1 //===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
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 implements classes used to handle lowerings specific to common
11 // object file formats.
13 //===----------------------------------------------------------------------===//
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/MCSymbol.h"
27 #include "llvm/Target/Mangler.h"
28 #include "llvm/Target/TargetData.h"
29 #include "llvm/Target/TargetMachine.h"
30 #include "llvm/Target/TargetOptions.h"
31 #include "llvm/Support/Dwarf.h"
32 #include "llvm/Support/ErrorHandling.h"
33 #include "llvm/Support/raw_ostream.h"
34 #include "llvm/ADT/SmallString.h"
35 #include "llvm/ADT/StringExtras.h"
37 using namespace dwarf;
39 //===----------------------------------------------------------------------===//
41 //===----------------------------------------------------------------------===//
43 void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
44 const TargetMachine &TM) {
45 TargetLoweringObjectFile::Initialize(Ctx, TM);
48 getContext().getELFSection(".bss", MCSectionELF::SHT_NOBITS,
49 MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC,
50 SectionKind::getBSS());
53 getContext().getELFSection(".text", MCSectionELF::SHT_PROGBITS,
54 MCSectionELF::SHF_EXECINSTR |
55 MCSectionELF::SHF_ALLOC,
56 SectionKind::getText());
59 getContext().getELFSection(".data", MCSectionELF::SHT_PROGBITS,
60 MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC,
61 SectionKind::getDataRel());
64 getContext().getELFSection(".rodata", MCSectionELF::SHT_PROGBITS,
65 MCSectionELF::SHF_ALLOC,
66 SectionKind::getReadOnly());
69 getContext().getELFSection(".tdata", MCSectionELF::SHT_PROGBITS,
70 MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
71 MCSectionELF::SHF_WRITE,
72 SectionKind::getThreadData());
75 getContext().getELFSection(".tbss", MCSectionELF::SHT_NOBITS,
76 MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
77 MCSectionELF::SHF_WRITE,
78 SectionKind::getThreadBSS());
81 getContext().getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS,
82 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
83 SectionKind::getDataRel());
86 getContext().getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS,
87 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
88 SectionKind::getDataRelLocal());
91 getContext().getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS,
92 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
93 SectionKind::getReadOnlyWithRel());
95 DataRelROLocalSection =
96 getContext().getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS,
97 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
98 SectionKind::getReadOnlyWithRelLocal());
100 MergeableConst4Section =
101 getContext().getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS,
102 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
103 SectionKind::getMergeableConst4());
105 MergeableConst8Section =
106 getContext().getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS,
107 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
108 SectionKind::getMergeableConst8());
110 MergeableConst16Section =
111 getContext().getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS,
112 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
113 SectionKind::getMergeableConst16());
116 getContext().getELFSection(".ctors", MCSectionELF::SHT_PROGBITS,
117 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
118 SectionKind::getDataRel());
121 getContext().getELFSection(".dtors", MCSectionELF::SHT_PROGBITS,
122 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
123 SectionKind::getDataRel());
125 // Exception Handling Sections.
127 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
128 // it contains relocatable pointers. In PIC mode, this is probably a big
129 // runtime hit for C++ apps. Either the contents of the LSDA need to be
130 // adjusted or this should be a data section.
132 getContext().getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS,
133 MCSectionELF::SHF_ALLOC,
134 SectionKind::getReadOnly());
136 getContext().getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS,
137 MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
138 SectionKind::getDataRel());
140 // Debug Info Sections.
142 getContext().getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0,
143 SectionKind::getMetadata());
145 getContext().getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0,
146 SectionKind::getMetadata());
148 getContext().getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0,
149 SectionKind::getMetadata());
151 getContext().getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0,
152 SectionKind::getMetadata());
153 DwarfPubNamesSection =
154 getContext().getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0,
155 SectionKind::getMetadata());
156 DwarfPubTypesSection =
157 getContext().getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0,
158 SectionKind::getMetadata());
160 getContext().getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0,
161 SectionKind::getMetadata());
163 getContext().getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0,
164 SectionKind::getMetadata());
165 DwarfARangesSection =
166 getContext().getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0,
167 SectionKind::getMetadata());
169 getContext().getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0,
170 SectionKind::getMetadata());
171 DwarfMacroInfoSection =
172 getContext().getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0,
173 SectionKind::getMetadata());
178 getELFKindForNamedSection(StringRef Name, SectionKind K) {
179 if (Name.empty() || Name[0] != '.') return K;
181 // Some lame default implementation based on some magic section names.
182 if (Name == ".bss" ||
183 Name.startswith(".bss.") ||
184 Name.startswith(".gnu.linkonce.b.") ||
185 Name.startswith(".llvm.linkonce.b.") ||
187 Name.startswith(".sbss.") ||
188 Name.startswith(".gnu.linkonce.sb.") ||
189 Name.startswith(".llvm.linkonce.sb."))
190 return SectionKind::getBSS();
192 if (Name == ".tdata" ||
193 Name.startswith(".tdata.") ||
194 Name.startswith(".gnu.linkonce.td.") ||
195 Name.startswith(".llvm.linkonce.td."))
196 return SectionKind::getThreadData();
198 if (Name == ".tbss" ||
199 Name.startswith(".tbss.") ||
200 Name.startswith(".gnu.linkonce.tb.") ||
201 Name.startswith(".llvm.linkonce.tb."))
202 return SectionKind::getThreadBSS();
208 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
210 if (Name == ".init_array")
211 return MCSectionELF::SHT_INIT_ARRAY;
213 if (Name == ".fini_array")
214 return MCSectionELF::SHT_FINI_ARRAY;
216 if (Name == ".preinit_array")
217 return MCSectionELF::SHT_PREINIT_ARRAY;
219 if (K.isBSS() || K.isThreadBSS())
220 return MCSectionELF::SHT_NOBITS;
222 return MCSectionELF::SHT_PROGBITS;
227 getELFSectionFlags(SectionKind K) {
231 Flags |= MCSectionELF::SHF_ALLOC;
234 Flags |= MCSectionELF::SHF_EXECINSTR;
237 Flags |= MCSectionELF::SHF_WRITE;
239 if (K.isThreadLocal())
240 Flags |= MCSectionELF::SHF_TLS;
242 // K.isMergeableConst() is left out to honour PR4650
243 if (K.isMergeableCString() || K.isMergeableConst4() ||
244 K.isMergeableConst8() || K.isMergeableConst16())
245 Flags |= MCSectionELF::SHF_MERGE;
247 if (K.isMergeableCString())
248 Flags |= MCSectionELF::SHF_STRINGS;
254 const MCSection *TargetLoweringObjectFileELF::
255 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
256 Mangler *Mang, const TargetMachine &TM) const {
257 StringRef SectionName = GV->getSection();
259 // Infer section flags from the section name if we can.
260 Kind = getELFKindForNamedSection(SectionName, Kind);
262 return getContext().getELFSection(SectionName,
263 getELFSectionType(SectionName, Kind),
264 getELFSectionFlags(Kind), Kind, true);
267 static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
268 if (Kind.isText()) return ".gnu.linkonce.t.";
269 if (Kind.isReadOnly()) return ".gnu.linkonce.r.";
271 if (Kind.isThreadData()) return ".gnu.linkonce.td.";
272 if (Kind.isThreadBSS()) return ".gnu.linkonce.tb.";
274 if (Kind.isDataNoRel()) return ".gnu.linkonce.d.";
275 if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local.";
276 if (Kind.isDataRel()) return ".gnu.linkonce.d.rel.";
277 if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
279 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
280 return ".gnu.linkonce.d.rel.ro.";
283 /// getSectionPrefixForGlobal - Return the section prefix name used by options
284 /// FunctionsSections and DataSections.
285 static const char *getSectionPrefixForGlobal(SectionKind Kind) {
286 if (Kind.isText()) return ".text.";
287 if (Kind.isReadOnly()) return ".rodata.";
289 if (Kind.isThreadData()) return ".tdata.";
290 if (Kind.isThreadBSS()) return ".tbss.";
292 if (Kind.isDataNoRel()) return ".data.";
293 if (Kind.isDataRelLocal()) return ".data.rel.local.";
294 if (Kind.isDataRel()) return ".data.rel.";
295 if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
297 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
298 return ".data.rel.ro.";
302 const MCSection *TargetLoweringObjectFileELF::
303 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
304 Mangler *Mang, const TargetMachine &TM) const {
305 // If we have -ffunction-section or -fdata-section then we should emit the
306 // global value to a uniqued section specifically for it.
307 bool EmitUniquedSection;
309 EmitUniquedSection = TM.getFunctionSections();
311 EmitUniquedSection = TM.getDataSections();
313 // If this global is linkonce/weak and the target handles this by emitting it
314 // into a 'uniqued' section name, create and return the section now.
315 if ((GV->isWeakForLinker() || EmitUniquedSection) &&
316 !Kind.isCommon() && !Kind.isBSS()) {
318 if (GV->isWeakForLinker())
319 Prefix = getSectionPrefixForUniqueGlobal(Kind);
321 assert(EmitUniquedSection);
322 Prefix = getSectionPrefixForGlobal(Kind);
325 SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
326 MCSymbol *Sym = Mang->getSymbol(GV);
327 Name.append(Sym->getName().begin(), Sym->getName().end());
328 return getContext().getELFSection(Name.str(),
329 getELFSectionType(Name.str(), Kind),
330 getELFSectionFlags(Kind), Kind);
333 if (Kind.isText()) return TextSection;
335 if (Kind.isMergeable1ByteCString() ||
336 Kind.isMergeable2ByteCString() ||
337 Kind.isMergeable4ByteCString()) {
339 // We also need alignment here.
340 // FIXME: this is getting the alignment of the character, not the
341 // alignment of the global!
343 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
345 const char *SizeSpec = ".rodata.str1.";
346 if (Kind.isMergeable2ByteCString())
347 SizeSpec = ".rodata.str2.";
348 else if (Kind.isMergeable4ByteCString())
349 SizeSpec = ".rodata.str4.";
351 assert(Kind.isMergeable1ByteCString() && "unknown string width");
354 std::string Name = SizeSpec + utostr(Align);
355 return getContext().getELFSection(Name, MCSectionELF::SHT_PROGBITS,
356 MCSectionELF::SHF_ALLOC |
357 MCSectionELF::SHF_MERGE |
358 MCSectionELF::SHF_STRINGS,
362 if (Kind.isMergeableConst()) {
363 if (Kind.isMergeableConst4() && MergeableConst4Section)
364 return MergeableConst4Section;
365 if (Kind.isMergeableConst8() && MergeableConst8Section)
366 return MergeableConst8Section;
367 if (Kind.isMergeableConst16() && MergeableConst16Section)
368 return MergeableConst16Section;
369 return ReadOnlySection; // .const
372 if (Kind.isReadOnly()) return ReadOnlySection;
374 if (Kind.isThreadData()) return TLSDataSection;
375 if (Kind.isThreadBSS()) return TLSBSSSection;
377 // Note: we claim that common symbols are put in BSSSection, but they are
378 // really emitted with the magic .comm directive, which creates a symbol table
379 // entry but not a section.
380 if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
382 if (Kind.isDataNoRel()) return DataSection;
383 if (Kind.isDataRelLocal()) return DataRelLocalSection;
384 if (Kind.isDataRel()) return DataRelSection;
385 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
387 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
388 return DataRelROSection;
391 /// getSectionForConstant - Given a mergeable constant with the
392 /// specified size and relocation information, return a section that it
393 /// should be placed in.
394 const MCSection *TargetLoweringObjectFileELF::
395 getSectionForConstant(SectionKind Kind) const {
396 if (Kind.isMergeableConst4() && MergeableConst4Section)
397 return MergeableConst4Section;
398 if (Kind.isMergeableConst8() && MergeableConst8Section)
399 return MergeableConst8Section;
400 if (Kind.isMergeableConst16() && MergeableConst16Section)
401 return MergeableConst16Section;
402 if (Kind.isReadOnly())
403 return ReadOnlySection;
405 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
406 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
407 return DataRelROSection;
410 const MCExpr *TargetLoweringObjectFileELF::
411 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
412 MachineModuleInfo *MMI,
413 unsigned Encoding, MCStreamer &Streamer) const {
415 if (Encoding & dwarf::DW_EH_PE_indirect) {
416 MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
418 SmallString<128> Name;
419 Mang->getNameWithPrefix(Name, GV, true);
422 // Add information about the stub reference to ELFMMI so that the stub
423 // gets emitted by the asmprinter.
424 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
425 MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
426 if (StubSym.getPointer() == 0) {
427 MCSymbol *Sym = Mang->getSymbol(GV);
428 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
431 return TargetLoweringObjectFile::
432 getExprForDwarfReference(SSym, Mang, MMI,
433 Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
436 return TargetLoweringObjectFile::
437 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
440 //===----------------------------------------------------------------------===//
442 //===----------------------------------------------------------------------===//
444 void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
445 const TargetMachine &TM) {
446 // _foo.eh symbols are currently always exported so that the linker knows
447 // about them. This is not necessary on 10.6 and later, but it
448 // doesn't hurt anything.
449 // FIXME: I need to get this from Triple.
450 IsFunctionEHSymbolGlobal = true;
451 IsFunctionEHFrameSymbolPrivate = false;
452 SupportsWeakOmittedEHFrame = false;
454 TargetLoweringObjectFile::Initialize(Ctx, TM);
457 = getContext().getMachOSection("__TEXT", "__text",
458 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
459 SectionKind::getText());
461 = getContext().getMachOSection("__DATA", "__data", 0,
462 SectionKind::getDataRel());
464 TLSDataSection // .tdata
465 = getContext().getMachOSection("__DATA", "__thread_data",
466 MCSectionMachO::S_THREAD_LOCAL_REGULAR,
467 SectionKind::getDataRel());
468 TLSBSSSection // .tbss
469 = getContext().getMachOSection("__DATA", "__thread_bss",
470 MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
471 SectionKind::getThreadBSS());
473 // TODO: Verify datarel below.
474 TLSTLVSection // .tlv
475 = getContext().getMachOSection("__DATA", "__thread_vars",
476 MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
477 SectionKind::getDataRel());
480 = getContext().getMachOSection("__DATA", "__thread_init",
481 MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
482 SectionKind::getDataRel());
484 CStringSection // .cstring
485 = getContext().getMachOSection("__TEXT", "__cstring",
486 MCSectionMachO::S_CSTRING_LITERALS,
487 SectionKind::getMergeable1ByteCString());
489 = getContext().getMachOSection("__TEXT","__ustring", 0,
490 SectionKind::getMergeable2ByteCString());
491 FourByteConstantSection // .literal4
492 = getContext().getMachOSection("__TEXT", "__literal4",
493 MCSectionMachO::S_4BYTE_LITERALS,
494 SectionKind::getMergeableConst4());
495 EightByteConstantSection // .literal8
496 = getContext().getMachOSection("__TEXT", "__literal8",
497 MCSectionMachO::S_8BYTE_LITERALS,
498 SectionKind::getMergeableConst8());
500 // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
501 // to using it in -static mode.
502 SixteenByteConstantSection = 0;
503 if (TM.getRelocationModel() != Reloc::Static &&
504 TM.getTargetData()->getPointerSize() == 32)
505 SixteenByteConstantSection = // .literal16
506 getContext().getMachOSection("__TEXT", "__literal16",
507 MCSectionMachO::S_16BYTE_LITERALS,
508 SectionKind::getMergeableConst16());
510 ReadOnlySection // .const
511 = getContext().getMachOSection("__TEXT", "__const", 0,
512 SectionKind::getReadOnly());
515 = getContext().getMachOSection("__TEXT", "__textcoal_nt",
516 MCSectionMachO::S_COALESCED |
517 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
518 SectionKind::getText());
520 = getContext().getMachOSection("__TEXT", "__const_coal",
521 MCSectionMachO::S_COALESCED,
522 SectionKind::getText());
524 = getContext().getMachOSection("__DATA","__const_coal",
525 MCSectionMachO::S_COALESCED,
526 SectionKind::getText());
527 ConstDataSection // .const_data
528 = getContext().getMachOSection("__DATA", "__const", 0,
529 SectionKind::getReadOnlyWithRel());
531 = getContext().getMachOSection("__DATA","__datacoal_nt",
532 MCSectionMachO::S_COALESCED,
533 SectionKind::getDataRel());
535 = getContext().getMachOSection("__DATA","__common",
536 MCSectionMachO::S_ZEROFILL,
537 SectionKind::getBSS());
539 = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
540 SectionKind::getBSS());
543 LazySymbolPointerSection
544 = getContext().getMachOSection("__DATA", "__la_symbol_ptr",
545 MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
546 SectionKind::getMetadata());
547 NonLazySymbolPointerSection
548 = getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
549 MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
550 SectionKind::getMetadata());
552 if (TM.getRelocationModel() == Reloc::Static) {
554 = getContext().getMachOSection("__TEXT", "__constructor", 0,
555 SectionKind::getDataRel());
557 = getContext().getMachOSection("__TEXT", "__destructor", 0,
558 SectionKind::getDataRel());
561 = getContext().getMachOSection("__DATA", "__mod_init_func",
562 MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
563 SectionKind::getDataRel());
565 = getContext().getMachOSection("__DATA", "__mod_term_func",
566 MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
567 SectionKind::getDataRel());
570 // Exception Handling.
571 LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
572 SectionKind::getReadOnlyWithRel());
574 getContext().getMachOSection("__TEXT", "__eh_frame",
575 MCSectionMachO::S_COALESCED |
576 MCSectionMachO::S_ATTR_NO_TOC |
577 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
578 MCSectionMachO::S_ATTR_LIVE_SUPPORT,
579 SectionKind::getReadOnly());
581 // Debug Information.
583 getContext().getMachOSection("__DWARF", "__debug_abbrev",
584 MCSectionMachO::S_ATTR_DEBUG,
585 SectionKind::getMetadata());
587 getContext().getMachOSection("__DWARF", "__debug_info",
588 MCSectionMachO::S_ATTR_DEBUG,
589 SectionKind::getMetadata());
591 getContext().getMachOSection("__DWARF", "__debug_line",
592 MCSectionMachO::S_ATTR_DEBUG,
593 SectionKind::getMetadata());
595 getContext().getMachOSection("__DWARF", "__debug_frame",
596 MCSectionMachO::S_ATTR_DEBUG,
597 SectionKind::getMetadata());
598 DwarfPubNamesSection =
599 getContext().getMachOSection("__DWARF", "__debug_pubnames",
600 MCSectionMachO::S_ATTR_DEBUG,
601 SectionKind::getMetadata());
602 DwarfPubTypesSection =
603 getContext().getMachOSection("__DWARF", "__debug_pubtypes",
604 MCSectionMachO::S_ATTR_DEBUG,
605 SectionKind::getMetadata());
607 getContext().getMachOSection("__DWARF", "__debug_str",
608 MCSectionMachO::S_ATTR_DEBUG,
609 SectionKind::getMetadata());
611 getContext().getMachOSection("__DWARF", "__debug_loc",
612 MCSectionMachO::S_ATTR_DEBUG,
613 SectionKind::getMetadata());
614 DwarfARangesSection =
615 getContext().getMachOSection("__DWARF", "__debug_aranges",
616 MCSectionMachO::S_ATTR_DEBUG,
617 SectionKind::getMetadata());
619 getContext().getMachOSection("__DWARF", "__debug_ranges",
620 MCSectionMachO::S_ATTR_DEBUG,
621 SectionKind::getMetadata());
622 DwarfMacroInfoSection =
623 getContext().getMachOSection("__DWARF", "__debug_macinfo",
624 MCSectionMachO::S_ATTR_DEBUG,
625 SectionKind::getMetadata());
626 DwarfDebugInlineSection =
627 getContext().getMachOSection("__DWARF", "__debug_inlined",
628 MCSectionMachO::S_ATTR_DEBUG,
629 SectionKind::getMetadata());
632 const MCSection *TargetLoweringObjectFileMachO::
633 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
634 Mangler *Mang, const TargetMachine &TM) const {
635 // Parse the section specifier and create it if valid.
636 StringRef Segment, Section;
637 unsigned TAA, StubSize;
638 std::string ErrorCode =
639 MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
641 if (!ErrorCode.empty()) {
642 // If invalid, report the error with report_fatal_error.
643 report_fatal_error("Global variable '" + GV->getNameStr() +
644 "' has an invalid section specifier '" + GV->getSection()+
645 "': " + ErrorCode + ".");
646 // Fall back to dropping it into the data section.
651 const MCSectionMachO *S =
652 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
654 // Okay, now that we got the section, verify that the TAA & StubSize agree.
655 // If the user declared multiple globals with different section flags, we need
656 // to reject it here.
657 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
658 // If invalid, report the error with report_fatal_error.
659 report_fatal_error("Global variable '" + GV->getNameStr() +
660 "' section type or attributes does not match previous"
661 " section specifier");
667 const MCSection *TargetLoweringObjectFileMachO::
668 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
669 Mangler *Mang, const TargetMachine &TM) const {
670 assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
673 return GV->isWeakForLinker() ? TextCoalSection : TextSection;
675 // If this is weak/linkonce, put this in a coalescable section, either in text
676 // or data depending on if it is writable.
677 if (GV->isWeakForLinker()) {
678 if (Kind.isReadOnly())
679 return ConstTextCoalSection;
680 return DataCoalSection;
683 // FIXME: Alignment check should be handled by section classifier.
684 if (Kind.isMergeable1ByteCString() &&
685 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
686 return CStringSection;
688 // Do not put 16-bit arrays in the UString section if they have an
689 // externally visible label, this runs into issues with certain linker
691 if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
692 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
693 return UStringSection;
695 if (Kind.isMergeableConst()) {
696 if (Kind.isMergeableConst4())
697 return FourByteConstantSection;
698 if (Kind.isMergeableConst8())
699 return EightByteConstantSection;
700 if (Kind.isMergeableConst16() && SixteenByteConstantSection)
701 return SixteenByteConstantSection;
704 // Otherwise, if it is readonly, but not something we can specially optimize,
705 // just drop it in .const.
706 if (Kind.isReadOnly())
707 return ReadOnlySection;
709 // If this is marked const, put it into a const section. But if the dynamic
710 // linker needs to write to it, put it in the data segment.
711 if (Kind.isReadOnlyWithRel())
712 return ConstDataSection;
714 // Put zero initialized globals with strong external linkage in the
715 // DATA, __common section with the .zerofill directive.
716 if (Kind.isBSSExtern())
717 return DataCommonSection;
719 // Put zero initialized globals with local linkage in __DATA,__bss directive
720 // with the .zerofill directive (aka .lcomm).
721 if (Kind.isBSSLocal())
722 return DataBSSSection;
724 // Otherwise, just drop the variable in the normal data section.
729 TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
730 // If this constant requires a relocation, we have to put it in the data
731 // segment, not in the text segment.
732 if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
733 return ConstDataSection;
735 if (Kind.isMergeableConst4())
736 return FourByteConstantSection;
737 if (Kind.isMergeableConst8())
738 return EightByteConstantSection;
739 if (Kind.isMergeableConst16() && SixteenByteConstantSection)
740 return SixteenByteConstantSection;
741 return ReadOnlySection; // .const
744 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
745 /// not to emit the UsedDirective for some symbols in llvm.used.
746 // FIXME: REMOVE this (rdar://7071300)
747 bool TargetLoweringObjectFileMachO::
748 shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
749 /// On Darwin, internally linked data beginning with "L" or "l" does not have
750 /// the directive emitted (this occurs in ObjC metadata).
751 if (!GV) return false;
753 // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
754 if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
755 // FIXME: ObjC metadata is currently emitted as internal symbols that have
756 // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and
757 // this horrible hack can go away.
758 MCSymbol *Sym = Mang->getSymbol(GV);
759 if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
766 const MCExpr *TargetLoweringObjectFileMachO::
767 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
768 MachineModuleInfo *MMI, unsigned Encoding,
769 MCStreamer &Streamer) const {
770 // The mach-o version of this method defaults to returning a stub reference.
772 if (Encoding & DW_EH_PE_indirect) {
773 MachineModuleInfoMachO &MachOMMI =
774 MMI->getObjFileInfo<MachineModuleInfoMachO>();
776 SmallString<128> Name;
777 Mang->getNameWithPrefix(Name, GV, true);
778 Name += "$non_lazy_ptr";
780 // Add information about the stub reference to MachOMMI so that the stub
781 // gets emitted by the asmprinter.
782 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
783 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
784 if (StubSym.getPointer() == 0) {
785 MCSymbol *Sym = Mang->getSymbol(GV);
786 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
789 return TargetLoweringObjectFile::
790 getExprForDwarfReference(SSym, Mang, MMI,
791 Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
794 return TargetLoweringObjectFile::
795 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
798 unsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
799 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
802 unsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
803 return DW_EH_PE_pcrel;
806 unsigned TargetLoweringObjectFileMachO::getFDEEncoding() const {
807 return DW_EH_PE_pcrel;
810 unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
811 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
814 //===----------------------------------------------------------------------===//
816 //===----------------------------------------------------------------------===//
818 void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
819 const TargetMachine &TM) {
820 TargetLoweringObjectFile::Initialize(Ctx, TM);
822 getContext().getCOFFSection(".text",
823 MCSectionCOFF::IMAGE_SCN_CNT_CODE |
824 MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
825 MCSectionCOFF::IMAGE_SCN_MEM_READ,
826 SectionKind::getText());
828 getContext().getCOFFSection(".data",
829 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
830 MCSectionCOFF::IMAGE_SCN_MEM_READ |
831 MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
832 SectionKind::getDataRel());
834 getContext().getCOFFSection(".rdata",
835 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
836 MCSectionCOFF::IMAGE_SCN_MEM_READ,
837 SectionKind::getReadOnly());
839 getContext().getCOFFSection(".ctors",
840 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
841 MCSectionCOFF::IMAGE_SCN_MEM_READ |
842 MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
843 SectionKind::getDataRel());
845 getContext().getCOFFSection(".dtors",
846 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
847 MCSectionCOFF::IMAGE_SCN_MEM_READ |
848 MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
849 SectionKind::getDataRel());
851 // FIXME: We're emitting LSDA info into a readonly section on COFF, even
852 // though it contains relocatable pointers. In PIC mode, this is probably a
853 // big runtime hit for C++ apps. Either the contents of the LSDA need to be
854 // adjusted or this should be a data section.
856 getContext().getCOFFSection(".gcc_except_table",
857 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
858 MCSectionCOFF::IMAGE_SCN_MEM_READ,
859 SectionKind::getReadOnly());
861 getContext().getCOFFSection(".eh_frame",
862 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
863 MCSectionCOFF::IMAGE_SCN_MEM_READ |
864 MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
865 SectionKind::getDataRel());
869 getContext().getCOFFSection(".debug_abbrev",
870 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
871 MCSectionCOFF::IMAGE_SCN_MEM_READ,
872 SectionKind::getMetadata());
874 getContext().getCOFFSection(".debug_info",
875 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
876 MCSectionCOFF::IMAGE_SCN_MEM_READ,
877 SectionKind::getMetadata());
879 getContext().getCOFFSection(".debug_line",
880 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
881 MCSectionCOFF::IMAGE_SCN_MEM_READ,
882 SectionKind::getMetadata());
884 getContext().getCOFFSection(".debug_frame",
885 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
886 MCSectionCOFF::IMAGE_SCN_MEM_READ,
887 SectionKind::getMetadata());
888 DwarfPubNamesSection =
889 getContext().getCOFFSection(".debug_pubnames",
890 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
891 MCSectionCOFF::IMAGE_SCN_MEM_READ,
892 SectionKind::getMetadata());
893 DwarfPubTypesSection =
894 getContext().getCOFFSection(".debug_pubtypes",
895 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
896 MCSectionCOFF::IMAGE_SCN_MEM_READ,
897 SectionKind::getMetadata());
899 getContext().getCOFFSection(".debug_str",
900 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
901 MCSectionCOFF::IMAGE_SCN_MEM_READ,
902 SectionKind::getMetadata());
904 getContext().getCOFFSection(".debug_loc",
905 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
906 MCSectionCOFF::IMAGE_SCN_MEM_READ,
907 SectionKind::getMetadata());
908 DwarfARangesSection =
909 getContext().getCOFFSection(".debug_aranges",
910 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
911 MCSectionCOFF::IMAGE_SCN_MEM_READ,
912 SectionKind::getMetadata());
914 getContext().getCOFFSection(".debug_ranges",
915 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
916 MCSectionCOFF::IMAGE_SCN_MEM_READ,
917 SectionKind::getMetadata());
918 DwarfMacroInfoSection =
919 getContext().getCOFFSection(".debug_macinfo",
920 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
921 MCSectionCOFF::IMAGE_SCN_MEM_READ,
922 SectionKind::getMetadata());
925 getContext().getCOFFSection(".drectve",
926 MCSectionCOFF::IMAGE_SCN_LNK_INFO,
927 SectionKind::getMetadata());
931 getCOFFSectionFlags(SectionKind K) {
936 MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE;
939 MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
940 MCSectionCOFF::IMAGE_SCN_CNT_CODE;
943 MCSectionCOFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
944 MCSectionCOFF::IMAGE_SCN_MEM_READ |
945 MCSectionCOFF::IMAGE_SCN_MEM_WRITE;
946 else if (K.isReadOnly())
948 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
949 MCSectionCOFF::IMAGE_SCN_MEM_READ;
950 else if (K.isWriteable())
952 MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
953 MCSectionCOFF::IMAGE_SCN_MEM_READ |
954 MCSectionCOFF::IMAGE_SCN_MEM_WRITE;
959 const MCSection *TargetLoweringObjectFileCOFF::
960 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
961 Mangler *Mang, const TargetMachine &TM) const {
962 return getContext().getCOFFSection(GV->getSection(),
963 getCOFFSectionFlags(Kind),
967 static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
969 return ".text$linkonce";
971 return ".bss$linkonce";
972 if (Kind.isWriteable())
973 return ".data$linkonce";
974 return ".rdata$linkonce";
978 const MCSection *TargetLoweringObjectFileCOFF::
979 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
980 Mangler *Mang, const TargetMachine &TM) const {
981 assert(!Kind.isThreadLocal() && "Doesn't support TLS");
983 // If this global is linkonce/weak and the target handles this by emitting it
984 // into a 'uniqued' section name, create and return the section now.
985 if (GV->isWeakForLinker()) {
986 const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
987 SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
988 MCSymbol *Sym = Mang->getSymbol(GV);
989 Name.append(Sym->getName().begin(), Sym->getName().end());
991 unsigned Characteristics = getCOFFSectionFlags(Kind);
993 Characteristics |= MCSectionCOFF::IMAGE_SCN_LNK_COMDAT;
995 return getContext().getCOFFSection(Name.str(), Characteristics,
996 MCSectionCOFF::IMAGE_COMDAT_SELECT_EXACT_MATCH, Kind);
1000 return getTextSection();
1002 return getDataSection();