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/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"
40 using namespace dwarf;
42 //===----------------------------------------------------------------------===//
44 //===----------------------------------------------------------------------===//
47 TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
49 MachineModuleInfo *MMI) const {
50 unsigned Encoding = getPersonalityEncoding();
51 switch (Encoding & 0x70) {
53 report_fatal_error("We do not support this DWARF encoding yet!");
54 case dwarf::DW_EH_PE_absptr:
55 return Mang->getSymbol(GV);
57 case dwarf::DW_EH_PE_pcrel: {
58 return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
59 Mang->getSymbol(GV)->getName());
65 void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
66 const TargetMachine &TM,
67 const MCSymbol *Sym) const {
68 SmallString<64> NameData("DW.ref.");
69 NameData += Sym->getName();
70 MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
71 Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
72 Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
73 StringRef Prefix = ".data.";
74 NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
75 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
76 const MCSection *Sec = getContext().getELFSection(NameData,
79 SectionKind::getDataRel(),
81 Streamer.SwitchSection(Sec);
82 Streamer.EmitValueToAlignment(8);
83 Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
84 const MCExpr *E = MCConstantExpr::Create(8, getContext());
85 Streamer.EmitELFSize(Label, E);
86 Streamer.EmitLabel(Label);
88 unsigned Size = TM.getTargetData()->getPointerSize();
89 Streamer.EmitSymbolValue(Sym, Size);
93 getELFKindForNamedSection(StringRef Name, SectionKind K) {
94 // N.B.: The defaults used in here are no the same ones used in MC.
95 // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
96 // both gas and MC will produce a section with no flags. Given
97 // section(".eh_frame") gcc will produce
98 // .section .eh_frame,"a",@progbits
99 if (Name.empty() || Name[0] != '.') return K;
101 // Some lame default implementation based on some magic section names.
102 if (Name == ".bss" ||
103 Name.startswith(".bss.") ||
104 Name.startswith(".gnu.linkonce.b.") ||
105 Name.startswith(".llvm.linkonce.b.") ||
107 Name.startswith(".sbss.") ||
108 Name.startswith(".gnu.linkonce.sb.") ||
109 Name.startswith(".llvm.linkonce.sb."))
110 return SectionKind::getBSS();
112 if (Name == ".tdata" ||
113 Name.startswith(".tdata.") ||
114 Name.startswith(".gnu.linkonce.td.") ||
115 Name.startswith(".llvm.linkonce.td."))
116 return SectionKind::getThreadData();
118 if (Name == ".tbss" ||
119 Name.startswith(".tbss.") ||
120 Name.startswith(".gnu.linkonce.tb.") ||
121 Name.startswith(".llvm.linkonce.tb."))
122 return SectionKind::getThreadBSS();
128 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
130 if (Name == ".init_array")
131 return ELF::SHT_INIT_ARRAY;
133 if (Name == ".fini_array")
134 return ELF::SHT_FINI_ARRAY;
136 if (Name == ".preinit_array")
137 return ELF::SHT_PREINIT_ARRAY;
139 if (K.isBSS() || K.isThreadBSS())
140 return ELF::SHT_NOBITS;
142 return ELF::SHT_PROGBITS;
147 getELFSectionFlags(SectionKind K) {
151 Flags |= ELF::SHF_ALLOC;
154 Flags |= ELF::SHF_EXECINSTR;
157 Flags |= ELF::SHF_WRITE;
159 if (K.isThreadLocal())
160 Flags |= ELF::SHF_TLS;
162 // K.isMergeableConst() is left out to honour PR4650
163 if (K.isMergeableCString() || K.isMergeableConst4() ||
164 K.isMergeableConst8() || K.isMergeableConst16())
165 Flags |= ELF::SHF_MERGE;
167 if (K.isMergeableCString())
168 Flags |= ELF::SHF_STRINGS;
174 const MCSection *TargetLoweringObjectFileELF::
175 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
176 Mangler *Mang, const TargetMachine &TM) const {
177 StringRef SectionName = GV->getSection();
179 // Infer section flags from the section name if we can.
180 Kind = getELFKindForNamedSection(SectionName, Kind);
182 return getContext().getELFSection(SectionName,
183 getELFSectionType(SectionName, Kind),
184 getELFSectionFlags(Kind), Kind);
187 /// getSectionPrefixForGlobal - Return the section prefix name used by options
188 /// FunctionsSections and DataSections.
189 static const char *getSectionPrefixForGlobal(SectionKind Kind) {
190 if (Kind.isText()) return ".text.";
191 if (Kind.isReadOnly()) return ".rodata.";
193 if (Kind.isThreadData()) return ".tdata.";
194 if (Kind.isThreadBSS()) return ".tbss.";
196 if (Kind.isDataNoRel()) return ".data.";
197 if (Kind.isDataRelLocal()) return ".data.rel.local.";
198 if (Kind.isDataRel()) return ".data.rel.";
199 if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
201 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
202 return ".data.rel.ro.";
206 const MCSection *TargetLoweringObjectFileELF::
207 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
208 Mangler *Mang, const TargetMachine &TM) const {
209 // If we have -ffunction-section or -fdata-section then we should emit the
210 // global value to a uniqued section specifically for it.
211 bool EmitUniquedSection;
213 EmitUniquedSection = TM.getFunctionSections();
215 EmitUniquedSection = TM.getDataSections();
217 // If this global is linkonce/weak and the target handles this by emitting it
218 // into a 'uniqued' section name, create and return the section now.
219 if ((GV->isWeakForLinker() || EmitUniquedSection) &&
220 !Kind.isCommon() && !Kind.isBSS()) {
222 Prefix = getSectionPrefixForGlobal(Kind);
224 SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
225 MCSymbol *Sym = Mang->getSymbol(GV);
226 Name.append(Sym->getName().begin(), Sym->getName().end());
227 StringRef Group = "";
228 unsigned Flags = getELFSectionFlags(Kind);
229 if (GV->isWeakForLinker()) {
230 Group = Sym->getName();
231 Flags |= ELF::SHF_GROUP;
234 return getContext().getELFSection(Name.str(),
235 getELFSectionType(Name.str(), Kind),
236 Flags, Kind, 0, Group);
239 if (Kind.isText()) return TextSection;
241 if (Kind.isMergeable1ByteCString() ||
242 Kind.isMergeable2ByteCString() ||
243 Kind.isMergeable4ByteCString()) {
245 // We also need alignment here.
246 // FIXME: this is getting the alignment of the character, not the
247 // alignment of the global!
249 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
251 const char *SizeSpec = ".rodata.str1.";
252 if (Kind.isMergeable2ByteCString())
253 SizeSpec = ".rodata.str2.";
254 else if (Kind.isMergeable4ByteCString())
255 SizeSpec = ".rodata.str4.";
257 assert(Kind.isMergeable1ByteCString() && "unknown string width");
260 std::string Name = SizeSpec + utostr(Align);
261 return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
268 if (Kind.isMergeableConst()) {
269 if (Kind.isMergeableConst4() && MergeableConst4Section)
270 return MergeableConst4Section;
271 if (Kind.isMergeableConst8() && MergeableConst8Section)
272 return MergeableConst8Section;
273 if (Kind.isMergeableConst16() && MergeableConst16Section)
274 return MergeableConst16Section;
275 return ReadOnlySection; // .const
278 if (Kind.isReadOnly()) return ReadOnlySection;
280 if (Kind.isThreadData()) return TLSDataSection;
281 if (Kind.isThreadBSS()) return TLSBSSSection;
283 // Note: we claim that common symbols are put in BSSSection, but they are
284 // really emitted with the magic .comm directive, which creates a symbol table
285 // entry but not a section.
286 if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
288 if (Kind.isDataNoRel()) return DataSection;
289 if (Kind.isDataRelLocal()) return DataRelLocalSection;
290 if (Kind.isDataRel()) return DataRelSection;
291 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
293 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
294 return DataRelROSection;
297 /// getSectionForConstant - Given a mergeable constant with the
298 /// specified size and relocation information, return a section that it
299 /// should be placed in.
300 const MCSection *TargetLoweringObjectFileELF::
301 getSectionForConstant(SectionKind Kind) const {
302 if (Kind.isMergeableConst4() && MergeableConst4Section)
303 return MergeableConst4Section;
304 if (Kind.isMergeableConst8() && MergeableConst8Section)
305 return MergeableConst8Section;
306 if (Kind.isMergeableConst16() && MergeableConst16Section)
307 return MergeableConst16Section;
308 if (Kind.isReadOnly())
309 return ReadOnlySection;
311 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
312 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
313 return DataRelROSection;
316 const MCExpr *TargetLoweringObjectFileELF::
317 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
318 MachineModuleInfo *MMI,
319 unsigned Encoding, MCStreamer &Streamer) const {
321 if (Encoding & dwarf::DW_EH_PE_indirect) {
322 MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
324 SmallString<128> Name;
325 Mang->getNameWithPrefix(Name, GV, true);
328 // Add information about the stub reference to ELFMMI so that the stub
329 // gets emitted by the asmprinter.
330 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
331 MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
332 if (StubSym.getPointer() == 0) {
333 MCSymbol *Sym = Mang->getSymbol(GV);
334 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
337 return TargetLoweringObjectFile::
338 getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
341 return TargetLoweringObjectFile::
342 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
345 //===----------------------------------------------------------------------===//
347 //===----------------------------------------------------------------------===//
349 const MCSection *TargetLoweringObjectFileMachO::
350 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
351 Mangler *Mang, const TargetMachine &TM) const {
352 // Parse the section specifier and create it if valid.
353 StringRef Segment, Section;
354 unsigned TAA = 0, StubSize = 0;
356 std::string ErrorCode =
357 MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
358 TAA, TAAParsed, StubSize);
359 if (!ErrorCode.empty()) {
360 // If invalid, report the error with report_fatal_error.
361 report_fatal_error("Global variable '" + GV->getNameStr() +
362 "' has an invalid section specifier '" + GV->getSection()+
363 "': " + ErrorCode + ".");
364 // Fall back to dropping it into the data section.
369 const MCSectionMachO *S =
370 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
372 // If TAA wasn't set by ParseSectionSpecifier() above,
373 // use the value returned by getMachOSection() as a default.
375 TAA = S->getTypeAndAttributes();
377 // Okay, now that we got the section, verify that the TAA & StubSize agree.
378 // If the user declared multiple globals with different section flags, we need
379 // to reject it here.
380 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
381 // If invalid, report the error with report_fatal_error.
382 report_fatal_error("Global variable '" + GV->getNameStr() +
383 "' section type or attributes does not match previous"
384 " section specifier");
390 const MCSection *TargetLoweringObjectFileMachO::
391 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
392 Mangler *Mang, const TargetMachine &TM) const {
394 // Handle thread local data.
395 if (Kind.isThreadBSS()) return TLSBSSSection;
396 if (Kind.isThreadData()) return TLSDataSection;
399 return GV->isWeakForLinker() ? TextCoalSection : TextSection;
401 // If this is weak/linkonce, put this in a coalescable section, either in text
402 // or data depending on if it is writable.
403 if (GV->isWeakForLinker()) {
404 if (Kind.isReadOnly())
405 return ConstTextCoalSection;
406 return DataCoalSection;
409 // FIXME: Alignment check should be handled by section classifier.
410 if (Kind.isMergeable1ByteCString() &&
411 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
412 return CStringSection;
414 // Do not put 16-bit arrays in the UString section if they have an
415 // externally visible label, this runs into issues with certain linker
417 if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
418 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
419 return UStringSection;
421 if (Kind.isMergeableConst()) {
422 if (Kind.isMergeableConst4())
423 return FourByteConstantSection;
424 if (Kind.isMergeableConst8())
425 return EightByteConstantSection;
426 if (Kind.isMergeableConst16() && SixteenByteConstantSection)
427 return SixteenByteConstantSection;
430 // Otherwise, if it is readonly, but not something we can specially optimize,
431 // just drop it in .const.
432 if (Kind.isReadOnly())
433 return ReadOnlySection;
435 // If this is marked const, put it into a const section. But if the dynamic
436 // linker needs to write to it, put it in the data segment.
437 if (Kind.isReadOnlyWithRel())
438 return ConstDataSection;
440 // Put zero initialized globals with strong external linkage in the
441 // DATA, __common section with the .zerofill directive.
442 if (Kind.isBSSExtern())
443 return DataCommonSection;
445 // Put zero initialized globals with local linkage in __DATA,__bss directive
446 // with the .zerofill directive (aka .lcomm).
447 if (Kind.isBSSLocal())
448 return DataBSSSection;
450 // Otherwise, just drop the variable in the normal data section.
455 TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
456 // If this constant requires a relocation, we have to put it in the data
457 // segment, not in the text segment.
458 if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
459 return ConstDataSection;
461 if (Kind.isMergeableConst4())
462 return FourByteConstantSection;
463 if (Kind.isMergeableConst8())
464 return EightByteConstantSection;
465 if (Kind.isMergeableConst16() && SixteenByteConstantSection)
466 return SixteenByteConstantSection;
467 return ReadOnlySection; // .const
470 /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
471 /// not to emit the UsedDirective for some symbols in llvm.used.
472 // FIXME: REMOVE this (rdar://7071300)
473 bool TargetLoweringObjectFileMachO::
474 shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
475 /// On Darwin, internally linked data beginning with "L" or "l" does not have
476 /// the directive emitted (this occurs in ObjC metadata).
477 if (!GV) return false;
479 // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
480 if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
481 // FIXME: ObjC metadata is currently emitted as internal symbols that have
482 // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and
483 // this horrible hack can go away.
484 MCSymbol *Sym = Mang->getSymbol(GV);
485 if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
492 const MCExpr *TargetLoweringObjectFileMachO::
493 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
494 MachineModuleInfo *MMI, unsigned Encoding,
495 MCStreamer &Streamer) const {
496 // The mach-o version of this method defaults to returning a stub reference.
498 if (Encoding & DW_EH_PE_indirect) {
499 MachineModuleInfoMachO &MachOMMI =
500 MMI->getObjFileInfo<MachineModuleInfoMachO>();
502 SmallString<128> Name;
503 Mang->getNameWithPrefix(Name, GV, true);
504 Name += "$non_lazy_ptr";
506 // Add information about the stub reference to MachOMMI so that the stub
507 // gets emitted by the asmprinter.
508 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
509 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
510 if (StubSym.getPointer() == 0) {
511 MCSymbol *Sym = Mang->getSymbol(GV);
512 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
515 return TargetLoweringObjectFile::
516 getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
519 return TargetLoweringObjectFile::
520 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
523 MCSymbol *TargetLoweringObjectFileMachO::
524 getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
525 MachineModuleInfo *MMI) const {
526 // The mach-o version of this method defaults to returning a stub reference.
527 MachineModuleInfoMachO &MachOMMI =
528 MMI->getObjFileInfo<MachineModuleInfoMachO>();
530 SmallString<128> Name;
531 Mang->getNameWithPrefix(Name, GV, true);
532 Name += "$non_lazy_ptr";
534 // Add information about the stub reference to MachOMMI so that the stub
535 // gets emitted by the asmprinter.
536 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
537 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
538 if (StubSym.getPointer() == 0) {
539 MCSymbol *Sym = Mang->getSymbol(GV);
540 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
546 //===----------------------------------------------------------------------===//
548 //===----------------------------------------------------------------------===//
551 getCOFFSectionFlags(SectionKind K) {
556 COFF::IMAGE_SCN_MEM_DISCARDABLE;
559 COFF::IMAGE_SCN_MEM_EXECUTE |
560 COFF::IMAGE_SCN_MEM_READ |
561 COFF::IMAGE_SCN_CNT_CODE;
564 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
565 COFF::IMAGE_SCN_MEM_READ |
566 COFF::IMAGE_SCN_MEM_WRITE;
567 else if (K.isReadOnly())
569 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
570 COFF::IMAGE_SCN_MEM_READ;
571 else if (K.isWriteable())
573 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
574 COFF::IMAGE_SCN_MEM_READ |
575 COFF::IMAGE_SCN_MEM_WRITE;
580 const MCSection *TargetLoweringObjectFileCOFF::
581 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
582 Mangler *Mang, const TargetMachine &TM) const {
583 return getContext().getCOFFSection(GV->getSection(),
584 getCOFFSectionFlags(Kind),
588 static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
593 if (Kind.isWriteable())
599 const MCSection *TargetLoweringObjectFileCOFF::
600 SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
601 Mangler *Mang, const TargetMachine &TM) const {
602 assert(!Kind.isThreadLocal() && "Doesn't support TLS");
604 // If this global is linkonce/weak and the target handles this by emitting it
605 // into a 'uniqued' section name, create and return the section now.
606 if (GV->isWeakForLinker()) {
607 const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
608 SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
609 MCSymbol *Sym = Mang->getSymbol(GV);
610 Name.append(Sym->getName().begin() + 1, Sym->getName().end());
612 unsigned Characteristics = getCOFFSectionFlags(Kind);
614 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
616 return getContext().getCOFFSection(Name.str(), Characteristics,
617 COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
621 return getTextSection();
623 return getDataSection();