237b96de1ad4b77661f119018cfafd960e69eed4
[oota-llvm.git] / lib / Target / TargetAsmInfo.cpp
1 //===-- TargetAsmInfo.cpp - Asm Info ---------------------------------------==//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines target asm properties related what form asm statements
11 // should take.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Constants.h"
16 #include "llvm/GlobalVariable.h"
17 #include "llvm/Function.h"
18 #include "llvm/Module.h"
19 #include "llvm/Type.h"
20 #include "llvm/Target/TargetAsmInfo.h"
21 #include "llvm/Target/TargetOptions.h"
22 #include "llvm/Support/Dwarf.h"
23 #include <cctype>
24 #include <cstring>
25
26 using namespace llvm;
27
28 TargetAsmInfo::TargetAsmInfo() :
29   TextSection("\t.text"),
30   TextSection_(0),
31   DataSection("\t.data"),
32   DataSection_(0),
33   BSSSection("\t.bss"),
34   BSSSection_(0),
35   ReadOnlySection(0),
36   ReadOnlySection_(0),
37   TLSDataSection("\t.section .tdata,\"awT\",@progbits"),
38   TLSDataSection_(0),
39   TLSBSSSection("\t.section .tbss,\"awT\",@nobits"),
40   TLSBSSSection_(0),
41   ZeroFillDirective(0),
42   NonexecutableStackDirective(0),
43   NeedsSet(false),
44   MaxInstLength(4),
45   PCSymbol("$"),
46   SeparatorChar(';'),
47   CommentString("#"),
48   GlobalPrefix(""),
49   PrivateGlobalPrefix("."),
50   JumpTableSpecialLabelPrefix(0),
51   GlobalVarAddrPrefix(""),
52   GlobalVarAddrSuffix(""),
53   FunctionAddrPrefix(""),
54   FunctionAddrSuffix(""),
55   PersonalityPrefix(""),
56   PersonalitySuffix(""),
57   NeedsIndirectEncoding(false),
58   InlineAsmStart("#APP"),
59   InlineAsmEnd("#NO_APP"),
60   AssemblerDialect(0),
61   StringConstantPrefix(".str"),
62   ZeroDirective("\t.zero\t"),
63   ZeroDirectiveSuffix(0),
64   AsciiDirective("\t.ascii\t"),
65   AscizDirective("\t.asciz\t"),
66   Data8bitsDirective("\t.byte\t"),
67   Data16bitsDirective("\t.short\t"),
68   Data32bitsDirective("\t.long\t"),
69   Data64bitsDirective("\t.quad\t"),
70   AlignDirective("\t.align\t"),
71   AlignmentIsInBytes(true),
72   TextAlignFillValue(0),
73   SwitchToSectionDirective("\t.section\t"),
74   TextSectionStartSuffix(""),
75   DataSectionStartSuffix(""),
76   SectionEndDirectiveSuffix(0),
77   ConstantPoolSection("\t.section .rodata"),
78   JumpTableDataSection("\t.section .rodata"),
79   JumpTableDirective(0),
80   CStringSection(0),
81   CStringSection_(0),
82   StaticCtorsSection("\t.section .ctors,\"aw\",@progbits"),
83   StaticDtorsSection("\t.section .dtors,\"aw\",@progbits"),
84   FourByteConstantSection(0),
85   FourByteConstantSection_(0),
86   EightByteConstantSection(0),
87   EightByteConstantSection_(0),
88   SixteenByteConstantSection(0),
89   SixteenByteConstantSection_(0),
90   GlobalDirective("\t.globl\t"),
91   SetDirective(0),
92   LCOMMDirective(0),
93   COMMDirective("\t.comm\t"),
94   COMMDirectiveTakesAlignment(true),
95   HasDotTypeDotSizeDirective(true),
96   UsedDirective(0),
97   WeakRefDirective(0),
98   WeakDefDirective(0),
99   HiddenDirective("\t.hidden\t"),
100   ProtectedDirective("\t.protected\t"),
101   AbsoluteDebugSectionOffsets(false),
102   AbsoluteEHSectionOffsets(false),
103   HasLEB128(false),
104   HasDotLocAndDotFile(false),
105   SupportsDebugInformation(false),
106   SupportsExceptionHandling(false),
107   DwarfRequiresFrameSection(true),
108   GlobalEHDirective(0),
109   SupportsWeakOmittedEHFrame(true),
110   DwarfSectionOffsetDirective(0),
111   DwarfAbbrevSection(".debug_abbrev"),
112   DwarfInfoSection(".debug_info"),
113   DwarfLineSection(".debug_line"),
114   DwarfFrameSection(".debug_frame"),
115   DwarfPubNamesSection(".debug_pubnames"),
116   DwarfPubTypesSection(".debug_pubtypes"),
117   DwarfStrSection(".debug_str"),
118   DwarfLocSection(".debug_loc"),
119   DwarfARangesSection(".debug_aranges"),
120   DwarfRangesSection(".debug_ranges"),
121   DwarfMacInfoSection(".debug_macinfo"),
122   DwarfEHFrameSection(".eh_frame"),
123   DwarfExceptionSection(".gcc_except_table"),
124   AsmTransCBE(0) {
125   TextSection_ = getUnnamedSection(TextSection);
126   DataSection_ = getUnnamedSection(DataSection);
127 }
128
129 TargetAsmInfo::~TargetAsmInfo() {
130 }
131
132 /// Measure the specified inline asm to determine an approximation of its
133 /// length.
134 /// Comments (which run till the next SeparatorChar or newline) do not
135 /// count as an instruction.
136 /// Any other non-whitespace text is considered an instruction, with
137 /// multiple instructions separated by SeparatorChar or newlines.
138 /// Variable-length instructions are not handled here; this function
139 /// may be overloaded in the target code to do that.
140 unsigned TargetAsmInfo::getInlineAsmLength(const char *Str) const {
141   // Count the number of instructions in the asm.
142   bool atInsnStart = true;
143   unsigned Length = 0;
144   for (; *Str; ++Str) {
145     if (*Str == '\n' || *Str == SeparatorChar)
146       atInsnStart = true;
147     if (atInsnStart && !isspace(*Str)) {
148       Length += MaxInstLength;
149       atInsnStart = false;
150     }
151     if (atInsnStart && strncmp(Str, CommentString, strlen(CommentString))==0)
152       atInsnStart = false;
153   }
154
155   return Length;
156 }
157
158 unsigned TargetAsmInfo::PreferredEHDataFormat(DwarfEncoding::Target Reason,
159                                               bool Global) const {
160   return dwarf::DW_EH_PE_absptr;
161 }
162
163 static bool isSuitableForBSS(const GlobalVariable *GV) {
164   if (!GV->hasInitializer())
165     return true;
166
167   // Leave constant zeros in readonly constant sections, so they can be shared
168   Constant *C = GV->getInitializer();
169   return (C->isNullValue() && !GV->isConstant() && !NoZerosInBSS);
170 }
171
172 SectionKind::Kind
173 TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
174   // Early exit - functions should be always in text sections.
175   if (isa<Function>(GV))
176     return SectionKind::Text;
177
178   const GlobalVariable* GVar = dyn_cast<GlobalVariable>(GV);
179   bool isThreadLocal = GVar->isThreadLocal();
180   assert(GVar && "Invalid global value for section selection");
181
182   if (isSuitableForBSS(GVar)) {
183     // Variable can be easily put to BSS section.
184     return (isThreadLocal ? SectionKind::ThreadBSS : SectionKind::BSS);
185   } else if (GVar->isConstant() && !isThreadLocal) {
186     // Now we know, that varible has initializer and it is constant. We need to
187     // check its initializer to decide, which section to output it into. Also
188     // note, there is no thread-local r/o section.
189     Constant *C = GVar->getInitializer();
190     if (C->ContainsRelocations())
191       return SectionKind::ROData;
192     else {
193       const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
194       // Check, if initializer is a null-terminated string
195       if (CVA && CVA->isCString())
196         return SectionKind::RODataMergeStr;
197       else
198         return SectionKind::RODataMergeConst;
199     }
200   }
201
202   // Variable is not constant or thread-local - emit to generic data section.
203   return (isThreadLocal ? SectionKind::ThreadData : SectionKind::Data);
204 }
205
206 unsigned
207 TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
208                                      const char* Name) const {
209   unsigned Flags = SectionFlags::None;
210
211   // Decode flags from global itself.
212   if (GV) {
213     SectionKind::Kind Kind = SectionKindForGlobal(GV);
214     switch (Kind) {
215      case SectionKind::Text:
216       Flags |= SectionFlags::Code;
217       break;
218      case SectionKind::ThreadData:
219      case SectionKind::ThreadBSS:
220       Flags |= SectionFlags::TLS;
221       // FALLS THROUGH
222      case SectionKind::Data:
223      case SectionKind::BSS:
224       Flags |= SectionFlags::Writeable;
225       break;
226      case SectionKind::ROData:
227      case SectionKind::RODataMergeStr:
228      case SectionKind::RODataMergeConst:
229       // No additional flags here
230       break;
231      default:
232       assert(0 && "Unexpected section kind!");
233     }
234
235     if (GV->isWeakForLinker())
236       Flags |= SectionFlags::Linkonce;
237   }
238
239   // Add flags from sections, if any.
240   if (Name && *Name) {
241     Flags |= SectionFlags::Named;
242
243     // Some lame default implementation based on some magic section names.
244     if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
245         strncmp(Name, ".llvm.linkonce.b.", 17) == 0)
246       Flags |= SectionFlags::BSS;
247     else if (strcmp(Name, ".tdata") == 0 ||
248              strncmp(Name, ".tdata.", 7) == 0 ||
249              strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
250              strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
251       Flags |= SectionFlags::TLS;
252     else if (strcmp(Name, ".tbss") == 0 ||
253              strncmp(Name, ".tbss.", 6) == 0 ||
254              strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
255              strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
256       Flags |= SectionFlags::BSS | SectionFlags::TLS;
257   }
258
259   return Flags;
260 }
261
262 std::string
263 TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const {
264   const Section* S;
265   // Select section name
266   if (GV->hasSection()) {
267     // Honour section already set, if any
268     unsigned Flags = SectionFlagsForGlobal(GV,
269                                            GV->getSection().c_str());
270     S = getNamedSection(GV->getSection().c_str(), Flags);
271   } else {
272     // Use default section depending on the 'type' of global
273     S = SelectSectionForGlobal(GV);
274   }
275
276   std::string Name = S->Name;
277
278   // If section is named we need to switch into it via special '.section'
279   // directive and also append funky flags. Otherwise - section name is just
280   // some magic assembler directive.
281   if (S->isNamed())
282     Name = getSwitchToSectionDirective() + Name + PrintSectionFlags(S->Flags);
283
284   return Name;
285 }
286
287 // Lame default implementation. Calculate the section name for global.
288 const Section*
289 TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
290   SectionKind::Kind Kind = SectionKindForGlobal(GV);
291
292   if (GV->isWeakForLinker()) {
293     std::string Name = UniqueSectionForGlobal(GV, Kind);
294     unsigned Flags = SectionFlagsForGlobal(GV, Name.c_str());
295     return getNamedSection(Name.c_str(), Flags);
296   } else {
297     if (Kind == SectionKind::Text)
298       return getTextSection_();
299     else if (Kind == SectionKind::BSS && getBSSSection_())
300       return getBSSSection_();
301     else if (getReadOnlySection_() &&
302              (Kind == SectionKind::ROData ||
303               Kind == SectionKind::RODataMergeConst ||
304               Kind == SectionKind::RODataMergeStr))
305       return getReadOnlySection_();
306   }
307
308   return getDataSection_();
309 }
310
311 std::string
312 TargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
313                                       SectionKind::Kind Kind) const {
314   switch (Kind) {
315    case SectionKind::Text:
316     return ".gnu.linkonce.t." + GV->getName();
317    case SectionKind::Data:
318     return ".gnu.linkonce.d." + GV->getName();
319    case SectionKind::BSS:
320     return ".gnu.linkonce.b." + GV->getName();
321    case SectionKind::ROData:
322    case SectionKind::RODataMergeConst:
323    case SectionKind::RODataMergeStr:
324     return ".gnu.linkonce.r." + GV->getName();
325    case SectionKind::ThreadData:
326     return ".gnu.linkonce.td." + GV->getName();
327    case SectionKind::ThreadBSS:
328     return ".gnu.linkonce.tb." + GV->getName();
329    default:
330     assert(0 && "Unknown section kind");
331   }
332 }
333
334 const Section*
335 TargetAsmInfo::getNamedSection(const char *Name, unsigned Flags) const {
336   Section& S = Sections[Name];
337
338   // This is newly-created section, set it up properly.
339   if (S.Flags == SectionFlags::Invalid) {
340     S.Flags = Flags | SectionFlags::Named;
341     S.Name = Name;
342   }
343
344   return &S;
345 }
346
347 const Section*
348 TargetAsmInfo::getUnnamedSection(const char *Directive, unsigned Flags) const {
349   Section& S = Sections[Directive];
350
351   // This is newly-created section, set it up properly.
352   if (S.Flags == SectionFlags::Invalid) {
353     S.Flags = Flags & ~SectionFlags::Named;
354     S.Name = Directive;
355   }
356
357   return &S;
358 }