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" 16f22ef01cSRoman Divacky #include "llvm/Constants.h" 17f22ef01cSRoman Divacky #include "llvm/DerivedTypes.h" 18f22ef01cSRoman Divacky #include "llvm/Function.h" 19f22ef01cSRoman Divacky #include "llvm/GlobalVariable.h" 20f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineModuleInfoImpls.h" 21f22ef01cSRoman Divacky #include "llvm/MC/MCContext.h" 22f22ef01cSRoman Divacky #include "llvm/MC/MCExpr.h" 23f22ef01cSRoman Divacky #include "llvm/MC/MCSectionMachO.h" 24f22ef01cSRoman Divacky #include "llvm/MC/MCSectionELF.h" 25f22ef01cSRoman Divacky #include "llvm/MC/MCSectionCOFF.h" 263b0f4066SDimitry Andric #include "llvm/MC/MCStreamer.h" 27f22ef01cSRoman Divacky #include "llvm/MC/MCSymbol.h" 28f22ef01cSRoman Divacky #include "llvm/Target/Mangler.h" 29f22ef01cSRoman Divacky #include "llvm/Target/TargetData.h" 30f22ef01cSRoman Divacky #include "llvm/Target/TargetMachine.h" 31f22ef01cSRoman Divacky #include "llvm/Target/TargetOptions.h" 32f22ef01cSRoman Divacky #include "llvm/Support/Dwarf.h" 332754fe60SDimitry Andric #include "llvm/Support/ELF.h" 34f22ef01cSRoman Divacky #include "llvm/Support/ErrorHandling.h" 35f22ef01cSRoman Divacky #include "llvm/Support/raw_ostream.h" 36f22ef01cSRoman Divacky #include "llvm/ADT/SmallString.h" 37f22ef01cSRoman Divacky #include "llvm/ADT/StringExtras.h" 382754fe60SDimitry Andric #include "llvm/ADT/Triple.h" 39f22ef01cSRoman Divacky using namespace llvm; 40f22ef01cSRoman Divacky using namespace dwarf; 41f22ef01cSRoman Divacky 42f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 43f22ef01cSRoman Divacky // ELF 44f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 45f22ef01cSRoman Divacky 4617a519f9SDimitry Andric TargetLoweringObjectFileELF::TargetLoweringObjectFileELF() 4717a519f9SDimitry Andric : TargetLoweringObjectFile(), 4817a519f9SDimitry Andric TLSDataSection(0), 4917a519f9SDimitry Andric TLSBSSSection(0), 5017a519f9SDimitry Andric DataRelSection(0), 5117a519f9SDimitry Andric DataRelLocalSection(0), 5217a519f9SDimitry Andric DataRelROSection(0), 5317a519f9SDimitry Andric DataRelROLocalSection(0), 5417a519f9SDimitry Andric MergeableConst4Section(0), 5517a519f9SDimitry Andric MergeableConst8Section(0), 5617a519f9SDimitry Andric MergeableConst16Section(0) { 5717a519f9SDimitry Andric } 5817a519f9SDimitry Andric 59f22ef01cSRoman Divacky void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 60f22ef01cSRoman Divacky const TargetMachine &TM) { 61f22ef01cSRoman Divacky TargetLoweringObjectFile::Initialize(Ctx, TM); 62f22ef01cSRoman Divacky 63f22ef01cSRoman Divacky BSSSection = 642754fe60SDimitry Andric getContext().getELFSection(".bss", ELF::SHT_NOBITS, 652754fe60SDimitry Andric ELF::SHF_WRITE |ELF::SHF_ALLOC, 66f22ef01cSRoman Divacky SectionKind::getBSS()); 67f22ef01cSRoman Divacky 68f22ef01cSRoman Divacky TextSection = 692754fe60SDimitry Andric getContext().getELFSection(".text", ELF::SHT_PROGBITS, 702754fe60SDimitry Andric ELF::SHF_EXECINSTR | 712754fe60SDimitry Andric ELF::SHF_ALLOC, 72f22ef01cSRoman Divacky SectionKind::getText()); 73f22ef01cSRoman Divacky 74f22ef01cSRoman Divacky DataSection = 752754fe60SDimitry Andric getContext().getELFSection(".data", ELF::SHT_PROGBITS, 762754fe60SDimitry Andric ELF::SHF_WRITE |ELF::SHF_ALLOC, 77f22ef01cSRoman Divacky SectionKind::getDataRel()); 78f22ef01cSRoman Divacky 79f22ef01cSRoman Divacky ReadOnlySection = 802754fe60SDimitry Andric getContext().getELFSection(".rodata", ELF::SHT_PROGBITS, 812754fe60SDimitry Andric ELF::SHF_ALLOC, 82f22ef01cSRoman Divacky SectionKind::getReadOnly()); 83f22ef01cSRoman Divacky 84f22ef01cSRoman Divacky TLSDataSection = 852754fe60SDimitry Andric getContext().getELFSection(".tdata", ELF::SHT_PROGBITS, 862754fe60SDimitry Andric ELF::SHF_ALLOC | ELF::SHF_TLS | 872754fe60SDimitry Andric ELF::SHF_WRITE, 88f22ef01cSRoman Divacky SectionKind::getThreadData()); 89f22ef01cSRoman Divacky 90f22ef01cSRoman Divacky TLSBSSSection = 912754fe60SDimitry Andric getContext().getELFSection(".tbss", ELF::SHT_NOBITS, 922754fe60SDimitry Andric ELF::SHF_ALLOC | ELF::SHF_TLS | 932754fe60SDimitry Andric ELF::SHF_WRITE, 94f22ef01cSRoman Divacky SectionKind::getThreadBSS()); 95f22ef01cSRoman Divacky 96f22ef01cSRoman Divacky DataRelSection = 972754fe60SDimitry Andric getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS, 982754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 99f22ef01cSRoman Divacky SectionKind::getDataRel()); 100f22ef01cSRoman Divacky 101f22ef01cSRoman Divacky DataRelLocalSection = 1022754fe60SDimitry Andric getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS, 1032754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 104f22ef01cSRoman Divacky SectionKind::getDataRelLocal()); 105f22ef01cSRoman Divacky 106f22ef01cSRoman Divacky DataRelROSection = 1072754fe60SDimitry Andric getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, 1082754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 109f22ef01cSRoman Divacky SectionKind::getReadOnlyWithRel()); 110f22ef01cSRoman Divacky 111f22ef01cSRoman Divacky DataRelROLocalSection = 1122754fe60SDimitry Andric getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, 1132754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 114f22ef01cSRoman Divacky SectionKind::getReadOnlyWithRelLocal()); 115f22ef01cSRoman Divacky 116f22ef01cSRoman Divacky MergeableConst4Section = 1172754fe60SDimitry Andric getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, 1182754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_MERGE, 119f22ef01cSRoman Divacky SectionKind::getMergeableConst4()); 120f22ef01cSRoman Divacky 121f22ef01cSRoman Divacky MergeableConst8Section = 1222754fe60SDimitry Andric getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, 1232754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_MERGE, 124f22ef01cSRoman Divacky SectionKind::getMergeableConst8()); 125f22ef01cSRoman Divacky 126f22ef01cSRoman Divacky MergeableConst16Section = 1272754fe60SDimitry Andric getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, 1282754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_MERGE, 129f22ef01cSRoman Divacky SectionKind::getMergeableConst16()); 130f22ef01cSRoman Divacky 131f22ef01cSRoman Divacky StaticCtorSection = 1322754fe60SDimitry Andric getContext().getELFSection(".ctors", ELF::SHT_PROGBITS, 1332754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 134f22ef01cSRoman Divacky SectionKind::getDataRel()); 135f22ef01cSRoman Divacky 136f22ef01cSRoman Divacky StaticDtorSection = 1372754fe60SDimitry Andric getContext().getELFSection(".dtors", ELF::SHT_PROGBITS, 1382754fe60SDimitry Andric ELF::SHF_ALLOC |ELF::SHF_WRITE, 139f22ef01cSRoman Divacky SectionKind::getDataRel()); 140f22ef01cSRoman Divacky 141f22ef01cSRoman Divacky // Exception Handling Sections. 142f22ef01cSRoman Divacky 143f22ef01cSRoman Divacky // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 144f22ef01cSRoman Divacky // it contains relocatable pointers. In PIC mode, this is probably a big 145f22ef01cSRoman Divacky // runtime hit for C++ apps. Either the contents of the LSDA need to be 146f22ef01cSRoman Divacky // adjusted or this should be a data section. 147f22ef01cSRoman Divacky LSDASection = 1482754fe60SDimitry Andric getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, 1492754fe60SDimitry Andric ELF::SHF_ALLOC, 150f22ef01cSRoman Divacky SectionKind::getReadOnly()); 151f22ef01cSRoman Divacky // Debug Info Sections. 152f22ef01cSRoman Divacky DwarfAbbrevSection = 1532754fe60SDimitry Andric getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0, 154f22ef01cSRoman Divacky SectionKind::getMetadata()); 155f22ef01cSRoman Divacky DwarfInfoSection = 1562754fe60SDimitry Andric getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, 157f22ef01cSRoman Divacky SectionKind::getMetadata()); 158f22ef01cSRoman Divacky DwarfLineSection = 1592754fe60SDimitry Andric getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0, 160f22ef01cSRoman Divacky SectionKind::getMetadata()); 161f22ef01cSRoman Divacky DwarfFrameSection = 1622754fe60SDimitry Andric getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0, 163f22ef01cSRoman Divacky SectionKind::getMetadata()); 164f22ef01cSRoman Divacky DwarfPubNamesSection = 1652754fe60SDimitry Andric getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0, 166f22ef01cSRoman Divacky SectionKind::getMetadata()); 167f22ef01cSRoman Divacky DwarfPubTypesSection = 1682754fe60SDimitry Andric getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0, 169f22ef01cSRoman Divacky SectionKind::getMetadata()); 170f22ef01cSRoman Divacky DwarfStrSection = 1712754fe60SDimitry Andric getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0, 172f22ef01cSRoman Divacky SectionKind::getMetadata()); 173f22ef01cSRoman Divacky DwarfLocSection = 1742754fe60SDimitry Andric getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0, 175f22ef01cSRoman Divacky SectionKind::getMetadata()); 176f22ef01cSRoman Divacky DwarfARangesSection = 1772754fe60SDimitry Andric getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0, 178f22ef01cSRoman Divacky SectionKind::getMetadata()); 179f22ef01cSRoman Divacky DwarfRangesSection = 1802754fe60SDimitry Andric getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, 181f22ef01cSRoman Divacky SectionKind::getMetadata()); 182f22ef01cSRoman Divacky DwarfMacroInfoSection = 1832754fe60SDimitry Andric getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0, 184f22ef01cSRoman Divacky SectionKind::getMetadata()); 185f22ef01cSRoman Divacky } 186f22ef01cSRoman Divacky 1872754fe60SDimitry Andric const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const { 1882754fe60SDimitry Andric return getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS, 1892754fe60SDimitry Andric ELF::SHF_ALLOC, 1902754fe60SDimitry Andric SectionKind::getDataRel()); 1912754fe60SDimitry Andric } 192f22ef01cSRoman Divacky 1933b0f4066SDimitry Andric MCSymbol * 1943b0f4066SDimitry Andric TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV, 1953b0f4066SDimitry Andric Mangler *Mang, 1963b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 1973b0f4066SDimitry Andric unsigned Encoding = getPersonalityEncoding(); 1983b0f4066SDimitry Andric switch (Encoding & 0x70) { 1993b0f4066SDimitry Andric default: 2003b0f4066SDimitry Andric report_fatal_error("We do not support this DWARF encoding yet!"); 2013b0f4066SDimitry Andric case dwarf::DW_EH_PE_absptr: 2023b0f4066SDimitry Andric return Mang->getSymbol(GV); 2033b0f4066SDimitry Andric break; 2043b0f4066SDimitry Andric case dwarf::DW_EH_PE_pcrel: { 20517a519f9SDimitry Andric return getContext().GetOrCreateSymbol(StringRef("DW.ref.") + 20617a519f9SDimitry Andric Mang->getSymbol(GV)->getName()); 2073b0f4066SDimitry Andric break; 2083b0f4066SDimitry Andric } 2093b0f4066SDimitry Andric } 2103b0f4066SDimitry Andric } 2113b0f4066SDimitry Andric 2123b0f4066SDimitry Andric void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer, 2133b0f4066SDimitry Andric const TargetMachine &TM, 2143b0f4066SDimitry Andric const MCSymbol *Sym) const { 21517a519f9SDimitry Andric SmallString<64> NameData("DW.ref."); 21617a519f9SDimitry Andric NameData += Sym->getName(); 21717a519f9SDimitry Andric MCSymbol *Label = getContext().GetOrCreateSymbol(NameData); 2183b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 2193b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 22017a519f9SDimitry Andric StringRef Prefix = ".data."; 22117a519f9SDimitry Andric NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 2223b0f4066SDimitry Andric unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 2233b0f4066SDimitry Andric const MCSection *Sec = getContext().getELFSection(NameData, 2243b0f4066SDimitry Andric ELF::SHT_PROGBITS, 2253b0f4066SDimitry Andric Flags, 2263b0f4066SDimitry Andric SectionKind::getDataRel(), 2273b0f4066SDimitry Andric 0, Label->getName()); 2283b0f4066SDimitry Andric Streamer.SwitchSection(Sec); 2293b0f4066SDimitry Andric Streamer.EmitValueToAlignment(8); 2303b0f4066SDimitry Andric Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 2313b0f4066SDimitry Andric const MCExpr *E = MCConstantExpr::Create(8, getContext()); 2323b0f4066SDimitry Andric Streamer.EmitELFSize(Label, E); 2333b0f4066SDimitry Andric Streamer.EmitLabel(Label); 2343b0f4066SDimitry Andric 2353b0f4066SDimitry Andric unsigned Size = TM.getTargetData()->getPointerSize(); 2363b0f4066SDimitry Andric Streamer.EmitSymbolValue(Sym, Size); 2373b0f4066SDimitry Andric } 2383b0f4066SDimitry Andric 239f22ef01cSRoman Divacky static SectionKind 240f22ef01cSRoman Divacky getELFKindForNamedSection(StringRef Name, SectionKind K) { 241bd5abe19SDimitry Andric // N.B.: The defaults used in here are no the same ones used in MC. 242bd5abe19SDimitry Andric // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 243bd5abe19SDimitry Andric // both gas and MC will produce a section with no flags. Given 244bd5abe19SDimitry Andric // section(".eh_frame") gcc will produce 245bd5abe19SDimitry Andric // .section .eh_frame,"a",@progbits 246f22ef01cSRoman Divacky if (Name.empty() || Name[0] != '.') return K; 247f22ef01cSRoman Divacky 248f22ef01cSRoman Divacky // Some lame default implementation based on some magic section names. 249f22ef01cSRoman Divacky if (Name == ".bss" || 250f22ef01cSRoman Divacky Name.startswith(".bss.") || 251f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.b.") || 252f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.b.") || 253f22ef01cSRoman Divacky Name == ".sbss" || 254f22ef01cSRoman Divacky Name.startswith(".sbss.") || 255f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.sb.") || 256f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.sb.")) 257f22ef01cSRoman Divacky return SectionKind::getBSS(); 258f22ef01cSRoman Divacky 259f22ef01cSRoman Divacky if (Name == ".tdata" || 260f22ef01cSRoman Divacky Name.startswith(".tdata.") || 261f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.td.") || 262f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.td.")) 263f22ef01cSRoman Divacky return SectionKind::getThreadData(); 264f22ef01cSRoman Divacky 265f22ef01cSRoman Divacky if (Name == ".tbss" || 266f22ef01cSRoman Divacky Name.startswith(".tbss.") || 267f22ef01cSRoman Divacky Name.startswith(".gnu.linkonce.tb.") || 268f22ef01cSRoman Divacky Name.startswith(".llvm.linkonce.tb.")) 269f22ef01cSRoman Divacky return SectionKind::getThreadBSS(); 270f22ef01cSRoman Divacky 271f22ef01cSRoman Divacky return K; 272f22ef01cSRoman Divacky } 273f22ef01cSRoman Divacky 274f22ef01cSRoman Divacky 275f22ef01cSRoman Divacky static unsigned getELFSectionType(StringRef Name, SectionKind K) { 276f22ef01cSRoman Divacky 277f22ef01cSRoman Divacky if (Name == ".init_array") 2782754fe60SDimitry Andric return ELF::SHT_INIT_ARRAY; 279f22ef01cSRoman Divacky 280f22ef01cSRoman Divacky if (Name == ".fini_array") 2812754fe60SDimitry Andric return ELF::SHT_FINI_ARRAY; 282f22ef01cSRoman Divacky 283f22ef01cSRoman Divacky if (Name == ".preinit_array") 2842754fe60SDimitry Andric return ELF::SHT_PREINIT_ARRAY; 285f22ef01cSRoman Divacky 286f22ef01cSRoman Divacky if (K.isBSS() || K.isThreadBSS()) 2872754fe60SDimitry Andric return ELF::SHT_NOBITS; 288f22ef01cSRoman Divacky 2892754fe60SDimitry Andric return ELF::SHT_PROGBITS; 290f22ef01cSRoman Divacky } 291f22ef01cSRoman Divacky 292f22ef01cSRoman Divacky 293f22ef01cSRoman Divacky static unsigned 294f22ef01cSRoman Divacky getELFSectionFlags(SectionKind K) { 295f22ef01cSRoman Divacky unsigned Flags = 0; 296f22ef01cSRoman Divacky 297f22ef01cSRoman Divacky if (!K.isMetadata()) 2982754fe60SDimitry Andric Flags |= ELF::SHF_ALLOC; 299f22ef01cSRoman Divacky 300f22ef01cSRoman Divacky if (K.isText()) 3012754fe60SDimitry Andric Flags |= ELF::SHF_EXECINSTR; 302f22ef01cSRoman Divacky 303f22ef01cSRoman Divacky if (K.isWriteable()) 3042754fe60SDimitry Andric Flags |= ELF::SHF_WRITE; 305f22ef01cSRoman Divacky 306f22ef01cSRoman Divacky if (K.isThreadLocal()) 3072754fe60SDimitry Andric Flags |= ELF::SHF_TLS; 308f22ef01cSRoman Divacky 309f22ef01cSRoman Divacky // K.isMergeableConst() is left out to honour PR4650 310f22ef01cSRoman Divacky if (K.isMergeableCString() || K.isMergeableConst4() || 311f22ef01cSRoman Divacky K.isMergeableConst8() || K.isMergeableConst16()) 3122754fe60SDimitry Andric Flags |= ELF::SHF_MERGE; 313f22ef01cSRoman Divacky 314f22ef01cSRoman Divacky if (K.isMergeableCString()) 3152754fe60SDimitry Andric Flags |= ELF::SHF_STRINGS; 316f22ef01cSRoman Divacky 317f22ef01cSRoman Divacky return Flags; 318f22ef01cSRoman Divacky } 319f22ef01cSRoman Divacky 320f22ef01cSRoman Divacky 321f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 322f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 323f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 324f22ef01cSRoman Divacky StringRef SectionName = GV->getSection(); 325f22ef01cSRoman Divacky 326f22ef01cSRoman Divacky // Infer section flags from the section name if we can. 327f22ef01cSRoman Divacky Kind = getELFKindForNamedSection(SectionName, Kind); 328f22ef01cSRoman Divacky 329f22ef01cSRoman Divacky return getContext().getELFSection(SectionName, 330f22ef01cSRoman Divacky getELFSectionType(SectionName, Kind), 3312754fe60SDimitry Andric getELFSectionFlags(Kind), Kind); 332f22ef01cSRoman Divacky } 333f22ef01cSRoman Divacky 334f22ef01cSRoman Divacky /// getSectionPrefixForGlobal - Return the section prefix name used by options 335f22ef01cSRoman Divacky /// FunctionsSections and DataSections. 336f22ef01cSRoman Divacky static const char *getSectionPrefixForGlobal(SectionKind Kind) { 337f22ef01cSRoman Divacky if (Kind.isText()) return ".text."; 338f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ".rodata."; 339f22ef01cSRoman Divacky 340f22ef01cSRoman Divacky if (Kind.isThreadData()) return ".tdata."; 341f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return ".tbss."; 342f22ef01cSRoman Divacky 343f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return ".data."; 344f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return ".data.rel.local."; 345f22ef01cSRoman Divacky if (Kind.isDataRel()) return ".data.rel."; 346f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 347f22ef01cSRoman Divacky 348f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 349f22ef01cSRoman Divacky return ".data.rel.ro."; 350f22ef01cSRoman Divacky } 351f22ef01cSRoman Divacky 352f22ef01cSRoman Divacky 353f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 354f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 355f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 356f22ef01cSRoman Divacky // If we have -ffunction-section or -fdata-section then we should emit the 357f22ef01cSRoman Divacky // global value to a uniqued section specifically for it. 358f22ef01cSRoman Divacky bool EmitUniquedSection; 359f22ef01cSRoman Divacky if (Kind.isText()) 360f22ef01cSRoman Divacky EmitUniquedSection = TM.getFunctionSections(); 361f22ef01cSRoman Divacky else 362f22ef01cSRoman Divacky EmitUniquedSection = TM.getDataSections(); 363f22ef01cSRoman Divacky 364f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 365f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 366f22ef01cSRoman Divacky if ((GV->isWeakForLinker() || EmitUniquedSection) && 367f22ef01cSRoman Divacky !Kind.isCommon() && !Kind.isBSS()) { 368f22ef01cSRoman Divacky const char *Prefix; 369f22ef01cSRoman Divacky Prefix = getSectionPrefixForGlobal(Kind); 370f22ef01cSRoman Divacky 371f22ef01cSRoman Divacky SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 372f22ef01cSRoman Divacky MCSymbol *Sym = Mang->getSymbol(GV); 373f22ef01cSRoman Divacky Name.append(Sym->getName().begin(), Sym->getName().end()); 3742754fe60SDimitry Andric StringRef Group = ""; 3752754fe60SDimitry Andric unsigned Flags = getELFSectionFlags(Kind); 3762754fe60SDimitry Andric if (GV->isWeakForLinker()) { 3772754fe60SDimitry Andric Group = Sym->getName(); 3782754fe60SDimitry Andric Flags |= ELF::SHF_GROUP; 3792754fe60SDimitry Andric } 3802754fe60SDimitry Andric 381f22ef01cSRoman Divacky return getContext().getELFSection(Name.str(), 382f22ef01cSRoman Divacky getELFSectionType(Name.str(), Kind), 3832754fe60SDimitry Andric Flags, Kind, 0, Group); 384f22ef01cSRoman Divacky } 385f22ef01cSRoman Divacky 386f22ef01cSRoman Divacky if (Kind.isText()) return TextSection; 387f22ef01cSRoman Divacky 388f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() || 389f22ef01cSRoman Divacky Kind.isMergeable2ByteCString() || 390f22ef01cSRoman Divacky Kind.isMergeable4ByteCString()) { 391f22ef01cSRoman Divacky 392f22ef01cSRoman Divacky // We also need alignment here. 393f22ef01cSRoman Divacky // FIXME: this is getting the alignment of the character, not the 394f22ef01cSRoman Divacky // alignment of the global! 395f22ef01cSRoman Divacky unsigned Align = 396f22ef01cSRoman Divacky TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 397f22ef01cSRoman Divacky 398f22ef01cSRoman Divacky const char *SizeSpec = ".rodata.str1."; 399f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString()) 400f22ef01cSRoman Divacky SizeSpec = ".rodata.str2."; 401f22ef01cSRoman Divacky else if (Kind.isMergeable4ByteCString()) 402f22ef01cSRoman Divacky SizeSpec = ".rodata.str4."; 403f22ef01cSRoman Divacky else 404f22ef01cSRoman Divacky assert(Kind.isMergeable1ByteCString() && "unknown string width"); 405f22ef01cSRoman Divacky 406f22ef01cSRoman Divacky 407f22ef01cSRoman Divacky std::string Name = SizeSpec + utostr(Align); 4082754fe60SDimitry Andric return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 4092754fe60SDimitry Andric ELF::SHF_ALLOC | 4102754fe60SDimitry Andric ELF::SHF_MERGE | 4112754fe60SDimitry Andric ELF::SHF_STRINGS, 412f22ef01cSRoman Divacky Kind); 413f22ef01cSRoman Divacky } 414f22ef01cSRoman Divacky 415f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 416f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 417f22ef01cSRoman Divacky return MergeableConst4Section; 418f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 419f22ef01cSRoman Divacky return MergeableConst8Section; 420f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 421f22ef01cSRoman Divacky return MergeableConst16Section; 422f22ef01cSRoman Divacky return ReadOnlySection; // .const 423f22ef01cSRoman Divacky } 424f22ef01cSRoman Divacky 425f22ef01cSRoman Divacky if (Kind.isReadOnly()) return ReadOnlySection; 426f22ef01cSRoman Divacky 427f22ef01cSRoman Divacky if (Kind.isThreadData()) return TLSDataSection; 428f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return TLSBSSSection; 429f22ef01cSRoman Divacky 430f22ef01cSRoman Divacky // Note: we claim that common symbols are put in BSSSection, but they are 431f22ef01cSRoman Divacky // really emitted with the magic .comm directive, which creates a symbol table 432f22ef01cSRoman Divacky // entry but not a section. 433f22ef01cSRoman Divacky if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 434f22ef01cSRoman Divacky 435f22ef01cSRoman Divacky if (Kind.isDataNoRel()) return DataSection; 436f22ef01cSRoman Divacky if (Kind.isDataRelLocal()) return DataRelLocalSection; 437f22ef01cSRoman Divacky if (Kind.isDataRel()) return DataRelSection; 438f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 439f22ef01cSRoman Divacky 440f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 441f22ef01cSRoman Divacky return DataRelROSection; 442f22ef01cSRoman Divacky } 443f22ef01cSRoman Divacky 444f22ef01cSRoman Divacky /// getSectionForConstant - Given a mergeable constant with the 445f22ef01cSRoman Divacky /// specified size and relocation information, return a section that it 446f22ef01cSRoman Divacky /// should be placed in. 447f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileELF:: 448f22ef01cSRoman Divacky getSectionForConstant(SectionKind Kind) const { 449f22ef01cSRoman Divacky if (Kind.isMergeableConst4() && MergeableConst4Section) 450f22ef01cSRoman Divacky return MergeableConst4Section; 451f22ef01cSRoman Divacky if (Kind.isMergeableConst8() && MergeableConst8Section) 452f22ef01cSRoman Divacky return MergeableConst8Section; 453f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && MergeableConst16Section) 454f22ef01cSRoman Divacky return MergeableConst16Section; 455f22ef01cSRoman Divacky if (Kind.isReadOnly()) 456f22ef01cSRoman Divacky return ReadOnlySection; 457f22ef01cSRoman Divacky 458f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 459f22ef01cSRoman Divacky assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 460f22ef01cSRoman Divacky return DataRelROSection; 461f22ef01cSRoman Divacky } 462f22ef01cSRoman Divacky 463f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileELF:: 464f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 465f22ef01cSRoman Divacky MachineModuleInfo *MMI, 466f22ef01cSRoman Divacky unsigned Encoding, MCStreamer &Streamer) const { 467f22ef01cSRoman Divacky 468f22ef01cSRoman Divacky if (Encoding & dwarf::DW_EH_PE_indirect) { 469f22ef01cSRoman Divacky MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 470f22ef01cSRoman Divacky 471f22ef01cSRoman Divacky SmallString<128> Name; 472f22ef01cSRoman Divacky Mang->getNameWithPrefix(Name, GV, true); 473f22ef01cSRoman Divacky Name += ".DW.stub"; 474f22ef01cSRoman Divacky 475f22ef01cSRoman Divacky // Add information about the stub reference to ELFMMI so that the stub 476f22ef01cSRoman Divacky // gets emitted by the asmprinter. 477f22ef01cSRoman Divacky MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 478f22ef01cSRoman Divacky MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 479f22ef01cSRoman Divacky if (StubSym.getPointer() == 0) { 480f22ef01cSRoman Divacky MCSymbol *Sym = Mang->getSymbol(GV); 481f22ef01cSRoman Divacky StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 482f22ef01cSRoman Divacky } 483f22ef01cSRoman Divacky 484f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 4853b0f4066SDimitry Andric getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 486f22ef01cSRoman Divacky } 487f22ef01cSRoman Divacky 488f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 489f22ef01cSRoman Divacky getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 490f22ef01cSRoman Divacky } 491f22ef01cSRoman Divacky 492f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 493f22ef01cSRoman Divacky // MachO 494f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 495f22ef01cSRoman Divacky 49617a519f9SDimitry Andric TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO() 49717a519f9SDimitry Andric : TargetLoweringObjectFile(), 49817a519f9SDimitry Andric TLSDataSection(0), 49917a519f9SDimitry Andric TLSBSSSection(0), 50017a519f9SDimitry Andric TLSTLVSection(0), 50117a519f9SDimitry Andric TLSThreadInitSection(0), 50217a519f9SDimitry Andric CStringSection(0), 50317a519f9SDimitry Andric UStringSection(0), 50417a519f9SDimitry Andric TextCoalSection(0), 50517a519f9SDimitry Andric ConstTextCoalSection(0), 50617a519f9SDimitry Andric ConstDataSection(0), 50717a519f9SDimitry Andric DataCoalSection(0), 50817a519f9SDimitry Andric DataCommonSection(0), 50917a519f9SDimitry Andric DataBSSSection(0), 51017a519f9SDimitry Andric FourByteConstantSection(0), 51117a519f9SDimitry Andric EightByteConstantSection(0), 51217a519f9SDimitry Andric SixteenByteConstantSection(0), 51317a519f9SDimitry Andric LazySymbolPointerSection(0), 51417a519f9SDimitry Andric NonLazySymbolPointerSection(0) { 51517a519f9SDimitry Andric } 51617a519f9SDimitry Andric 517f22ef01cSRoman Divacky void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 518f22ef01cSRoman Divacky const TargetMachine &TM) { 519f22ef01cSRoman Divacky IsFunctionEHFrameSymbolPrivate = false; 520f22ef01cSRoman Divacky SupportsWeakOmittedEHFrame = false; 521f22ef01cSRoman Divacky 5223b0f4066SDimitry Andric // .comm doesn't support alignment before Leopard. 5232754fe60SDimitry Andric Triple T(((LLVMTargetMachine&)TM).getTargetTriple()); 5243b0f4066SDimitry Andric if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5)) 5252754fe60SDimitry Andric CommDirectiveSupportsAlignment = false; 5262754fe60SDimitry Andric 527f22ef01cSRoman Divacky TargetLoweringObjectFile::Initialize(Ctx, TM); 528f22ef01cSRoman Divacky 529f22ef01cSRoman Divacky TextSection // .text 530f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__text", 531f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 532f22ef01cSRoman Divacky SectionKind::getText()); 533f22ef01cSRoman Divacky DataSection // .data 534f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__data", 0, 535f22ef01cSRoman Divacky SectionKind::getDataRel()); 536f22ef01cSRoman Divacky 537f22ef01cSRoman Divacky TLSDataSection // .tdata 538f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__thread_data", 539f22ef01cSRoman Divacky MCSectionMachO::S_THREAD_LOCAL_REGULAR, 540f22ef01cSRoman Divacky SectionKind::getDataRel()); 541f22ef01cSRoman Divacky TLSBSSSection // .tbss 542f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__thread_bss", 543f22ef01cSRoman Divacky MCSectionMachO::S_THREAD_LOCAL_ZEROFILL, 544f22ef01cSRoman Divacky SectionKind::getThreadBSS()); 545f22ef01cSRoman Divacky 546f22ef01cSRoman Divacky // TODO: Verify datarel below. 547f22ef01cSRoman Divacky TLSTLVSection // .tlv 548f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__thread_vars", 549f22ef01cSRoman Divacky MCSectionMachO::S_THREAD_LOCAL_VARIABLES, 550f22ef01cSRoman Divacky SectionKind::getDataRel()); 551f22ef01cSRoman Divacky 552f22ef01cSRoman Divacky TLSThreadInitSection 553f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__thread_init", 554f22ef01cSRoman Divacky MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, 555f22ef01cSRoman Divacky SectionKind::getDataRel()); 556f22ef01cSRoman Divacky 557f22ef01cSRoman Divacky CStringSection // .cstring 558f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__cstring", 559f22ef01cSRoman Divacky MCSectionMachO::S_CSTRING_LITERALS, 560f22ef01cSRoman Divacky SectionKind::getMergeable1ByteCString()); 561f22ef01cSRoman Divacky UStringSection 562f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT","__ustring", 0, 563f22ef01cSRoman Divacky SectionKind::getMergeable2ByteCString()); 564f22ef01cSRoman Divacky FourByteConstantSection // .literal4 565f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__literal4", 566f22ef01cSRoman Divacky MCSectionMachO::S_4BYTE_LITERALS, 567f22ef01cSRoman Divacky SectionKind::getMergeableConst4()); 568f22ef01cSRoman Divacky EightByteConstantSection // .literal8 569f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__literal8", 570f22ef01cSRoman Divacky MCSectionMachO::S_8BYTE_LITERALS, 571f22ef01cSRoman Divacky SectionKind::getMergeableConst8()); 572f22ef01cSRoman Divacky 573f22ef01cSRoman Divacky // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 574f22ef01cSRoman Divacky // to using it in -static mode. 575f22ef01cSRoman Divacky SixteenByteConstantSection = 0; 576f22ef01cSRoman Divacky if (TM.getRelocationModel() != Reloc::Static && 577f22ef01cSRoman Divacky TM.getTargetData()->getPointerSize() == 32) 578f22ef01cSRoman Divacky SixteenByteConstantSection = // .literal16 579f22ef01cSRoman Divacky getContext().getMachOSection("__TEXT", "__literal16", 580f22ef01cSRoman Divacky MCSectionMachO::S_16BYTE_LITERALS, 581f22ef01cSRoman Divacky SectionKind::getMergeableConst16()); 582f22ef01cSRoman Divacky 583f22ef01cSRoman Divacky ReadOnlySection // .const 584f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__const", 0, 585f22ef01cSRoman Divacky SectionKind::getReadOnly()); 586f22ef01cSRoman Divacky 587f22ef01cSRoman Divacky TextCoalSection 588f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__textcoal_nt", 589f22ef01cSRoman Divacky MCSectionMachO::S_COALESCED | 590f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 591f22ef01cSRoman Divacky SectionKind::getText()); 592f22ef01cSRoman Divacky ConstTextCoalSection 593f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__const_coal", 594f22ef01cSRoman Divacky MCSectionMachO::S_COALESCED, 595e580952dSDimitry Andric SectionKind::getReadOnly()); 596f22ef01cSRoman Divacky ConstDataSection // .const_data 597f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__const", 0, 598f22ef01cSRoman Divacky SectionKind::getReadOnlyWithRel()); 599f22ef01cSRoman Divacky DataCoalSection 600f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA","__datacoal_nt", 601f22ef01cSRoman Divacky MCSectionMachO::S_COALESCED, 602f22ef01cSRoman Divacky SectionKind::getDataRel()); 603f22ef01cSRoman Divacky DataCommonSection 604f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA","__common", 605f22ef01cSRoman Divacky MCSectionMachO::S_ZEROFILL, 606f22ef01cSRoman Divacky SectionKind::getBSS()); 607f22ef01cSRoman Divacky DataBSSSection 608f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, 609f22ef01cSRoman Divacky SectionKind::getBSS()); 610f22ef01cSRoman Divacky 611f22ef01cSRoman Divacky 612f22ef01cSRoman Divacky LazySymbolPointerSection 613f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__la_symbol_ptr", 614f22ef01cSRoman Divacky MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 615f22ef01cSRoman Divacky SectionKind::getMetadata()); 616f22ef01cSRoman Divacky NonLazySymbolPointerSection 617f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__nl_symbol_ptr", 618f22ef01cSRoman Divacky MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 619f22ef01cSRoman Divacky SectionKind::getMetadata()); 620f22ef01cSRoman Divacky 621f22ef01cSRoman Divacky if (TM.getRelocationModel() == Reloc::Static) { 622f22ef01cSRoman Divacky StaticCtorSection 623f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__constructor", 0, 624f22ef01cSRoman Divacky SectionKind::getDataRel()); 625f22ef01cSRoman Divacky StaticDtorSection 626f22ef01cSRoman Divacky = getContext().getMachOSection("__TEXT", "__destructor", 0, 627f22ef01cSRoman Divacky SectionKind::getDataRel()); 628f22ef01cSRoman Divacky } else { 629f22ef01cSRoman Divacky StaticCtorSection 630f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__mod_init_func", 631f22ef01cSRoman Divacky MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 632f22ef01cSRoman Divacky SectionKind::getDataRel()); 633f22ef01cSRoman Divacky StaticDtorSection 634f22ef01cSRoman Divacky = getContext().getMachOSection("__DATA", "__mod_term_func", 635f22ef01cSRoman Divacky MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 636f22ef01cSRoman Divacky SectionKind::getDataRel()); 637f22ef01cSRoman Divacky } 638f22ef01cSRoman Divacky 639f22ef01cSRoman Divacky // Exception Handling. 640f22ef01cSRoman Divacky LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0, 641f22ef01cSRoman Divacky SectionKind::getReadOnlyWithRel()); 64217a519f9SDimitry Andric 64317a519f9SDimitry Andric if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) 64417a519f9SDimitry Andric CompactUnwindSection = 64517a519f9SDimitry Andric getContext().getMachOSection("__LD", "__compact_unwind", 64617a519f9SDimitry Andric MCSectionMachO::S_ATTR_DEBUG, 64717a519f9SDimitry Andric SectionKind::getReadOnly()); 64817a519f9SDimitry Andric 649f22ef01cSRoman Divacky // Debug Information. 650f22ef01cSRoman Divacky DwarfAbbrevSection = 651f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_abbrev", 652f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 653f22ef01cSRoman Divacky SectionKind::getMetadata()); 654f22ef01cSRoman Divacky DwarfInfoSection = 655f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_info", 656f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 657f22ef01cSRoman Divacky SectionKind::getMetadata()); 658f22ef01cSRoman Divacky DwarfLineSection = 659f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_line", 660f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 661f22ef01cSRoman Divacky SectionKind::getMetadata()); 662f22ef01cSRoman Divacky DwarfFrameSection = 663f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_frame", 664f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 665f22ef01cSRoman Divacky SectionKind::getMetadata()); 666f22ef01cSRoman Divacky DwarfPubNamesSection = 667f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_pubnames", 668f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 669f22ef01cSRoman Divacky SectionKind::getMetadata()); 670f22ef01cSRoman Divacky DwarfPubTypesSection = 671f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_pubtypes", 672f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 673f22ef01cSRoman Divacky SectionKind::getMetadata()); 674f22ef01cSRoman Divacky DwarfStrSection = 675f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_str", 676f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 677f22ef01cSRoman Divacky SectionKind::getMetadata()); 678f22ef01cSRoman Divacky DwarfLocSection = 679f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_loc", 680f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 681f22ef01cSRoman Divacky SectionKind::getMetadata()); 682f22ef01cSRoman Divacky DwarfARangesSection = 683f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_aranges", 684f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 685f22ef01cSRoman Divacky SectionKind::getMetadata()); 686f22ef01cSRoman Divacky DwarfRangesSection = 687f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_ranges", 688f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 689f22ef01cSRoman Divacky SectionKind::getMetadata()); 690f22ef01cSRoman Divacky DwarfMacroInfoSection = 691f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_macinfo", 692f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 693f22ef01cSRoman Divacky SectionKind::getMetadata()); 694f22ef01cSRoman Divacky DwarfDebugInlineSection = 695f22ef01cSRoman Divacky getContext().getMachOSection("__DWARF", "__debug_inlined", 696f22ef01cSRoman Divacky MCSectionMachO::S_ATTR_DEBUG, 697f22ef01cSRoman Divacky SectionKind::getMetadata()); 698f22ef01cSRoman Divacky 699f22ef01cSRoman Divacky TLSExtraDataSection = TLSTLVSection; 700f22ef01cSRoman Divacky } 701f22ef01cSRoman Divacky 7022754fe60SDimitry Andric const MCSection *TargetLoweringObjectFileMachO::getEHFrameSection() const { 7032754fe60SDimitry Andric return getContext().getMachOSection("__TEXT", "__eh_frame", 7042754fe60SDimitry Andric MCSectionMachO::S_COALESCED | 7052754fe60SDimitry Andric MCSectionMachO::S_ATTR_NO_TOC | 7062754fe60SDimitry Andric MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 7072754fe60SDimitry Andric MCSectionMachO::S_ATTR_LIVE_SUPPORT, 7082754fe60SDimitry Andric SectionKind::getReadOnly()); 7092754fe60SDimitry Andric } 7102754fe60SDimitry Andric 711f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO:: 712f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 713f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 714f22ef01cSRoman Divacky // Parse the section specifier and create it if valid. 715f22ef01cSRoman Divacky StringRef Segment, Section; 7163b0f4066SDimitry Andric unsigned TAA = 0, StubSize = 0; 7173b0f4066SDimitry Andric bool TAAParsed; 718f22ef01cSRoman Divacky std::string ErrorCode = 719f22ef01cSRoman Divacky MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 7203b0f4066SDimitry Andric TAA, TAAParsed, StubSize); 721f22ef01cSRoman Divacky if (!ErrorCode.empty()) { 722f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 723f22ef01cSRoman Divacky report_fatal_error("Global variable '" + GV->getNameStr() + 724f22ef01cSRoman Divacky "' has an invalid section specifier '" + GV->getSection()+ 725f22ef01cSRoman Divacky "': " + ErrorCode + "."); 726f22ef01cSRoman Divacky // Fall back to dropping it into the data section. 727f22ef01cSRoman Divacky return DataSection; 728f22ef01cSRoman Divacky } 729f22ef01cSRoman Divacky 730f22ef01cSRoman Divacky // Get the section. 731f22ef01cSRoman Divacky const MCSectionMachO *S = 732f22ef01cSRoman Divacky getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 733f22ef01cSRoman Divacky 734dd6029ffSDimitry Andric // If TAA wasn't set by ParseSectionSpecifier() above, 735dd6029ffSDimitry Andric // use the value returned by getMachOSection() as a default. 7363b0f4066SDimitry Andric if (!TAAParsed) 737dd6029ffSDimitry Andric TAA = S->getTypeAndAttributes(); 738dd6029ffSDimitry Andric 739f22ef01cSRoman Divacky // Okay, now that we got the section, verify that the TAA & StubSize agree. 740f22ef01cSRoman Divacky // If the user declared multiple globals with different section flags, we need 741f22ef01cSRoman Divacky // to reject it here. 742f22ef01cSRoman Divacky if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 743f22ef01cSRoman Divacky // If invalid, report the error with report_fatal_error. 744f22ef01cSRoman Divacky report_fatal_error("Global variable '" + GV->getNameStr() + 745f22ef01cSRoman Divacky "' section type or attributes does not match previous" 746f22ef01cSRoman Divacky " section specifier"); 747f22ef01cSRoman Divacky } 748f22ef01cSRoman Divacky 749f22ef01cSRoman Divacky return S; 750f22ef01cSRoman Divacky } 751f22ef01cSRoman Divacky 752f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileMachO:: 753f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 754f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 755f22ef01cSRoman Divacky 756f22ef01cSRoman Divacky // Handle thread local data. 757f22ef01cSRoman Divacky if (Kind.isThreadBSS()) return TLSBSSSection; 758f22ef01cSRoman Divacky if (Kind.isThreadData()) return TLSDataSection; 759f22ef01cSRoman Divacky 760f22ef01cSRoman Divacky if (Kind.isText()) 761f22ef01cSRoman Divacky return GV->isWeakForLinker() ? TextCoalSection : TextSection; 762f22ef01cSRoman Divacky 763f22ef01cSRoman Divacky // If this is weak/linkonce, put this in a coalescable section, either in text 764f22ef01cSRoman Divacky // or data depending on if it is writable. 765f22ef01cSRoman Divacky if (GV->isWeakForLinker()) { 766f22ef01cSRoman Divacky if (Kind.isReadOnly()) 767f22ef01cSRoman Divacky return ConstTextCoalSection; 768f22ef01cSRoman Divacky return DataCoalSection; 769f22ef01cSRoman Divacky } 770f22ef01cSRoman Divacky 771f22ef01cSRoman Divacky // FIXME: Alignment check should be handled by section classifier. 772f22ef01cSRoman Divacky if (Kind.isMergeable1ByteCString() && 773f22ef01cSRoman Divacky TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 774f22ef01cSRoman Divacky return CStringSection; 775f22ef01cSRoman Divacky 776f22ef01cSRoman Divacky // Do not put 16-bit arrays in the UString section if they have an 777f22ef01cSRoman Divacky // externally visible label, this runs into issues with certain linker 778f22ef01cSRoman Divacky // versions. 779f22ef01cSRoman Divacky if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 780f22ef01cSRoman Divacky TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 781f22ef01cSRoman Divacky return UStringSection; 782f22ef01cSRoman Divacky 783f22ef01cSRoman Divacky if (Kind.isMergeableConst()) { 784f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 785f22ef01cSRoman Divacky return FourByteConstantSection; 786f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 787f22ef01cSRoman Divacky return EightByteConstantSection; 788f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && SixteenByteConstantSection) 789f22ef01cSRoman Divacky return SixteenByteConstantSection; 790f22ef01cSRoman Divacky } 791f22ef01cSRoman Divacky 792f22ef01cSRoman Divacky // Otherwise, if it is readonly, but not something we can specially optimize, 793f22ef01cSRoman Divacky // just drop it in .const. 794f22ef01cSRoman Divacky if (Kind.isReadOnly()) 795f22ef01cSRoman Divacky return ReadOnlySection; 796f22ef01cSRoman Divacky 797f22ef01cSRoman Divacky // If this is marked const, put it into a const section. But if the dynamic 798f22ef01cSRoman Divacky // linker needs to write to it, put it in the data segment. 799f22ef01cSRoman Divacky if (Kind.isReadOnlyWithRel()) 800f22ef01cSRoman Divacky return ConstDataSection; 801f22ef01cSRoman Divacky 802f22ef01cSRoman Divacky // Put zero initialized globals with strong external linkage in the 803f22ef01cSRoman Divacky // DATA, __common section with the .zerofill directive. 804f22ef01cSRoman Divacky if (Kind.isBSSExtern()) 805f22ef01cSRoman Divacky return DataCommonSection; 806f22ef01cSRoman Divacky 807f22ef01cSRoman Divacky // Put zero initialized globals with local linkage in __DATA,__bss directive 808f22ef01cSRoman Divacky // with the .zerofill directive (aka .lcomm). 809f22ef01cSRoman Divacky if (Kind.isBSSLocal()) 810f22ef01cSRoman Divacky return DataBSSSection; 811f22ef01cSRoman Divacky 812f22ef01cSRoman Divacky // Otherwise, just drop the variable in the normal data section. 813f22ef01cSRoman Divacky return DataSection; 814f22ef01cSRoman Divacky } 815f22ef01cSRoman Divacky 816f22ef01cSRoman Divacky const MCSection * 817f22ef01cSRoman Divacky TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 818f22ef01cSRoman Divacky // If this constant requires a relocation, we have to put it in the data 819f22ef01cSRoman Divacky // segment, not in the text segment. 820f22ef01cSRoman Divacky if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 821f22ef01cSRoman Divacky return ConstDataSection; 822f22ef01cSRoman Divacky 823f22ef01cSRoman Divacky if (Kind.isMergeableConst4()) 824f22ef01cSRoman Divacky return FourByteConstantSection; 825f22ef01cSRoman Divacky if (Kind.isMergeableConst8()) 826f22ef01cSRoman Divacky return EightByteConstantSection; 827f22ef01cSRoman Divacky if (Kind.isMergeableConst16() && SixteenByteConstantSection) 828f22ef01cSRoman Divacky return SixteenByteConstantSection; 829f22ef01cSRoman Divacky return ReadOnlySection; // .const 830f22ef01cSRoman Divacky } 831f22ef01cSRoman Divacky 832f22ef01cSRoman Divacky /// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 833f22ef01cSRoman Divacky /// not to emit the UsedDirective for some symbols in llvm.used. 834f22ef01cSRoman Divacky // FIXME: REMOVE this (rdar://7071300) 835f22ef01cSRoman Divacky bool TargetLoweringObjectFileMachO:: 836f22ef01cSRoman Divacky shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 837f22ef01cSRoman Divacky /// On Darwin, internally linked data beginning with "L" or "l" does not have 838f22ef01cSRoman Divacky /// the directive emitted (this occurs in ObjC metadata). 839f22ef01cSRoman Divacky if (!GV) return false; 840f22ef01cSRoman Divacky 841f22ef01cSRoman Divacky // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 842f22ef01cSRoman Divacky if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 843f22ef01cSRoman Divacky // FIXME: ObjC metadata is currently emitted as internal symbols that have 844f22ef01cSRoman Divacky // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 845f22ef01cSRoman Divacky // this horrible hack can go away. 846f22ef01cSRoman Divacky MCSymbol *Sym = Mang->getSymbol(GV); 847f22ef01cSRoman Divacky if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l') 848f22ef01cSRoman Divacky return false; 849f22ef01cSRoman Divacky } 850f22ef01cSRoman Divacky 851f22ef01cSRoman Divacky return true; 852f22ef01cSRoman Divacky } 853f22ef01cSRoman Divacky 854f22ef01cSRoman Divacky const MCExpr *TargetLoweringObjectFileMachO:: 855f22ef01cSRoman Divacky getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 856f22ef01cSRoman Divacky MachineModuleInfo *MMI, unsigned Encoding, 857f22ef01cSRoman Divacky MCStreamer &Streamer) const { 858f22ef01cSRoman Divacky // The mach-o version of this method defaults to returning a stub reference. 859f22ef01cSRoman Divacky 860f22ef01cSRoman Divacky if (Encoding & DW_EH_PE_indirect) { 861f22ef01cSRoman Divacky MachineModuleInfoMachO &MachOMMI = 862f22ef01cSRoman Divacky MMI->getObjFileInfo<MachineModuleInfoMachO>(); 863f22ef01cSRoman Divacky 864f22ef01cSRoman Divacky SmallString<128> Name; 865f22ef01cSRoman Divacky Mang->getNameWithPrefix(Name, GV, true); 866f22ef01cSRoman Divacky Name += "$non_lazy_ptr"; 867f22ef01cSRoman Divacky 868f22ef01cSRoman Divacky // Add information about the stub reference to MachOMMI so that the stub 869f22ef01cSRoman Divacky // gets emitted by the asmprinter. 870f22ef01cSRoman Divacky MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 871f22ef01cSRoman Divacky MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 872f22ef01cSRoman Divacky if (StubSym.getPointer() == 0) { 873f22ef01cSRoman Divacky MCSymbol *Sym = Mang->getSymbol(GV); 874f22ef01cSRoman Divacky StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 875f22ef01cSRoman Divacky } 876f22ef01cSRoman Divacky 877f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 8783b0f4066SDimitry Andric getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 879f22ef01cSRoman Divacky } 880f22ef01cSRoman Divacky 881f22ef01cSRoman Divacky return TargetLoweringObjectFile:: 882f22ef01cSRoman Divacky getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 883f22ef01cSRoman Divacky } 884f22ef01cSRoman Divacky 8853b0f4066SDimitry Andric MCSymbol *TargetLoweringObjectFileMachO:: 8863b0f4066SDimitry Andric getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 8873b0f4066SDimitry Andric MachineModuleInfo *MMI) const { 8883b0f4066SDimitry Andric // The mach-o version of this method defaults to returning a stub reference. 8893b0f4066SDimitry Andric MachineModuleInfoMachO &MachOMMI = 8903b0f4066SDimitry Andric MMI->getObjFileInfo<MachineModuleInfoMachO>(); 8913b0f4066SDimitry Andric 8923b0f4066SDimitry Andric SmallString<128> Name; 8933b0f4066SDimitry Andric Mang->getNameWithPrefix(Name, GV, true); 8943b0f4066SDimitry Andric Name += "$non_lazy_ptr"; 8953b0f4066SDimitry Andric 8963b0f4066SDimitry Andric // Add information about the stub reference to MachOMMI so that the stub 8973b0f4066SDimitry Andric // gets emitted by the asmprinter. 8983b0f4066SDimitry Andric MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 8993b0f4066SDimitry Andric MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 9003b0f4066SDimitry Andric if (StubSym.getPointer() == 0) { 9013b0f4066SDimitry Andric MCSymbol *Sym = Mang->getSymbol(GV); 9023b0f4066SDimitry Andric StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 9033b0f4066SDimitry Andric } 9043b0f4066SDimitry Andric 9053b0f4066SDimitry Andric return SSym; 9063b0f4066SDimitry Andric } 9073b0f4066SDimitry Andric 908f22ef01cSRoman Divacky unsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const { 909f22ef01cSRoman Divacky return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 910f22ef01cSRoman Divacky } 911f22ef01cSRoman Divacky 912f22ef01cSRoman Divacky unsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const { 913f22ef01cSRoman Divacky return DW_EH_PE_pcrel; 914f22ef01cSRoman Divacky } 915f22ef01cSRoman Divacky 9163b0f4066SDimitry Andric unsigned TargetLoweringObjectFileMachO::getFDEEncoding(bool CFI) const { 917f22ef01cSRoman Divacky return DW_EH_PE_pcrel; 918f22ef01cSRoman Divacky } 919f22ef01cSRoman Divacky 920f22ef01cSRoman Divacky unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const { 921f22ef01cSRoman Divacky return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 922f22ef01cSRoman Divacky } 923f22ef01cSRoman Divacky 924f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 925f22ef01cSRoman Divacky // COFF 926f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 927f22ef01cSRoman Divacky 92817a519f9SDimitry Andric TargetLoweringObjectFileCOFF::TargetLoweringObjectFileCOFF() 92917a519f9SDimitry Andric : TargetLoweringObjectFile(), 93017a519f9SDimitry Andric DrectveSection(0), 93117a519f9SDimitry Andric PDataSection(0), 93217a519f9SDimitry Andric XDataSection(0) { 93317a519f9SDimitry Andric } 93417a519f9SDimitry Andric 935f22ef01cSRoman Divacky void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 936f22ef01cSRoman Divacky const TargetMachine &TM) { 937f22ef01cSRoman Divacky TargetLoweringObjectFile::Initialize(Ctx, TM); 938f22ef01cSRoman Divacky TextSection = 939f22ef01cSRoman Divacky getContext().getCOFFSection(".text", 940ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_CODE | 941ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_EXECUTE | 942ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 943f22ef01cSRoman Divacky SectionKind::getText()); 944f22ef01cSRoman Divacky DataSection = 945f22ef01cSRoman Divacky getContext().getCOFFSection(".data", 946ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 947ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 948ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE, 949f22ef01cSRoman Divacky SectionKind::getDataRel()); 950f22ef01cSRoman Divacky ReadOnlySection = 951f22ef01cSRoman Divacky getContext().getCOFFSection(".rdata", 952ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 953ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 954f22ef01cSRoman Divacky SectionKind::getReadOnly()); 955f22ef01cSRoman Divacky StaticCtorSection = 956f22ef01cSRoman Divacky getContext().getCOFFSection(".ctors", 957ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 958ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 959ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE, 960f22ef01cSRoman Divacky SectionKind::getDataRel()); 961f22ef01cSRoman Divacky StaticDtorSection = 962f22ef01cSRoman Divacky getContext().getCOFFSection(".dtors", 963ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 964ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 965ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE, 966f22ef01cSRoman Divacky SectionKind::getDataRel()); 967f22ef01cSRoman Divacky 968f22ef01cSRoman Divacky // FIXME: We're emitting LSDA info into a readonly section on COFF, even 969f22ef01cSRoman Divacky // though it contains relocatable pointers. In PIC mode, this is probably a 970f22ef01cSRoman Divacky // big runtime hit for C++ apps. Either the contents of the LSDA need to be 971f22ef01cSRoman Divacky // adjusted or this should be a data section. 972f22ef01cSRoman Divacky LSDASection = 973f22ef01cSRoman Divacky getContext().getCOFFSection(".gcc_except_table", 974ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 975ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 976f22ef01cSRoman Divacky SectionKind::getReadOnly()); 977f22ef01cSRoman Divacky // Debug info. 978f22ef01cSRoman Divacky DwarfAbbrevSection = 979f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_abbrev", 980ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 981ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 982f22ef01cSRoman Divacky SectionKind::getMetadata()); 983f22ef01cSRoman Divacky DwarfInfoSection = 984f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_info", 985ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 986ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 987f22ef01cSRoman Divacky SectionKind::getMetadata()); 988f22ef01cSRoman Divacky DwarfLineSection = 989f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_line", 990ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 991ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 992f22ef01cSRoman Divacky SectionKind::getMetadata()); 993f22ef01cSRoman Divacky DwarfFrameSection = 994f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_frame", 995ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 996ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 997f22ef01cSRoman Divacky SectionKind::getMetadata()); 998f22ef01cSRoman Divacky DwarfPubNamesSection = 999f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_pubnames", 1000ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1001ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1002f22ef01cSRoman Divacky SectionKind::getMetadata()); 1003f22ef01cSRoman Divacky DwarfPubTypesSection = 1004f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_pubtypes", 1005ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1006ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1007f22ef01cSRoman Divacky SectionKind::getMetadata()); 1008f22ef01cSRoman Divacky DwarfStrSection = 1009f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_str", 1010ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1011ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1012f22ef01cSRoman Divacky SectionKind::getMetadata()); 1013f22ef01cSRoman Divacky DwarfLocSection = 1014f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_loc", 1015ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1016ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1017f22ef01cSRoman Divacky SectionKind::getMetadata()); 1018f22ef01cSRoman Divacky DwarfARangesSection = 1019f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_aranges", 1020ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1021ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1022f22ef01cSRoman Divacky SectionKind::getMetadata()); 1023f22ef01cSRoman Divacky DwarfRangesSection = 1024f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_ranges", 1025ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1026ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1027f22ef01cSRoman Divacky SectionKind::getMetadata()); 1028f22ef01cSRoman Divacky DwarfMacroInfoSection = 1029f22ef01cSRoman Divacky getContext().getCOFFSection(".debug_macinfo", 1030ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE | 1031ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ, 1032f22ef01cSRoman Divacky SectionKind::getMetadata()); 1033f22ef01cSRoman Divacky 1034f22ef01cSRoman Divacky DrectveSection = 1035f22ef01cSRoman Divacky getContext().getCOFFSection(".drectve", 1036ffd1746dSEd Schouten COFF::IMAGE_SCN_LNK_INFO, 1037f22ef01cSRoman Divacky SectionKind::getMetadata()); 1038bd5abe19SDimitry Andric 1039bd5abe19SDimitry Andric PDataSection = 1040bd5abe19SDimitry Andric getContext().getCOFFSection(".pdata", 1041bd5abe19SDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 1042bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 1043bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_WRITE, 1044bd5abe19SDimitry Andric SectionKind::getDataRel()); 1045bd5abe19SDimitry Andric 1046bd5abe19SDimitry Andric XDataSection = 1047bd5abe19SDimitry Andric getContext().getCOFFSection(".xdata", 1048bd5abe19SDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 1049bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 1050bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_WRITE, 1051bd5abe19SDimitry Andric SectionKind::getDataRel()); 1052f22ef01cSRoman Divacky } 1053f22ef01cSRoman Divacky 10542754fe60SDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getEHFrameSection() const { 10552754fe60SDimitry Andric return getContext().getCOFFSection(".eh_frame", 10562754fe60SDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 10572754fe60SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 10582754fe60SDimitry Andric COFF::IMAGE_SCN_MEM_WRITE, 10592754fe60SDimitry Andric SectionKind::getDataRel()); 10602754fe60SDimitry Andric } 10612754fe60SDimitry Andric 1062bd5abe19SDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getWin64EHFuncTableSection( 1063bd5abe19SDimitry Andric StringRef suffix) const { 1064bd5abe19SDimitry Andric if (suffix == "") 1065bd5abe19SDimitry Andric return PDataSection; 1066bd5abe19SDimitry Andric return getContext().getCOFFSection((".pdata"+suffix).str(), 1067bd5abe19SDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 1068bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 1069bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_WRITE, 1070bd5abe19SDimitry Andric SectionKind::getDataRel()); 1071bd5abe19SDimitry Andric } 1072bd5abe19SDimitry Andric 1073bd5abe19SDimitry Andric const MCSection *TargetLoweringObjectFileCOFF::getWin64EHTableSection( 1074bd5abe19SDimitry Andric StringRef suffix) const { 1075bd5abe19SDimitry Andric if (suffix == "") 1076bd5abe19SDimitry Andric return XDataSection; 1077bd5abe19SDimitry Andric return getContext().getCOFFSection((".xdata"+suffix).str(), 1078bd5abe19SDimitry Andric COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 1079bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 1080bd5abe19SDimitry Andric COFF::IMAGE_SCN_MEM_WRITE, 1081bd5abe19SDimitry Andric SectionKind::getDataRel()); 1082bd5abe19SDimitry Andric } 1083bd5abe19SDimitry Andric 10842754fe60SDimitry Andric 1085f22ef01cSRoman Divacky static unsigned 1086f22ef01cSRoman Divacky getCOFFSectionFlags(SectionKind K) { 1087f22ef01cSRoman Divacky unsigned Flags = 0; 1088f22ef01cSRoman Divacky 1089ffd1746dSEd Schouten if (K.isMetadata()) 1090f22ef01cSRoman Divacky Flags |= 1091ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_DISCARDABLE; 1092f22ef01cSRoman Divacky else if (K.isText()) 1093f22ef01cSRoman Divacky Flags |= 1094ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_EXECUTE | 10952754fe60SDimitry Andric COFF::IMAGE_SCN_MEM_READ | 1096ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_CODE; 1097f22ef01cSRoman Divacky else if (K.isBSS ()) 1098f22ef01cSRoman Divacky Flags |= 1099ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 1100ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 1101ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 1102f22ef01cSRoman Divacky else if (K.isReadOnly()) 1103f22ef01cSRoman Divacky Flags |= 1104ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 1105ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ; 1106f22ef01cSRoman Divacky else if (K.isWriteable()) 1107f22ef01cSRoman Divacky Flags |= 1108ffd1746dSEd Schouten COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 1109ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_READ | 1110ffd1746dSEd Schouten COFF::IMAGE_SCN_MEM_WRITE; 1111f22ef01cSRoman Divacky 1112f22ef01cSRoman Divacky return Flags; 1113f22ef01cSRoman Divacky } 1114f22ef01cSRoman Divacky 1115f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF:: 1116f22ef01cSRoman Divacky getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 1117f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 1118f22ef01cSRoman Divacky return getContext().getCOFFSection(GV->getSection(), 1119f22ef01cSRoman Divacky getCOFFSectionFlags(Kind), 1120f22ef01cSRoman Divacky Kind); 1121f22ef01cSRoman Divacky } 1122f22ef01cSRoman Divacky 1123f22ef01cSRoman Divacky static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1124f22ef01cSRoman Divacky if (Kind.isText()) 11252754fe60SDimitry Andric return ".text$"; 1126f22ef01cSRoman Divacky if (Kind.isBSS ()) 11272754fe60SDimitry Andric return ".bss$"; 1128f22ef01cSRoman Divacky if (Kind.isWriteable()) 11292754fe60SDimitry Andric return ".data$"; 11302754fe60SDimitry Andric return ".rdata$"; 1131f22ef01cSRoman Divacky } 1132f22ef01cSRoman Divacky 1133f22ef01cSRoman Divacky 1134f22ef01cSRoman Divacky const MCSection *TargetLoweringObjectFileCOFF:: 1135f22ef01cSRoman Divacky SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1136f22ef01cSRoman Divacky Mangler *Mang, const TargetMachine &TM) const { 1137f22ef01cSRoman Divacky assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 1138f22ef01cSRoman Divacky 1139f22ef01cSRoman Divacky // If this global is linkonce/weak and the target handles this by emitting it 1140f22ef01cSRoman Divacky // into a 'uniqued' section name, create and return the section now. 1141f22ef01cSRoman Divacky if (GV->isWeakForLinker()) { 1142f22ef01cSRoman Divacky const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 1143f22ef01cSRoman Divacky SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 1144f22ef01cSRoman Divacky MCSymbol *Sym = Mang->getSymbol(GV); 11452754fe60SDimitry Andric Name.append(Sym->getName().begin() + 1, Sym->getName().end()); 1146f22ef01cSRoman Divacky 1147f22ef01cSRoman Divacky unsigned Characteristics = getCOFFSectionFlags(Kind); 1148f22ef01cSRoman Divacky 1149ffd1746dSEd Schouten Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 1150f22ef01cSRoman Divacky 1151f22ef01cSRoman Divacky return getContext().getCOFFSection(Name.str(), Characteristics, 11522754fe60SDimitry Andric COFF::IMAGE_COMDAT_SELECT_ANY, Kind); 1153f22ef01cSRoman Divacky } 1154f22ef01cSRoman Divacky 1155f22ef01cSRoman Divacky if (Kind.isText()) 1156f22ef01cSRoman Divacky return getTextSection(); 1157f22ef01cSRoman Divacky 1158f22ef01cSRoman Divacky return getDataSection(); 1159f22ef01cSRoman Divacky } 1160f22ef01cSRoman Divacky 1161