TargetLoweringObjectFileImpl.cpp revision 3574eca1b02600bac4e625297f4ecf745f4c4f32
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===// 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The LLVM Compiler Infrastructure 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// This file is distributed under the University of Illinois Open Source 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt// License. See LICENSE.TXT for details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// This file implements classes used to handle lowerings specific to common 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// object file formats. 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Constants.h" 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/DerivedTypes.h" 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Function.h" 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/GlobalVariable.h" 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Module.h" 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/CodeGen/MachineModuleInfoImpls.h" 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCContext.h" 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCExpr.h" 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSectionMachO.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSectionELF.h" 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSectionCOFF.h" 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCStreamer.h" 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/MC/MCSymbol.h" 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Target/Mangler.h" 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/DataLayout.h" 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Target/TargetMachine.h" 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Target/TargetOptions.h" 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/Dwarf.h" 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/ELF.h" 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/ErrorHandling.h" 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/Support/raw_ostream.h" 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/SmallString.h" 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/StringExtras.h" 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "llvm/ADT/Triple.h" 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace llvm; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtusing namespace dwarf; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// ELF 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt//===----------------------------------------------------------------------===// 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtMCSymbol * 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtTargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV, 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mangler *Mang, 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MachineModuleInfo *MMI) const { 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Encoding = getPersonalityEncoding(); 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt switch (Encoding & 0x70) { 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt default: 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt report_fatal_error("We do not support this DWARF encoding yet!"); 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case dwarf::DW_EH_PE_absptr: 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return Mang->getSymbol(GV); 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt case dwarf::DW_EH_PE_pcrel: { 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getContext().GetOrCreateSymbol(StringRef("DW.ref.") + 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mang->getSymbol(GV)->getName()); 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer, 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const TargetMachine &TM, 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const MCSymbol *Sym) const { 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SmallString<64> NameData("DW.ref."); 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NameData += Sym->getName(); 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MCSymbol *Label = getContext().GetOrCreateSymbol(NameData); 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StringRef Prefix = ".data."; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const MCSection *Sec = getContext().getELFSection(NameData, 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ELF::SHT_PROGBITS, 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags, 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SectionKind::getDataRel(), 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 0, Label->getName()); 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Size = TM.getDataLayout()->getPointerSize(); 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.SwitchSection(Sec); 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitValueToAlignment(TM.getDataLayout()->getPointerABIAlignment()); 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const MCExpr *E = MCConstantExpr::Create(Size, getContext()); 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitELFSize(Label, E); 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitLabel(Label); 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Streamer.EmitSymbolValue(Sym, Size); 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic SectionKind 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetELFKindForNamedSection(StringRef Name, SectionKind K) { 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // N.B.: The defaults used in here are no the same ones used in MC. 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // both gas and MC will produce a section with no flags. Given 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // section(".eh_frame") gcc will produce: 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // .section .eh_frame,"a",@progbits 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name.empty() || Name[0] != '.') return K; 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Some lame default implementation based on some magic section names. 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name == ".bss" || 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".bss.") || 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".gnu.linkonce.b.") || 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".llvm.linkonce.b.") || 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name == ".sbss" || 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".sbss.") || 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".gnu.linkonce.sb.") || 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".llvm.linkonce.sb.")) 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SectionKind::getBSS(); 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name == ".tdata" || 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".tdata.") || 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".gnu.linkonce.td.") || 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".llvm.linkonce.td.")) 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SectionKind::getThreadData(); 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name == ".tbss" || 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".tbss.") || 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".gnu.linkonce.tb.") || 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.startswith(".llvm.linkonce.tb.")) 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return SectionKind::getThreadBSS(); 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return K; 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name == ".init_array") 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ELF::SHT_INIT_ARRAY; 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name == ".fini_array") 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ELF::SHT_FINI_ARRAY; 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Name == ".preinit_array") 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ELF::SHT_PREINIT_ARRAY; 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (K.isBSS() || K.isThreadBSS()) 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ELF::SHT_NOBITS; 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ELF::SHT_PROGBITS; 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic unsigned 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetELFSectionFlags(SectionKind K) { 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Flags = 0; 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!K.isMetadata()) 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_ALLOC; 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (K.isText()) 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_EXECINSTR; 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (K.isWriteable()) 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_WRITE; 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (K.isThreadLocal()) 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_TLS; 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // K.isMergeableConst() is left out to honour PR4650 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (K.isMergeableCString() || K.isMergeableConst4() || 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt K.isMergeableConst8() || K.isMergeableConst16()) 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_MERGE; 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (K.isMergeableCString()) 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_STRINGS; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return Flags; 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileELF:: 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StringRef SectionName = GV->getSection(); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Infer section flags from the section name if we can. 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Kind = getELFKindForNamedSection(SectionName, Kind); 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getContext().getELFSection(SectionName, 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getELFSectionType(SectionName, Kind), 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getELFSectionFlags(Kind), Kind); 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// getSectionPrefixForGlobal - Return the section prefix name used by options 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// FunctionsSections and DataSections. 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic const char *getSectionPrefixForGlobal(SectionKind Kind) { 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isText()) return ".text."; 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isReadOnly()) return ".rodata."; 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isBSS()) return ".bss."; 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isThreadData()) return ".tdata."; 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isThreadBSS()) return ".tbss."; 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isDataNoRel()) return ".data."; 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isDataRelLocal()) return ".data.rel.local."; 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isDataRel()) return ".data.rel."; 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ".data.rel.ro."; 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileELF:: 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // If we have -ffunction-section or -fdata-section then we should emit the 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // global value to a uniqued section specifically for it. 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool EmitUniquedSection; 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isText()) 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EmitUniquedSection = TM.getFunctionSections(); 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt EmitUniquedSection = TM.getDataSections(); 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // If this global is linkonce/weak and the target handles this by emitting it 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // into a 'uniqued' section name, create and return the section now. 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((GV->isWeakForLinker() || EmitUniquedSection) && 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt !Kind.isCommon()) { 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *Prefix; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Prefix = getSectionPrefixForGlobal(Kind); 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MCSymbol *Sym = Mang->getSymbol(GV); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name.append(Sym->getName().begin(), Sym->getName().end()); 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StringRef Group = ""; 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Flags = getELFSectionFlags(Kind); 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (GV->isWeakForLinker()) { 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Group = Sym->getName(); 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags |= ELF::SHF_GROUP; 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getContext().getELFSection(Name.str(), 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getELFSectionType(Name.str(), Kind), 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Flags, Kind, 0, Group); 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isText()) return TextSection; 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeable1ByteCString() || 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Kind.isMergeable2ByteCString() || 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Kind.isMergeable4ByteCString()) { 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // We also need alignment here. 2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // FIXME: this is getting the alignment of the character, not the 2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // alignment of the global! 2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Align = 2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)); 2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *SizeSpec = ".rodata.str1."; 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeable2ByteCString()) 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SizeSpec = ".rodata.str2."; 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else if (Kind.isMergeable4ByteCString()) 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SizeSpec = ".rodata.str4."; 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Kind.isMergeable1ByteCString() && "unknown string width"); 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::string Name = SizeSpec + utostr(Align); 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ELF::SHF_ALLOC | 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ELF::SHF_MERGE | 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ELF::SHF_STRINGS, 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Kind); 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst()) { 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst4() && MergeableConst4Section) 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return MergeableConst4Section; 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst8() && MergeableConst8Section) 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return MergeableConst8Section; 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst16() && MergeableConst16Section) 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return MergeableConst16Section; 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ReadOnlySection; // .const 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isReadOnly()) return ReadOnlySection; 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isThreadData()) return TLSDataSection; 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isThreadBSS()) return TLSBSSSection; 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Note: we claim that common symbols are put in BSSSection, but they are 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // really emitted with the magic .comm directive, which creates a symbol table 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // entry but not a section. 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isDataNoRel()) return DataSection; 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isDataRelLocal()) return DataRelLocalSection; 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isDataRel()) return DataRelSection; 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return DataRelROSection; 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// getSectionForConstant - Given a mergeable constant with the 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// specified size and relocation information, return a section that it 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/// should be placed in. 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileELF:: 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetSectionForConstant(SectionKind Kind) const { 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst4() && MergeableConst4Section) 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return MergeableConst4Section; 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst8() && MergeableConst8Section) 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return MergeableConst8Section; 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isMergeableConst16() && MergeableConst16Section) 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return MergeableConst16Section; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isReadOnly()) 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ReadOnlySection; 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return DataRelROSection; 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCExpr *TargetLoweringObjectFileELF:: 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtgetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MachineModuleInfo *MMI, 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsigned Encoding, MCStreamer &Streamer) const { 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Encoding & dwarf::DW_EH_PE_indirect) { 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SmallString<128> Name; 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mang->getNameWithPrefix(Name, GV, true); 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Name += ".DW.stub"; 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Add information about the stub reference to ELFMMI so that the stub 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // gets emitted by the asmprinter. 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (StubSym.getPointer() == 0) { 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt MCSymbol *Sym = Mang->getSymbol(GV); 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TargetLoweringObjectFile:: 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return TargetLoweringObjectFile:: 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection * 34761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileELF::getStaticCtorSection(unsigned Priority) const { 34861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // The default scheme is .ctor / .dtor, so we have to invert the priority 34961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // numbering. 35061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Priority == 65535) 35161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return StaticCtorSection; 35261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 353b5d893b5dec601a58c3ce0fc9e5d6da3816ce97aDmitry Shmidt if (UseInitArray) { 35461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt std::string Name = std::string(".init_array.") + utostr(Priority); 35561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return getContext().getELFSection(Name, ELF::SHT_INIT_ARRAY, 35661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_ALLOC | ELF::SHF_WRITE, 35761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataRel()); 35861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 35961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt std::string Name = std::string(".ctors.") + utostr(65535 - Priority); 36061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 36161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_ALLOC |ELF::SHF_WRITE, 36261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataRel()); 36361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 36461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 36561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 36661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCSection * 36761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileELF::getStaticDtorSection(unsigned Priority) const { 36861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // The default scheme is .ctor / .dtor, so we have to invert the priority 36961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // numbering. 37061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Priority == 65535) 37161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return StaticDtorSection; 37261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 37361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (UseInitArray) { 37461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt std::string Name = std::string(".fini_array.") + utostr(Priority); 37561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return getContext().getELFSection(Name, ELF::SHT_FINI_ARRAY, 37661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_ALLOC | ELF::SHF_WRITE, 37761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataRel()); 37861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } else { 37961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt std::string Name = std::string(".dtors.") + utostr(65535 - Priority); 38061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 38161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_ALLOC |ELF::SHF_WRITE, 38261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataRel()); 38361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 38461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 38561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 38661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid 38761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) { 38861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt UseInitArray = UseInitArray_; 38961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!UseInitArray) 39061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return; 39161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 39261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt StaticCtorSection = 39361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt getContext().getELFSection(".init_array", ELF::SHT_INIT_ARRAY, 39461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_WRITE | 39561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_ALLOC, 39661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataRel()); 39761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt StaticDtorSection = 39861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt getContext().getELFSection(".fini_array", ELF::SHT_FINI_ARRAY, 39961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_WRITE | 40061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ELF::SHF_ALLOC, 40161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataRel()); 40261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 4035605286c30e1701491bd3af974ae423727750eddDmitry Shmidt 40461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt//===----------------------------------------------------------------------===// 40561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt// MachO 40661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt//===----------------------------------------------------------------------===// 40761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 40861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/// emitModuleFlags - Emit the module flags that specify the garbage collection 40961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt/// information. 41061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtvoid TargetLoweringObjectFileMachO:: 41161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtemitModuleFlags(MCStreamer &Streamer, 41261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 41361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 41461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned VersionVal = 0; 41561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned ImageInfoFlags = 0; 41661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt StringRef SectionVal; 41761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 41861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt for (ArrayRef<Module::ModuleFlagEntry>::iterator 41961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 42061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const Module::ModuleFlagEntry &MFE = *i; 42161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 42261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Ignore flags with 'Require' behavior. 42361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (MFE.Behavior == Module::Require) 42461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt continue; 42561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 42661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt StringRef Key = MFE.Key->getString(); 42761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Value *Val = MFE.Val; 42861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 42961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Key == "Objective-C Image Info Version") 43061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt VersionVal = cast<ConstantInt>(Val)->getZExtValue(); 43161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else if (Key == "Objective-C Garbage Collection" || 43261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Key == "Objective-C GC Only" || 43361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Key == "Objective-C Is Simulated") 43461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ImageInfoFlags |= cast<ConstantInt>(Val)->getZExtValue(); 43561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt else if (Key == "Objective-C Image Info Section") 43661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionVal = cast<MDString>(Val)->getString(); 43761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 43861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 43961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // The section is mandatory. If we don't have it, then we don't have GC info. 44061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (SectionVal.empty()) return; 44161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 44261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt StringRef Segment, Section; 44361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned TAA = 0, StubSize = 0; 44461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt bool TAAParsed; 44561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt std::string ErrorCode = 44661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section, 44761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt TAA, TAAParsed, StubSize); 44861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!ErrorCode.empty()) 44961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // If invalid, report the error with report_fatal_error. 45061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt report_fatal_error("Invalid section specifier '" + Section + "': " + 45161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt ErrorCode + "."); 45261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 45361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Get the section. 45461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt const MCSectionMachO *S = 45561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt getContext().getMachOSection(Segment, Section, TAA, StubSize, 45661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SectionKind::getDataNoRel()); 45761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Streamer.SwitchSection(S); 45861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Streamer.EmitLabel(getContext(). 45961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt GetOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO"))); 46061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Streamer.EmitIntValue(VersionVal, 4); 46161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Streamer.EmitIntValue(ImageInfoFlags, 4); 46261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Streamer.AddBlankLine(); 46361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 46461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 46561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCSection *TargetLoweringObjectFileMachO:: 46661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 46761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 46861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Parse the section specifier and create it if valid. 46961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt StringRef Segment, Section; 47061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt unsigned TAA = 0, StubSize = 0; 4715605286c30e1701491bd3af974ae423727750eddDmitry Shmidt bool TAAParsed; 4725605286c30e1701491bd3af974ae423727750eddDmitry Shmidt std::string ErrorCode = 47361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 47461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt TAA, TAAParsed, StubSize); 47561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (!ErrorCode.empty()) { 47661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // If invalid, report the error with report_fatal_error. 47761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt report_fatal_error("Global variable '" + GV->getName() + 4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt "' has an invalid section specifier '" + 4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt GV->getSection() + "': " + ErrorCode + "."); 4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Get the section. 4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const MCSectionMachO *S = 4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // If TAA wasn't set by ParseSectionSpecifier() above, 4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // use the value returned by getMachOSection() as a default. 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (!TAAParsed) 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt TAA = S->getTypeAndAttributes(); 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Okay, now that we got the section, verify that the TAA & StubSize agree. 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // If the user declared multiple globals with different section flags, we need 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // to reject it here. 49461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 49561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // If invalid, report the error with report_fatal_error. 49661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt report_fatal_error("Global variable '" + GV->getName() + 49761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt "' section type or attributes does not match previous" 49861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt " section specifier"); 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 50061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 50161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return S; 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtconst MCSection *TargetLoweringObjectFileMachO:: 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Handle thread local data. 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (Kind.isThreadBSS()) return TLSBSSSection; 51061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isThreadData()) return TLSDataSection; 51161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 51261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isText()) 51361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return GV->isWeakForLinker() ? TextCoalSection : TextSection; 51461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 51561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // If this is weak/linkonce, put this in a coalescable section, either in text 51661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // or data depending on if it is writable. 51761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (GV->isWeakForLinker()) { 51861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isReadOnly()) 51961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return ConstTextCoalSection; 52061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return DataCoalSection; 52161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 5224b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt 52361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // FIXME: Alignment check should be handled by section classifier. 52461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeable1ByteCString() && 52561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 52661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return CStringSection; 52761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 52861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Do not put 16-bit arrays in the UString section if they have an 52961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // externally visible label, this runs into issues with certain linker 53061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // versions. 53161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 53261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt TM.getDataLayout()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 53361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return UStringSection; 53461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 5354b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt if (Kind.isMergeableConst()) { 53661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeableConst4()) 53761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return FourByteConstantSection; 53861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeableConst8()) 53961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return EightByteConstantSection; 54061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeableConst16() && SixteenByteConstantSection) 54161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return SixteenByteConstantSection; 54261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 54361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 54461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Otherwise, if it is readonly, but not something we can specially optimize, 54561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // just drop it in .const. 54661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isReadOnly()) 54761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return ReadOnlySection; 54861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 54961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // If this is marked const, put it into a const section. But if the dynamic 55061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // linker needs to write to it, put it in the data segment. 55161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isReadOnlyWithRel()) 55261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return ConstDataSection; 55361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 55461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Put zero initialized globals with strong external linkage in the 55561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // DATA, __common section with the .zerofill directive. 55661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isBSSExtern()) 55761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return DataCommonSection; 55861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 55961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Put zero initialized globals with local linkage in __DATA,__bss directive 56061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // with the .zerofill directive (aka .lcomm). 56161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isBSSLocal()) 56261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return DataBSSSection; 56361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 56461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Otherwise, just drop the variable in the normal data section. 56561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return DataSection; 56661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 56761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 56861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCSection * 56961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 57061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // If this constant requires a relocation, we have to put it in the data 57161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // segment, not in the text segment. 57261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 57361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return ConstDataSection; 57461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 57561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeableConst4()) 57661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return FourByteConstantSection; 57761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeableConst8()) 57861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return EightByteConstantSection; 57961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Kind.isMergeableConst16() && SixteenByteConstantSection) 58061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return SixteenByteConstantSection; 58168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt return ReadOnlySection; // .const 58268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt} 58368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 58468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 58568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt/// not to emit the UsedDirective for some symbols in llvm.used. 58668d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt// FIXME: REMOVE this (rdar://7071300) 58768d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidtbool TargetLoweringObjectFileMachO:: 58868d0e3ed07847339aedfac8e02f50db68c702e52Dmitry ShmidtshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 58968d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt /// On Darwin, internally linked data beginning with "L" or "l" does not have 59068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt /// the directive emitted (this occurs in ObjC metadata). 59168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (!GV) return false; 59268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt 59368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 59468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 59568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt // FIXME: ObjC metadata is currently emitted as internal symbols that have 59661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 59761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // this horrible hack can go away. 59861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MCSymbol *Sym = Mang->getSymbol(GV); 59961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l') 60061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return false; 60161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt } 60261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 60361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt return true; 60461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} 60561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 60661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtconst MCExpr *TargetLoweringObjectFileMachO:: 60761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry ShmidtgetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 60861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MachineModuleInfo *MMI, unsigned Encoding, 60961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MCStreamer &Streamer) const { 61061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // The mach-o version of this method defaults to returning a stub reference. 61161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 61261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt if (Encoding & DW_EH_PE_indirect) { 61361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MachineModuleInfoMachO &MachOMMI = 61461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MMI->getObjFileInfo<MachineModuleInfoMachO>(); 61561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 61661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt SmallString<128> Name; 61761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Mang->getNameWithPrefix(Name, GV, true); 61861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt Name += "$non_lazy_ptr"; 61961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt 62061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // Add information about the stub reference to MachOMMI so that the stub 62161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt // gets emitted by the asmprinter. 62261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 62361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MachineModuleInfoImpl::StubValueTy &StubSym = 62461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 62561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt MachOMMI.getGVStubEntry(SSym); 6264b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt if (StubSym.getPointer() == 0) { 6274b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt MCSymbol *Sym = Mang->getSymbol(GV); 6284b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 6294b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt } 6304b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt 6314b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt return TargetLoweringObjectFile:: 6324b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 6334b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt } 6344b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt 6354b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt return TargetLoweringObjectFile:: 6364b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 6374b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt} 6384b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt 6394b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry ShmidtMCSymbol *TargetLoweringObjectFileMachO:: 6404b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry ShmidtgetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 6414b06059785b935dd1f4f09314e4e12c417d2c6a4Dmitry Shmidt MachineModuleInfo *MMI) const { 6424ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt // The mach-o version of this method defaults to returning a stub reference. 6434ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt MachineModuleInfoMachO &MachOMMI = 6444ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt MMI->getObjFileInfo<MachineModuleInfoMachO>(); 6454ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6464ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt SmallString<128> Name; 6474ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Mang->getNameWithPrefix(Name, GV, true); 6484ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Name += "$non_lazy_ptr"; 6494ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6504ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt // Add information about the stub reference to MachOMMI so that the stub 6514ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt // gets emitted by the asmprinter. 6524ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 6534ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 6544ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (StubSym.getPointer() == 0) { 6554ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt MCSymbol *Sym = Mang->getSymbol(GV); 6564ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 6574ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt } 6584ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6594ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return SSym; 6604ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt} 6614ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6624ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt//===----------------------------------------------------------------------===// 6634ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt// COFF 6644ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt//===----------------------------------------------------------------------===// 6654ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6664ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtstatic unsigned 6674ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry ShmidtgetCOFFSectionFlags(SectionKind K) { 6684ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt unsigned Flags = 0; 6694ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6704ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (K.isMetadata()) 6714ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Flags |= 6724ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_DISCARDABLE; 6734ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt else if (K.isText()) 6744ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Flags |= 6754ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_EXECUTE | 6764ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_READ | 6774ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_CNT_CODE; 6784ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt else if (K.isBSS ()) 6794ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Flags |= 6804ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 6814ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_READ | 6824ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_WRITE; 6834ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt else if (K.isThreadLocal()) 6844ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Flags |= 6854ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 6864ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_READ | 6874ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_WRITE; 6884ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt else if (K.isReadOnly()) 6894ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Flags |= 6904ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 6914ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_READ; 6924ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt else if (K.isWriteable()) 6934ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Flags |= 6944ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 6954ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_READ | 6964ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt COFF::IMAGE_SCN_MEM_WRITE; 6974ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 6984ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return Flags; 6994ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt} 7004ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7014ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtconst MCSection *TargetLoweringObjectFileCOFF:: 7024ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry ShmidtgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 7034ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 7044ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return getContext().getCOFFSection(GV->getSection(), 7054ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt getCOFFSectionFlags(Kind), 7064ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Kind); 7074ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt} 7084ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7094ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 7104ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (Kind.isText()) 7114ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return ".text$"; 7124ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (Kind.isBSS ()) 7134ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return ".bss$"; 7144ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (Kind.isThreadLocal()) 7154ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return ".tls$"; 7164ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (Kind.isWriteable()) 7174ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return ".data$"; 7184ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt return ".rdata$"; 7194ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt} 7204ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7214ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7224ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidtconst MCSection *TargetLoweringObjectFileCOFF:: 7234ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry ShmidtSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 7244ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Mangler *Mang, const TargetMachine &TM) const { 7254ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7264ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt // If this global is linkonce/weak and the target handles this by emitting it 7274ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt // into a 'uniqued' section name, create and return the section now. 7284ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt if (GV->isWeakForLinker()) { 7294ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 7304ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 7314ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt MCSymbol *Sym = Mang->getSymbol(GV); 7324ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Name.append(Sym->getName().begin() + 1, Sym->getName().end()); 7334ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7344ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt unsigned Characteristics = getCOFFSectionFlags(Kind); 7354ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 7364ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 7374ce9c87407c036fc83eb5a6044ddf976c86f53fcDmitry Shmidt 738fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return getContext().getCOFFSection(Name.str(), Characteristics, 739fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt COFF::IMAGE_COMDAT_SELECT_ANY, Kind); 740fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt } 741fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 742fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (Kind.isText()) 743fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return getTextSection(); 744fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 745fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt if (Kind.isThreadLocal()) 746fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return getTLSDataSection(); 747fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 748fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt return getDataSection(); 749fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt} 750fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt 751fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt