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" 25139f7f9bSDimitry Andric #include "llvm/IR/Module.h" 26f22ef01cSRoman Divacky #include "llvm/MC/MCContext.h" 27f22ef01cSRoman Divacky #include "llvm/MC/MCExpr.h" 28f22ef01cSRoman Divacky #include "llvm/MC/MCSectionCOFF.h" 29139f7f9bSDimitry Andric #include "llvm/MC/MCSectionELF.h" 30139f7f9bSDimitry Andric #include "llvm/MC/MCSectionMachO.h" 313b0f4066SDimitry Andric #include "llvm/MC/MCStreamer.h" 32f22ef01cSRoman Divacky #include "llvm/MC/MCSymbol.h" 33f22ef01cSRoman Divacky #include "llvm/Support/Dwarf.h" 342754fe60SDimitry Andric #include "llvm/Support/ELF.h" 35f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 36f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h" 37139f7f9bSDimitry Andric #include "llvm/Target/Mangler.h" 38139f7f9bSDimitry Andric #include "llvm/Target/TargetMachine.h" 39f22ef01cSRoman Divacky using namespace llvm; 40f22ef01cSRoman Divacky using namespace dwarf; 41f22ef01cSRoman Divacky 42f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 43f22ef01cSRoman Divacky // ELF 44f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 45f22ef01cSRoman Divacky 463b0f4066SDimitry Andric MCSymbol * 473b0f4066SDimitry Andric TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV, 483b0f4066SDimitry Andric Mangler *Mang, 493b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 503b0f4066SDimitry Andric unsigned Encoding = getPersonalityEncoding(); 513b0f4066SDimitry Andric switch (Encoding & 0x70) { 523b0f4066SDimitry Andric default: 533b0f4066SDimitry Andric report_fatal_error("We do not support this DWARF encoding yet!"); 543b0f4066SDimitry Andric case dwarf::DW_EH_PE_absptr: 55f785676fSDimitry Andric return getSymbol(*Mang, GV); 563b0f4066SDimitry Andric case dwarf::DW_EH_PE_pcrel: { 5717a519f9SDimitry Andric return getContext().GetOrCreateSymbol(StringRef("DW.ref.") + 58f785676fSDimitry Andric getSymbol(*Mang, GV)->getName()); 593b0f4066SDimitry Andric } 603b0f4066SDimitry Andric } 613b0f4066SDimitry Andric } 623b0f4066SDimitry Andric 633b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer, 643b0f4066SDimitry Andric const TargetMachine &TM, 653b0f4066SDimitry Andric const MCSymbol *Sym) const { 6617a519f9SDimitry Andric SmallString<64> NameData("DW.ref."); 6717a519f9SDimitry Andric NameData += Sym->getName(); 6817a519f9SDimitry Andric MCSymbol *Label = getContext().GetOrCreateSymbol(NameData); 693b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 703b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 7117a519f9SDimitry Andric StringRef Prefix = ".data."; 7217a519f9SDimitry Andric NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 733b0f4066SDimitry Andric unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 743b0f4066SDimitry Andric const MCSection *Sec = getContext().getELFSection(NameData, 753b0f4066SDimitry Andric ELF::SHT_PROGBITS, 763b0f4066SDimitry Andric Flags, 773b0f4066SDimitry Andric SectionKind::getDataRel(), 783b0f4066SDimitry Andric 0, Label->getName()); 793861d79fSDimitry Andric unsigned Size = TM.getDataLayout()->getPointerSize(); 803b0f4066SDimitry Andric Streamer.SwitchSection(Sec); 813861d79fSDimitry Andric Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment()); 823b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 83dff0c46cSDimitry Andric const MCExpr *E = MCConstantExpr::Create(Size, getContext()); 843b0f4066SDimitry Andric Streamer.EmitELFSize(Label, E); 853b0f4066SDimitry Andric Streamer.EmitLabel(Label); 863b0f4066SDimitry Andric 873b0f4066SDimitry Andric Streamer.EmitSymbolValue(Sym, Size); 883b0f4066SDimitry Andric } 893b0f4066SDimitry Andric 90139f7f9bSDimitry Andric const MCExpr *TargetLoweringObjectFileELF:: 91139f7f9bSDimitry Andric getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 92139f7f9bSDimitry Andric MachineModuleInfo *MMI, unsigned Encoding, 93139f7f9bSDimitry Andric MCStreamer &Streamer) const { 94139f7f9bSDimitry Andric 95139f7f9bSDimitry Andric if (Encoding & dwarf::DW_EH_PE_indirect) { 96139f7f9bSDimitry Andric MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 97139f7f9bSDimitry Andric 98139f7f9bSDimitry Andric SmallString<128> Name; 99139f7f9bSDimitry Andric Mang->getNameWithPrefix(Name, GV, true); 100139f7f9bSDimitry Andric Name += ".DW.stub"; 101139f7f9bSDimitry Andric 102139f7f9bSDimitry Andric // Add information about the stub reference to ELFMMI so that the stub 103139f7f9bSDimitry Andric // gets emitted by the asmprinter. 104139f7f9bSDimitry Andric MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 105139f7f9bSDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 106139f7f9bSDimitry Andric if (StubSym.getPointer() == 0) { 107f785676fSDimitry Andric MCSymbol *Sym = getSymbol(*Mang, GV); 108139f7f9bSDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 109139f7f9bSDimitry Andric } 110139f7f9bSDimitry Andric 111139f7f9bSDimitry Andric return TargetLoweringObjectFile:: 112139f7f9bSDimitry Andric getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()), 113139f7f9bSDimitry Andric Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 114139f7f9bSDimitry Andric } 115139f7f9bSDimitry Andric 116139f7f9bSDimitry Andric return TargetLoweringObjectFile:: 117139f7f9bSDimitry Andric getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer); 118139f7f9bSDimitry Andric } 119139f7f9bSDimitry Andric 120f22ef01cSRoman Divacky static SectionKind 121f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) { 122bd5abe19SDimitry Andric // N.B.: The defaults used in here are no the same ones used in MC. 123bd5abe19SDimitry Andric // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 124bd5abe19SDimitry Andric // both gas and MC will produce a section with no flags. Given 1257ae0e2c9SDimitry Andric // section(".eh_frame") gcc will produce: 1267ae0e2c9SDimitry Andric // 127bd5abe19SDimitry Andric // .section .eh_frame,"a",@progbits 128f22ef01cSRoman Divacky if (Name.empty() || Name[0] != '.') return K; 129f22ef01cSRoman Divacky 130f22ef01cSRoman Divacky // Some lame default implementation based on some magic section names. 131f22ef01cSRoman Divacky if (Name == ".bss" || 132f22ef01cSRoman Divacky Name.startswith(".bss.") || 133f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.b.") || 134f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.b.") || 135f22ef01cSRoman Divacky Name == ".sbss" || 136f22ef01cSRoman Divacky Name.startswith(".sbss.") || 137f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.sb.") || 138f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.sb.")) 139f22ef01cSRoman Divacky return SectionKind::getBSS(); 140f22ef01cSRoman Divacky 141f22ef01cSRoman Divacky if (Name == ".tdata" || 142f22ef01cSRoman Divacky Name.startswith(".tdata.") || 143f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.td.") || 144f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.td.")) 145f22ef01cSRoman Divacky return SectionKind::getThreadData(); 146f22ef01cSRoman Divacky 147f22ef01cSRoman Divacky if (Name == ".tbss" || 148f22ef01cSRoman Divacky Name.startswith(".tbss.") || 149f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.tb.") || 150f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.tb.")) 151f22ef01cSRoman Divacky return SectionKind::getThreadBSS(); 152f22ef01cSRoman Divacky 153f22ef01cSRoman Divacky return K; 154f22ef01cSRoman Divacky } 155f22ef01cSRoman Divacky 156f22ef01cSRoman Divacky 157f22ef01cSRoman Divacky static unsigned getELFSectionType(StringRef Name, SectionKind K) { 158f22ef01cSRoman Divacky 159f22ef01cSRoman Divacky if (Name == ".init_array") 1602754fe60SDimitry Andric return ELF::SHT_INIT_ARRAY; 161f22ef01cSRoman Divacky 162f22ef01cSRoman Divacky if (Name == ".fini_array") 1632754fe60SDimitry Andric return ELF::SHT_FINI_ARRAY; 164f22ef01cSRoman Divacky 165f22ef01cSRoman Divacky if (Name == ".preinit_array") 1662754fe60SDimitry Andric return ELF::SHT_PREINIT_ARRAY; 167f22ef01cSRoman Divacky 168f22ef01cSRoman Divacky if (K.isBSS() || K.isThreadBSS()) 1692754fe60SDimitry Andric return ELF::SHT_NOBITS; 170f22ef01cSRoman Divacky 1712754fe60SDimitry Andric return ELF::SHT_PROGBITS; 172f22ef01cSRoman Divacky } 173f22ef01cSRoman Divacky 174f22ef01cSRoman Divacky 175f22ef01cSRoman Divacky static unsigned 176f22ef01cSRoman Divacky getELFSectionFlags(SectionKind K) { 177f22ef01cSRoman Divacky unsigned Flags = 0; 178f22ef01cSRoman Divacky 179f22ef01cSRoman Divacky if (!K.isMetadata()) 1802754fe60SDimitry Andric Flags |= ELF::SHF_ALLOC; 181f22ef01cSRoman Divacky 182f22ef01cSRoman Divacky if (K.isText()) 1832754fe60SDimitry Andric Flags |= ELF::SHF_EXECINSTR; 184f22ef01cSRoman Divacky 185f22ef01cSRoman Divacky if (K.isWriteable()) 1862754fe60SDimitry Andric Flags |= ELF::SHF_WRITE; 187f22ef01cSRoman Divacky 188f22ef01cSRoman Divacky if (K.isThreadLocal()) 1892754fe60SDimitry Andric Flags |= ELF::SHF_TLS; 190f22ef01cSRoman Divacky 191f22ef01cSRoman Divacky // K.isMergeableConst() is left out to honour PR4650 192f22ef01cSRoman Divacky if (K.isMergeableCString() || K.isMergeableConst4() || 193f22ef01cSRoman Divacky K.isMergeableConst8() || K.isMergeableConst16()) 1942754fe60SDimitry Andric Flags |= ELF::SHF_MERGE; 195f22ef01cSRoman Divacky 196f22ef01cSRoman Divacky if (K.isMergeableCString()) 1972754fe60SDimitry Andric Flags |= ELF::SHF_STRINGS; 198f22ef01cSRoman Divacky 199f22ef01cSRoman Divacky return Flags; 200f22ef01cSRoman Divacky } 201f22ef01cSRoman Divacky 202f22ef01cSRoman Divacky 203f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 204f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 205f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 206f22ef01cSRoman Divacky StringRef SectionName = GV->getSection(); 207f22ef01cSRoman Divacky 208f22ef01cSRoman Divacky // Infer section flags from the section name if we can. 209f22ef01cSRoman Divacky Kind = getELFKindForNamedSection(SectionName, Kind); 210f22ef01cSRoman Divacky 211f22ef01cSRoman Divacky return getContext().getELFSection(SectionName, 212f22ef01cSRoman Divacky getELFSectionType(SectionName, Kind), 2132754fe60SDimitry Andric getELFSectionFlags(Kind), Kind); 214f22ef01cSRoman Divacky } 215f22ef01cSRoman Divacky 216f22ef01cSRoman Divacky /// getSectionPrefixForGlobal - Return the section prefix name used by options 217f22ef01cSRoman Divacky /// FunctionsSections and DataSections. 218f22ef01cSRoman Divacky static const char *getSectionPrefixForGlobal(SectionKind Kind) { 219f22ef01cSRoman Divacky if (Kind.isText()) return ".text."; 220f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ".rodata."; 221dff0c46cSDimitry Andric if (Kind.isBSS()) return ".bss."; 222f22ef01cSRoman Divacky 223f22ef01cSRoman Divacky if (Kind.isThreadData()) return ".tdata."; 224f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return ".tbss."; 225f22ef01cSRoman Divacky 226f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return ".data."; 227f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return ".data.rel.local."; 228f22ef01cSRoman Divacky if (Kind.isDataRel()) return ".data.rel."; 229f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 230f22ef01cSRoman Divacky 231f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 232f22ef01cSRoman Divacky return ".data.rel.ro."; 233f22ef01cSRoman Divacky } 234f22ef01cSRoman Divacky 235f22ef01cSRoman Divacky 236f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 237f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 238f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 239f22ef01cSRoman Divacky // If we have -ffunction-section or -fdata-section then we should emit the 240f22ef01cSRoman Divacky // global value to a uniqued section specifically for it. 241f22ef01cSRoman Divacky bool EmitUniquedSection; 242f22ef01cSRoman Divacky if (Kind.isText()) 243f22ef01cSRoman Divacky EmitUniquedSection = TM.getFunctionSections(); 244f22ef01cSRoman Divacky else 245f22ef01cSRoman Divacky EmitUniquedSection = TM.getDataSections(); 246f22ef01cSRoman Divacky 247f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 248f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 249f22ef01cSRoman Divacky if ((GV->isWeakForLinker() || EmitUniquedSection) && 250dff0c46cSDimitry Andric !Kind.isCommon()) { 251f22ef01cSRoman Divacky const char *Prefix; 252f22ef01cSRoman Divacky Prefix = getSectionPrefixForGlobal(Kind); 253f22ef01cSRoman Divacky 254f22ef01cSRoman Divacky SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 255f785676fSDimitry Andric MCSymbol *Sym = getSymbol(*Mang, GV); 256f22ef01cSRoman Divacky Name.append(Sym->getName().begin(), Sym->getName().end()); 2572754fe60SDimitry Andric StringRef Group = ""; 2582754fe60SDimitry Andric unsigned Flags = getELFSectionFlags(Kind); 2592754fe60SDimitry Andric if (GV->isWeakForLinker()) { 2602754fe60SDimitry Andric Group = Sym->getName(); 2612754fe60SDimitry Andric Flags |= ELF::SHF_GROUP; 2622754fe60SDimitry Andric } 2632754fe60SDimitry Andric 264f22ef01cSRoman Divacky return getContext().getELFSection(Name.str(), 265f22ef01cSRoman Divacky getELFSectionType(Name.str(), Kind), 2662754fe60SDimitry Andric Flags, Kind, 0, Group); 267f22ef01cSRoman Divacky } 268f22ef01cSRoman Divacky 269f22ef01cSRoman Divacky if (Kind.isText()) return TextSection; 270f22ef01cSRoman Divacky 271f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() || 272f22ef01cSRoman Divacky Kind.isMergeable2ByteCString() || 273f22ef01cSRoman Divacky Kind.isMergeable4ByteCString()) { 274f22ef01cSRoman Divacky 275f22ef01cSRoman Divacky // We also need alignment here. 276f22ef01cSRoman Divacky // FIXME: this is getting the alignment of the character, not the 277f22ef01cSRoman Divacky // alignment of the global! 278f22ef01cSRoman Divacky unsigned Align = 2793861d79fSDimitry Andric TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)); 280f22ef01cSRoman Divacky 281f22ef01cSRoman Divacky const char *SizeSpec = ".rodata.str1."; 282f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString()) 283f22ef01cSRoman Divacky SizeSpec = ".rodata.str2."; 284f22ef01cSRoman Divacky else if (Kind.isMergeable4ByteCString()) 285f22ef01cSRoman Divacky SizeSpec = ".rodata.str4."; 286f22ef01cSRoman Divacky else 287f22ef01cSRoman Divacky assert(Kind.isMergeable1ByteCString() && "unknown string width"); 288f22ef01cSRoman Divacky 289f22ef01cSRoman Divacky 290f22ef01cSRoman Divacky std::string Name = SizeSpec + utostr(Align); 2912754fe60SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 2922754fe60SDimitry Andric ELF::SHF_ALLOC | 2932754fe60SDimitry Andric ELF::SHF_MERGE | 2942754fe60SDimitry Andric ELF::SHF_STRINGS, 295f22ef01cSRoman Divacky Kind); 296f22ef01cSRoman Divacky } 297f22ef01cSRoman Divacky 298f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 299f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 300f22ef01cSRoman Divacky return MergeableConst4Section; 301f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 302f22ef01cSRoman Divacky return MergeableConst8Section; 303f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 304f22ef01cSRoman Divacky return MergeableConst16Section; 305f22ef01cSRoman Divacky return ReadOnlySection; // .const 306f22ef01cSRoman Divacky } 307f22ef01cSRoman Divacky 308f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ReadOnlySection; 309f22ef01cSRoman Divacky 310f22ef01cSRoman Divacky if (Kind.isThreadData()) return TLSDataSection; 311f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return TLSBSSSection; 312f22ef01cSRoman Divacky 313f22ef01cSRoman Divacky // Note: we claim that common symbols are put in BSSSection, but they are 314f22ef01cSRoman Divacky // really emitted with the magic .comm directive, which creates a symbol table 315f22ef01cSRoman Divacky // entry but not a section. 316f22ef01cSRoman Divacky if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 317f22ef01cSRoman Divacky 318f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return DataSection; 319f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return DataRelLocalSection; 320f22ef01cSRoman Divacky if (Kind.isDataRel()) return DataRelSection; 321f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 322f22ef01cSRoman Divacky 323f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 324f22ef01cSRoman Divacky return DataRelROSection; 325f22ef01cSRoman Divacky } 326f22ef01cSRoman Divacky 327f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the 328f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it 329f22ef01cSRoman Divacky /// should be placed in. 330f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 331f22ef01cSRoman Divacky getSectionForConstant(SectionKind Kind) const { 332f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 333f22ef01cSRoman Divacky return MergeableConst4Section; 334f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 335f22ef01cSRoman Divacky return MergeableConst8Section; 336f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 337f22ef01cSRoman Divacky return MergeableConst16Section; 338f22ef01cSRoman Divacky if (Kind.isReadOnly()) 339f22ef01cSRoman Divacky return ReadOnlySection; 340f22ef01cSRoman Divacky 341f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 342f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 343f22ef01cSRoman Divacky return DataRelROSection; 344f22ef01cSRoman Divacky } 345f22ef01cSRoman Divacky 346dff0c46cSDimitry Andric const MCSection * 347dff0c46cSDimitry Andric TargetLoweringObjectFileELF::getStaticCtorSection(unsigned Priority) const { 348dff0c46cSDimitry Andric // The default scheme is .ctor / .dtor, so we have to invert the priority 349dff0c46cSDimitry Andric // numbering. 350dff0c46cSDimitry Andric if (Priority == 65535) 351dff0c46cSDimitry Andric return StaticCtorSection; 352dff0c46cSDimitry Andric 3537ae0e2c9SDimitry Andric if (UseInitArray) { 3547ae0e2c9SDimitry Andric std::string Name = std::string(".init_array.") + utostr(Priority); 3557ae0e2c9SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY, 3567ae0e2c9SDimitry Andric ELF::SHF_ALLOC | ELF::SHF_WRITE, 3577ae0e2c9SDimitry Andric SectionKind::getDataRel()); 3587ae0e2c9SDimitry Andric } else { 359dff0c46cSDimitry Andric std::string Name = std::string(".ctors.") + utostr(65535 - Priority); 360dff0c46cSDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 361dff0c46cSDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 362dff0c46cSDimitry Andric SectionKind::getDataRel()); 363dff0c46cSDimitry Andric } 3647ae0e2c9SDimitry Andric } 365dff0c46cSDimitry Andric 366dff0c46cSDimitry Andric const MCSection * 367dff0c46cSDimitry Andric TargetLoweringObjectFileELF::getStaticDtorSection(unsigned Priority) const { 368dff0c46cSDimitry Andric // The default scheme is .ctor / .dtor, so we have to invert the priority 369dff0c46cSDimitry Andric // numbering. 370dff0c46cSDimitry Andric if (Priority == 65535) 371dff0c46cSDimitry Andric return StaticDtorSection; 372dff0c46cSDimitry Andric 3737ae0e2c9SDimitry Andric if (UseInitArray) { 3747ae0e2c9SDimitry Andric std::string Name = std::string(".fini_array.") + utostr(Priority); 3757ae0e2c9SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY, 3767ae0e2c9SDimitry Andric ELF::SHF_ALLOC | ELF::SHF_WRITE, 3777ae0e2c9SDimitry Andric SectionKind::getDataRel()); 3787ae0e2c9SDimitry Andric } else { 379dff0c46cSDimitry Andric std::string Name = std::string(".dtors.") + utostr(65535 - Priority); 380dff0c46cSDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 381dff0c46cSDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 382dff0c46cSDimitry Andric SectionKind::getDataRel()); 383dff0c46cSDimitry Andric } 3847ae0e2c9SDimitry Andric } 3857ae0e2c9SDimitry Andric 3867ae0e2c9SDimitry Andric void 3877ae0e2c9SDimitry Andric TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) { 3887ae0e2c9SDimitry Andric UseInitArray = UseInitArray_; 3897ae0e2c9SDimitry Andric if (!UseInitArray) 3907ae0e2c9SDimitry Andric return; 3917ae0e2c9SDimitry Andric 3927ae0e2c9SDimitry Andric StaticCtorSection = 3937ae0e2c9SDimitry Andric getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY, 3947ae0e2c9SDimitry Andric ELF::SHF_WRITE | 3957ae0e2c9SDimitry Andric ELF::SHF_ALLOC, 3967ae0e2c9SDimitry Andric SectionKind::getDataRel()); 3977ae0e2c9SDimitry Andric StaticDtorSection = 3987ae0e2c9SDimitry Andric getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY, 3997ae0e2c9SDimitry Andric ELF::SHF_WRITE | 4007ae0e2c9SDimitry Andric ELF::SHF_ALLOC, 4017ae0e2c9SDimitry Andric SectionKind::getDataRel()); 4027ae0e2c9SDimitry Andric } 403dff0c46cSDimitry Andric 404f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 405f22ef01cSRoman Divacky // MachO 406f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 407f22ef01cSRoman Divacky 408139f7f9bSDimitry Andric /// emitModuleFlags - Perform code emission for module flags. 409dff0c46cSDimitry Andric void TargetLoweringObjectFileMachO:: 410dff0c46cSDimitry Andric emitModuleFlags(MCStreamer &Streamer, 411dff0c46cSDimitry Andric ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 412dff0c46cSDimitry Andric Mangler *Mang, const TargetMachine &TM) const { 413dff0c46cSDimitry Andric unsigned VersionVal = 0; 4147ae0e2c9SDimitry Andric unsigned ImageInfoFlags = 0; 415139f7f9bSDimitry Andric MDNode *LinkerOptions = 0; 416dff0c46cSDimitry Andric StringRef SectionVal; 417dff0c46cSDimitry Andric 418dff0c46cSDimitry Andric for (ArrayRef<Module::ModuleFlagEntry>::iterator 419dff0c46cSDimitry Andric i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 420dff0c46cSDimitry Andric const Module::ModuleFlagEntry &MFE = *i; 421dff0c46cSDimitry Andric 422dff0c46cSDimitry Andric // Ignore flags with 'Require' behavior. 423dff0c46cSDimitry Andric if (MFE.Behavior == Module::Require) 424dff0c46cSDimitry Andric continue; 425dff0c46cSDimitry Andric 426dff0c46cSDimitry Andric StringRef Key = MFE.Key->getString(); 427dff0c46cSDimitry Andric Value *Val = MFE.Val; 428dff0c46cSDimitry Andric 429139f7f9bSDimitry Andric if (Key == "Objective-C Image Info Version") { 430dff0c46cSDimitry Andric VersionVal = cast<ConstantInt>(Val)->getZExtValue(); 431139f7f9bSDimitry Andric } else if (Key == "Objective-C Garbage Collection" || 4327ae0e2c9SDimitry Andric Key == "Objective-C GC Only" || 433139f7f9bSDimitry Andric Key == "Objective-C Is Simulated") { 4347ae0e2c9SDimitry Andric ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue(); 435139f7f9bSDimitry Andric } else if (Key == "Objective-C Image Info Section") { 436dff0c46cSDimitry Andric SectionVal = cast<MDString>(Val)->getString(); 437139f7f9bSDimitry Andric } else if (Key == "Linker Options") { 438139f7f9bSDimitry Andric LinkerOptions = cast<MDNode>(Val); 439139f7f9bSDimitry Andric } 440139f7f9bSDimitry Andric } 441139f7f9bSDimitry Andric 442139f7f9bSDimitry Andric // Emit the linker options if present. 443139f7f9bSDimitry Andric if (LinkerOptions) { 444139f7f9bSDimitry Andric for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 445139f7f9bSDimitry Andric MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 446139f7f9bSDimitry Andric SmallVector<std::string, 4> StrOptions; 447139f7f9bSDimitry Andric 448139f7f9bSDimitry Andric // Convert to strings. 449139f7f9bSDimitry Andric for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 450139f7f9bSDimitry Andric MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 451139f7f9bSDimitry Andric StrOptions.push_back(MDOption->getString()); 452139f7f9bSDimitry Andric } 453139f7f9bSDimitry Andric 454139f7f9bSDimitry Andric Streamer.EmitLinkerOptions(StrOptions); 455139f7f9bSDimitry Andric } 456dff0c46cSDimitry Andric } 457dff0c46cSDimitry Andric 458dff0c46cSDimitry Andric // The section is mandatory. If we don't have it, then we don't have GC info. 459dff0c46cSDimitry Andric if (SectionVal.empty()) return; 460dff0c46cSDimitry Andric 461dff0c46cSDimitry Andric StringRef Segment, Section; 462dff0c46cSDimitry Andric unsigned TAA = 0, StubSize = 0; 463dff0c46cSDimitry Andric bool TAAParsed; 464dff0c46cSDimitry Andric std::string ErrorCode = 465dff0c46cSDimitry Andric MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section, 466dff0c46cSDimitry Andric TAA, TAAParsed, StubSize); 467dff0c46cSDimitry Andric if (!ErrorCode.empty()) 468dff0c46cSDimitry Andric // If invalid, report the error with report_fatal_error. 469dff0c46cSDimitry Andric report_fatal_error("Invalid section specifier '" + Section + "': " + 470dff0c46cSDimitry Andric ErrorCode + "."); 471dff0c46cSDimitry Andric 472dff0c46cSDimitry Andric // Get the section. 473dff0c46cSDimitry Andric const MCSectionMachO *S = 474dff0c46cSDimitry Andric getContext().getMachOSection(Segment, Section, TAA, StubSize, 475dff0c46cSDimitry Andric SectionKind::getDataNoRel()); 476dff0c46cSDimitry Andric Streamer.SwitchSection(S); 477dff0c46cSDimitry Andric Streamer.EmitLabel(getContext(). 478dff0c46cSDimitry Andric GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO"))); 479dff0c46cSDimitry Andric Streamer.EmitIntValue(VersionVal, 4); 4807ae0e2c9SDimitry Andric Streamer.EmitIntValue(ImageInfoFlags, 4); 481dff0c46cSDimitry Andric Streamer.AddBlankLine(); 482dff0c46cSDimitry Andric } 483dff0c46cSDimitry Andric 484f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO:: 485f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 486f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 487f22ef01cSRoman Divacky // Parse the section specifier and create it if valid. 488f22ef01cSRoman Divacky StringRef Segment, Section; 4893b0f4066SDimitry Andric unsigned TAA = 0, StubSize = 0; 4903b0f4066SDimitry Andric bool TAAParsed; 491f22ef01cSRoman Divacky std::string ErrorCode = 492f22ef01cSRoman Divacky MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 4933b0f4066SDimitry Andric TAA, TAAParsed, StubSize); 494f22ef01cSRoman Divacky if (!ErrorCode.empty()) { 495f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 496dff0c46cSDimitry Andric report_fatal_error("Global variable '" + GV->getName() + 497dff0c46cSDimitry Andric "' has an invalid section specifier '" + 498dff0c46cSDimitry Andric GV->getSection() + "': " + ErrorCode + "."); 499f22ef01cSRoman Divacky } 500f22ef01cSRoman Divacky 501f22ef01cSRoman Divacky // Get the section. 502f22ef01cSRoman Divacky const MCSectionMachO *S = 503f22ef01cSRoman Divacky getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 504f22ef01cSRoman Divacky 505dd6029ffSDimitry Andric // If TAA wasn't set by ParseSectionSpecifier() above, 506dd6029ffSDimitry Andric // use the value returned by getMachOSection() as a default. 5073b0f4066SDimitry Andric if (!TAAParsed) 508dd6029ffSDimitry Andric TAA = S->getTypeAndAttributes(); 509dd6029ffSDimitry Andric 510f22ef01cSRoman Divacky // Okay, now that we got the section, verify that the TAA & StubSize agree. 511f22ef01cSRoman Divacky // If the user declared multiple globals with different section flags, we need 512f22ef01cSRoman Divacky // to reject it here. 513f22ef01cSRoman Divacky if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 514f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 515dff0c46cSDimitry Andric report_fatal_error("Global variable '" + GV->getName() + 516f22ef01cSRoman Divacky "' section type or attributes does not match previous" 517f22ef01cSRoman Divacky " section specifier"); 518f22ef01cSRoman Divacky } 519f22ef01cSRoman Divacky 520f22ef01cSRoman Divacky return S; 521f22ef01cSRoman Divacky } 522f22ef01cSRoman Divacky 523f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO:: 524f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 525f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 526f785676fSDimitry Andric 527f785676fSDimitry Andric // Handle thread local data. 528f785676fSDimitry Andric if (Kind.isThreadBSS()) return TLSBSSSection; 529f785676fSDimitry Andric if (Kind.isThreadData()) return TLSDataSection; 530f785676fSDimitry Andric 531f22ef01cSRoman Divacky if (Kind.isText()) 532f22ef01cSRoman Divacky return GV->isWeakForLinker() ? TextCoalSection : TextSection; 533f22ef01cSRoman Divacky 534f22ef01cSRoman Divacky // If this is weak/linkonce, put this in a coalescable section, either in text 535f22ef01cSRoman Divacky // or data depending on if it is writable. 536f22ef01cSRoman Divacky if (GV->isWeakForLinker()) { 537f22ef01cSRoman Divacky if (Kind.isReadOnly()) 538f22ef01cSRoman Divacky return ConstTextCoalSection; 539f22ef01cSRoman Divacky return DataCoalSection; 540f22ef01cSRoman Divacky } 541f22ef01cSRoman Divacky 542f22ef01cSRoman Divacky // FIXME: Alignment check should be handled by section classifier. 543f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() && 5443861d79fSDimitry Andric TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 545f22ef01cSRoman Divacky return CStringSection; 546f22ef01cSRoman Divacky 547f22ef01cSRoman Divacky // Do not put 16-bit arrays in the UString section if they have an 548f22ef01cSRoman Divacky // externally visible label, this runs into issues with certain linker 549f22ef01cSRoman Divacky // versions. 550f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 5513861d79fSDimitry Andric TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 552f22ef01cSRoman Divacky return UStringSection; 553f22ef01cSRoman Divacky 554f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 555f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 556f22ef01cSRoman Divacky return FourByteConstantSection; 557f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 558f22ef01cSRoman Divacky return EightByteConstantSection; 559f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && SixteenByteConstantSection) 560f22ef01cSRoman Divacky return SixteenByteConstantSection; 561f22ef01cSRoman Divacky } 562f22ef01cSRoman Divacky 563f22ef01cSRoman Divacky // Otherwise, if it is readonly, but not something we can specially optimize, 564f22ef01cSRoman Divacky // just drop it in .const. 565f22ef01cSRoman Divacky if (Kind.isReadOnly()) 566f22ef01cSRoman Divacky return ReadOnlySection; 567f22ef01cSRoman Divacky 568f22ef01cSRoman Divacky // If this is marked const, put it into a const section. But if the dynamic 569f22ef01cSRoman Divacky // linker needs to write to it, put it in the data segment. 570f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRel()) 571f22ef01cSRoman Divacky return ConstDataSection; 572f22ef01cSRoman Divacky 573f22ef01cSRoman Divacky // Put zero initialized globals with strong external linkage in the 574f22ef01cSRoman Divacky // DATA, __common section with the .zerofill directive. 575f22ef01cSRoman Divacky if (Kind.isBSSExtern()) 576f22ef01cSRoman Divacky return DataCommonSection; 577f22ef01cSRoman Divacky 578f22ef01cSRoman Divacky // Put zero initialized globals with local linkage in __DATA,__bss directive 579f22ef01cSRoman Divacky // with the .zerofill directive (aka .lcomm). 580f22ef01cSRoman Divacky if (Kind.isBSSLocal()) 581f22ef01cSRoman Divacky return DataBSSSection; 582f22ef01cSRoman Divacky 583f22ef01cSRoman Divacky // Otherwise, just drop the variable in the normal data section. 584f22ef01cSRoman Divacky return DataSection; 585f22ef01cSRoman Divacky } 586f22ef01cSRoman Divacky 587f22ef01cSRoman Divacky const MCSection * 588f22ef01cSRoman Divacky TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 589f22ef01cSRoman Divacky // If this constant requires a relocation, we have to put it in the data 590f22ef01cSRoman Divacky // segment, not in the text segment. 591f22ef01cSRoman Divacky if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 592f22ef01cSRoman Divacky return ConstDataSection; 593f22ef01cSRoman Divacky 594f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 595f22ef01cSRoman Divacky return FourByteConstantSection; 596f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 597f22ef01cSRoman Divacky return EightByteConstantSection; 598f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && SixteenByteConstantSection) 599f22ef01cSRoman Divacky return SixteenByteConstantSection; 600f22ef01cSRoman Divacky return ReadOnlySection; // .const 601f22ef01cSRoman Divacky } 602f22ef01cSRoman Divacky 603f22ef01cSRoman Divacky /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 604f22ef01cSRoman Divacky /// not to emit the UsedDirective for some symbols in llvm.used. 605f22ef01cSRoman Divacky // FIXME: REMOVE this (rdar://7071300) 606f22ef01cSRoman Divacky bool TargetLoweringObjectFileMachO:: 607f22ef01cSRoman Divacky shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 608f22ef01cSRoman Divacky /// On Darwin, internally linked data beginning with "L" or "l" does not have 609f22ef01cSRoman Divacky /// the directive emitted (this occurs in ObjC metadata). 610f22ef01cSRoman Divacky if (!GV) return false; 611f22ef01cSRoman Divacky 612f22ef01cSRoman Divacky // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 613f22ef01cSRoman Divacky if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 614f22ef01cSRoman Divacky // FIXME: ObjC metadata is currently emitted as internal symbols that have 615f22ef01cSRoman Divacky // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 616f22ef01cSRoman Divacky // this horrible hack can go away. 617f785676fSDimitry Andric MCSymbol *Sym = getSymbol(*Mang, GV); 618f22ef01cSRoman Divacky if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l') 619f22ef01cSRoman Divacky return false; 620f22ef01cSRoman Divacky } 621f22ef01cSRoman Divacky 622f22ef01cSRoman Divacky return true; 623f22ef01cSRoman Divacky } 624f22ef01cSRoman Divacky 625f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileMachO:: 626139f7f9bSDimitry Andric getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 627f22ef01cSRoman Divacky MachineModuleInfo *MMI, unsigned Encoding, 628f22ef01cSRoman Divacky MCStreamer &Streamer) const { 629f22ef01cSRoman Divacky // The mach-o version of this method defaults to returning a stub reference. 630f22ef01cSRoman Divacky 631f22ef01cSRoman Divacky if (Encoding & DW_EH_PE_indirect) { 632f22ef01cSRoman Divacky MachineModuleInfoMachO &MachOMMI = 633f22ef01cSRoman Divacky MMI->getObjFileInfo<MachineModuleInfoMachO>(); 634f22ef01cSRoman Divacky 635f22ef01cSRoman Divacky SmallString<128> Name; 636f22ef01cSRoman Divacky Mang->getNameWithPrefix(Name, GV, true); 637f22ef01cSRoman Divacky Name += "$non_lazy_ptr"; 638f22ef01cSRoman Divacky 639f22ef01cSRoman Divacky // Add information about the stub reference to MachOMMI so that the stub 640f22ef01cSRoman Divacky // gets emitted by the asmprinter. 641f22ef01cSRoman Divacky MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 642f8254f43SDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = 643f8254f43SDimitry Andric GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 644f8254f43SDimitry Andric MachOMMI.getGVStubEntry(SSym); 645f22ef01cSRoman Divacky if (StubSym.getPointer() == 0) { 646f785676fSDimitry Andric MCSymbol *Sym = getSymbol(*Mang, GV); 647f22ef01cSRoman Divacky StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 648f22ef01cSRoman Divacky } 649f22ef01cSRoman Divacky 650f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 651139f7f9bSDimitry Andric getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()), 652139f7f9bSDimitry Andric Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 653f22ef01cSRoman Divacky } 654f22ef01cSRoman Divacky 655f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 656139f7f9bSDimitry Andric getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer); 657f22ef01cSRoman Divacky } 658f22ef01cSRoman Divacky 6593b0f4066SDimitry Andric MCSymbol *TargetLoweringObjectFileMachO:: 6603b0f4066SDimitry Andric getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 6613b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 6623b0f4066SDimitry Andric // The mach-o version of this method defaults to returning a stub reference. 6633b0f4066SDimitry Andric MachineModuleInfoMachO &MachOMMI = 6643b0f4066SDimitry Andric MMI->getObjFileInfo<MachineModuleInfoMachO>(); 6653b0f4066SDimitry Andric 6663b0f4066SDimitry Andric SmallString<128> Name; 6673b0f4066SDimitry Andric Mang->getNameWithPrefix(Name, GV, true); 6683b0f4066SDimitry Andric Name += "$non_lazy_ptr"; 6693b0f4066SDimitry Andric 6703b0f4066SDimitry Andric // Add information about the stub reference to MachOMMI so that the stub 6713b0f4066SDimitry Andric // gets emitted by the asmprinter. 6723b0f4066SDimitry Andric MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 673dff0c46cSDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 6743b0f4066SDimitry Andric if (StubSym.getPointer() == 0) { 675f785676fSDimitry Andric MCSymbol *Sym = getSymbol(*Mang, GV); 6763b0f4066SDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 6773b0f4066SDimitry Andric } 6783b0f4066SDimitry Andric 6793b0f4066SDimitry Andric return SSym; 6803b0f4066SDimitry Andric } 6813b0f4066SDimitry Andric 682f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 683f22ef01cSRoman Divacky // COFF 684f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 685f22ef01cSRoman Divacky 686f22ef01cSRoman Divacky static unsigned 687f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) { 688f22ef01cSRoman Divacky unsigned Flags = 0; 689f22ef01cSRoman Divacky 690ffd1746dSEd Schouten if (K.isMetadata()) 691f22ef01cSRoman Divacky Flags |= 692ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE; 693f22ef01cSRoman Divacky else if (K.isText()) 694f22ef01cSRoman Divacky Flags |= 695ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_EXECUTE | 6962754fe60SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 697ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_CODE; 698f22ef01cSRoman Divacky else if (K.isBSS ()) 699f22ef01cSRoman Divacky Flags |= 700ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 701ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 702ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 703dff0c46cSDimitry Andric else if (K.isThreadLocal()) 704dff0c46cSDimitry Andric Flags |= 705dff0c46cSDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 706dff0c46cSDimitry Andric COFF::IMAGE_SCN_MEM_READ | 707dff0c46cSDimitry Andric COFF::IMAGE_SCN_MEM_WRITE; 708f22ef01cSRoman Divacky else if (K.isReadOnly()) 709f22ef01cSRoman Divacky Flags |= 710ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 711ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ; 712f22ef01cSRoman Divacky else if (K.isWriteable()) 713f22ef01cSRoman Divacky Flags |= 714ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 715ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 716ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 717f22ef01cSRoman Divacky 718f22ef01cSRoman Divacky return Flags; 719f22ef01cSRoman Divacky } 720f22ef01cSRoman Divacky 721f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF:: 722f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 723f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 724139f7f9bSDimitry Andric int Selection = 0; 725139f7f9bSDimitry Andric unsigned Characteristics = getCOFFSectionFlags(Kind); 726139f7f9bSDimitry Andric SmallString<128> Name(GV->getSection().c_str()); 727139f7f9bSDimitry Andric if (GV->isWeakForLinker()) { 728139f7f9bSDimitry Andric Selection = COFF::IMAGE_COMDAT_SELECT_ANY; 729139f7f9bSDimitry Andric Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 730139f7f9bSDimitry Andric Name.append("$"); 731f785676fSDimitry Andric Mang->getNameWithPrefix(Name, GV, false, false); 732139f7f9bSDimitry Andric } 733139f7f9bSDimitry Andric return getContext().getCOFFSection(Name, 734139f7f9bSDimitry Andric Characteristics, 735f785676fSDimitry Andric Kind, 736f785676fSDimitry Andric "", 737f785676fSDimitry Andric Selection); 738f22ef01cSRoman Divacky } 739f22ef01cSRoman Divacky 740f22ef01cSRoman Divacky static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 741f22ef01cSRoman Divacky if (Kind.isText()) 7422754fe60SDimitry Andric return ".text$"; 743f22ef01cSRoman Divacky if (Kind.isBSS ()) 7442754fe60SDimitry Andric return ".bss$"; 745139f7f9bSDimitry Andric if (Kind.isThreadLocal()) { 746139f7f9bSDimitry Andric // 'LLVM' is just an arbitary string to ensure that the section name gets 747139f7f9bSDimitry Andric // sorted in between '.tls$AAA' and '.tls$ZZZ' by the linker. 748139f7f9bSDimitry Andric return ".tls$LLVM"; 749139f7f9bSDimitry Andric } 750f22ef01cSRoman Divacky if (Kind.isWriteable()) 7512754fe60SDimitry Andric return ".data$"; 7522754fe60SDimitry Andric return ".rdata$"; 753f22ef01cSRoman Divacky } 754f22ef01cSRoman Divacky 755f22ef01cSRoman Divacky 756f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF:: 757f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 758f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 759f22ef01cSRoman Divacky 760f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 761f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 762f22ef01cSRoman Divacky if (GV->isWeakForLinker()) { 763f22ef01cSRoman Divacky const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 764f22ef01cSRoman Divacky SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 765f785676fSDimitry Andric Mang->getNameWithPrefix(Name, GV, false, false); 766f22ef01cSRoman Divacky 767f22ef01cSRoman Divacky unsigned Characteristics = getCOFFSectionFlags(Kind); 768f22ef01cSRoman Divacky 769ffd1746dSEd Schouten Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 770f22ef01cSRoman Divacky 771f22ef01cSRoman Divacky return getContext().getCOFFSection(Name.str(), Characteristics, 772f785676fSDimitry Andric Kind, "", COFF::IMAGE_COMDAT_SELECT_ANY); 773f22ef01cSRoman Divacky } 774f22ef01cSRoman Divacky 775f22ef01cSRoman Divacky if (Kind.isText()) 776f785676fSDimitry Andric return TextSection; 777f22ef01cSRoman Divacky 778dff0c46cSDimitry Andric if (Kind.isThreadLocal()) 779f785676fSDimitry Andric return TLSDataSection; 780dff0c46cSDimitry Andric 781f785676fSDimitry Andric if (Kind.isReadOnly()) 782f785676fSDimitry Andric return ReadOnlySection; 783f785676fSDimitry Andric 784f785676fSDimitry Andric if (Kind.isBSS()) 785f785676fSDimitry Andric return BSSSection; 786f785676fSDimitry Andric 787f785676fSDimitry Andric return DataSection; 788f22ef01cSRoman Divacky } 789f22ef01cSRoman Divacky 790284c1978SDimitry Andric void TargetLoweringObjectFileCOFF:: 791284c1978SDimitry Andric emitModuleFlags(MCStreamer &Streamer, 792284c1978SDimitry Andric ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 793284c1978SDimitry Andric Mangler *Mang, const TargetMachine &TM) const { 794284c1978SDimitry Andric MDNode *LinkerOptions = 0; 795284c1978SDimitry Andric 796284c1978SDimitry Andric // Look for the "Linker Options" flag, since it's the only one we support. 797284c1978SDimitry Andric for (ArrayRef<Module::ModuleFlagEntry>::iterator 798284c1978SDimitry Andric i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 799284c1978SDimitry Andric const Module::ModuleFlagEntry &MFE = *i; 800284c1978SDimitry Andric StringRef Key = MFE.Key->getString(); 801284c1978SDimitry Andric Value *Val = MFE.Val; 802284c1978SDimitry Andric if (Key == "Linker Options") { 803284c1978SDimitry Andric LinkerOptions = cast<MDNode>(Val); 804284c1978SDimitry Andric break; 805284c1978SDimitry Andric } 806284c1978SDimitry Andric } 807284c1978SDimitry Andric if (!LinkerOptions) 808284c1978SDimitry Andric return; 809284c1978SDimitry Andric 810284c1978SDimitry Andric // Emit the linker options to the linker .drectve section. According to the 811284c1978SDimitry Andric // spec, this section is a space-separated string containing flags for linker. 812284c1978SDimitry Andric const MCSection *Sec = getDrectveSection(); 813284c1978SDimitry Andric Streamer.SwitchSection(Sec); 814284c1978SDimitry Andric for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 815284c1978SDimitry Andric MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 816284c1978SDimitry Andric for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 817284c1978SDimitry Andric MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 818284c1978SDimitry Andric StringRef Op = MDOption->getString(); 819284c1978SDimitry Andric // Lead with a space for consistency with our dllexport implementation. 820284c1978SDimitry Andric std::string Escaped(" "); 821284c1978SDimitry Andric if (Op.find(" ") != StringRef::npos) { 822284c1978SDimitry Andric // The PE-COFF spec says args with spaces must be quoted. It doesn't say 823284c1978SDimitry Andric // how to escape quotes, but it probably uses this algorithm: 824284c1978SDimitry Andric // http://msdn.microsoft.com/en-us/library/17w5ykft(v=vs.85).aspx 825284c1978SDimitry Andric // FIXME: Reuse escaping code from Support/Windows/Program.inc 826284c1978SDimitry Andric Escaped.push_back('\"'); 827284c1978SDimitry Andric Escaped.append(Op); 828284c1978SDimitry Andric Escaped.push_back('\"'); 829284c1978SDimitry Andric } else { 830284c1978SDimitry Andric Escaped.append(Op); 831284c1978SDimitry Andric } 832284c1978SDimitry Andric Streamer.EmitBytes(Escaped); 833284c1978SDimitry Andric } 834284c1978SDimitry Andric } 835284c1978SDimitry Andric } 836