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" 40f22ef01cSRoman Divacky using namespace llvm; 41f22ef01cSRoman Divacky using namespace dwarf; 42f22ef01cSRoman Divacky 43f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 44f22ef01cSRoman Divacky // ELF 45f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 46f22ef01cSRoman Divacky 4791bc56edSDimitry Andric MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol( 4891bc56edSDimitry Andric const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, 493b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 503b0f4066SDimitry Andric unsigned Encoding = getPersonalityEncoding(); 5191bc56edSDimitry Andric if ((Encoding & 0x80) == dwarf::DW_EH_PE_indirect) 5217a519f9SDimitry Andric return getContext().GetOrCreateSymbol(StringRef("DW.ref.") + 5391bc56edSDimitry Andric TM.getSymbol(GV, Mang)->getName()); 5491bc56edSDimitry Andric if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr) 5591bc56edSDimitry Andric return TM.getSymbol(GV, Mang); 5691bc56edSDimitry Andric report_fatal_error("We do not support this DWARF encoding yet!"); 573b0f4066SDimitry Andric } 583b0f4066SDimitry Andric 593b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer, 603b0f4066SDimitry Andric const TargetMachine &TM, 613b0f4066SDimitry Andric const MCSymbol *Sym) const { 6217a519f9SDimitry Andric SmallString<64> NameData("DW.ref."); 6317a519f9SDimitry Andric NameData += Sym->getName(); 6417a519f9SDimitry Andric MCSymbol *Label = getContext().GetOrCreateSymbol(NameData); 653b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 663b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 6717a519f9SDimitry Andric StringRef Prefix = ".data."; 6817a519f9SDimitry Andric NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 693b0f4066SDimitry Andric unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 703b0f4066SDimitry Andric const MCSection *Sec = getContext().getELFSection(NameData, 713b0f4066SDimitry Andric ELF::SHT_PROGBITS, 723b0f4066SDimitry Andric Flags, 733b0f4066SDimitry Andric SectionKind::getDataRel(), 743b0f4066SDimitry Andric 0, Label->getName()); 753861d79fSDimitry Andric unsigned Size = TM.getDataLayout()->getPointerSize(); 763b0f4066SDimitry Andric Streamer.SwitchSection(Sec); 773861d79fSDimitry Andric Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment()); 783b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 79dff0c46cSDimitry Andric const MCExpr *E = MCConstantExpr::Create(Size, getContext()); 803b0f4066SDimitry Andric Streamer.EmitELFSize(Label, E); 813b0f4066SDimitry Andric Streamer.EmitLabel(Label); 823b0f4066SDimitry Andric 833b0f4066SDimitry Andric Streamer.EmitSymbolValue(Sym, Size); 843b0f4066SDimitry Andric } 853b0f4066SDimitry Andric 8691bc56edSDimitry Andric const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference( 8791bc56edSDimitry Andric const GlobalValue *GV, unsigned Encoding, Mangler &Mang, 8891bc56edSDimitry Andric const TargetMachine &TM, MachineModuleInfo *MMI, 89139f7f9bSDimitry Andric MCStreamer &Streamer) const { 90139f7f9bSDimitry Andric 91139f7f9bSDimitry Andric if (Encoding & dwarf::DW_EH_PE_indirect) { 92139f7f9bSDimitry Andric MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 93139f7f9bSDimitry Andric 9491bc56edSDimitry Andric MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang, TM); 95139f7f9bSDimitry Andric 96139f7f9bSDimitry Andric // Add information about the stub reference to ELFMMI so that the stub 97139f7f9bSDimitry Andric // gets emitted by the asmprinter. 98139f7f9bSDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 9991bc56edSDimitry Andric if (!StubSym.getPointer()) { 10091bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(GV, Mang); 101139f7f9bSDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 102139f7f9bSDimitry Andric } 103139f7f9bSDimitry Andric 104139f7f9bSDimitry Andric return TargetLoweringObjectFile:: 105139f7f9bSDimitry Andric getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()), 106139f7f9bSDimitry Andric Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 107139f7f9bSDimitry Andric } 108139f7f9bSDimitry Andric 109139f7f9bSDimitry Andric return TargetLoweringObjectFile:: 11091bc56edSDimitry Andric getTTypeGlobalReference(GV, Encoding, Mang, TM, MMI, Streamer); 111139f7f9bSDimitry Andric } 112139f7f9bSDimitry Andric 113f22ef01cSRoman Divacky static SectionKind 114f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) { 115bd5abe19SDimitry Andric // N.B.: The defaults used in here are no the same ones used in MC. 116bd5abe19SDimitry Andric // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 117bd5abe19SDimitry Andric // both gas and MC will produce a section with no flags. Given 1187ae0e2c9SDimitry Andric // section(".eh_frame") gcc will produce: 1197ae0e2c9SDimitry Andric // 120bd5abe19SDimitry Andric // .section .eh_frame,"a",@progbits 121f22ef01cSRoman Divacky if (Name.empty() || Name[0] != '.') return K; 122f22ef01cSRoman Divacky 123f22ef01cSRoman Divacky // Some lame default implementation based on some magic section names. 124f22ef01cSRoman Divacky if (Name == ".bss" || 125f22ef01cSRoman Divacky Name.startswith(".bss.") || 126f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.b.") || 127f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.b.") || 128f22ef01cSRoman Divacky Name == ".sbss" || 129f22ef01cSRoman Divacky Name.startswith(".sbss.") || 130f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.sb.") || 131f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.sb.")) 132f22ef01cSRoman Divacky return SectionKind::getBSS(); 133f22ef01cSRoman Divacky 134f22ef01cSRoman Divacky if (Name == ".tdata" || 135f22ef01cSRoman Divacky Name.startswith(".tdata.") || 136f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.td.") || 137f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.td.")) 138f22ef01cSRoman Divacky return SectionKind::getThreadData(); 139f22ef01cSRoman Divacky 140f22ef01cSRoman Divacky if (Name == ".tbss" || 141f22ef01cSRoman Divacky Name.startswith(".tbss.") || 142f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.tb.") || 143f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.tb.")) 144f22ef01cSRoman Divacky return SectionKind::getThreadBSS(); 145f22ef01cSRoman Divacky 146f22ef01cSRoman Divacky return K; 147f22ef01cSRoman Divacky } 148f22ef01cSRoman Divacky 149f22ef01cSRoman Divacky 150f22ef01cSRoman Divacky static unsigned getELFSectionType(StringRef Name, SectionKind K) { 151f22ef01cSRoman Divacky 152f22ef01cSRoman Divacky if (Name == ".init_array") 1532754fe60SDimitry Andric return ELF::SHT_INIT_ARRAY; 154f22ef01cSRoman Divacky 155f22ef01cSRoman Divacky if (Name == ".fini_array") 1562754fe60SDimitry Andric return ELF::SHT_FINI_ARRAY; 157f22ef01cSRoman Divacky 158f22ef01cSRoman Divacky if (Name == ".preinit_array") 1592754fe60SDimitry Andric return ELF::SHT_PREINIT_ARRAY; 160f22ef01cSRoman Divacky 161f22ef01cSRoman Divacky if (K.isBSS() || K.isThreadBSS()) 1622754fe60SDimitry Andric return ELF::SHT_NOBITS; 163f22ef01cSRoman Divacky 1642754fe60SDimitry Andric return ELF::SHT_PROGBITS; 165f22ef01cSRoman Divacky } 166f22ef01cSRoman Divacky 167f22ef01cSRoman Divacky 168f22ef01cSRoman Divacky static unsigned 169f22ef01cSRoman Divacky getELFSectionFlags(SectionKind K) { 170f22ef01cSRoman Divacky unsigned Flags = 0; 171f22ef01cSRoman Divacky 172f22ef01cSRoman Divacky if (!K.isMetadata()) 1732754fe60SDimitry Andric Flags |= ELF::SHF_ALLOC; 174f22ef01cSRoman Divacky 175f22ef01cSRoman Divacky if (K.isText()) 1762754fe60SDimitry Andric Flags |= ELF::SHF_EXECINSTR; 177f22ef01cSRoman Divacky 178f22ef01cSRoman Divacky if (K.isWriteable()) 1792754fe60SDimitry Andric Flags |= ELF::SHF_WRITE; 180f22ef01cSRoman Divacky 181f22ef01cSRoman Divacky if (K.isThreadLocal()) 1822754fe60SDimitry Andric Flags |= ELF::SHF_TLS; 183f22ef01cSRoman Divacky 184f22ef01cSRoman Divacky // K.isMergeableConst() is left out to honour PR4650 185f22ef01cSRoman Divacky if (K.isMergeableCString() || K.isMergeableConst4() || 186f22ef01cSRoman Divacky K.isMergeableConst8() || K.isMergeableConst16()) 1872754fe60SDimitry Andric Flags |= ELF::SHF_MERGE; 188f22ef01cSRoman Divacky 189f22ef01cSRoman Divacky if (K.isMergeableCString()) 1902754fe60SDimitry Andric Flags |= ELF::SHF_STRINGS; 191f22ef01cSRoman Divacky 192f22ef01cSRoman Divacky return Flags; 193f22ef01cSRoman Divacky } 194f22ef01cSRoman Divacky 19591bc56edSDimitry Andric static const Comdat *getELFComdat(const GlobalValue *GV) { 19691bc56edSDimitry Andric const Comdat *C = GV->getComdat(); 19791bc56edSDimitry Andric if (!C) 19891bc56edSDimitry Andric return nullptr; 199f22ef01cSRoman Divacky 20091bc56edSDimitry Andric if (C->getSelectionKind() != Comdat::Any) 20191bc56edSDimitry Andric report_fatal_error("ELF COMDATs only support SelectionKind::Any, '" + 20291bc56edSDimitry Andric C->getName() + "' cannot be lowered."); 20391bc56edSDimitry Andric 20491bc56edSDimitry Andric return C; 20591bc56edSDimitry Andric } 20691bc56edSDimitry Andric 20791bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( 20891bc56edSDimitry Andric const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 20991bc56edSDimitry Andric const TargetMachine &TM) const { 210f22ef01cSRoman Divacky StringRef SectionName = GV->getSection(); 211f22ef01cSRoman Divacky 212f22ef01cSRoman Divacky // Infer section flags from the section name if we can. 213f22ef01cSRoman Divacky Kind = getELFKindForNamedSection(SectionName, Kind); 214f22ef01cSRoman Divacky 21591bc56edSDimitry Andric StringRef Group = ""; 21691bc56edSDimitry Andric unsigned Flags = getELFSectionFlags(Kind); 21791bc56edSDimitry Andric if (const Comdat *C = getELFComdat(GV)) { 21891bc56edSDimitry Andric Group = C->getName(); 21991bc56edSDimitry Andric Flags |= ELF::SHF_GROUP; 22091bc56edSDimitry Andric } 221f22ef01cSRoman Divacky return getContext().getELFSection(SectionName, 22291bc56edSDimitry Andric getELFSectionType(SectionName, Kind), Flags, 22391bc56edSDimitry Andric Kind, /*EntrySize=*/0, Group); 224f22ef01cSRoman Divacky } 225f22ef01cSRoman Divacky 226f22ef01cSRoman Divacky /// getSectionPrefixForGlobal - Return the section prefix name used by options 227f22ef01cSRoman Divacky /// FunctionsSections and DataSections. 22891bc56edSDimitry Andric static StringRef getSectionPrefixForGlobal(SectionKind Kind) { 229f22ef01cSRoman Divacky if (Kind.isText()) return ".text."; 230f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ".rodata."; 231dff0c46cSDimitry Andric if (Kind.isBSS()) return ".bss."; 232f22ef01cSRoman Divacky 233f22ef01cSRoman Divacky if (Kind.isThreadData()) return ".tdata."; 234f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return ".tbss."; 235f22ef01cSRoman Divacky 236f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return ".data."; 237f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return ".data.rel.local."; 238f22ef01cSRoman Divacky if (Kind.isDataRel()) return ".data.rel."; 239f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 240f22ef01cSRoman Divacky 241f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 242f22ef01cSRoman Divacky return ".data.rel.ro."; 243f22ef01cSRoman Divacky } 244f22ef01cSRoman Divacky 245f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 246f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 24791bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 248f22ef01cSRoman Divacky // If we have -ffunction-section or -fdata-section then we should emit the 249f22ef01cSRoman Divacky // global value to a uniqued section specifically for it. 250f22ef01cSRoman Divacky bool EmitUniquedSection; 251f22ef01cSRoman Divacky if (Kind.isText()) 252f22ef01cSRoman Divacky EmitUniquedSection = TM.getFunctionSections(); 253f22ef01cSRoman Divacky else 254f22ef01cSRoman Divacky EmitUniquedSection = TM.getDataSections(); 255f22ef01cSRoman Divacky 256f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 257f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 25891bc56edSDimitry Andric if ((GV->isWeakForLinker() || EmitUniquedSection || GV->hasComdat()) && 259dff0c46cSDimitry Andric !Kind.isCommon()) { 26091bc56edSDimitry Andric StringRef Prefix = getSectionPrefixForGlobal(Kind); 261f22ef01cSRoman Divacky 26291bc56edSDimitry Andric SmallString<128> Name(Prefix); 26391bc56edSDimitry Andric TM.getNameWithPrefix(Name, GV, Mang, true); 26491bc56edSDimitry Andric 2652754fe60SDimitry Andric StringRef Group = ""; 2662754fe60SDimitry Andric unsigned Flags = getELFSectionFlags(Kind); 26791bc56edSDimitry Andric if (GV->isWeakForLinker() || GV->hasComdat()) { 26891bc56edSDimitry Andric if (const Comdat *C = getELFComdat(GV)) 26991bc56edSDimitry Andric Group = C->getName(); 27091bc56edSDimitry Andric else 27191bc56edSDimitry Andric Group = Name.substr(Prefix.size()); 2722754fe60SDimitry Andric Flags |= ELF::SHF_GROUP; 2732754fe60SDimitry Andric } 2742754fe60SDimitry Andric 275f22ef01cSRoman Divacky return getContext().getELFSection(Name.str(), 276f22ef01cSRoman Divacky getELFSectionType(Name.str(), Kind), 2772754fe60SDimitry Andric Flags, Kind, 0, Group); 278f22ef01cSRoman Divacky } 279f22ef01cSRoman Divacky 280f22ef01cSRoman Divacky if (Kind.isText()) return TextSection; 281f22ef01cSRoman Divacky 282f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() || 283f22ef01cSRoman Divacky Kind.isMergeable2ByteCString() || 284f22ef01cSRoman Divacky Kind.isMergeable4ByteCString()) { 285f22ef01cSRoman Divacky 286f22ef01cSRoman Divacky // We also need alignment here. 287f22ef01cSRoman Divacky // FIXME: this is getting the alignment of the character, not the 288f22ef01cSRoman Divacky // alignment of the global! 289f22ef01cSRoman Divacky unsigned Align = 2903861d79fSDimitry Andric TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)); 291f22ef01cSRoman Divacky 292f22ef01cSRoman Divacky const char *SizeSpec = ".rodata.str1."; 293f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString()) 294f22ef01cSRoman Divacky SizeSpec = ".rodata.str2."; 295f22ef01cSRoman Divacky else if (Kind.isMergeable4ByteCString()) 296f22ef01cSRoman Divacky SizeSpec = ".rodata.str4."; 297f22ef01cSRoman Divacky else 298f22ef01cSRoman Divacky assert(Kind.isMergeable1ByteCString() && "unknown string width"); 299f22ef01cSRoman Divacky 300f22ef01cSRoman Divacky 301f22ef01cSRoman Divacky std::string Name = SizeSpec + utostr(Align); 3022754fe60SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 3032754fe60SDimitry Andric ELF::SHF_ALLOC | 3042754fe60SDimitry Andric ELF::SHF_MERGE | 3052754fe60SDimitry Andric ELF::SHF_STRINGS, 306f22ef01cSRoman Divacky Kind); 307f22ef01cSRoman Divacky } 308f22ef01cSRoman Divacky 309f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 310f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 311f22ef01cSRoman Divacky return MergeableConst4Section; 312f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 313f22ef01cSRoman Divacky return MergeableConst8Section; 314f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 315f22ef01cSRoman Divacky return MergeableConst16Section; 316f22ef01cSRoman Divacky return ReadOnlySection; // .const 317f22ef01cSRoman Divacky } 318f22ef01cSRoman Divacky 319f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ReadOnlySection; 320f22ef01cSRoman Divacky 321f22ef01cSRoman Divacky if (Kind.isThreadData()) return TLSDataSection; 322f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return TLSBSSSection; 323f22ef01cSRoman Divacky 324f22ef01cSRoman Divacky // Note: we claim that common symbols are put in BSSSection, but they are 325f22ef01cSRoman Divacky // really emitted with the magic .comm directive, which creates a symbol table 326f22ef01cSRoman Divacky // entry but not a section. 327f22ef01cSRoman Divacky if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 328f22ef01cSRoman Divacky 329f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return DataSection; 330f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return DataRelLocalSection; 331f22ef01cSRoman Divacky if (Kind.isDataRel()) return DataRelSection; 332f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 333f22ef01cSRoman Divacky 334f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 335f22ef01cSRoman Divacky return DataRelROSection; 336f22ef01cSRoman Divacky } 337f22ef01cSRoman Divacky 338f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the 339f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it 340f22ef01cSRoman Divacky /// should be placed in. 34191bc56edSDimitry Andric const MCSection * 34291bc56edSDimitry Andric TargetLoweringObjectFileELF::getSectionForConstant(SectionKind Kind, 34391bc56edSDimitry Andric const Constant *C) const { 344f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 345f22ef01cSRoman Divacky return MergeableConst4Section; 346f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 347f22ef01cSRoman Divacky return MergeableConst8Section; 348f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 349f22ef01cSRoman Divacky return MergeableConst16Section; 350f22ef01cSRoman Divacky if (Kind.isReadOnly()) 351f22ef01cSRoman Divacky return ReadOnlySection; 352f22ef01cSRoman Divacky 353f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 354f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 355f22ef01cSRoman Divacky return DataRelROSection; 356f22ef01cSRoman Divacky } 357f22ef01cSRoman Divacky 35891bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileELF::getStaticCtorSection( 35991bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 360dff0c46cSDimitry Andric // The default scheme is .ctor / .dtor, so we have to invert the priority 361dff0c46cSDimitry Andric // numbering. 362dff0c46cSDimitry Andric if (Priority == 65535) 363dff0c46cSDimitry Andric return StaticCtorSection; 364dff0c46cSDimitry Andric 3657ae0e2c9SDimitry Andric if (UseInitArray) { 3667ae0e2c9SDimitry Andric std::string Name = std::string(".init_array.") + utostr(Priority); 3677ae0e2c9SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY, 3687ae0e2c9SDimitry Andric ELF::SHF_ALLOC | ELF::SHF_WRITE, 3697ae0e2c9SDimitry Andric SectionKind::getDataRel()); 3707ae0e2c9SDimitry Andric } else { 371dff0c46cSDimitry Andric std::string Name = std::string(".ctors.") + utostr(65535 - Priority); 372dff0c46cSDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 373dff0c46cSDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 374dff0c46cSDimitry Andric SectionKind::getDataRel()); 375dff0c46cSDimitry Andric } 3767ae0e2c9SDimitry Andric } 377dff0c46cSDimitry Andric 37891bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileELF::getStaticDtorSection( 37991bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 380dff0c46cSDimitry Andric // The default scheme is .ctor / .dtor, so we have to invert the priority 381dff0c46cSDimitry Andric // numbering. 382dff0c46cSDimitry Andric if (Priority == 65535) 383dff0c46cSDimitry Andric return StaticDtorSection; 384dff0c46cSDimitry Andric 3857ae0e2c9SDimitry Andric if (UseInitArray) { 3867ae0e2c9SDimitry Andric std::string Name = std::string(".fini_array.") + utostr(Priority); 3877ae0e2c9SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY, 3887ae0e2c9SDimitry Andric ELF::SHF_ALLOC | ELF::SHF_WRITE, 3897ae0e2c9SDimitry Andric SectionKind::getDataRel()); 3907ae0e2c9SDimitry Andric } else { 391dff0c46cSDimitry Andric std::string Name = std::string(".dtors.") + utostr(65535 - Priority); 392dff0c46cSDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 393dff0c46cSDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 394dff0c46cSDimitry Andric SectionKind::getDataRel()); 395dff0c46cSDimitry Andric } 3967ae0e2c9SDimitry Andric } 3977ae0e2c9SDimitry Andric 3987ae0e2c9SDimitry Andric void 3997ae0e2c9SDimitry Andric TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) { 4007ae0e2c9SDimitry Andric UseInitArray = UseInitArray_; 4017ae0e2c9SDimitry Andric if (!UseInitArray) 4027ae0e2c9SDimitry Andric return; 4037ae0e2c9SDimitry Andric 4047ae0e2c9SDimitry Andric StaticCtorSection = 4057ae0e2c9SDimitry Andric getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY, 4067ae0e2c9SDimitry Andric ELF::SHF_WRITE | 4077ae0e2c9SDimitry Andric ELF::SHF_ALLOC, 4087ae0e2c9SDimitry Andric SectionKind::getDataRel()); 4097ae0e2c9SDimitry Andric StaticDtorSection = 4107ae0e2c9SDimitry Andric getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY, 4117ae0e2c9SDimitry Andric ELF::SHF_WRITE | 4127ae0e2c9SDimitry Andric ELF::SHF_ALLOC, 4137ae0e2c9SDimitry Andric SectionKind::getDataRel()); 4147ae0e2c9SDimitry Andric } 415dff0c46cSDimitry Andric 416f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 417f22ef01cSRoman Divacky // MachO 418f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 419f22ef01cSRoman Divacky 42091bc56edSDimitry Andric /// getDepLibFromLinkerOpt - Extract the dependent library name from a linker 42191bc56edSDimitry Andric /// option string. Returns StringRef() if the option does not specify a library. 42291bc56edSDimitry Andric StringRef TargetLoweringObjectFileMachO:: 42391bc56edSDimitry Andric getDepLibFromLinkerOpt(StringRef LinkerOption) const { 42491bc56edSDimitry Andric const char *LibCmd = "-l"; 42591bc56edSDimitry Andric if (LinkerOption.startswith(LibCmd)) 42691bc56edSDimitry Andric return LinkerOption.substr(strlen(LibCmd)); 42791bc56edSDimitry Andric return StringRef(); 42891bc56edSDimitry Andric } 42991bc56edSDimitry Andric 430139f7f9bSDimitry Andric /// emitModuleFlags - Perform code emission for module flags. 431dff0c46cSDimitry Andric void TargetLoweringObjectFileMachO:: 432dff0c46cSDimitry Andric emitModuleFlags(MCStreamer &Streamer, 433dff0c46cSDimitry Andric ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 43491bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 435dff0c46cSDimitry Andric unsigned VersionVal = 0; 4367ae0e2c9SDimitry Andric unsigned ImageInfoFlags = 0; 43791bc56edSDimitry Andric MDNode *LinkerOptions = nullptr; 438dff0c46cSDimitry Andric StringRef SectionVal; 439dff0c46cSDimitry Andric 440dff0c46cSDimitry Andric for (ArrayRef<Module::ModuleFlagEntry>::iterator 441dff0c46cSDimitry Andric i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 442dff0c46cSDimitry Andric const Module::ModuleFlagEntry &MFE = *i; 443dff0c46cSDimitry Andric 444dff0c46cSDimitry Andric // Ignore flags with 'Require' behavior. 445dff0c46cSDimitry Andric if (MFE.Behavior == Module::Require) 446dff0c46cSDimitry Andric continue; 447dff0c46cSDimitry Andric 448dff0c46cSDimitry Andric StringRef Key = MFE.Key->getString(); 449dff0c46cSDimitry Andric Value *Val = MFE.Val; 450dff0c46cSDimitry Andric 451139f7f9bSDimitry Andric if (Key == "Objective-C Image Info Version") { 452dff0c46cSDimitry Andric VersionVal = cast<ConstantInt>(Val)->getZExtValue(); 453139f7f9bSDimitry Andric } else if (Key == "Objective-C Garbage Collection" || 4547ae0e2c9SDimitry Andric Key == "Objective-C GC Only" || 455139f7f9bSDimitry Andric Key == "Objective-C Is Simulated") { 4567ae0e2c9SDimitry Andric ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue(); 457139f7f9bSDimitry Andric } else if (Key == "Objective-C Image Info Section") { 458dff0c46cSDimitry Andric SectionVal = cast<MDString>(Val)->getString(); 459139f7f9bSDimitry Andric } else if (Key == "Linker Options") { 460139f7f9bSDimitry Andric LinkerOptions = cast<MDNode>(Val); 461139f7f9bSDimitry Andric } 462139f7f9bSDimitry Andric } 463139f7f9bSDimitry Andric 464139f7f9bSDimitry Andric // Emit the linker options if present. 465139f7f9bSDimitry Andric if (LinkerOptions) { 466139f7f9bSDimitry Andric for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 467139f7f9bSDimitry Andric MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 468139f7f9bSDimitry Andric SmallVector<std::string, 4> StrOptions; 469139f7f9bSDimitry Andric 470139f7f9bSDimitry Andric // Convert to strings. 471139f7f9bSDimitry Andric for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 472139f7f9bSDimitry Andric MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 473139f7f9bSDimitry Andric StrOptions.push_back(MDOption->getString()); 474139f7f9bSDimitry Andric } 475139f7f9bSDimitry Andric 476139f7f9bSDimitry Andric Streamer.EmitLinkerOptions(StrOptions); 477139f7f9bSDimitry Andric } 478dff0c46cSDimitry Andric } 479dff0c46cSDimitry Andric 480dff0c46cSDimitry Andric // The section is mandatory. If we don't have it, then we don't have GC info. 481dff0c46cSDimitry Andric if (SectionVal.empty()) return; 482dff0c46cSDimitry Andric 483dff0c46cSDimitry Andric StringRef Segment, Section; 484dff0c46cSDimitry Andric unsigned TAA = 0, StubSize = 0; 485dff0c46cSDimitry Andric bool TAAParsed; 486dff0c46cSDimitry Andric std::string ErrorCode = 487dff0c46cSDimitry Andric MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section, 488dff0c46cSDimitry Andric TAA, TAAParsed, StubSize); 489dff0c46cSDimitry Andric if (!ErrorCode.empty()) 490dff0c46cSDimitry Andric // If invalid, report the error with report_fatal_error. 491dff0c46cSDimitry Andric report_fatal_error("Invalid section specifier '" + Section + "': " + 492dff0c46cSDimitry Andric ErrorCode + "."); 493dff0c46cSDimitry Andric 494dff0c46cSDimitry Andric // Get the section. 495dff0c46cSDimitry Andric const MCSectionMachO *S = 496dff0c46cSDimitry Andric getContext().getMachOSection(Segment, Section, TAA, StubSize, 497dff0c46cSDimitry Andric SectionKind::getDataNoRel()); 498dff0c46cSDimitry Andric Streamer.SwitchSection(S); 499dff0c46cSDimitry Andric Streamer.EmitLabel(getContext(). 500dff0c46cSDimitry Andric GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO"))); 501dff0c46cSDimitry Andric Streamer.EmitIntValue(VersionVal, 4); 5027ae0e2c9SDimitry Andric Streamer.EmitIntValue(ImageInfoFlags, 4); 503dff0c46cSDimitry Andric Streamer.AddBlankLine(); 504dff0c46cSDimitry Andric } 505dff0c46cSDimitry Andric 50691bc56edSDimitry Andric static void checkMachOComdat(const GlobalValue *GV) { 50791bc56edSDimitry Andric const Comdat *C = GV->getComdat(); 50891bc56edSDimitry Andric if (!C) 50991bc56edSDimitry Andric return; 51091bc56edSDimitry Andric 51191bc56edSDimitry Andric report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() + 51291bc56edSDimitry Andric "' cannot be lowered."); 51391bc56edSDimitry Andric } 51491bc56edSDimitry Andric 51591bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal( 51691bc56edSDimitry Andric const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 51791bc56edSDimitry Andric const TargetMachine &TM) const { 518f22ef01cSRoman Divacky // Parse the section specifier and create it if valid. 519f22ef01cSRoman Divacky StringRef Segment, Section; 5203b0f4066SDimitry Andric unsigned TAA = 0, StubSize = 0; 5213b0f4066SDimitry Andric bool TAAParsed; 52291bc56edSDimitry Andric 52391bc56edSDimitry Andric checkMachOComdat(GV); 52491bc56edSDimitry Andric 525f22ef01cSRoman Divacky std::string ErrorCode = 526f22ef01cSRoman Divacky MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 5273b0f4066SDimitry Andric TAA, TAAParsed, StubSize); 528f22ef01cSRoman Divacky if (!ErrorCode.empty()) { 529f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 530dff0c46cSDimitry Andric report_fatal_error("Global variable '" + GV->getName() + 531dff0c46cSDimitry Andric "' has an invalid section specifier '" + 532dff0c46cSDimitry Andric GV->getSection() + "': " + ErrorCode + "."); 533f22ef01cSRoman Divacky } 534f22ef01cSRoman Divacky 535f22ef01cSRoman Divacky // Get the section. 536f22ef01cSRoman Divacky const MCSectionMachO *S = 537f22ef01cSRoman Divacky getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 538f22ef01cSRoman Divacky 539dd6029ffSDimitry Andric // If TAA wasn't set by ParseSectionSpecifier() above, 540dd6029ffSDimitry Andric // use the value returned by getMachOSection() as a default. 5413b0f4066SDimitry Andric if (!TAAParsed) 542dd6029ffSDimitry Andric TAA = S->getTypeAndAttributes(); 543dd6029ffSDimitry Andric 544f22ef01cSRoman Divacky // Okay, now that we got the section, verify that the TAA & StubSize agree. 545f22ef01cSRoman Divacky // If the user declared multiple globals with different section flags, we need 546f22ef01cSRoman Divacky // to reject it here. 547f22ef01cSRoman Divacky if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 548f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 549dff0c46cSDimitry Andric report_fatal_error("Global variable '" + GV->getName() + 550f22ef01cSRoman Divacky "' section type or attributes does not match previous" 551f22ef01cSRoman Divacky " section specifier"); 552f22ef01cSRoman Divacky } 553f22ef01cSRoman Divacky 554f22ef01cSRoman Divacky return S; 555f22ef01cSRoman Divacky } 556f22ef01cSRoman Divacky 55791bc56edSDimitry Andric bool TargetLoweringObjectFileMachO::isSectionAtomizableBySymbols( 55891bc56edSDimitry Andric const MCSection &Section) const { 55991bc56edSDimitry Andric const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section); 56091bc56edSDimitry Andric 56191bc56edSDimitry Andric // Sections holding 1 byte strings are atomized based on the data 56291bc56edSDimitry Andric // they contain. 56391bc56edSDimitry Andric // Sections holding 2 byte strings require symbols in order to be 56491bc56edSDimitry Andric // atomized. 56591bc56edSDimitry Andric // There is no dedicated section for 4 byte strings. 56691bc56edSDimitry Andric if (SMO.getKind().isMergeable1ByteCString()) 56791bc56edSDimitry Andric return false; 56891bc56edSDimitry Andric 56991bc56edSDimitry Andric if (SMO.getSegmentName() == "__DATA" && 57091bc56edSDimitry Andric SMO.getSectionName() == "__cfstring") 57191bc56edSDimitry Andric return false; 57291bc56edSDimitry Andric 57391bc56edSDimitry Andric switch (SMO.getType()) { 57491bc56edSDimitry Andric default: 57591bc56edSDimitry Andric return true; 57691bc56edSDimitry Andric 57791bc56edSDimitry Andric // These sections are atomized at the element boundaries without using 57891bc56edSDimitry Andric // symbols. 57991bc56edSDimitry Andric case MachO::S_4BYTE_LITERALS: 58091bc56edSDimitry Andric case MachO::S_8BYTE_LITERALS: 58191bc56edSDimitry Andric case MachO::S_16BYTE_LITERALS: 58291bc56edSDimitry Andric case MachO::S_LITERAL_POINTERS: 58391bc56edSDimitry Andric case MachO::S_NON_LAZY_SYMBOL_POINTERS: 58491bc56edSDimitry Andric case MachO::S_LAZY_SYMBOL_POINTERS: 58591bc56edSDimitry Andric case MachO::S_MOD_INIT_FUNC_POINTERS: 58691bc56edSDimitry Andric case MachO::S_MOD_TERM_FUNC_POINTERS: 58791bc56edSDimitry Andric case MachO::S_INTERPOSING: 58891bc56edSDimitry Andric return false; 58991bc56edSDimitry Andric } 59091bc56edSDimitry Andric } 59191bc56edSDimitry Andric 592f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO:: 593f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 59491bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 59591bc56edSDimitry Andric checkMachOComdat(GV); 596f785676fSDimitry Andric 597f785676fSDimitry Andric // Handle thread local data. 598f785676fSDimitry Andric if (Kind.isThreadBSS()) return TLSBSSSection; 599f785676fSDimitry Andric if (Kind.isThreadData()) return TLSDataSection; 600f785676fSDimitry Andric 601f22ef01cSRoman Divacky if (Kind.isText()) 602f22ef01cSRoman Divacky return GV->isWeakForLinker() ? TextCoalSection : TextSection; 603f22ef01cSRoman Divacky 604f22ef01cSRoman Divacky // If this is weak/linkonce, put this in a coalescable section, either in text 605f22ef01cSRoman Divacky // or data depending on if it is writable. 606f22ef01cSRoman Divacky if (GV->isWeakForLinker()) { 607f22ef01cSRoman Divacky if (Kind.isReadOnly()) 608f22ef01cSRoman Divacky return ConstTextCoalSection; 609f22ef01cSRoman Divacky return DataCoalSection; 610f22ef01cSRoman Divacky } 611f22ef01cSRoman Divacky 612f22ef01cSRoman Divacky // FIXME: Alignment check should be handled by section classifier. 613f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() && 6143861d79fSDimitry Andric TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 615f22ef01cSRoman Divacky return CStringSection; 616f22ef01cSRoman Divacky 617f22ef01cSRoman Divacky // Do not put 16-bit arrays in the UString section if they have an 618f22ef01cSRoman Divacky // externally visible label, this runs into issues with certain linker 619f22ef01cSRoman Divacky // versions. 620f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 6213861d79fSDimitry Andric TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 622f22ef01cSRoman Divacky return UStringSection; 623f22ef01cSRoman Divacky 624f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 625f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 626f22ef01cSRoman Divacky return FourByteConstantSection; 627f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 628f22ef01cSRoman Divacky return EightByteConstantSection; 62991bc56edSDimitry Andric if (Kind.isMergeableConst16()) 630f22ef01cSRoman Divacky return SixteenByteConstantSection; 631f22ef01cSRoman Divacky } 632f22ef01cSRoman Divacky 633f22ef01cSRoman Divacky // Otherwise, if it is readonly, but not something we can specially optimize, 634f22ef01cSRoman Divacky // just drop it in .const. 635f22ef01cSRoman Divacky if (Kind.isReadOnly()) 636f22ef01cSRoman Divacky return ReadOnlySection; 637f22ef01cSRoman Divacky 638f22ef01cSRoman Divacky // If this is marked const, put it into a const section. But if the dynamic 639f22ef01cSRoman Divacky // linker needs to write to it, put it in the data segment. 640f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRel()) 641f22ef01cSRoman Divacky return ConstDataSection; 642f22ef01cSRoman Divacky 643f22ef01cSRoman Divacky // Put zero initialized globals with strong external linkage in the 644f22ef01cSRoman Divacky // DATA, __common section with the .zerofill directive. 645f22ef01cSRoman Divacky if (Kind.isBSSExtern()) 646f22ef01cSRoman Divacky return DataCommonSection; 647f22ef01cSRoman Divacky 648f22ef01cSRoman Divacky // Put zero initialized globals with local linkage in __DATA,__bss directive 649f22ef01cSRoman Divacky // with the .zerofill directive (aka .lcomm). 650f22ef01cSRoman Divacky if (Kind.isBSSLocal()) 651f22ef01cSRoman Divacky return DataBSSSection; 652f22ef01cSRoman Divacky 653f22ef01cSRoman Divacky // Otherwise, just drop the variable in the normal data section. 654f22ef01cSRoman Divacky return DataSection; 655f22ef01cSRoman Divacky } 656f22ef01cSRoman Divacky 657f22ef01cSRoman Divacky const MCSection * 65891bc56edSDimitry Andric TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind, 65991bc56edSDimitry Andric const Constant *C) const { 660f22ef01cSRoman Divacky // If this constant requires a relocation, we have to put it in the data 661f22ef01cSRoman Divacky // segment, not in the text segment. 662f22ef01cSRoman Divacky if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 663f22ef01cSRoman Divacky return ConstDataSection; 664f22ef01cSRoman Divacky 665f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 666f22ef01cSRoman Divacky return FourByteConstantSection; 667f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 668f22ef01cSRoman Divacky return EightByteConstantSection; 66991bc56edSDimitry Andric if (Kind.isMergeableConst16()) 670f22ef01cSRoman Divacky return SixteenByteConstantSection; 671f22ef01cSRoman Divacky return ReadOnlySection; // .const 672f22ef01cSRoman Divacky } 673f22ef01cSRoman Divacky 67491bc56edSDimitry Andric const MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference( 67591bc56edSDimitry Andric const GlobalValue *GV, unsigned Encoding, Mangler &Mang, 67691bc56edSDimitry Andric const TargetMachine &TM, MachineModuleInfo *MMI, 677f22ef01cSRoman Divacky MCStreamer &Streamer) const { 678f22ef01cSRoman Divacky // The mach-o version of this method defaults to returning a stub reference. 679f22ef01cSRoman Divacky 680f22ef01cSRoman Divacky if (Encoding & DW_EH_PE_indirect) { 681f22ef01cSRoman Divacky MachineModuleInfoMachO &MachOMMI = 682f22ef01cSRoman Divacky MMI->getObjFileInfo<MachineModuleInfoMachO>(); 683f22ef01cSRoman Divacky 68491bc56edSDimitry Andric MCSymbol *SSym = 68591bc56edSDimitry Andric getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM); 686f22ef01cSRoman Divacky 687f22ef01cSRoman Divacky // Add information about the stub reference to MachOMMI so that the stub 688f22ef01cSRoman Divacky // gets emitted by the asmprinter. 689f8254f43SDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = 690f8254f43SDimitry Andric GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 691f8254f43SDimitry Andric MachOMMI.getGVStubEntry(SSym); 69291bc56edSDimitry Andric if (!StubSym.getPointer()) { 69391bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(GV, Mang); 694f22ef01cSRoman Divacky StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 695f22ef01cSRoman Divacky } 696f22ef01cSRoman Divacky 697f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 698139f7f9bSDimitry Andric getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()), 699139f7f9bSDimitry Andric Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 700f22ef01cSRoman Divacky } 701f22ef01cSRoman Divacky 70291bc56edSDimitry Andric return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding, Mang, 70391bc56edSDimitry Andric TM, MMI, Streamer); 704f22ef01cSRoman Divacky } 705f22ef01cSRoman Divacky 70691bc56edSDimitry Andric MCSymbol *TargetLoweringObjectFileMachO::getCFIPersonalitySymbol( 70791bc56edSDimitry Andric const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, 7083b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 7093b0f4066SDimitry Andric // The mach-o version of this method defaults to returning a stub reference. 7103b0f4066SDimitry Andric MachineModuleInfoMachO &MachOMMI = 7113b0f4066SDimitry Andric MMI->getObjFileInfo<MachineModuleInfoMachO>(); 7123b0f4066SDimitry Andric 71391bc56edSDimitry Andric MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM); 7143b0f4066SDimitry Andric 7153b0f4066SDimitry Andric // Add information about the stub reference to MachOMMI so that the stub 7163b0f4066SDimitry Andric // gets emitted by the asmprinter. 717dff0c46cSDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 71891bc56edSDimitry Andric if (!StubSym.getPointer()) { 71991bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(GV, Mang); 7203b0f4066SDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 7213b0f4066SDimitry Andric } 7223b0f4066SDimitry Andric 7233b0f4066SDimitry Andric return SSym; 7243b0f4066SDimitry Andric } 7253b0f4066SDimitry Andric 726f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 727f22ef01cSRoman Divacky // COFF 728f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 729f22ef01cSRoman Divacky 730f22ef01cSRoman Divacky static unsigned 731f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) { 732f22ef01cSRoman Divacky unsigned Flags = 0; 733f22ef01cSRoman Divacky 734ffd1746dSEd Schouten if (K.isMetadata()) 735f22ef01cSRoman Divacky Flags |= 736ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE; 737f22ef01cSRoman Divacky else if (K.isText()) 738f22ef01cSRoman Divacky Flags |= 739ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_EXECUTE | 7402754fe60SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 741ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_CODE; 742f22ef01cSRoman Divacky else if (K.isBSS ()) 743f22ef01cSRoman Divacky Flags |= 744ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 745ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 746ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 747dff0c46cSDimitry Andric else if (K.isThreadLocal()) 748dff0c46cSDimitry Andric Flags |= 749dff0c46cSDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 750dff0c46cSDimitry Andric COFF::IMAGE_SCN_MEM_READ | 751dff0c46cSDimitry Andric COFF::IMAGE_SCN_MEM_WRITE; 752f22ef01cSRoman Divacky else if (K.isReadOnly()) 753f22ef01cSRoman Divacky Flags |= 754ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 755ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ; 756f22ef01cSRoman Divacky else if (K.isWriteable()) 757f22ef01cSRoman Divacky Flags |= 758ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 759ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 760ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 761f22ef01cSRoman Divacky 762f22ef01cSRoman Divacky return Flags; 763f22ef01cSRoman Divacky } 764f22ef01cSRoman Divacky 76591bc56edSDimitry Andric static const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) { 76691bc56edSDimitry Andric const Comdat *C = GV->getComdat(); 76791bc56edSDimitry Andric assert(C && "expected GV to have a Comdat!"); 76891bc56edSDimitry Andric 76991bc56edSDimitry Andric StringRef ComdatGVName = C->getName(); 77091bc56edSDimitry Andric const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName); 77191bc56edSDimitry Andric if (!ComdatGV) 77291bc56edSDimitry Andric report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + 77391bc56edSDimitry Andric "' does not exist."); 77491bc56edSDimitry Andric 77591bc56edSDimitry Andric if (ComdatGV->getComdat() != C) 77691bc56edSDimitry Andric report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + 77791bc56edSDimitry Andric "' is not a key for it's COMDAT."); 77891bc56edSDimitry Andric 77991bc56edSDimitry Andric return ComdatGV; 78091bc56edSDimitry Andric } 78191bc56edSDimitry Andric 78291bc56edSDimitry Andric static int getSelectionForCOFF(const GlobalValue *GV) { 78391bc56edSDimitry Andric if (const Comdat *C = GV->getComdat()) { 78491bc56edSDimitry Andric const GlobalValue *ComdatKey = getComdatGVForCOFF(GV); 78591bc56edSDimitry Andric if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey)) 78691bc56edSDimitry Andric ComdatKey = GA->getBaseObject(); 78791bc56edSDimitry Andric if (ComdatKey == GV) { 78891bc56edSDimitry Andric switch (C->getSelectionKind()) { 78991bc56edSDimitry Andric case Comdat::Any: 79091bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_ANY; 79191bc56edSDimitry Andric case Comdat::ExactMatch: 79291bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH; 79391bc56edSDimitry Andric case Comdat::Largest: 79491bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_LARGEST; 79591bc56edSDimitry Andric case Comdat::NoDuplicates: 79691bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES; 79791bc56edSDimitry Andric case Comdat::SameSize: 79891bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE; 79991bc56edSDimitry Andric } 80091bc56edSDimitry Andric } else { 80191bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE; 80291bc56edSDimitry Andric } 80391bc56edSDimitry Andric } else if (GV->isWeakForLinker()) { 80491bc56edSDimitry Andric return COFF::IMAGE_COMDAT_SELECT_ANY; 80591bc56edSDimitry Andric } 80691bc56edSDimitry Andric return 0; 80791bc56edSDimitry Andric } 80891bc56edSDimitry Andric 80991bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal( 81091bc56edSDimitry Andric const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 81191bc56edSDimitry Andric const TargetMachine &TM) const { 812139f7f9bSDimitry Andric int Selection = 0; 813139f7f9bSDimitry Andric unsigned Characteristics = getCOFFSectionFlags(Kind); 81491bc56edSDimitry Andric StringRef Name = GV->getSection(); 81591bc56edSDimitry Andric StringRef COMDATSymName = ""; 81691bc56edSDimitry Andric if ((GV->isWeakForLinker() || GV->hasComdat()) && !Kind.isCommon()) { 81791bc56edSDimitry Andric Selection = getSelectionForCOFF(GV); 81891bc56edSDimitry Andric const GlobalValue *ComdatGV; 81991bc56edSDimitry Andric if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) 82091bc56edSDimitry Andric ComdatGV = getComdatGVForCOFF(GV); 82191bc56edSDimitry Andric else 82291bc56edSDimitry Andric ComdatGV = GV; 82391bc56edSDimitry Andric 82491bc56edSDimitry Andric if (!ComdatGV->hasPrivateLinkage()) { 82591bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); 82691bc56edSDimitry Andric COMDATSymName = Sym->getName(); 827139f7f9bSDimitry Andric Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 82891bc56edSDimitry Andric } else { 82991bc56edSDimitry Andric Selection = 0; 83091bc56edSDimitry Andric } 831139f7f9bSDimitry Andric } 832139f7f9bSDimitry Andric return getContext().getCOFFSection(Name, 833139f7f9bSDimitry Andric Characteristics, 834f785676fSDimitry Andric Kind, 83591bc56edSDimitry Andric COMDATSymName, 836f785676fSDimitry Andric Selection); 837f22ef01cSRoman Divacky } 838f22ef01cSRoman Divacky 83991bc56edSDimitry Andric static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) { 840f22ef01cSRoman Divacky if (Kind.isText()) 84191bc56edSDimitry Andric return ".text"; 842f22ef01cSRoman Divacky if (Kind.isBSS()) 84391bc56edSDimitry Andric return ".bss"; 84491bc56edSDimitry Andric if (Kind.isThreadLocal()) 84591bc56edSDimitry Andric return ".tls$"; 846f22ef01cSRoman Divacky if (Kind.isWriteable()) 84791bc56edSDimitry Andric return ".data"; 84891bc56edSDimitry Andric return ".rdata"; 849f22ef01cSRoman Divacky } 850f22ef01cSRoman Divacky 851f22ef01cSRoman Divacky 852f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF:: 853f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 85491bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 85591bc56edSDimitry Andric // If we have -ffunction-sections then we should emit the global value to a 85691bc56edSDimitry Andric // uniqued section specifically for it. 85791bc56edSDimitry Andric bool EmitUniquedSection; 85891bc56edSDimitry Andric if (Kind.isText()) 85991bc56edSDimitry Andric EmitUniquedSection = TM.getFunctionSections(); 86091bc56edSDimitry Andric else 86191bc56edSDimitry Andric EmitUniquedSection = TM.getDataSections(); 862f22ef01cSRoman Divacky 863f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 864f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 86591bc56edSDimitry Andric // Section names depend on the name of the symbol which is not feasible if the 86691bc56edSDimitry Andric // symbol has private linkage. 86791bc56edSDimitry Andric if ((GV->isWeakForLinker() || EmitUniquedSection || GV->hasComdat()) && 86891bc56edSDimitry Andric !Kind.isCommon()) { 86991bc56edSDimitry Andric const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); 870f22ef01cSRoman Divacky unsigned Characteristics = getCOFFSectionFlags(Kind); 871f22ef01cSRoman Divacky 872ffd1746dSEd Schouten Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 87391bc56edSDimitry Andric int Selection = getSelectionForCOFF(GV); 87491bc56edSDimitry Andric if (!Selection) 87591bc56edSDimitry Andric Selection = COFF::IMAGE_COMDAT_SELECT_NODUPLICATES; 87691bc56edSDimitry Andric const GlobalValue *ComdatGV; 87791bc56edSDimitry Andric if (GV->hasComdat()) 87891bc56edSDimitry Andric ComdatGV = getComdatGVForCOFF(GV); 87991bc56edSDimitry Andric else 88091bc56edSDimitry Andric ComdatGV = GV; 881f22ef01cSRoman Divacky 88291bc56edSDimitry Andric if (!ComdatGV->hasPrivateLinkage()) { 88391bc56edSDimitry Andric MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); 88491bc56edSDimitry Andric StringRef COMDATSymName = Sym->getName(); 88591bc56edSDimitry Andric return getContext().getCOFFSection(Name, Characteristics, Kind, 88691bc56edSDimitry Andric COMDATSymName, Selection); 88791bc56edSDimitry Andric } 888f22ef01cSRoman Divacky } 889f22ef01cSRoman Divacky 890f22ef01cSRoman Divacky if (Kind.isText()) 891f785676fSDimitry Andric return TextSection; 892f22ef01cSRoman Divacky 893dff0c46cSDimitry Andric if (Kind.isThreadLocal()) 894f785676fSDimitry Andric return TLSDataSection; 895dff0c46cSDimitry Andric 896f785676fSDimitry Andric if (Kind.isReadOnly()) 897f785676fSDimitry Andric return ReadOnlySection; 898f785676fSDimitry Andric 89991bc56edSDimitry Andric // Note: we claim that common symbols are put in BSSSection, but they are 90091bc56edSDimitry Andric // really emitted with the magic .comm directive, which creates a symbol table 90191bc56edSDimitry Andric // entry but not a section. 90291bc56edSDimitry Andric if (Kind.isBSS() || Kind.isCommon()) 903f785676fSDimitry Andric return BSSSection; 904f785676fSDimitry Andric 905f785676fSDimitry Andric return DataSection; 906f22ef01cSRoman Divacky } 907f22ef01cSRoman Divacky 90891bc56edSDimitry Andric StringRef TargetLoweringObjectFileCOFF:: 90991bc56edSDimitry Andric getDepLibFromLinkerOpt(StringRef LinkerOption) const { 91091bc56edSDimitry Andric const char *LibCmd = "/DEFAULTLIB:"; 91191bc56edSDimitry Andric if (LinkerOption.startswith(LibCmd)) 91291bc56edSDimitry Andric return LinkerOption.substr(strlen(LibCmd)); 91391bc56edSDimitry Andric return StringRef(); 91491bc56edSDimitry Andric } 91591bc56edSDimitry Andric 916284c1978SDimitry Andric void TargetLoweringObjectFileCOFF:: 917284c1978SDimitry Andric emitModuleFlags(MCStreamer &Streamer, 918284c1978SDimitry Andric ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 91991bc56edSDimitry Andric Mangler &Mang, const TargetMachine &TM) const { 92091bc56edSDimitry Andric MDNode *LinkerOptions = nullptr; 921284c1978SDimitry Andric 922284c1978SDimitry Andric // Look for the "Linker Options" flag, since it's the only one we support. 923284c1978SDimitry Andric for (ArrayRef<Module::ModuleFlagEntry>::iterator 924284c1978SDimitry Andric i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 925284c1978SDimitry Andric const Module::ModuleFlagEntry &MFE = *i; 926284c1978SDimitry Andric StringRef Key = MFE.Key->getString(); 927284c1978SDimitry Andric Value *Val = MFE.Val; 928284c1978SDimitry Andric if (Key == "Linker Options") { 929284c1978SDimitry Andric LinkerOptions = cast<MDNode>(Val); 930284c1978SDimitry Andric break; 931284c1978SDimitry Andric } 932284c1978SDimitry Andric } 933284c1978SDimitry Andric if (!LinkerOptions) 934284c1978SDimitry Andric return; 935284c1978SDimitry Andric 936284c1978SDimitry Andric // Emit the linker options to the linker .drectve section. According to the 937284c1978SDimitry Andric // spec, this section is a space-separated string containing flags for linker. 938284c1978SDimitry Andric const MCSection *Sec = getDrectveSection(); 939284c1978SDimitry Andric Streamer.SwitchSection(Sec); 940284c1978SDimitry Andric for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 941284c1978SDimitry Andric MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 942284c1978SDimitry Andric for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 943284c1978SDimitry Andric MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 944284c1978SDimitry Andric StringRef Op = MDOption->getString(); 945284c1978SDimitry Andric // Lead with a space for consistency with our dllexport implementation. 946284c1978SDimitry Andric std::string Escaped(" "); 947284c1978SDimitry Andric if (Op.find(" ") != StringRef::npos) { 948284c1978SDimitry Andric // The PE-COFF spec says args with spaces must be quoted. It doesn't say 949284c1978SDimitry Andric // how to escape quotes, but it probably uses this algorithm: 950284c1978SDimitry Andric // http://msdn.microsoft.com/en-us/library/17w5ykft(v=vs.85).aspx 951284c1978SDimitry Andric // FIXME: Reuse escaping code from Support/Windows/Program.inc 952284c1978SDimitry Andric Escaped.push_back('\"'); 953284c1978SDimitry Andric Escaped.append(Op); 954284c1978SDimitry Andric Escaped.push_back('\"'); 955284c1978SDimitry Andric } else { 956284c1978SDimitry Andric Escaped.append(Op); 957284c1978SDimitry Andric } 958284c1978SDimitry Andric Streamer.EmitBytes(Escaped); 959284c1978SDimitry Andric } 960284c1978SDimitry Andric } 961284c1978SDimitry Andric } 96291bc56edSDimitry Andric 96391bc56edSDimitry Andric static const MCSection *getAssociativeCOFFSection(MCContext &Ctx, 96491bc56edSDimitry Andric const MCSection *Sec, 96591bc56edSDimitry Andric const MCSymbol *KeySym) { 96691bc56edSDimitry Andric // Return the normal section if we don't have to be associative. 96791bc56edSDimitry Andric if (!KeySym) 96891bc56edSDimitry Andric return Sec; 96991bc56edSDimitry Andric 97091bc56edSDimitry Andric // Make an associative section with the same name and kind as the normal 97191bc56edSDimitry Andric // section. 97291bc56edSDimitry Andric const MCSectionCOFF *SecCOFF = cast<MCSectionCOFF>(Sec); 97391bc56edSDimitry Andric unsigned Characteristics = 97491bc56edSDimitry Andric SecCOFF->getCharacteristics() | COFF::IMAGE_SCN_LNK_COMDAT; 97591bc56edSDimitry Andric return Ctx.getCOFFSection(SecCOFF->getSectionName(), Characteristics, 97691bc56edSDimitry Andric SecCOFF->getKind(), KeySym->getName(), 97791bc56edSDimitry Andric COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE); 97891bc56edSDimitry Andric } 97991bc56edSDimitry Andric 98091bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection( 98191bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 98291bc56edSDimitry Andric return getAssociativeCOFFSection(getContext(), StaticCtorSection, KeySym); 98391bc56edSDimitry Andric } 98491bc56edSDimitry Andric 98591bc56edSDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection( 98691bc56edSDimitry Andric unsigned Priority, const MCSymbol *KeySym) const { 98791bc56edSDimitry Andric return getAssociativeCOFFSection(getContext(), StaticDtorSection, KeySym); 98891bc56edSDimitry Andric } 989