6ed91b09966ea86f60806adec5c5b1f8cff05930
[oota-llvm.git] / lib / CodeGen / TargetLoweringObjectFileImpl.cpp
1 //===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File 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 implements classes used to handle lowerings specific to common
11 // object file formats.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
16 #include "llvm/Constants.h"
17 #include "llvm/DerivedTypes.h"
18 #include "llvm/Function.h"
19 #include "llvm/GlobalVariable.h"
20 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
21 #include "llvm/MC/MCContext.h"
22 #include "llvm/MC/MCExpr.h"
23 #include "llvm/MC/MCSectionMachO.h"
24 #include "llvm/MC/MCSectionELF.h"
25 #include "llvm/MC/MCSectionCOFF.h"
26 #include "llvm/MC/MCStreamer.h"
27 #include "llvm/MC/MCSymbol.h"
28 #include "llvm/Target/Mangler.h"
29 #include "llvm/Target/TargetData.h"
30 #include "llvm/Target/TargetMachine.h"
31 #include "llvm/Target/TargetOptions.h"
32 #include "llvm/Support/Dwarf.h"
33 #include "llvm/Support/ELF.h"
34 #include "llvm/Support/ErrorHandling.h"
35 #include "llvm/Support/raw_ostream.h"
36 #include "llvm/ADT/SmallString.h"
37 #include "llvm/ADT/StringExtras.h"
38 #include "llvm/ADT/Triple.h"
39 using namespace llvm;
40 using namespace dwarf;
41
42 //===----------------------------------------------------------------------===//
43 //                                  ELF
44 //===----------------------------------------------------------------------===//
45
46 void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
47                                              const TargetMachine &TM) {
48   TargetLoweringObjectFile::Initialize(Ctx, TM);
49
50   BSSSection =
51     getContext().getELFSection(".bss", ELF::SHT_NOBITS,
52                                ELF::SHF_WRITE |ELF::SHF_ALLOC,
53                                SectionKind::getBSS());
54
55   TextSection =
56     getContext().getELFSection(".text", ELF::SHT_PROGBITS,
57                                ELF::SHF_EXECINSTR |
58                                ELF::SHF_ALLOC,
59                                SectionKind::getText());
60
61   DataSection =
62     getContext().getELFSection(".data", ELF::SHT_PROGBITS,
63                                ELF::SHF_WRITE |ELF::SHF_ALLOC,
64                                SectionKind::getDataRel());
65
66   ReadOnlySection =
67     getContext().getELFSection(".rodata", ELF::SHT_PROGBITS,
68                                ELF::SHF_ALLOC,
69                                SectionKind::getReadOnly());
70
71   TLSDataSection =
72     getContext().getELFSection(".tdata", ELF::SHT_PROGBITS,
73                                ELF::SHF_ALLOC | ELF::SHF_TLS |
74                                ELF::SHF_WRITE,
75                                SectionKind::getThreadData());
76
77   TLSBSSSection =
78     getContext().getELFSection(".tbss", ELF::SHT_NOBITS,
79                                ELF::SHF_ALLOC | ELF::SHF_TLS |
80                                ELF::SHF_WRITE,
81                                SectionKind::getThreadBSS());
82
83   DataRelSection =
84     getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS,
85                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
86                                SectionKind::getDataRel());
87
88   DataRelLocalSection =
89     getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
90                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
91                                SectionKind::getDataRelLocal());
92
93   DataRelROSection =
94     getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
95                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
96                                SectionKind::getReadOnlyWithRel());
97
98   DataRelROLocalSection =
99     getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
100                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
101                                SectionKind::getReadOnlyWithRelLocal());
102
103   MergeableConst4Section =
104     getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
105                                ELF::SHF_ALLOC |ELF::SHF_MERGE,
106                                SectionKind::getMergeableConst4());
107
108   MergeableConst8Section =
109     getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
110                                ELF::SHF_ALLOC |ELF::SHF_MERGE,
111                                SectionKind::getMergeableConst8());
112
113   MergeableConst16Section =
114     getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
115                                ELF::SHF_ALLOC |ELF::SHF_MERGE,
116                                SectionKind::getMergeableConst16());
117
118   StaticCtorSection =
119     getContext().getELFSection(".ctors", ELF::SHT_PROGBITS,
120                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
121                                SectionKind::getDataRel());
122
123   StaticDtorSection =
124     getContext().getELFSection(".dtors", ELF::SHT_PROGBITS,
125                                ELF::SHF_ALLOC |ELF::SHF_WRITE,
126                                SectionKind::getDataRel());
127
128   // Exception Handling Sections.
129
130   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
131   // it contains relocatable pointers.  In PIC mode, this is probably a big
132   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
133   // adjusted or this should be a data section.
134   LSDASection =
135     getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
136                                ELF::SHF_ALLOC,
137                                SectionKind::getReadOnly());
138   // Debug Info Sections.
139   DwarfAbbrevSection =
140     getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
141                                SectionKind::getMetadata());
142   DwarfInfoSection =
143     getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
144                                SectionKind::getMetadata());
145   DwarfLineSection =
146     getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
147                                SectionKind::getMetadata());
148   DwarfFrameSection =
149     getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
150                                SectionKind::getMetadata());
151   DwarfPubNamesSection =
152     getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
153                                SectionKind::getMetadata());
154   DwarfPubTypesSection =
155     getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
156                                SectionKind::getMetadata());
157   DwarfStrSection =
158     getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
159                                SectionKind::getMetadata());
160   DwarfLocSection =
161     getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
162                                SectionKind::getMetadata());
163   DwarfARangesSection =
164     getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
165                                SectionKind::getMetadata());
166   DwarfRangesSection =
167     getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
168                                SectionKind::getMetadata());
169   DwarfMacroInfoSection =
170     getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
171                                SectionKind::getMetadata());
172 }
173
174 const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const {
175   return getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS,
176                                     ELF::SHF_ALLOC,
177                                     SectionKind::getDataRel());
178 }
179
180 MCSymbol *
181 TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
182                                                      Mangler *Mang,
183                                                 MachineModuleInfo *MMI) const {
184   unsigned Encoding = getPersonalityEncoding();
185   switch (Encoding & 0x70) {
186   default:
187     report_fatal_error("We do not support this DWARF encoding yet!");
188   case dwarf::DW_EH_PE_absptr:
189     return  Mang->getSymbol(GV);
190     break;
191   case dwarf::DW_EH_PE_pcrel: {
192     Twine FullName = StringRef("DW.ref.") + Mang->getSymbol(GV)->getName();
193     return getContext().GetOrCreateSymbol(FullName);
194     break;
195   }
196   }
197 }
198
199 void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
200                                                        const TargetMachine &TM,
201                                                        const MCSymbol *Sym) const {
202   Twine FullName = StringRef("DW.ref.") + Sym->getName();
203   MCSymbol *Label = getContext().GetOrCreateSymbol(FullName);
204   Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
205   Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
206   Twine SectionName = StringRef(".data.") + Label->getName();
207   SmallString<64> NameData;
208   SectionName.toVector(NameData);
209   unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
210   const MCSection *Sec = getContext().getELFSection(NameData,
211                                                     ELF::SHT_PROGBITS,
212                                                     Flags,
213                                                     SectionKind::getDataRel(),
214                                                     0, Label->getName());
215   Streamer.SwitchSection(Sec);
216   Streamer.EmitValueToAlignment(8);
217   Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
218   const MCExpr *E = MCConstantExpr::Create(8, getContext());
219   Streamer.EmitELFSize(Label, E);
220   Streamer.EmitLabel(Label);
221
222   unsigned Size = TM.getTargetData()->getPointerSize();
223   Streamer.EmitSymbolValue(Sym, Size);
224 }
225
226 static SectionKind
227 getELFKindForNamedSection(StringRef Name, SectionKind K) {
228   // FIXME: Why is this here? Codegen is should not be in the business
229   // of figuring section flags. If the user wrote section(".eh_frame"),
230   // we should just pass that to MC which will defer to the assembly
231   // or use its default if producing an object file.
232   if (Name.empty() || Name[0] != '.') return K;
233
234   // Some lame default implementation based on some magic section names.
235   if (Name == ".bss" ||
236       Name.startswith(".bss.") ||
237       Name.startswith(".gnu.linkonce.b.") ||
238       Name.startswith(".llvm.linkonce.b.") ||
239       Name == ".sbss" ||
240       Name.startswith(".sbss.") ||
241       Name.startswith(".gnu.linkonce.sb.") ||
242       Name.startswith(".llvm.linkonce.sb."))
243     return SectionKind::getBSS();
244
245   if (Name == ".tdata" ||
246       Name.startswith(".tdata.") ||
247       Name.startswith(".gnu.linkonce.td.") ||
248       Name.startswith(".llvm.linkonce.td."))
249     return SectionKind::getThreadData();
250
251   if (Name == ".tbss" ||
252       Name.startswith(".tbss.") ||
253       Name.startswith(".gnu.linkonce.tb.") ||
254       Name.startswith(".llvm.linkonce.tb."))
255     return SectionKind::getThreadBSS();
256
257   if (Name == ".eh_frame")
258     return SectionKind::getDataRel();
259
260   return K;
261 }
262
263
264 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
265
266   if (Name == ".init_array")
267     return ELF::SHT_INIT_ARRAY;
268
269   if (Name == ".fini_array")
270     return ELF::SHT_FINI_ARRAY;
271
272   if (Name == ".preinit_array")
273     return ELF::SHT_PREINIT_ARRAY;
274
275   if (K.isBSS() || K.isThreadBSS())
276     return ELF::SHT_NOBITS;
277
278   return ELF::SHT_PROGBITS;
279 }
280
281
282 static unsigned
283 getELFSectionFlags(SectionKind K) {
284   unsigned Flags = 0;
285
286   if (!K.isMetadata())
287     Flags |= ELF::SHF_ALLOC;
288
289   if (K.isText())
290     Flags |= ELF::SHF_EXECINSTR;
291
292   if (K.isWriteable())
293     Flags |= ELF::SHF_WRITE;
294
295   if (K.isThreadLocal())
296     Flags |= ELF::SHF_TLS;
297
298   // K.isMergeableConst() is left out to honour PR4650
299   if (K.isMergeableCString() || K.isMergeableConst4() ||
300       K.isMergeableConst8() || K.isMergeableConst16())
301     Flags |= ELF::SHF_MERGE;
302
303   if (K.isMergeableCString())
304     Flags |= ELF::SHF_STRINGS;
305
306   return Flags;
307 }
308
309
310 const MCSection *TargetLoweringObjectFileELF::
311 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
312                          Mangler *Mang, const TargetMachine &TM) const {
313   StringRef SectionName = GV->getSection();
314
315   // Infer section flags from the section name if we can.
316   Kind = getELFKindForNamedSection(SectionName, Kind);
317
318   return getContext().getELFSection(SectionName,
319                                     getELFSectionType(SectionName, Kind),
320                                     getELFSectionFlags(Kind), Kind);
321 }
322
323 /// getSectionPrefixForGlobal - Return the section prefix name used by options
324 /// FunctionsSections and DataSections.
325 static const char *getSectionPrefixForGlobal(SectionKind Kind) {
326   if (Kind.isText())                 return ".text.";
327   if (Kind.isReadOnly())             return ".rodata.";
328
329   if (Kind.isThreadData())           return ".tdata.";
330   if (Kind.isThreadBSS())            return ".tbss.";
331
332   if (Kind.isDataNoRel())            return ".data.";
333   if (Kind.isDataRelLocal())         return ".data.rel.local.";
334   if (Kind.isDataRel())              return ".data.rel.";
335   if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
336
337   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
338   return ".data.rel.ro.";
339 }
340
341
342 const MCSection *TargetLoweringObjectFileELF::
343 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
344                        Mangler *Mang, const TargetMachine &TM) const {
345   // If we have -ffunction-section or -fdata-section then we should emit the
346   // global value to a uniqued section specifically for it.
347   bool EmitUniquedSection;
348   if (Kind.isText())
349     EmitUniquedSection = TM.getFunctionSections();
350   else
351     EmitUniquedSection = TM.getDataSections();
352
353   // If this global is linkonce/weak and the target handles this by emitting it
354   // into a 'uniqued' section name, create and return the section now.
355   if ((GV->isWeakForLinker() || EmitUniquedSection) &&
356       !Kind.isCommon() && !Kind.isBSS()) {
357     const char *Prefix;
358     Prefix = getSectionPrefixForGlobal(Kind);
359
360     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
361     MCSymbol *Sym = Mang->getSymbol(GV);
362     Name.append(Sym->getName().begin(), Sym->getName().end());
363     StringRef Group = "";
364     unsigned Flags = getELFSectionFlags(Kind);
365     if (GV->isWeakForLinker()) {
366       Group = Sym->getName();
367       Flags |= ELF::SHF_GROUP;
368     }
369
370     return getContext().getELFSection(Name.str(),
371                                       getELFSectionType(Name.str(), Kind),
372                                       Flags, Kind, 0, Group);
373   }
374
375   if (Kind.isText()) return TextSection;
376
377   if (Kind.isMergeable1ByteCString() ||
378       Kind.isMergeable2ByteCString() ||
379       Kind.isMergeable4ByteCString()) {
380
381     // We also need alignment here.
382     // FIXME: this is getting the alignment of the character, not the
383     // alignment of the global!
384     unsigned Align =
385       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
386
387     const char *SizeSpec = ".rodata.str1.";
388     if (Kind.isMergeable2ByteCString())
389       SizeSpec = ".rodata.str2.";
390     else if (Kind.isMergeable4ByteCString())
391       SizeSpec = ".rodata.str4.";
392     else
393       assert(Kind.isMergeable1ByteCString() && "unknown string width");
394
395
396     std::string Name = SizeSpec + utostr(Align);
397     return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
398                                       ELF::SHF_ALLOC |
399                                       ELF::SHF_MERGE |
400                                       ELF::SHF_STRINGS,
401                                       Kind);
402   }
403
404   if (Kind.isMergeableConst()) {
405     if (Kind.isMergeableConst4() && MergeableConst4Section)
406       return MergeableConst4Section;
407     if (Kind.isMergeableConst8() && MergeableConst8Section)
408       return MergeableConst8Section;
409     if (Kind.isMergeableConst16() && MergeableConst16Section)
410       return MergeableConst16Section;
411     return ReadOnlySection;  // .const
412   }
413
414   if (Kind.isReadOnly())             return ReadOnlySection;
415
416   if (Kind.isThreadData())           return TLSDataSection;
417   if (Kind.isThreadBSS())            return TLSBSSSection;
418
419   // Note: we claim that common symbols are put in BSSSection, but they are
420   // really emitted with the magic .comm directive, which creates a symbol table
421   // entry but not a section.
422   if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
423
424   if (Kind.isDataNoRel())            return DataSection;
425   if (Kind.isDataRelLocal())         return DataRelLocalSection;
426   if (Kind.isDataRel())              return DataRelSection;
427   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
428
429   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
430   return DataRelROSection;
431 }
432
433 /// getSectionForConstant - Given a mergeable constant with the
434 /// specified size and relocation information, return a section that it
435 /// should be placed in.
436 const MCSection *TargetLoweringObjectFileELF::
437 getSectionForConstant(SectionKind Kind) const {
438   if (Kind.isMergeableConst4() && MergeableConst4Section)
439     return MergeableConst4Section;
440   if (Kind.isMergeableConst8() && MergeableConst8Section)
441     return MergeableConst8Section;
442   if (Kind.isMergeableConst16() && MergeableConst16Section)
443     return MergeableConst16Section;
444   if (Kind.isReadOnly())
445     return ReadOnlySection;
446
447   if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
448   assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
449   return DataRelROSection;
450 }
451
452 const MCExpr *TargetLoweringObjectFileELF::
453 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
454                                MachineModuleInfo *MMI,
455                                unsigned Encoding, MCStreamer &Streamer) const {
456
457   if (Encoding & dwarf::DW_EH_PE_indirect) {
458     MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
459
460     SmallString<128> Name;
461     Mang->getNameWithPrefix(Name, GV, true);
462     Name += ".DW.stub";
463
464     // Add information about the stub reference to ELFMMI so that the stub
465     // gets emitted by the asmprinter.
466     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
467     MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
468     if (StubSym.getPointer() == 0) {
469       MCSymbol *Sym = Mang->getSymbol(GV);
470       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
471     }
472
473     return TargetLoweringObjectFile::
474       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
475   }
476
477   return TargetLoweringObjectFile::
478     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
479 }
480
481 //===----------------------------------------------------------------------===//
482 //                                 MachO
483 //===----------------------------------------------------------------------===//
484
485 void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
486                                                const TargetMachine &TM) {
487   // _foo.eh symbols are currently always exported so that the linker knows
488   // about them.  This is not necessary on 10.6 and later, but it
489   // doesn't hurt anything.
490   // FIXME: I need to get this from Triple.
491   IsFunctionEHSymbolGlobal = true;
492   IsFunctionEHFrameSymbolPrivate = false;
493   SupportsWeakOmittedEHFrame = false;
494
495   // .comm doesn't support alignment before Leopard.
496   Triple T(((LLVMTargetMachine&)TM).getTargetTriple());
497   if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
498     CommDirectiveSupportsAlignment = false;
499
500   TargetLoweringObjectFile::Initialize(Ctx, TM);
501
502   TextSection // .text
503     = getContext().getMachOSection("__TEXT", "__text",
504                                    MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
505                                    SectionKind::getText());
506   DataSection // .data
507     = getContext().getMachOSection("__DATA", "__data", 0,
508                                    SectionKind::getDataRel());
509
510   TLSDataSection // .tdata
511     = getContext().getMachOSection("__DATA", "__thread_data",
512                                    MCSectionMachO::S_THREAD_LOCAL_REGULAR,
513                                    SectionKind::getDataRel());
514   TLSBSSSection // .tbss
515     = getContext().getMachOSection("__DATA", "__thread_bss",
516                                    MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
517                                    SectionKind::getThreadBSS());
518
519   // TODO: Verify datarel below.
520   TLSTLVSection // .tlv
521     = getContext().getMachOSection("__DATA", "__thread_vars",
522                                    MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
523                                    SectionKind::getDataRel());
524
525   TLSThreadInitSection
526     = getContext().getMachOSection("__DATA", "__thread_init",
527                           MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
528                           SectionKind::getDataRel());
529
530   CStringSection // .cstring
531     = getContext().getMachOSection("__TEXT", "__cstring",
532                                    MCSectionMachO::S_CSTRING_LITERALS,
533                                    SectionKind::getMergeable1ByteCString());
534   UStringSection
535     = getContext().getMachOSection("__TEXT","__ustring", 0,
536                                    SectionKind::getMergeable2ByteCString());
537   FourByteConstantSection // .literal4
538     = getContext().getMachOSection("__TEXT", "__literal4",
539                                    MCSectionMachO::S_4BYTE_LITERALS,
540                                    SectionKind::getMergeableConst4());
541   EightByteConstantSection // .literal8
542     = getContext().getMachOSection("__TEXT", "__literal8",
543                                    MCSectionMachO::S_8BYTE_LITERALS,
544                                    SectionKind::getMergeableConst8());
545
546   // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
547   // to using it in -static mode.
548   SixteenByteConstantSection = 0;
549   if (TM.getRelocationModel() != Reloc::Static &&
550       TM.getTargetData()->getPointerSize() == 32)
551     SixteenByteConstantSection =   // .literal16
552       getContext().getMachOSection("__TEXT", "__literal16",
553                                    MCSectionMachO::S_16BYTE_LITERALS,
554                                    SectionKind::getMergeableConst16());
555
556   ReadOnlySection  // .const
557     = getContext().getMachOSection("__TEXT", "__const", 0,
558                                    SectionKind::getReadOnly());
559
560   TextCoalSection
561     = getContext().getMachOSection("__TEXT", "__textcoal_nt",
562                                    MCSectionMachO::S_COALESCED |
563                                    MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
564                                    SectionKind::getText());
565   ConstTextCoalSection
566     = getContext().getMachOSection("__TEXT", "__const_coal",
567                                    MCSectionMachO::S_COALESCED,
568                                    SectionKind::getReadOnly());
569   ConstDataSection  // .const_data
570     = getContext().getMachOSection("__DATA", "__const", 0,
571                                    SectionKind::getReadOnlyWithRel());
572   DataCoalSection
573     = getContext().getMachOSection("__DATA","__datacoal_nt",
574                                    MCSectionMachO::S_COALESCED,
575                                    SectionKind::getDataRel());
576   DataCommonSection
577     = getContext().getMachOSection("__DATA","__common",
578                                    MCSectionMachO::S_ZEROFILL,
579                                    SectionKind::getBSS());
580   DataBSSSection
581     = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
582                                    SectionKind::getBSS());
583
584
585   LazySymbolPointerSection
586     = getContext().getMachOSection("__DATA", "__la_symbol_ptr",
587                                    MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
588                                    SectionKind::getMetadata());
589   NonLazySymbolPointerSection
590     = getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
591                                    MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
592                                    SectionKind::getMetadata());
593
594   if (TM.getRelocationModel() == Reloc::Static) {
595     StaticCtorSection
596       = getContext().getMachOSection("__TEXT", "__constructor", 0,
597                                      SectionKind::getDataRel());
598     StaticDtorSection
599       = getContext().getMachOSection("__TEXT", "__destructor", 0,
600                                      SectionKind::getDataRel());
601   } else {
602     StaticCtorSection
603       = getContext().getMachOSection("__DATA", "__mod_init_func",
604                                      MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
605                                      SectionKind::getDataRel());
606     StaticDtorSection
607       = getContext().getMachOSection("__DATA", "__mod_term_func",
608                                      MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
609                                      SectionKind::getDataRel());
610   }
611
612   // Exception Handling.
613   LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
614                                              SectionKind::getReadOnlyWithRel());
615   // Debug Information.
616   DwarfAbbrevSection =
617     getContext().getMachOSection("__DWARF", "__debug_abbrev",
618                                  MCSectionMachO::S_ATTR_DEBUG,
619                                  SectionKind::getMetadata());
620   DwarfInfoSection =
621     getContext().getMachOSection("__DWARF", "__debug_info",
622                                  MCSectionMachO::S_ATTR_DEBUG,
623                                  SectionKind::getMetadata());
624   DwarfLineSection =
625     getContext().getMachOSection("__DWARF", "__debug_line",
626                                  MCSectionMachO::S_ATTR_DEBUG,
627                                  SectionKind::getMetadata());
628   DwarfFrameSection =
629     getContext().getMachOSection("__DWARF", "__debug_frame",
630                                  MCSectionMachO::S_ATTR_DEBUG,
631                                  SectionKind::getMetadata());
632   DwarfPubNamesSection =
633     getContext().getMachOSection("__DWARF", "__debug_pubnames",
634                                  MCSectionMachO::S_ATTR_DEBUG,
635                                  SectionKind::getMetadata());
636   DwarfPubTypesSection =
637     getContext().getMachOSection("__DWARF", "__debug_pubtypes",
638                                  MCSectionMachO::S_ATTR_DEBUG,
639                                  SectionKind::getMetadata());
640   DwarfStrSection =
641     getContext().getMachOSection("__DWARF", "__debug_str",
642                                  MCSectionMachO::S_ATTR_DEBUG,
643                                  SectionKind::getMetadata());
644   DwarfLocSection =
645     getContext().getMachOSection("__DWARF", "__debug_loc",
646                                  MCSectionMachO::S_ATTR_DEBUG,
647                                  SectionKind::getMetadata());
648   DwarfARangesSection =
649     getContext().getMachOSection("__DWARF", "__debug_aranges",
650                                  MCSectionMachO::S_ATTR_DEBUG,
651                                  SectionKind::getMetadata());
652   DwarfRangesSection =
653     getContext().getMachOSection("__DWARF", "__debug_ranges",
654                                  MCSectionMachO::S_ATTR_DEBUG,
655                                  SectionKind::getMetadata());
656   DwarfMacroInfoSection =
657     getContext().getMachOSection("__DWARF", "__debug_macinfo",
658                                  MCSectionMachO::S_ATTR_DEBUG,
659                                  SectionKind::getMetadata());
660   DwarfDebugInlineSection =
661     getContext().getMachOSection("__DWARF", "__debug_inlined",
662                                  MCSectionMachO::S_ATTR_DEBUG,
663                                  SectionKind::getMetadata());
664
665   TLSExtraDataSection = TLSTLVSection;
666 }
667
668 const MCSection *TargetLoweringObjectFileMachO::getEHFrameSection() const {
669   return getContext().getMachOSection("__TEXT", "__eh_frame",
670                                       MCSectionMachO::S_COALESCED |
671                                       MCSectionMachO::S_ATTR_NO_TOC |
672                                       MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
673                                       MCSectionMachO::S_ATTR_LIVE_SUPPORT,
674                                       SectionKind::getReadOnly());
675 }
676
677 const MCSection *TargetLoweringObjectFileMachO::
678 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
679                          Mangler *Mang, const TargetMachine &TM) const {
680   // Parse the section specifier and create it if valid.
681   StringRef Segment, Section;
682   unsigned TAA = 0, StubSize = 0;
683   bool TAAParsed;
684   std::string ErrorCode =
685     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
686                                           TAA, TAAParsed, StubSize);
687   if (!ErrorCode.empty()) {
688     // If invalid, report the error with report_fatal_error.
689     report_fatal_error("Global variable '" + GV->getNameStr() +
690                       "' has an invalid section specifier '" + GV->getSection()+
691                       "': " + ErrorCode + ".");
692     // Fall back to dropping it into the data section.
693     return DataSection;
694   }
695
696   // Get the section.
697   const MCSectionMachO *S =
698     getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
699
700   // If TAA wasn't set by ParseSectionSpecifier() above,
701   // use the value returned by getMachOSection() as a default.
702   if (!TAAParsed)
703     TAA = S->getTypeAndAttributes();
704
705   // Okay, now that we got the section, verify that the TAA & StubSize agree.
706   // If the user declared multiple globals with different section flags, we need
707   // to reject it here.
708   if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
709     // If invalid, report the error with report_fatal_error.
710     report_fatal_error("Global variable '" + GV->getNameStr() +
711                       "' section type or attributes does not match previous"
712                       " section specifier");
713   }
714
715   return S;
716 }
717
718 const MCSection *TargetLoweringObjectFileMachO::
719 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
720                        Mangler *Mang, const TargetMachine &TM) const {
721
722   // Handle thread local data.
723   if (Kind.isThreadBSS()) return TLSBSSSection;
724   if (Kind.isThreadData()) return TLSDataSection;
725
726   if (Kind.isText())
727     return GV->isWeakForLinker() ? TextCoalSection : TextSection;
728
729   // If this is weak/linkonce, put this in a coalescable section, either in text
730   // or data depending on if it is writable.
731   if (GV->isWeakForLinker()) {
732     if (Kind.isReadOnly())
733       return ConstTextCoalSection;
734     return DataCoalSection;
735   }
736
737   // FIXME: Alignment check should be handled by section classifier.
738   if (Kind.isMergeable1ByteCString() &&
739       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
740     return CStringSection;
741
742   // Do not put 16-bit arrays in the UString section if they have an
743   // externally visible label, this runs into issues with certain linker
744   // versions.
745   if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
746       TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
747     return UStringSection;
748
749   if (Kind.isMergeableConst()) {
750     if (Kind.isMergeableConst4())
751       return FourByteConstantSection;
752     if (Kind.isMergeableConst8())
753       return EightByteConstantSection;
754     if (Kind.isMergeableConst16() && SixteenByteConstantSection)
755       return SixteenByteConstantSection;
756   }
757
758   // Otherwise, if it is readonly, but not something we can specially optimize,
759   // just drop it in .const.
760   if (Kind.isReadOnly())
761     return ReadOnlySection;
762
763   // If this is marked const, put it into a const section.  But if the dynamic
764   // linker needs to write to it, put it in the data segment.
765   if (Kind.isReadOnlyWithRel())
766     return ConstDataSection;
767
768   // Put zero initialized globals with strong external linkage in the
769   // DATA, __common section with the .zerofill directive.
770   if (Kind.isBSSExtern())
771     return DataCommonSection;
772
773   // Put zero initialized globals with local linkage in __DATA,__bss directive
774   // with the .zerofill directive (aka .lcomm).
775   if (Kind.isBSSLocal())
776     return DataBSSSection;
777
778   // Otherwise, just drop the variable in the normal data section.
779   return DataSection;
780 }
781
782 const MCSection *
783 TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
784   // If this constant requires a relocation, we have to put it in the data
785   // segment, not in the text segment.
786   if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
787     return ConstDataSection;
788
789   if (Kind.isMergeableConst4())
790     return FourByteConstantSection;
791   if (Kind.isMergeableConst8())
792     return EightByteConstantSection;
793   if (Kind.isMergeableConst16() && SixteenByteConstantSection)
794     return SixteenByteConstantSection;
795   return ReadOnlySection;  // .const
796 }
797
798 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
799 /// not to emit the UsedDirective for some symbols in llvm.used.
800 // FIXME: REMOVE this (rdar://7071300)
801 bool TargetLoweringObjectFileMachO::
802 shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
803   /// On Darwin, internally linked data beginning with "L" or "l" does not have
804   /// the directive emitted (this occurs in ObjC metadata).
805   if (!GV) return false;
806
807   // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
808   if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
809     // FIXME: ObjC metadata is currently emitted as internal symbols that have
810     // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
811     // this horrible hack can go away.
812     MCSymbol *Sym = Mang->getSymbol(GV);
813     if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
814       return false;
815   }
816
817   return true;
818 }
819
820 const MCExpr *TargetLoweringObjectFileMachO::
821 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
822                                MachineModuleInfo *MMI, unsigned Encoding,
823                                MCStreamer &Streamer) const {
824   // The mach-o version of this method defaults to returning a stub reference.
825
826   if (Encoding & DW_EH_PE_indirect) {
827     MachineModuleInfoMachO &MachOMMI =
828       MMI->getObjFileInfo<MachineModuleInfoMachO>();
829
830     SmallString<128> Name;
831     Mang->getNameWithPrefix(Name, GV, true);
832     Name += "$non_lazy_ptr";
833
834     // Add information about the stub reference to MachOMMI so that the stub
835     // gets emitted by the asmprinter.
836     MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
837     MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
838     if (StubSym.getPointer() == 0) {
839       MCSymbol *Sym = Mang->getSymbol(GV);
840       StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
841     }
842
843     return TargetLoweringObjectFile::
844       getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
845   }
846
847   return TargetLoweringObjectFile::
848     getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
849 }
850
851 MCSymbol *TargetLoweringObjectFileMachO::
852 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
853                         MachineModuleInfo *MMI) const {
854   // The mach-o version of this method defaults to returning a stub reference.
855   MachineModuleInfoMachO &MachOMMI =
856     MMI->getObjFileInfo<MachineModuleInfoMachO>();
857
858   SmallString<128> Name;
859   Mang->getNameWithPrefix(Name, GV, true);
860   Name += "$non_lazy_ptr";
861
862   // Add information about the stub reference to MachOMMI so that the stub
863   // gets emitted by the asmprinter.
864   MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
865   MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
866   if (StubSym.getPointer() == 0) {
867     MCSymbol *Sym = Mang->getSymbol(GV);
868     StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
869   }
870
871   return SSym;
872 }
873
874 unsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
875   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
876 }
877
878 unsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
879   return DW_EH_PE_pcrel;
880 }
881
882 unsigned TargetLoweringObjectFileMachO::getFDEEncoding(bool CFI) const {
883   return DW_EH_PE_pcrel;
884 }
885
886 unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
887   return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
888 }
889
890 //===----------------------------------------------------------------------===//
891 //                                  COFF
892 //===----------------------------------------------------------------------===//
893
894 void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
895                                               const TargetMachine &TM) {
896   TargetLoweringObjectFile::Initialize(Ctx, TM);
897   TextSection =
898     getContext().getCOFFSection(".text",
899                                 COFF::IMAGE_SCN_CNT_CODE |
900                                 COFF::IMAGE_SCN_MEM_EXECUTE |
901                                 COFF::IMAGE_SCN_MEM_READ,
902                                 SectionKind::getText());
903   DataSection =
904     getContext().getCOFFSection(".data",
905                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
906                                 COFF::IMAGE_SCN_MEM_READ |
907                                 COFF::IMAGE_SCN_MEM_WRITE,
908                                 SectionKind::getDataRel());
909   ReadOnlySection =
910     getContext().getCOFFSection(".rdata",
911                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
912                                 COFF::IMAGE_SCN_MEM_READ,
913                                 SectionKind::getReadOnly());
914   StaticCtorSection =
915     getContext().getCOFFSection(".ctors",
916                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
917                                 COFF::IMAGE_SCN_MEM_READ |
918                                 COFF::IMAGE_SCN_MEM_WRITE,
919                                 SectionKind::getDataRel());
920   StaticDtorSection =
921     getContext().getCOFFSection(".dtors",
922                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
923                                 COFF::IMAGE_SCN_MEM_READ |
924                                 COFF::IMAGE_SCN_MEM_WRITE,
925                                 SectionKind::getDataRel());
926
927   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
928   // though it contains relocatable pointers.  In PIC mode, this is probably a
929   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
930   // adjusted or this should be a data section.
931   LSDASection =
932     getContext().getCOFFSection(".gcc_except_table",
933                                 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
934                                 COFF::IMAGE_SCN_MEM_READ,
935                                 SectionKind::getReadOnly());
936   // Debug info.
937   DwarfAbbrevSection =
938     getContext().getCOFFSection(".debug_abbrev",
939                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
940                                 COFF::IMAGE_SCN_MEM_READ,
941                                 SectionKind::getMetadata());
942   DwarfInfoSection =
943     getContext().getCOFFSection(".debug_info",
944                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
945                                 COFF::IMAGE_SCN_MEM_READ,
946                                 SectionKind::getMetadata());
947   DwarfLineSection =
948     getContext().getCOFFSection(".debug_line",
949                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
950                                 COFF::IMAGE_SCN_MEM_READ,
951                                 SectionKind::getMetadata());
952   DwarfFrameSection =
953     getContext().getCOFFSection(".debug_frame",
954                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
955                                 COFF::IMAGE_SCN_MEM_READ,
956                                 SectionKind::getMetadata());
957   DwarfPubNamesSection =
958     getContext().getCOFFSection(".debug_pubnames",
959                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
960                                 COFF::IMAGE_SCN_MEM_READ,
961                                 SectionKind::getMetadata());
962   DwarfPubTypesSection =
963     getContext().getCOFFSection(".debug_pubtypes",
964                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
965                                 COFF::IMAGE_SCN_MEM_READ,
966                                 SectionKind::getMetadata());
967   DwarfStrSection =
968     getContext().getCOFFSection(".debug_str",
969                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
970                                 COFF::IMAGE_SCN_MEM_READ,
971                                 SectionKind::getMetadata());
972   DwarfLocSection =
973     getContext().getCOFFSection(".debug_loc",
974                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
975                                 COFF::IMAGE_SCN_MEM_READ,
976                                 SectionKind::getMetadata());
977   DwarfARangesSection =
978     getContext().getCOFFSection(".debug_aranges",
979                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
980                                 COFF::IMAGE_SCN_MEM_READ,
981                                 SectionKind::getMetadata());
982   DwarfRangesSection =
983     getContext().getCOFFSection(".debug_ranges",
984                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
985                                 COFF::IMAGE_SCN_MEM_READ,
986                                 SectionKind::getMetadata());
987   DwarfMacroInfoSection =
988     getContext().getCOFFSection(".debug_macinfo",
989                                 COFF::IMAGE_SCN_MEM_DISCARDABLE |
990                                 COFF::IMAGE_SCN_MEM_READ,
991                                 SectionKind::getMetadata());
992
993   DrectveSection =
994     getContext().getCOFFSection(".drectve",
995                                 COFF::IMAGE_SCN_LNK_INFO,
996                                 SectionKind::getMetadata());
997 }
998
999 const MCSection *TargetLoweringObjectFileCOFF::getEHFrameSection() const {
1000   return getContext().getCOFFSection(".eh_frame",
1001                                      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1002                                      COFF::IMAGE_SCN_MEM_READ |
1003                                      COFF::IMAGE_SCN_MEM_WRITE,
1004                                      SectionKind::getDataRel());
1005 }
1006
1007
1008 static unsigned
1009 getCOFFSectionFlags(SectionKind K) {
1010   unsigned Flags = 0;
1011
1012   if (K.isMetadata())
1013     Flags |=
1014       COFF::IMAGE_SCN_MEM_DISCARDABLE;
1015   else if (K.isText())
1016     Flags |=
1017       COFF::IMAGE_SCN_MEM_EXECUTE |
1018       COFF::IMAGE_SCN_MEM_READ |
1019       COFF::IMAGE_SCN_CNT_CODE;
1020   else if (K.isBSS ())
1021     Flags |=
1022       COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
1023       COFF::IMAGE_SCN_MEM_READ |
1024       COFF::IMAGE_SCN_MEM_WRITE;
1025   else if (K.isReadOnly())
1026     Flags |=
1027       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1028       COFF::IMAGE_SCN_MEM_READ;
1029   else if (K.isWriteable())
1030     Flags |=
1031       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1032       COFF::IMAGE_SCN_MEM_READ |
1033       COFF::IMAGE_SCN_MEM_WRITE;
1034
1035   return Flags;
1036 }
1037
1038 const MCSection *TargetLoweringObjectFileCOFF::
1039 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
1040                          Mangler *Mang, const TargetMachine &TM) const {
1041   return getContext().getCOFFSection(GV->getSection(),
1042                                      getCOFFSectionFlags(Kind),
1043                                      Kind);
1044 }
1045
1046 static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
1047   if (Kind.isText())
1048     return ".text$";
1049   if (Kind.isBSS ())
1050     return ".bss$";
1051   if (Kind.isWriteable())
1052     return ".data$";
1053   return ".rdata$";
1054 }
1055
1056
1057 const MCSection *TargetLoweringObjectFileCOFF::
1058 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
1059                        Mangler *Mang, const TargetMachine &TM) const {
1060   assert(!Kind.isThreadLocal() && "Doesn't support TLS");
1061
1062   // If this global is linkonce/weak and the target handles this by emitting it
1063   // into a 'uniqued' section name, create and return the section now.
1064   if (GV->isWeakForLinker()) {
1065     const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
1066     SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
1067     MCSymbol *Sym = Mang->getSymbol(GV);
1068     Name.append(Sym->getName().begin() + 1, Sym->getName().end());
1069
1070     unsigned Characteristics = getCOFFSectionFlags(Kind);
1071
1072     Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1073
1074     return getContext().getCOFFSection(Name.str(), Characteristics,
1075                           COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
1076   }
1077
1078   if (Kind.isText())
1079     return getTextSection();
1080
1081   return getDataSection();
1082 }
1083