1 //===-- MipsTargetAsmInfo.cpp - Mips asm properties -------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the declarations of the MipsTargetAsmInfo properties.
12 //===----------------------------------------------------------------------===//
14 #include "MipsTargetAsmInfo.h"
15 #include "MipsTargetMachine.h"
19 MipsTargetAsmInfo::MipsTargetAsmInfo(const MipsTargetMachine &TM):
20 ELFTargetAsmInfo(TM) {
22 Subtarget = &TM.getSubtarget<MipsSubtarget>();
24 AlignmentIsInBytes = false;
25 COMMDirectiveTakesAlignment = true;
26 Data16bitsDirective = "\t.half\t";
27 Data32bitsDirective = "\t.word\t";
28 Data64bitsDirective = NULL;
29 PrivateGlobalPrefix = "$";
30 JumpTableDataSection = "\t.rdata";
32 ReadOnlySection = "\t.rdata";
33 ZeroDirective = "\t.space\t";
34 BSSSection = "\t.section\t.bss";
35 CStringSection = ".rodata.str";
36 FourByteConstantSection = "\t.section\t.rodata.cst4,\"aM\",@progbits,4";
38 if (!Subtarget->hasABICall()) {
39 JumpTableDirective = "\t.word\t";
40 SmallDataSection = getNamedSection("\t.sdata", SectionFlags::Writeable);
41 SmallBSSSection = getNamedSection("\t.sbss", SectionFlags::Writeable |
44 JumpTableDirective = "\t.gpword\t";
49 MipsTargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
50 SectionKind::Kind K = ELFTargetAsmInfo::SectionKindForGlobal(GV);
52 if (Subtarget->hasABICall())
55 if (K != SectionKind::Data && K != SectionKind::BSS &&
56 K != SectionKind::RODataMergeConst)
59 if (isa<GlobalVariable>(GV)) {
60 const TargetData *TD = ETM->getTargetData();
61 unsigned Size = TD->getABITypeSize(GV->getType()->getElementType());
62 unsigned Threshold = Subtarget->getSSectionThreshold();
64 if (Size > 0 && Size <= Threshold) {
65 if (K == SectionKind::BSS)
66 return SectionKind::SmallBSS;
68 return SectionKind::SmallData;
76 MipsTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
77 SectionKind::Kind K = SectionKindForGlobal(GV);
78 const GlobalVariable *GVA = dyn_cast<GlobalVariable>(GV);
80 if (GVA && (!GVA->isWeakForLinker()))
82 case SectionKind::SmallData:
83 return getSmallDataSection();
84 case SectionKind::SmallBSS:
85 return getSmallBSSSection();
89 return ELFTargetAsmInfo::SelectSectionForGlobal(GV);