1f22ef01cSRoman Divacky //===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky // 10f22ef01cSRoman Divacky // This file implements classes used to handle lowerings specific to common 11f22ef01cSRoman Divacky // object file formats. 12f22ef01cSRoman Divacky // 13f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 14f22ef01cSRoman Divacky 15f22ef01cSRoman Divacky #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 16139f7f9bSDimitry Andric #include "llvm/ADT/SmallString.h" 17139f7f9bSDimitry Andric #include "llvm/ADT/StringExtras.h" 18139f7f9bSDimitry Andric #include "llvm/ADT/Triple.h" 19f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineModuleInfoImpls.h" 20139f7f9bSDimitry Andric #include "llvm/IR/Constants.h" 21139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h" 22139f7f9bSDimitry Andric #include "llvm/IR/DerivedTypes.h" 23139f7f9bSDimitry Andric #include "llvm/IR/Function.h" 24139f7f9bSDimitry Andric #include "llvm/IR/GlobalVariable.h" 2591bc56edSDimitry Andric #include "llvm/IR/Mangler.h" 26139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 27f22ef01cSRoman Divacky #include "llvm/MC/MCContext.h" 28f22ef01cSRoman Divacky #include "llvm/MC/MCExpr.h" 29f22ef01cSRoman Divacky #include "llvm/MC/MCSectionCOFF.h" 30139f7f9bSDimitry Andric #include "llvm/MC/MCSectionELF.h" 31139f7f9bSDimitry Andric #include "llvm/MC/MCSectionMachO.h" 323b0f4066SDimitry Andric #include "llvm/MC/MCStreamer.h" 33f22ef01cSRoman Divacky #include "llvm/MC/MCSymbol.h" 34f22ef01cSRoman Divacky #include "llvm/Support/Dwarf.h" 352754fe60SDimitry Andric #include "llvm/Support/ELF.h" 36f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 37f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h" 3891bc56edSDimitry Andric #include "llvm/Target/TargetLowering.h" 39139f7f9bSDimitry Andric #include "llvm/Target/TargetMachine.h" 4039d628a0SDimitry Andric #include "llvm/Target/TargetSubtargetInfo.h" 41f22ef01cSRoman Divacky using namespace llvm; 42f22ef01cSRoman Divacky using namespace dwarf; 43f22ef01cSRoman Divacky 44f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 45f22ef01cSRoman Divacky // ELF 46f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 47f22ef01cSRoman Divacky 4891bc56edSDimitry Andric MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol( 4991bc56edSDimitry Andric const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, 503b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 513b0f4066SDimitry Andric unsigned Encoding = getPersonalityEncoding(); 5291bc56edSDimitry Andric if ((Encoding & 0x80) == dwarf::DW_EH_PE_indirect) 5317a519f9SDimitry Andric return getContext().GetOrCreateSymbol(StringRef("DW.ref.") + 5491bc56edSDimitry Andric TM.getSymbol(GV, Mang)->getName()); 5591bc56edSDimitry Andric if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr) 5691bc56edSDimitry Andric return TM.getSymbol(GV, Mang); 5791bc56edSDimitry Andric report_fatal_error("We do not support this DWARF encoding yet!"); 583b0f4066SDimitry Andric } 593b0f4066SDimitry Andric 603b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer, 613b0f4066SDimitry Andric const TargetMachine &TM, 623b0f4066SDimitry Andric const MCSymbol *Sym) const { 6317a519f9SDimitry Andric SmallString<64> NameData("DW.ref."); 6417a519f9SDimitry Andric NameData += Sym->getName(); 6517a519f9SDimitry Andric MCSymbol *Label = getContext().GetOrCreateSymbol(NameData); 663b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 673b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 6817a519f9SDimitry Andric StringRef Prefix = ".data."; 6917a519f9SDimitry Andric NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 703b0f4066SDimitry Andric unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 713b0f4066SDimitry Andric const MCSection *Sec = getContext().getELFSection(NameData, 723b0f4066SDimitry Andric ELF::SHT_PROGBITS, 733b0f4066SDimitry Andric Flags, 743b0f4066SDimitry Andric SectionKind::getDataRel(), 753b0f4066SDimitry Andric 0, Label->getName()); 7639d628a0SDimitry Andric unsigned Size = TM.getSubtargetImpl()->getDataLayout()->getPointerSize(); 773b0f4066SDimitry Andric Streamer.SwitchSection(Sec); 7839d628a0SDimitry Andric Streamer.EmitValueToAlignment( 7939d628a0SDimitry Andric TM.getSubtargetImpl()->getDataLayout()->getPointerABIAlignment()); 803b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 81dff0c46cSDimitry Andric const MCExpr *E = MCConstantExpr::Create(Size, getContext()); 823b0f4066SDimitry Andric Streamer.EmitELFSize(Label, E); 833b0f4066SDimitry Andric Streamer.EmitLabel(Label); 843b0f4066SDimitry Andric 853b0f4066SDimitry Andric Streamer.EmitSymbolValue(Sym, Size); 863b0f4066SDimitry Andric } 873b0f4066SDimitry Andric 8891bc56edSDimitry Andric const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference( 8991bc56edSDimitry Andric const GlobalValue *GV, unsigned Encoding, Mangler &Mang, 9091bc56edSDimitry Andric const TargetMachine &TM, MachineModuleInfo *MMI, 91139f7f9bSDimitry Andric MCStreamer &Streamer) const { 92139f7f9bSDimitry Andric 93139f7f9bSDimitry Andric if (Encoding & dwarf::DW_EH_PE_indirect) { 94139f7f9bSDimitry Andric MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 95139f7f9bSDimitry Andric 9691bc56edSDimitry Andric MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang, TM); 97139f7f9bSDimitry Andric 98139f7f9bSDimitry Andric // Add information about the stub reference to ELFMMI so that the stub 99139f7f9bSDimitry Andric // gets emitted by the asmprinter. 100139f7f9bSDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 10191bc56edSDimitry Andric if (!StubSym.getPointer()) { 10291bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(GV, Mang); 103139f7f9bSDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 104139f7f9bSDimitry Andric } 105139f7f9bSDimitry Andric 106139f7f9bSDimitry Andric return TargetLoweringObjectFile:: 107139f7f9bSDimitry Andric getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()), 108139f7f9bSDimitry Andric Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 109139f7f9bSDimitry Andric } 110139f7f9bSDimitry Andric 111139f7f9bSDimitry Andric return TargetLoweringObjectFile:: 11291bc56edSDimitry Andric getTTypeGlobalReference(GV, Encoding, Mang, TM, MMI, Streamer); 113139f7f9bSDimitry Andric } 114139f7f9bSDimitry Andric 115f22ef01cSRoman Divacky static SectionKind 116f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) { 117bd5abe19SDimitry Andric // N.B.: The defaults used in here are no the same ones used in MC. 118bd5abe19SDimitry Andric // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 119bd5abe19SDimitry Andric // both gas and MC will produce a section with no flags. Given 1207ae0e2c9SDimitry Andric // section(".eh_frame") gcc will produce: 1217ae0e2c9SDimitry Andric // 122bd5abe19SDimitry Andric // .section .eh_frame,"a",@progbits 123f22ef01cSRoman Divacky if (Name.empty() || Name[0] != '.') return K; 124f22ef01cSRoman Divacky 125f22ef01cSRoman Divacky // Some lame default implementation based on some magic section names. 126f22ef01cSRoman Divacky if (Name == ".bss" || 127f22ef01cSRoman Divacky Name.startswith(".bss.") || 128f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.b.") || 129f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.b.") || 130f22ef01cSRoman Divacky Name == ".sbss" || 131f22ef01cSRoman Divacky Name.startswith(".sbss.") || 132f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.sb.") || 133f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.sb.")) 134f22ef01cSRoman Divacky return SectionKind::getBSS(); 135f22ef01cSRoman Divacky 136f22ef01cSRoman Divacky if (Name == ".tdata" || 137f22ef01cSRoman Divacky Name.startswith(".tdata.") || 138f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.td.") || 139f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.td.")) 140f22ef01cSRoman Divacky return SectionKind::getThreadData(); 141f22ef01cSRoman Divacky 142f22ef01cSRoman Divacky if (Name == ".tbss" || 143f22ef01cSRoman Divacky Name.startswith(".tbss.") || 144f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.tb.") || 145f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.tb.")) 146f22ef01cSRoman Divacky return SectionKind::getThreadBSS(); 147f22ef01cSRoman Divacky 148f22ef01cSRoman Divacky return K; 149f22ef01cSRoman Divacky } 150f22ef01cSRoman Divacky 151f22ef01cSRoman Divacky 152f22ef01cSRoman Divacky static unsigned getELFSectionType(StringRef Name, SectionKind K) { 153f22ef01cSRoman Divacky 154f22ef01cSRoman Divacky if (Name == ".init_array") 1552754fe60SDimitry Andric return ELF::SHT_INIT_ARRAY; 156f22ef01cSRoman Divacky 157f22ef01cSRoman Divacky if (Name == ".fini_array") 1582754fe60SDimitry Andric return ELF::SHT_FINI_ARRAY; 159f22ef01cSRoman Divacky 160f22ef01cSRoman Divacky if (Name == ".preinit_array") 1612754fe60SDimitry Andric return ELF::SHT_PREINIT_ARRAY; 162f22ef01cSRoman Divacky 163f22ef01cSRoman Divacky if (K.isBSS() || K.isThreadBSS()) 1642754fe60SDimitry Andric return ELF::SHT_NOBITS; 165f22ef01cSRoman Divacky 1662754fe60SDimitry Andric return ELF::SHT_PROGBITS; 167f22ef01cSRoman Divacky } 168f22ef01cSRoman Divacky 169f22ef01cSRoman Divacky 170f22ef01cSRoman Divacky static unsigned 171f22ef01cSRoman Divacky getELFSectionFlags(SectionKind K) { 172f22ef01cSRoman Divacky unsigned Flags = 0; 173f22ef01cSRoman Divacky 174f22ef01cSRoman Divacky if (!K.isMetadata()) 1752754fe60SDimitry Andric Flags |= ELF::SHF_ALLOC; 176f22ef01cSRoman Divacky 177f22ef01cSRoman Divacky if (K.isText()) 1782754fe60SDimitry Andric Flags |= ELF::SHF_EXECINSTR; 179f22ef01cSRoman Divacky 180f22ef01cSRoman Divacky if (K.isWriteable()) 1812754fe60SDimitry Andric Flags |= ELF::SHF_WRITE; 182f22ef01cSRoman Divacky 183f22ef01cSRoman Divacky if (K.isThreadLocal()) 1842754fe60SDimitry Andric Flags |= ELF::SHF_TLS; 185f22ef01cSRoman Divacky 186f22ef01cSRoman Divacky // K.isMergeableConst() is left out to honour PR4650 187f22ef01cSRoman Divacky if (K.isMergeableCString() || K.isMergeableConst4() || 188f22ef01cSRoman Divacky K.isMergeableConst8() || K.isMergeableConst16()) 1892754fe60SDimitry Andric Flags |= ELF::SHF_MERGE; 190f22ef01cSRoman Divacky 191f22ef01cSRoman Divacky if (K.isMergeableCString()) 1922754fe60SDimitry Andric Flags |= ELF::SHF_STRINGS; 193f22ef01cSRoman Divacky 194f22ef01cSRoman Divacky return Flags; 195f22ef01cSRoman Divacky } 196f22ef01cSRoman Divacky 19791bc56edSDimitry Andric static const Comdat *getELFComdat(const GlobalValue *GV) { 19891bc56edSDimitry Andric const Comdat *C = GV->getComdat(); 19991bc56edSDimitry Andric if (!C) 20091bc56edSDimitry Andric return nullptr; 201f22ef01cSRoman Divacky 20291bc56edSDimitry Andric if (C->getSelectionKind() != Comdat::Any) 20391bc56edSDimitry Andric report_fatal_error("ELF COMDATs only support SelectionKind::Any, '" + 20491bc56edSDimitry Andric C->getName() + "' cannot be lowered."); 20591bc56edSDimitry Andric 20691bc56edSDimitry Andric return C; 20791bc56edSDimitry Andric } 20891bc56edSDimitry Andric 20991bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( 21091bc56edSDimitry Andric const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 21191bc56edSDimitry Andric const TargetMachine &TM) const { 212f22ef01cSRoman Divacky StringRef SectionName = GV->getSection(); 213f22ef01cSRoman Divacky 214f22ef01cSRoman Divacky // Infer section flags from the section name if we can. 215f22ef01cSRoman Divacky Kind = getELFKindForNamedSection(SectionName, Kind); 216f22ef01cSRoman Divacky 21791bc56edSDimitry Andric StringRef Group = ""; 21891bc56edSDimitry Andric unsigned Flags = getELFSectionFlags(Kind); 21991bc56edSDimitry Andric if (const Comdat *C = getELFComdat(GV)) { 22091bc56edSDimitry Andric Group = C->getName(); 22191bc56edSDimitry Andric Flags |= ELF::SHF_GROUP; 22291bc56edSDimitry Andric } 223f22ef01cSRoman Divacky return getContext().getELFSection(SectionName, 22491bc56edSDimitry Andric getELFSectionType(SectionName, Kind), Flags, 22591bc56edSDimitry Andric Kind, /*EntrySize=*/0, Group); 226f22ef01cSRoman Divacky } 227f22ef01cSRoman Divacky 228f22ef01cSRoman Divacky /// getSectionPrefixForGlobal - Return the section prefix name used by options 229f22ef01cSRoman Divacky /// FunctionsSections and DataSections. 23091bc56edSDimitry Andric static StringRef getSectionPrefixForGlobal(SectionKind Kind) { 231f22ef01cSRoman Divacky if (Kind.isText()) return ".text."; 232f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ".rodata."; 233dff0c46cSDimitry Andric if (Kind.isBSS()) return ".bss."; 234f22ef01cSRoman Divacky 235f22ef01cSRoman Divacky if (Kind.isThreadData()) return ".tdata."; 236f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return ".tbss."; 237f22ef01cSRoman Divacky 238f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return ".data."; 239f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return ".data.rel.local."; 240f22ef01cSRoman Divacky if (Kind.isDataRel()) return ".data.rel."; 241f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 242f22ef01cSRoman Divacky 243f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 244f22ef01cSRoman Divacky return ".data.rel.ro."; 245f22ef01cSRoman Divacky } 246f22ef01cSRoman Divacky 247f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 248f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 24991bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 250f22ef01cSRoman Divacky // If we have -ffunction-section or -fdata-section then we should emit the 251f22ef01cSRoman Divacky // global value to a uniqued section specifically for it. 252f22ef01cSRoman Divacky bool EmitUniquedSection; 253f22ef01cSRoman Divacky if (Kind.isText()) 254f22ef01cSRoman Divacky EmitUniquedSection = TM.getFunctionSections(); 255f22ef01cSRoman Divacky else 256f22ef01cSRoman Divacky EmitUniquedSection = TM.getDataSections(); 257f22ef01cSRoman Divacky 258f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 259f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 26091bc56edSDimitry Andric if ((GV->isWeakForLinker() || EmitUniquedSection || GV->hasComdat()) && 261dff0c46cSDimitry Andric !Kind.isCommon()) { 26291bc56edSDimitry Andric StringRef Prefix = getSectionPrefixForGlobal(Kind); 263f22ef01cSRoman Divacky 26491bc56edSDimitry Andric SmallString<128> Name(Prefix); 26591bc56edSDimitry Andric TM.getNameWithPrefix(Name, GV, Mang, true); 26691bc56edSDimitry Andric 2672754fe60SDimitry Andric StringRef Group = ""; 2682754fe60SDimitry Andric unsigned Flags = getELFSectionFlags(Kind); 26991bc56edSDimitry Andric if (GV->isWeakForLinker() || GV->hasComdat()) { 27091bc56edSDimitry Andric if (const Comdat *C = getELFComdat(GV)) 27191bc56edSDimitry Andric Group = C->getName(); 27291bc56edSDimitry Andric else 27391bc56edSDimitry Andric Group = Name.substr(Prefix.size()); 2742754fe60SDimitry Andric Flags |= ELF::SHF_GROUP; 2752754fe60SDimitry Andric } 2762754fe60SDimitry Andric 277f22ef01cSRoman Divacky return getContext().getELFSection(Name.str(), 278f22ef01cSRoman Divacky getELFSectionType(Name.str(), Kind), 2792754fe60SDimitry Andric Flags, Kind, 0, Group); 280f22ef01cSRoman Divacky } 281f22ef01cSRoman Divacky 282f22ef01cSRoman Divacky if (Kind.isText()) return TextSection; 283f22ef01cSRoman Divacky 284f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() || 285f22ef01cSRoman Divacky Kind.isMergeable2ByteCString() || 286f22ef01cSRoman Divacky Kind.isMergeable4ByteCString()) { 287f22ef01cSRoman Divacky 288f22ef01cSRoman Divacky // We also need alignment here. 289f22ef01cSRoman Divacky // FIXME: this is getting the alignment of the character, not the 290f22ef01cSRoman Divacky // alignment of the global! 291f22ef01cSRoman Divacky unsigned Align = 29239d628a0SDimitry Andric TM.getSubtargetImpl()->getDataLayout()->getPreferredAlignment( 29339d628a0SDimitry Andric cast<GlobalVariable>(GV)); 294f22ef01cSRoman Divacky 295f22ef01cSRoman Divacky const char *SizeSpec = ".rodata.str1."; 296f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString()) 297f22ef01cSRoman Divacky SizeSpec = ".rodata.str2."; 298f22ef01cSRoman Divacky else if (Kind.isMergeable4ByteCString()) 299f22ef01cSRoman Divacky SizeSpec = ".rodata.str4."; 300f22ef01cSRoman Divacky else 301f22ef01cSRoman Divacky assert(Kind.isMergeable1ByteCString() && "unknown string width"); 302f22ef01cSRoman Divacky 303f22ef01cSRoman Divacky 304f22ef01cSRoman Divacky std::string Name = SizeSpec + utostr(Align); 3052754fe60SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 3062754fe60SDimitry Andric ELF::SHF_ALLOC | 3072754fe60SDimitry Andric ELF::SHF_MERGE | 3082754fe60SDimitry Andric ELF::SHF_STRINGS, 309f22ef01cSRoman Divacky Kind); 310f22ef01cSRoman Divacky } 311f22ef01cSRoman Divacky 312f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 313f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 314f22ef01cSRoman Divacky return MergeableConst4Section; 315f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 316f22ef01cSRoman Divacky return MergeableConst8Section; 317f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 318f22ef01cSRoman Divacky return MergeableConst16Section; 319f22ef01cSRoman Divacky return ReadOnlySection; // .const 320f22ef01cSRoman Divacky } 321f22ef01cSRoman Divacky 322f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ReadOnlySection; 323f22ef01cSRoman Divacky 324f22ef01cSRoman Divacky if (Kind.isThreadData()) return TLSDataSection; 325f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return TLSBSSSection; 326f22ef01cSRoman Divacky 327f22ef01cSRoman Divacky // Note: we claim that common symbols are put in BSSSection, but they are 328f22ef01cSRoman Divacky // really emitted with the magic .comm directive, which creates a symbol table 329f22ef01cSRoman Divacky // entry but not a section. 330f22ef01cSRoman Divacky if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 331f22ef01cSRoman Divacky 332f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return DataSection; 333f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return DataRelLocalSection; 334f22ef01cSRoman Divacky if (Kind.isDataRel()) return DataRelSection; 335f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 336f22ef01cSRoman Divacky 337f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 338f22ef01cSRoman Divacky return DataRelROSection; 339f22ef01cSRoman Divacky } 340f22ef01cSRoman Divacky 341f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the 342f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it 343f22ef01cSRoman Divacky /// should be placed in. 34491bc56edSDimitry Andric const MCSection * 34591bc56edSDimitry Andric TargetLoweringObjectFileELF::getSectionForConstant(SectionKind Kind, 34691bc56edSDimitry Andric const Constant *C) const { 347f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 348f22ef01cSRoman Divacky return MergeableConst4Section; 349f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 350f22ef01cSRoman Divacky return MergeableConst8Section; 351f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 352f22ef01cSRoman Divacky return MergeableConst16Section; 353f22ef01cSRoman Divacky if (Kind.isReadOnly()) 354f22ef01cSRoman Divacky return ReadOnlySection; 355f22ef01cSRoman Divacky 356f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 357f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 358f22ef01cSRoman Divacky return DataRelROSection; 359f22ef01cSRoman Divacky } 360f22ef01cSRoman Divacky 36139d628a0SDimitry Andric static const MCSectionELF *getStaticStructorSection(MCContext &Ctx, 36239d628a0SDimitry Andric bool UseInitArray, 36339d628a0SDimitry Andric bool IsCtor, 36439d628a0SDimitry Andric unsigned Priority, 36539d628a0SDimitry Andric const MCSymbol *KeySym) { 36639d628a0SDimitry Andric std::string Name; 36739d628a0SDimitry Andric unsigned Type; 36839d628a0SDimitry Andric unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE; 36939d628a0SDimitry Andric SectionKind Kind = SectionKind::getDataRel(); 37039d628a0SDimitry Andric StringRef COMDAT = KeySym ? KeySym->getName() : ""; 37139d628a0SDimitry Andric 37239d628a0SDimitry Andric if (KeySym) 37339d628a0SDimitry Andric Flags |= ELF::SHF_GROUP; 374dff0c46cSDimitry Andric 3757ae0e2c9SDimitry Andric if (UseInitArray) { 37639d628a0SDimitry Andric if (IsCtor) { 37739d628a0SDimitry Andric Type = ELF::SHT_INIT_ARRAY; 37839d628a0SDimitry Andric Name = ".init_array"; 3797ae0e2c9SDimitry Andric } else { 38039d628a0SDimitry Andric Type = ELF::SHT_FINI_ARRAY; 38139d628a0SDimitry Andric Name = ".fini_array"; 382dff0c46cSDimitry Andric } 38339d628a0SDimitry Andric if (Priority != 65535) { 38439d628a0SDimitry Andric Name += '.'; 38539d628a0SDimitry Andric Name += utostr(Priority); 38639d628a0SDimitry Andric } 38739d628a0SDimitry Andric } else { 38839d628a0SDimitry Andric // The default scheme is .ctor / .dtor, so we have to invert the priority 38939d628a0SDimitry Andric // numbering. 39039d628a0SDimitry Andric if (IsCtor) 39139d628a0SDimitry Andric Name = ".ctors"; 39239d628a0SDimitry Andric else 39339d628a0SDimitry Andric Name = ".dtors"; 39439d628a0SDimitry Andric if (Priority != 65535) { 39539d628a0SDimitry Andric Name += '.'; 39639d628a0SDimitry Andric Name += utostr(65535 - Priority); 39739d628a0SDimitry Andric } 39839d628a0SDimitry Andric Type = ELF::SHT_PROGBITS; 39939d628a0SDimitry Andric } 40039d628a0SDimitry Andric 40139d628a0SDimitry Andric return Ctx.getELFSection(Name, Type, Flags, Kind, 0, COMDAT); 40239d628a0SDimitry Andric } 40339d628a0SDimitry Andric 40439d628a0SDimitry Andric const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection( 40539d628a0SDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 40639d628a0SDimitry Andric return getStaticStructorSection(getContext(), UseInitArray, true, Priority, 40739d628a0SDimitry Andric KeySym); 4087ae0e2c9SDimitry Andric } 409dff0c46cSDimitry Andric 41091bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileELF::getStaticDtorSection( 41191bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 41239d628a0SDimitry Andric return getStaticStructorSection(getContext(), UseInitArray, false, Priority, 41339d628a0SDimitry Andric KeySym); 4147ae0e2c9SDimitry Andric } 4157ae0e2c9SDimitry Andric 4167ae0e2c9SDimitry Andric void 4177ae0e2c9SDimitry Andric TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) { 4187ae0e2c9SDimitry Andric UseInitArray = UseInitArray_; 4197ae0e2c9SDimitry Andric if (!UseInitArray) 4207ae0e2c9SDimitry Andric return; 4217ae0e2c9SDimitry Andric 4227ae0e2c9SDimitry Andric StaticCtorSection = 4237ae0e2c9SDimitry Andric getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY, 4247ae0e2c9SDimitry Andric ELF::SHF_WRITE | 4257ae0e2c9SDimitry Andric ELF::SHF_ALLOC, 4267ae0e2c9SDimitry Andric SectionKind::getDataRel()); 4277ae0e2c9SDimitry Andric StaticDtorSection = 4287ae0e2c9SDimitry Andric getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY, 4297ae0e2c9SDimitry Andric ELF::SHF_WRITE | 4307ae0e2c9SDimitry Andric ELF::SHF_ALLOC, 4317ae0e2c9SDimitry Andric SectionKind::getDataRel()); 4327ae0e2c9SDimitry Andric } 433dff0c46cSDimitry Andric 434f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 435f22ef01cSRoman Divacky // MachO 436f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 437f22ef01cSRoman Divacky 43891bc56edSDimitry Andric /// getDepLibFromLinkerOpt - Extract the dependent library name from a linker 43991bc56edSDimitry Andric /// option string. Returns StringRef() if the option does not specify a library. 44091bc56edSDimitry Andric StringRef TargetLoweringObjectFileMachO:: 44191bc56edSDimitry Andric getDepLibFromLinkerOpt(StringRef LinkerOption) const { 44291bc56edSDimitry Andric const char *LibCmd = "-l"; 44391bc56edSDimitry Andric if (LinkerOption.startswith(LibCmd)) 44491bc56edSDimitry Andric return LinkerOption.substr(strlen(LibCmd)); 44591bc56edSDimitry Andric return StringRef(); 44691bc56edSDimitry Andric } 44791bc56edSDimitry Andric 448139f7f9bSDimitry Andric /// emitModuleFlags - Perform code emission for module flags. 449dff0c46cSDimitry Andric void TargetLoweringObjectFileMachO:: 450dff0c46cSDimitry Andric emitModuleFlags(MCStreamer &Streamer, 451dff0c46cSDimitry Andric ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 45291bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 453dff0c46cSDimitry Andric unsigned VersionVal = 0; 4547ae0e2c9SDimitry Andric unsigned ImageInfoFlags = 0; 45591bc56edSDimitry Andric MDNode *LinkerOptions = nullptr; 456dff0c46cSDimitry Andric StringRef SectionVal; 457dff0c46cSDimitry Andric 458dff0c46cSDimitry Andric for (ArrayRef<Module::ModuleFlagEntry>::iterator 459dff0c46cSDimitry Andric i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 460dff0c46cSDimitry Andric const Module::ModuleFlagEntry &MFE = *i; 461dff0c46cSDimitry Andric 462dff0c46cSDimitry Andric // Ignore flags with 'Require' behavior. 463dff0c46cSDimitry Andric if (MFE.Behavior == Module::Require) 464dff0c46cSDimitry Andric continue; 465dff0c46cSDimitry Andric 466dff0c46cSDimitry Andric StringRef Key = MFE.Key->getString(); 46739d628a0SDimitry Andric Metadata *Val = MFE.Val; 468dff0c46cSDimitry Andric 469139f7f9bSDimitry Andric if (Key == "Objective-C Image Info Version") { 47039d628a0SDimitry Andric VersionVal = mdconst::extract<ConstantInt>(Val)->getZExtValue(); 471139f7f9bSDimitry Andric } else if (Key == "Objective-C Garbage Collection" || 4727ae0e2c9SDimitry Andric Key == "Objective-C GC Only" || 47339d628a0SDimitry Andric Key == "Objective-C Is Simulated" || 47439d628a0SDimitry Andric Key == "Objective-C Image Swift Version") { 47539d628a0SDimitry Andric ImageInfoFlags |= mdconst::extract<ConstantInt>(Val)->getZExtValue(); 476139f7f9bSDimitry Andric } else if (Key == "Objective-C Image Info Section") { 477dff0c46cSDimitry Andric SectionVal = cast<MDString>(Val)->getString(); 478139f7f9bSDimitry Andric } else if (Key == "Linker Options") { 479139f7f9bSDimitry Andric LinkerOptions = cast<MDNode>(Val); 480139f7f9bSDimitry Andric } 481139f7f9bSDimitry Andric } 482139f7f9bSDimitry Andric 483139f7f9bSDimitry Andric // Emit the linker options if present. 484139f7f9bSDimitry Andric if (LinkerOptions) { 485139f7f9bSDimitry Andric for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 486139f7f9bSDimitry Andric MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 487139f7f9bSDimitry Andric SmallVector<std::string, 4> StrOptions; 488139f7f9bSDimitry Andric 489139f7f9bSDimitry Andric // Convert to strings. 490139f7f9bSDimitry Andric for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 491139f7f9bSDimitry Andric MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 492139f7f9bSDimitry Andric StrOptions.push_back(MDOption->getString()); 493139f7f9bSDimitry Andric } 494139f7f9bSDimitry Andric 495139f7f9bSDimitry Andric Streamer.EmitLinkerOptions(StrOptions); 496139f7f9bSDimitry Andric } 497dff0c46cSDimitry Andric } 498dff0c46cSDimitry Andric 499dff0c46cSDimitry Andric // The section is mandatory. If we don't have it, then we don't have GC info. 500dff0c46cSDimitry Andric if (SectionVal.empty()) return; 501dff0c46cSDimitry Andric 502dff0c46cSDimitry Andric StringRef Segment, Section; 503dff0c46cSDimitry Andric unsigned TAA = 0, StubSize = 0; 504dff0c46cSDimitry Andric bool TAAParsed; 505dff0c46cSDimitry Andric std::string ErrorCode = 506dff0c46cSDimitry Andric MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section, 507dff0c46cSDimitry Andric TAA, TAAParsed, StubSize); 508dff0c46cSDimitry Andric if (!ErrorCode.empty()) 509dff0c46cSDimitry Andric // If invalid, report the error with report_fatal_error. 510dff0c46cSDimitry Andric report_fatal_error("Invalid section specifier '" + Section + "': " + 511dff0c46cSDimitry Andric ErrorCode + "."); 512dff0c46cSDimitry Andric 513dff0c46cSDimitry Andric // Get the section. 514dff0c46cSDimitry Andric const MCSectionMachO *S = 515dff0c46cSDimitry Andric getContext().getMachOSection(Segment, Section, TAA, StubSize, 516dff0c46cSDimitry Andric SectionKind::getDataNoRel()); 517dff0c46cSDimitry Andric Streamer.SwitchSection(S); 518dff0c46cSDimitry Andric Streamer.EmitLabel(getContext(). 519dff0c46cSDimitry Andric GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO"))); 520dff0c46cSDimitry Andric Streamer.EmitIntValue(VersionVal, 4); 5217ae0e2c9SDimitry Andric Streamer.EmitIntValue(ImageInfoFlags, 4); 522dff0c46cSDimitry Andric Streamer.AddBlankLine(); 523dff0c46cSDimitry Andric } 524dff0c46cSDimitry Andric 52591bc56edSDimitry Andric static void checkMachOComdat(const GlobalValue *GV) { 52691bc56edSDimitry Andric const Comdat *C = GV->getComdat(); 52791bc56edSDimitry Andric if (!C) 52891bc56edSDimitry Andric return; 52991bc56edSDimitry Andric 53091bc56edSDimitry Andric report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() + 53191bc56edSDimitry Andric "' cannot be lowered."); 53291bc56edSDimitry Andric } 53391bc56edSDimitry Andric 53491bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal( 53591bc56edSDimitry Andric const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 53691bc56edSDimitry Andric const TargetMachine &TM) const { 537f22ef01cSRoman Divacky // Parse the section specifier and create it if valid. 538f22ef01cSRoman Divacky StringRef Segment, Section; 5393b0f4066SDimitry Andric unsigned TAA = 0, StubSize = 0; 5403b0f4066SDimitry Andric bool TAAParsed; 54191bc56edSDimitry Andric 54291bc56edSDimitry Andric checkMachOComdat(GV); 54391bc56edSDimitry Andric 544f22ef01cSRoman Divacky std::string ErrorCode = 545f22ef01cSRoman Divacky MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 5463b0f4066SDimitry Andric TAA, TAAParsed, StubSize); 547f22ef01cSRoman Divacky if (!ErrorCode.empty()) { 548f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 549dff0c46cSDimitry Andric report_fatal_error("Global variable '" + GV->getName() + 550dff0c46cSDimitry Andric "' has an invalid section specifier '" + 551dff0c46cSDimitry Andric GV->getSection() + "': " + ErrorCode + "."); 552f22ef01cSRoman Divacky } 553f22ef01cSRoman Divacky 554f22ef01cSRoman Divacky // Get the section. 555f22ef01cSRoman Divacky const MCSectionMachO *S = 556f22ef01cSRoman Divacky getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 557f22ef01cSRoman Divacky 558dd6029ffSDimitry Andric // If TAA wasn't set by ParseSectionSpecifier() above, 559dd6029ffSDimitry Andric // use the value returned by getMachOSection() as a default. 5603b0f4066SDimitry Andric if (!TAAParsed) 561dd6029ffSDimitry Andric TAA = S->getTypeAndAttributes(); 562dd6029ffSDimitry Andric 563f22ef01cSRoman Divacky // Okay, now that we got the section, verify that the TAA & StubSize agree. 564f22ef01cSRoman Divacky // If the user declared multiple globals with different section flags, we need 565f22ef01cSRoman Divacky // to reject it here. 566f22ef01cSRoman Divacky if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 567f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 568dff0c46cSDimitry Andric report_fatal_error("Global variable '" + GV->getName() + 569f22ef01cSRoman Divacky "' section type or attributes does not match previous" 570f22ef01cSRoman Divacky " section specifier"); 571f22ef01cSRoman Divacky } 572f22ef01cSRoman Divacky 573f22ef01cSRoman Divacky return S; 574f22ef01cSRoman Divacky } 575f22ef01cSRoman Divacky 576f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO:: 577f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 57891bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 57991bc56edSDimitry Andric checkMachOComdat(GV); 580f785676fSDimitry Andric 581f785676fSDimitry Andric // Handle thread local data. 582f785676fSDimitry Andric if (Kind.isThreadBSS()) return TLSBSSSection; 583f785676fSDimitry Andric if (Kind.isThreadData()) return TLSDataSection; 584f785676fSDimitry Andric 585f22ef01cSRoman Divacky if (Kind.isText()) 586f22ef01cSRoman Divacky return GV->isWeakForLinker() ? TextCoalSection : TextSection; 587f22ef01cSRoman Divacky 588f22ef01cSRoman Divacky // If this is weak/linkonce, put this in a coalescable section, either in text 589f22ef01cSRoman Divacky // or data depending on if it is writable. 590f22ef01cSRoman Divacky if (GV->isWeakForLinker()) { 591f22ef01cSRoman Divacky if (Kind.isReadOnly()) 592f22ef01cSRoman Divacky return ConstTextCoalSection; 593f22ef01cSRoman Divacky return DataCoalSection; 594f22ef01cSRoman Divacky } 595f22ef01cSRoman Divacky 596f22ef01cSRoman Divacky // FIXME: Alignment check should be handled by section classifier. 597f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() && 59839d628a0SDimitry Andric TM.getSubtargetImpl()->getDataLayout()->getPreferredAlignment( 59939d628a0SDimitry Andric cast<GlobalVariable>(GV)) < 32) 600f22ef01cSRoman Divacky return CStringSection; 601f22ef01cSRoman Divacky 602f22ef01cSRoman Divacky // Do not put 16-bit arrays in the UString section if they have an 603f22ef01cSRoman Divacky // externally visible label, this runs into issues with certain linker 604f22ef01cSRoman Divacky // versions. 605f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 60639d628a0SDimitry Andric TM.getSubtargetImpl()->getDataLayout()->getPreferredAlignment( 60739d628a0SDimitry Andric cast<GlobalVariable>(GV)) < 32) 608f22ef01cSRoman Divacky return UStringSection; 609f22ef01cSRoman Divacky 61039d628a0SDimitry Andric // With MachO only variables whose corresponding symbol starts with 'l' or 61139d628a0SDimitry Andric // 'L' can be merged, so we only try merging GVs with private linkage. 61239d628a0SDimitry Andric if (GV->hasPrivateLinkage() && Kind.isMergeableConst()) { 613f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 614f22ef01cSRoman Divacky return FourByteConstantSection; 615f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 616f22ef01cSRoman Divacky return EightByteConstantSection; 61791bc56edSDimitry Andric if (Kind.isMergeableConst16()) 618f22ef01cSRoman Divacky return SixteenByteConstantSection; 619f22ef01cSRoman Divacky } 620f22ef01cSRoman Divacky 621f22ef01cSRoman Divacky // Otherwise, if it is readonly, but not something we can specially optimize, 622f22ef01cSRoman Divacky // just drop it in .const. 623f22ef01cSRoman Divacky if (Kind.isReadOnly()) 624f22ef01cSRoman Divacky return ReadOnlySection; 625f22ef01cSRoman Divacky 626f22ef01cSRoman Divacky // If this is marked const, put it into a const section. But if the dynamic 627f22ef01cSRoman Divacky // linker needs to write to it, put it in the data segment. 628f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRel()) 629f22ef01cSRoman Divacky return ConstDataSection; 630f22ef01cSRoman Divacky 631f22ef01cSRoman Divacky // Put zero initialized globals with strong external linkage in the 632f22ef01cSRoman Divacky // DATA, __common section with the .zerofill directive. 633f22ef01cSRoman Divacky if (Kind.isBSSExtern()) 634f22ef01cSRoman Divacky return DataCommonSection; 635f22ef01cSRoman Divacky 636f22ef01cSRoman Divacky // Put zero initialized globals with local linkage in __DATA,__bss directive 637f22ef01cSRoman Divacky // with the .zerofill directive (aka .lcomm). 638f22ef01cSRoman Divacky if (Kind.isBSSLocal()) 639f22ef01cSRoman Divacky return DataBSSSection; 640f22ef01cSRoman Divacky 641f22ef01cSRoman Divacky // Otherwise, just drop the variable in the normal data section. 642f22ef01cSRoman Divacky return DataSection; 643f22ef01cSRoman Divacky } 644f22ef01cSRoman Divacky 645f22ef01cSRoman Divacky const MCSection * 64691bc56edSDimitry Andric TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind, 64791bc56edSDimitry Andric const Constant *C) const { 648f22ef01cSRoman Divacky // If this constant requires a relocation, we have to put it in the data 649f22ef01cSRoman Divacky // segment, not in the text segment. 650f22ef01cSRoman Divacky if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 651f22ef01cSRoman Divacky return ConstDataSection; 652f22ef01cSRoman Divacky 653f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 654f22ef01cSRoman Divacky return FourByteConstantSection; 655f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 656f22ef01cSRoman Divacky return EightByteConstantSection; 65791bc56edSDimitry Andric if (Kind.isMergeableConst16()) 658f22ef01cSRoman Divacky return SixteenByteConstantSection; 659f22ef01cSRoman Divacky return ReadOnlySection; // .const 660f22ef01cSRoman Divacky } 661f22ef01cSRoman Divacky 66291bc56edSDimitry Andric const MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference( 66391bc56edSDimitry Andric const GlobalValue *GV, unsigned Encoding, Mangler &Mang, 66491bc56edSDimitry Andric const TargetMachine &TM, MachineModuleInfo *MMI, 665f22ef01cSRoman Divacky MCStreamer &Streamer) const { 666f22ef01cSRoman Divacky // The mach-o version of this method defaults to returning a stub reference. 667f22ef01cSRoman Divacky 668f22ef01cSRoman Divacky if (Encoding & DW_EH_PE_indirect) { 669f22ef01cSRoman Divacky MachineModuleInfoMachO &MachOMMI = 670f22ef01cSRoman Divacky MMI->getObjFileInfo<MachineModuleInfoMachO>(); 671f22ef01cSRoman Divacky 67291bc56edSDimitry Andric MCSymbol *SSym = 67391bc56edSDimitry Andric getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM); 674f22ef01cSRoman Divacky 675f22ef01cSRoman Divacky // Add information about the stub reference to MachOMMI so that the stub 676f22ef01cSRoman Divacky // gets emitted by the asmprinter. 677f8254f43SDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = 678f8254f43SDimitry Andric GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 679f8254f43SDimitry Andric MachOMMI.getGVStubEntry(SSym); 68091bc56edSDimitry Andric if (!StubSym.getPointer()) { 68191bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(GV, Mang); 682f22ef01cSRoman Divacky StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 683f22ef01cSRoman Divacky } 684f22ef01cSRoman Divacky 685f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 686139f7f9bSDimitry Andric getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()), 687139f7f9bSDimitry Andric Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 688f22ef01cSRoman Divacky } 689f22ef01cSRoman Divacky 69091bc56edSDimitry Andric return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding, Mang, 69191bc56edSDimitry Andric TM, MMI, Streamer); 692f22ef01cSRoman Divacky } 693f22ef01cSRoman Divacky 69491bc56edSDimitry Andric MCSymbol *TargetLoweringObjectFileMachO::getCFIPersonalitySymbol( 69591bc56edSDimitry Andric const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, 6963b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 6973b0f4066SDimitry Andric // The mach-o version of this method defaults to returning a stub reference. 6983b0f4066SDimitry Andric MachineModuleInfoMachO &MachOMMI = 6993b0f4066SDimitry Andric MMI->getObjFileInfo<MachineModuleInfoMachO>(); 7003b0f4066SDimitry Andric 70191bc56edSDimitry Andric MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM); 7023b0f4066SDimitry Andric 7033b0f4066SDimitry Andric // Add information about the stub reference to MachOMMI so that the stub 7043b0f4066SDimitry Andric // gets emitted by the asmprinter. 705dff0c46cSDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 70691bc56edSDimitry Andric if (!StubSym.getPointer()) { 70791bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(GV, Mang); 7083b0f4066SDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 7093b0f4066SDimitry Andric } 7103b0f4066SDimitry Andric 7113b0f4066SDimitry Andric return SSym; 7123b0f4066SDimitry Andric } 7133b0f4066SDimitry Andric 714f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 715f22ef01cSRoman Divacky // COFF 716f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 717f22ef01cSRoman Divacky 718f22ef01cSRoman Divacky static unsigned 719f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) { 720f22ef01cSRoman Divacky unsigned Flags = 0; 721f22ef01cSRoman Divacky 722ffd1746dSEd Schouten if (K.isMetadata()) 723f22ef01cSRoman Divacky Flags |= 724ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE; 725f22ef01cSRoman Divacky else if (K.isText()) 726f22ef01cSRoman Divacky Flags |= 727ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_EXECUTE | 7282754fe60SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 729ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_CODE; 730f22ef01cSRoman Divacky else if (K.isBSS()) 731f22ef01cSRoman Divacky Flags |= 732ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 733ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 734ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 735dff0c46cSDimitry Andric else if (K.isThreadLocal()) 736dff0c46cSDimitry Andric Flags |= 737dff0c46cSDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 738dff0c46cSDimitry Andric COFF::IMAGE_SCN_MEM_READ | 739dff0c46cSDimitry Andric COFF::IMAGE_SCN_MEM_WRITE; 74039d628a0SDimitry Andric else if (K.isReadOnly() || K.isReadOnlyWithRel()) 741f22ef01cSRoman Divacky Flags |= 742ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 743ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ; 744f22ef01cSRoman Divacky else if (K.isWriteable()) 745f22ef01cSRoman Divacky Flags |= 746ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 747ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 748ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 749f22ef01cSRoman Divacky 750f22ef01cSRoman Divacky return Flags; 751f22ef01cSRoman Divacky } 752f22ef01cSRoman Divacky 75391bc56edSDimitry Andric static const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) { 75491bc56edSDimitry Andric const Comdat *C = GV->getComdat(); 75591bc56edSDimitry Andric assert(C && "expected GV to have a Comdat!"); 75691bc56edSDimitry Andric 75791bc56edSDimitry Andric StringRef ComdatGVName = C->getName(); 75891bc56edSDimitry Andric const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName); 75991bc56edSDimitry Andric if (!ComdatGV) 76091bc56edSDimitry Andric report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + 76191bc56edSDimitry Andric "' does not exist."); 76291bc56edSDimitry Andric 76391bc56edSDimitry Andric if (ComdatGV->getComdat() != C) 76491bc56edSDimitry Andric report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + 76539d628a0SDimitry Andric "' is not a key for its COMDAT."); 76691bc56edSDimitry Andric 76791bc56edSDimitry Andric return ComdatGV; 76891bc56edSDimitry Andric } 76991bc56edSDimitry Andric 77091bc56edSDimitry Andric static int getSelectionForCOFF(const GlobalValue *GV) { 77191bc56edSDimitry Andric if (const Comdat *C = GV->getComdat()) { 77291bc56edSDimitry Andric const GlobalValue *ComdatKey = getComdatGVForCOFF(GV); 77391bc56edSDimitry Andric if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey)) 77491bc56edSDimitry Andric ComdatKey = GA->getBaseObject(); 77591bc56edSDimitry Andric if (ComdatKey == GV) { 77691bc56edSDimitry Andric switch (C->getSelectionKind()) { 77791bc56edSDimitry Andric case Comdat::Any: 77891bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_ANY; 77991bc56edSDimitry Andric case Comdat::ExactMatch: 78091bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH; 78191bc56edSDimitry Andric case Comdat::Largest: 78291bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_LARGEST; 78391bc56edSDimitry Andric case Comdat::NoDuplicates: 78491bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES; 78591bc56edSDimitry Andric case Comdat::SameSize: 78691bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE; 78791bc56edSDimitry Andric } 78891bc56edSDimitry Andric } else { 78991bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE; 79091bc56edSDimitry Andric } 79191bc56edSDimitry Andric } else if (GV->isWeakForLinker()) { 79291bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_ANY; 79391bc56edSDimitry Andric } 79491bc56edSDimitry Andric return 0; 79591bc56edSDimitry Andric } 79691bc56edSDimitry Andric 79791bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal( 79891bc56edSDimitry Andric const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 79991bc56edSDimitry Andric const TargetMachine &TM) const { 800139f7f9bSDimitry Andric int Selection = 0; 801139f7f9bSDimitry Andric unsigned Characteristics = getCOFFSectionFlags(Kind); 80291bc56edSDimitry Andric StringRef Name = GV->getSection(); 80391bc56edSDimitry Andric StringRef COMDATSymName = ""; 80491bc56edSDimitry Andric if ((GV->isWeakForLinker() || GV->hasComdat()) && !Kind.isCommon()) { 80591bc56edSDimitry Andric Selection = getSelectionForCOFF(GV); 80691bc56edSDimitry Andric const GlobalValue *ComdatGV; 80791bc56edSDimitry Andric if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) 80891bc56edSDimitry Andric ComdatGV = getComdatGVForCOFF(GV); 80991bc56edSDimitry Andric else 81091bc56edSDimitry Andric ComdatGV = GV; 81191bc56edSDimitry Andric 81291bc56edSDimitry Andric if (!ComdatGV->hasPrivateLinkage()) { 81391bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); 81491bc56edSDimitry Andric COMDATSymName = Sym->getName(); 815139f7f9bSDimitry Andric Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 81691bc56edSDimitry Andric } else { 81791bc56edSDimitry Andric Selection = 0; 81891bc56edSDimitry Andric } 819139f7f9bSDimitry Andric } 820139f7f9bSDimitry Andric return getContext().getCOFFSection(Name, 821139f7f9bSDimitry Andric Characteristics, 822f785676fSDimitry Andric Kind, 82391bc56edSDimitry Andric COMDATSymName, 824f785676fSDimitry Andric Selection); 825f22ef01cSRoman Divacky } 826f22ef01cSRoman Divacky 82791bc56edSDimitry Andric static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) { 828f22ef01cSRoman Divacky if (Kind.isText()) 82991bc56edSDimitry Andric return ".text"; 830f22ef01cSRoman Divacky if (Kind.isBSS()) 83191bc56edSDimitry Andric return ".bss"; 83291bc56edSDimitry Andric if (Kind.isThreadLocal()) 83391bc56edSDimitry Andric return ".tls$"; 83439d628a0SDimitry Andric if (Kind.isReadOnly() || Kind.isReadOnlyWithRel()) 83591bc56edSDimitry Andric return ".rdata"; 83639d628a0SDimitry Andric return ".data"; 837f22ef01cSRoman Divacky } 838f22ef01cSRoman Divacky 839f22ef01cSRoman Divacky 840f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF:: 841f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 84291bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 84391bc56edSDimitry Andric // If we have -ffunction-sections then we should emit the global value to a 84491bc56edSDimitry Andric // uniqued section specifically for it. 84591bc56edSDimitry Andric bool EmitUniquedSection; 84691bc56edSDimitry Andric if (Kind.isText()) 84791bc56edSDimitry Andric EmitUniquedSection = TM.getFunctionSections(); 84891bc56edSDimitry Andric else 84991bc56edSDimitry Andric EmitUniquedSection = TM.getDataSections(); 850f22ef01cSRoman Divacky 851f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 852f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 85391bc56edSDimitry Andric // Section names depend on the name of the symbol which is not feasible if the 85491bc56edSDimitry Andric // symbol has private linkage. 85591bc56edSDimitry Andric if ((GV->isWeakForLinker() || EmitUniquedSection || GV->hasComdat()) && 85691bc56edSDimitry Andric !Kind.isCommon()) { 85791bc56edSDimitry Andric const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); 858f22ef01cSRoman Divacky unsigned Characteristics = getCOFFSectionFlags(Kind); 859f22ef01cSRoman Divacky 860ffd1746dSEd Schouten Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 86191bc56edSDimitry Andric int Selection = getSelectionForCOFF(GV); 86291bc56edSDimitry Andric if (!Selection) 86391bc56edSDimitry Andric Selection = COFF::IMAGE_COMDAT_SELECT_NODUPLICATES; 86491bc56edSDimitry Andric const GlobalValue *ComdatGV; 86591bc56edSDimitry Andric if (GV->hasComdat()) 86691bc56edSDimitry Andric ComdatGV = getComdatGVForCOFF(GV); 86791bc56edSDimitry Andric else 86891bc56edSDimitry Andric ComdatGV = GV; 869f22ef01cSRoman Divacky 87091bc56edSDimitry Andric if (!ComdatGV->hasPrivateLinkage()) { 87191bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); 87291bc56edSDimitry Andric StringRef COMDATSymName = Sym->getName(); 87391bc56edSDimitry Andric return getContext().getCOFFSection(Name, Characteristics, Kind, 87491bc56edSDimitry Andric COMDATSymName, Selection); 87591bc56edSDimitry Andric } 876f22ef01cSRoman Divacky } 877f22ef01cSRoman Divacky 878f22ef01cSRoman Divacky if (Kind.isText()) 879f785676fSDimitry Andric return TextSection; 880f22ef01cSRoman Divacky 881dff0c46cSDimitry Andric if (Kind.isThreadLocal()) 882f785676fSDimitry Andric return TLSDataSection; 883dff0c46cSDimitry Andric 88439d628a0SDimitry Andric if (Kind.isReadOnly() || Kind.isReadOnlyWithRel()) 885f785676fSDimitry Andric return ReadOnlySection; 886f785676fSDimitry Andric 88791bc56edSDimitry Andric // Note: we claim that common symbols are put in BSSSection, but they are 88891bc56edSDimitry Andric // really emitted with the magic .comm directive, which creates a symbol table 88991bc56edSDimitry Andric // entry but not a section. 89091bc56edSDimitry Andric if (Kind.isBSS() || Kind.isCommon()) 891f785676fSDimitry Andric return BSSSection; 892f785676fSDimitry Andric 893f785676fSDimitry Andric return DataSection; 894f22ef01cSRoman Divacky } 895f22ef01cSRoman Divacky 89691bc56edSDimitry Andric StringRef TargetLoweringObjectFileCOFF:: 89791bc56edSDimitry Andric getDepLibFromLinkerOpt(StringRef LinkerOption) const { 89891bc56edSDimitry Andric const char *LibCmd = "/DEFAULTLIB:"; 89991bc56edSDimitry Andric if (LinkerOption.startswith(LibCmd)) 90091bc56edSDimitry Andric return LinkerOption.substr(strlen(LibCmd)); 90191bc56edSDimitry Andric return StringRef(); 90291bc56edSDimitry Andric } 90391bc56edSDimitry Andric 904284c1978SDimitry Andric void TargetLoweringObjectFileCOFF:: 905284c1978SDimitry Andric emitModuleFlags(MCStreamer &Streamer, 906284c1978SDimitry Andric ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 90791bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 90891bc56edSDimitry Andric MDNode *LinkerOptions = nullptr; 909284c1978SDimitry Andric 910284c1978SDimitry Andric // Look for the "Linker Options" flag, since it's the only one we support. 911284c1978SDimitry Andric for (ArrayRef<Module::ModuleFlagEntry>::iterator 912284c1978SDimitry Andric i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 913284c1978SDimitry Andric const Module::ModuleFlagEntry &MFE = *i; 914284c1978SDimitry Andric StringRef Key = MFE.Key->getString(); 91539d628a0SDimitry Andric Metadata *Val = MFE.Val; 916284c1978SDimitry Andric if (Key == "Linker Options") { 917284c1978SDimitry Andric LinkerOptions = cast<MDNode>(Val); 918284c1978SDimitry Andric break; 919284c1978SDimitry Andric } 920284c1978SDimitry Andric } 921284c1978SDimitry Andric if (!LinkerOptions) 922284c1978SDimitry Andric return; 923284c1978SDimitry Andric 924284c1978SDimitry Andric // Emit the linker options to the linker .drectve section. According to the 925284c1978SDimitry Andric // spec, this section is a space-separated string containing flags for linker. 926284c1978SDimitry Andric const MCSection *Sec = getDrectveSection(); 927284c1978SDimitry Andric Streamer.SwitchSection(Sec); 928284c1978SDimitry Andric for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 929284c1978SDimitry Andric MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 930284c1978SDimitry Andric for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 931284c1978SDimitry Andric MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 932284c1978SDimitry Andric StringRef Op = MDOption->getString(); 933284c1978SDimitry Andric // Lead with a space for consistency with our dllexport implementation. 934284c1978SDimitry Andric std::string Escaped(" "); 93539d628a0SDimitry Andric if (!Op.startswith("\"") && (Op.find(" ") != StringRef::npos)) { 936284c1978SDimitry Andric // The PE-COFF spec says args with spaces must be quoted. It doesn't say 937284c1978SDimitry Andric // how to escape quotes, but it probably uses this algorithm: 938284c1978SDimitry Andric // http://msdn.microsoft.com/en-us/library/17w5ykft(v=vs.85).aspx 939284c1978SDimitry Andric // FIXME: Reuse escaping code from Support/Windows/Program.inc 940284c1978SDimitry Andric Escaped.push_back('\"'); 941284c1978SDimitry Andric Escaped.append(Op); 942284c1978SDimitry Andric Escaped.push_back('\"'); 943284c1978SDimitry Andric } else { 944284c1978SDimitry Andric Escaped.append(Op); 945284c1978SDimitry Andric } 946284c1978SDimitry Andric Streamer.EmitBytes(Escaped); 947284c1978SDimitry Andric } 948284c1978SDimitry Andric } 949284c1978SDimitry Andric } 95091bc56edSDimitry Andric 95191bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection( 95291bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 95339d628a0SDimitry Andric return getContext().getAssociativeCOFFSection( 95439d628a0SDimitry Andric cast<MCSectionCOFF>(StaticCtorSection), KeySym); 95591bc56edSDimitry Andric } 95691bc56edSDimitry Andric 95791bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection( 95891bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 95939d628a0SDimitry Andric return getContext().getAssociativeCOFFSection( 96039d628a0SDimitry Andric cast<MCSectionCOFF>(StaticDtorSection), KeySym); 96191bc56edSDimitry Andric } 962