119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements classes used to handle lowerings specific to common 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// object file formats. 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Constants.h" 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/DerivedTypes.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Function.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/GlobalVariable.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineModuleInfoImpls.h" 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCContext.h" 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCExpr.h" 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionMachO.h" 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionELF.h" 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSectionCOFF.h" 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCStreamer.h" 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSymbol.h" 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/Mangler.h" 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetData.h" 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetMachine.h" 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetOptions.h" 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/Dwarf.h" 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ELF.h" 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h" 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/raw_ostream.h" 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/SmallString.h" 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/StringExtras.h" 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/Triple.h" 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm; 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace dwarf; 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// ELF 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCSymbol * 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanTargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV, 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfo *MMI) const { 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Encoding = getPersonalityEncoding(); 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman switch (Encoding & 0x70) { 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman default: 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman report_fatal_error("We do not support this DWARF encoding yet!"); 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case dwarf::DW_EH_PE_absptr: 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Mang->getSymbol(GV); 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman case dwarf::DW_EH_PE_pcrel: { 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getContext().GetOrCreateSymbol(StringRef("DW.ref.") + 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mang->getSymbol(GV)->getName()); 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman break; 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer, 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const TargetMachine &TM, 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSymbol *Sym) const { 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<64> NameData("DW.ref."); 6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman NameData += Sym->getName(); 7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Label = getContext().GetOrCreateSymbol(NameData); 7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef Prefix = ".data."; 7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSection *Sec = getContext().getELFSection(NameData, 7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELF::SHT_PROGBITS, 7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags, 7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SectionKind::getDataRel(), 8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 0, Label->getName()); 8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.SwitchSection(Sec); 8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitValueToAlignment(8); 8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCExpr *E = MCConstantExpr::Create(8, getContext()); 8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitELFSize(Label, E); 8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitLabel(Label); 8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Size = TM.getTargetData()->getPointerSize(); 8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Streamer.EmitSymbolValue(Sym, Size); 9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic SectionKind 9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetELFKindForNamedSection(StringRef Name, SectionKind K) { 9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // N.B.: The defaults used in here are no the same ones used in MC. 9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // both gas and MC will produce a section with no flags. Given 9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // section(".eh_frame") gcc will produce 9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // .section .eh_frame,"a",@progbits 9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name.empty() || Name[0] != '.') return K; 10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Some lame default implementation based on some magic section names. 10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name == ".bss" || 10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".bss.") || 10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".gnu.linkonce.b.") || 10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".llvm.linkonce.b.") || 10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name == ".sbss" || 10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".sbss.") || 10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".gnu.linkonce.sb.") || 10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".llvm.linkonce.sb.")) 11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SectionKind::getBSS(); 11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name == ".tdata" || 11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".tdata.") || 11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".gnu.linkonce.td.") || 11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".llvm.linkonce.td.")) 11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SectionKind::getThreadData(); 11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name == ".tbss" || 11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".tbss.") || 12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".gnu.linkonce.tb.") || 12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.startswith(".llvm.linkonce.tb.")) 12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SectionKind::getThreadBSS(); 12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return K; 12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name == ".init_array") 13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ELF::SHT_INIT_ARRAY; 13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name == ".fini_array") 13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ELF::SHT_FINI_ARRAY; 13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Name == ".preinit_array") 13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ELF::SHT_PREINIT_ARRAY; 13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isBSS() || K.isThreadBSS()) 14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ELF::SHT_NOBITS; 14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ELF::SHT_PROGBITS; 14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned 14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetELFSectionFlags(SectionKind K) { 14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Flags = 0; 14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!K.isMetadata()) 15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_ALLOC; 15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isText()) 15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_EXECINSTR; 15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isWriteable()) 15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_WRITE; 15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isThreadLocal()) 16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_TLS; 16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // K.isMergeableConst() is left out to honour PR4650 16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isMergeableCString() || K.isMergeableConst4() || 16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman K.isMergeableConst8() || K.isMergeableConst16()) 16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_MERGE; 16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isMergeableCString()) 16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_STRINGS; 16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Flags; 17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileELF:: 17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, const TargetMachine &TM) const { 17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef SectionName = GV->getSection(); 17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Infer section flags from the section name if we can. 18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Kind = getELFKindForNamedSection(SectionName, Kind); 18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getContext().getELFSection(SectionName, 18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getELFSectionType(SectionName, Kind), 18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getELFSectionFlags(Kind), Kind); 18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// getSectionPrefixForGlobal - Return the section prefix name used by options 18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// FunctionsSections and DataSections. 18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic const char *getSectionPrefixForGlobal(SectionKind Kind) { 19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isText()) return ".text."; 19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnly()) return ".rodata."; 19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isThreadData()) return ".tdata."; 19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isThreadBSS()) return ".tbss."; 19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataNoRel()) return ".data."; 19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataRelLocal()) return ".data.rel.local."; 19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataRel()) return ".data.rel."; 19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ".data.rel.ro."; 20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileELF:: 20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, const TargetMachine &TM) const { 20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If we have -ffunction-section or -fdata-section then we should emit the 21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // global value to a uniqued section specifically for it. 21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool EmitUniquedSection; 21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isText()) 21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman EmitUniquedSection = TM.getFunctionSections(); 21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else 21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman EmitUniquedSection = TM.getDataSections(); 21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If this global is linkonce/weak and the target handles this by emitting it 21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // into a 'uniqued' section name, create and return the section now. 21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if ((GV->isWeakForLinker() || EmitUniquedSection) && 22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman !Kind.isCommon() && !Kind.isBSS()) { 22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char *Prefix; 22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Prefix = getSectionPrefixForGlobal(Kind); 22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Sym = Mang->getSymbol(GV); 22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.append(Sym->getName().begin(), Sym->getName().end()); 22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef Group = ""; 22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Flags = getELFSectionFlags(Kind); 22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (GV->isWeakForLinker()) { 23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Group = Sym->getName(); 23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= ELF::SHF_GROUP; 23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 23319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getContext().getELFSection(Name.str(), 23519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getELFSectionType(Name.str(), Kind), 23619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags, Kind, 0, Group); 23719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 23819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 23919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isText()) return TextSection; 24019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeable1ByteCString() || 24219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Kind.isMergeable2ByteCString() || 24319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Kind.isMergeable4ByteCString()) { 24419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 24519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // We also need alignment here. 24619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // FIXME: this is getting the alignment of the character, not the 24719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // alignment of the global! 24819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Align = 24919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 25019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 25119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char *SizeSpec = ".rodata.str1."; 25219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeable2ByteCString()) 25319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SizeSpec = ".rodata.str2."; 25419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else if (Kind.isMergeable4ByteCString()) 25519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SizeSpec = ".rodata.str4."; 25619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else 25719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Kind.isMergeable1ByteCString() && "unknown string width"); 25819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 25919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::string Name = SizeSpec + utostr(Align); 26119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 26219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELF::SHF_ALLOC | 26319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELF::SHF_MERGE | 26419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman ELF::SHF_STRINGS, 26519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Kind); 26619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 26719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 26819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst()) { 26919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst4() && MergeableConst4Section) 27019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MergeableConst4Section; 27119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst8() && MergeableConst8Section) 27219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MergeableConst8Section; 27319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst16() && MergeableConst16Section) 27419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MergeableConst16Section; 27519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ReadOnlySection; // .const 27619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 27719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 27819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnly()) return ReadOnlySection; 27919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 28019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isThreadData()) return TLSDataSection; 28119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isThreadBSS()) return TLSBSSSection; 28219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 28319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Note: we claim that common symbols are put in BSSSection, but they are 28419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // really emitted with the magic .comm directive, which creates a symbol table 28519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // entry but not a section. 28619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 28719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 28819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataNoRel()) return DataSection; 28919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataRelLocal()) return DataRelLocalSection; 29019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataRel()) return DataRelSection; 29119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 29219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 29419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataRelROSection; 29519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 29619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 29719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// getSectionForConstant - Given a mergeable constant with the 29819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// specified size and relocation information, return a section that it 29919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// should be placed in. 30019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileELF:: 30119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetSectionForConstant(SectionKind Kind) const { 30219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst4() && MergeableConst4Section) 30319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MergeableConst4Section; 30419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst8() && MergeableConst8Section) 30519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MergeableConst8Section; 30619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst16() && MergeableConst16Section) 30719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return MergeableConst16Section; 30819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnly()) 30919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ReadOnlySection; 31019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 31219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 31319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataRelROSection; 31419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 31519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 31619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCExpr *TargetLoweringObjectFileELF:: 31719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 31819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfo *MMI, 31919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Encoding, MCStreamer &Streamer) const { 32019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Encoding & dwarf::DW_EH_PE_indirect) { 32219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 32319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<128> Name; 32519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mang->getNameWithPrefix(Name, GV, true); 32619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name += ".DW.stub"; 32719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 32819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Add information about the stub reference to ELFMMI so that the stub 32919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // gets emitted by the asmprinter. 33019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 33119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 33219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (StubSym.getPointer() == 0) { 33319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Sym = Mang->getSymbol(GV); 33419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 33519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 33619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 33719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return TargetLoweringObjectFile:: 33819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 33919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 34019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 34119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return TargetLoweringObjectFile:: 34219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 34319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 34419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 34519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 34619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// MachO 34719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 34819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 34919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileMachO:: 35019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 35119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, const TargetMachine &TM) const { 35219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Parse the section specifier and create it if valid. 35319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StringRef Segment, Section; 35419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned TAA = 0, StubSize = 0; 35519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman bool TAAParsed; 35619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman std::string ErrorCode = 35719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 35819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TAA, TAAParsed, StubSize); 35919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!ErrorCode.empty()) { 36019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If invalid, report the error with report_fatal_error. 36119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman report_fatal_error("Global variable '" + GV->getNameStr() + 36219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "' has an invalid section specifier '" + GV->getSection()+ 36319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "': " + ErrorCode + "."); 36419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Fall back to dropping it into the data section. 36519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataSection; 36619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 36719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 36819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Get the section. 36919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const MCSectionMachO *S = 37019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 37119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 37219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If TAA wasn't set by ParseSectionSpecifier() above, 37319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // use the value returned by getMachOSection() as a default. 37419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!TAAParsed) 37519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TAA = S->getTypeAndAttributes(); 37619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 37719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Okay, now that we got the section, verify that the TAA & StubSize agree. 37819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If the user declared multiple globals with different section flags, we need 37919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // to reject it here. 38019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 38119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If invalid, report the error with report_fatal_error. 38219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman report_fatal_error("Global variable '" + GV->getNameStr() + 38319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman "' section type or attributes does not match previous" 38419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman " section specifier"); 38519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 38619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 38719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return S; 38819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 38919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 39019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileMachO:: 39119bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 39219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, const TargetMachine &TM) const { 39319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 39419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Handle thread local data. 39519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isThreadBSS()) return TLSBSSSection; 39619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isThreadData()) return TLSDataSection; 39719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 39819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isText()) 39919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return GV->isWeakForLinker() ? TextCoalSection : TextSection; 40019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 40119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If this is weak/linkonce, put this in a coalescable section, either in text 40219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // or data depending on if it is writable. 40319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (GV->isWeakForLinker()) { 40419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnly()) 40519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ConstTextCoalSection; 40619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataCoalSection; 40719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 40819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 40919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // FIXME: Alignment check should be handled by section classifier. 41019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeable1ByteCString() && 41119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 41219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return CStringSection; 41319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 41419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Do not put 16-bit arrays in the UString section if they have an 41519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // externally visible label, this runs into issues with certain linker 41619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // versions. 41719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 41819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 41919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return UStringSection; 42019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 42119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst()) { 42219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst4()) 42319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return FourByteConstantSection; 42419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst8()) 42519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return EightByteConstantSection; 42619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst16() && SixteenByteConstantSection) 42719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SixteenByteConstantSection; 42819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 42919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 43019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Otherwise, if it is readonly, but not something we can specially optimize, 43119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // just drop it in .const. 43219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnly()) 43319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ReadOnlySection; 43419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 43519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If this is marked const, put it into a const section. But if the dynamic 43619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // linker needs to write to it, put it in the data segment. 43719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isReadOnlyWithRel()) 43819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ConstDataSection; 43919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 44019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Put zero initialized globals with strong external linkage in the 44119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // DATA, __common section with the .zerofill directive. 44219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isBSSExtern()) 44319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataCommonSection; 44419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 44519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Put zero initialized globals with local linkage in __DATA,__bss directive 44619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // with the .zerofill directive (aka .lcomm). 44719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isBSSLocal()) 44819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataBSSSection; 44919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 45019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Otherwise, just drop the variable in the normal data section. 45119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return DataSection; 45219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 45319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 45419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection * 45519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 45619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If this constant requires a relocation, we have to put it in the data 45719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // segment, not in the text segment. 45819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 45919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ConstDataSection; 46019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 46119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst4()) 46219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return FourByteConstantSection; 46319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst8()) 46419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return EightByteConstantSection; 46519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isMergeableConst16() && SixteenByteConstantSection) 46619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SixteenByteConstantSection; 46719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ReadOnlySection; // .const 46819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 46919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 47019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 47119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// not to emit the UsedDirective for some symbols in llvm.used. 47219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// FIXME: REMOVE this (rdar://7071300) 47319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool TargetLoweringObjectFileMachO:: 47419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 47519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// On Darwin, internally linked data beginning with "L" or "l" does not have 47619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// the directive emitted (this occurs in ObjC metadata). 47719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (!GV) return false; 47819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 47919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 48019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 48119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // FIXME: ObjC metadata is currently emitted as internal symbols that have 48219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 48319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // this horrible hack can go away. 48419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Sym = Mang->getSymbol(GV); 48519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l') 48619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 48719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 48819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 48919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return true; 49019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 49119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 49219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCExpr *TargetLoweringObjectFileMachO:: 49319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 49419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfo *MMI, unsigned Encoding, 49519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCStreamer &Streamer) const { 49619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // The mach-o version of this method defaults to returning a stub reference. 49719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 49819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Encoding & DW_EH_PE_indirect) { 49919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfoMachO &MachOMMI = 50019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MMI->getObjFileInfo<MachineModuleInfoMachO>(); 50119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 50219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<128> Name; 50319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mang->getNameWithPrefix(Name, GV, true); 50419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name += "$non_lazy_ptr"; 50519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 50619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Add information about the stub reference to MachOMMI so that the stub 50719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // gets emitted by the asmprinter. 50819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 50919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfoImpl::StubValueTy &StubSym = 51019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 51119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachOMMI.getGVStubEntry(SSym); 51219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (StubSym.getPointer() == 0) { 51319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Sym = Mang->getSymbol(GV); 51419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 51519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 51619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 51719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return TargetLoweringObjectFile:: 51819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 51919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 52019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 52119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return TargetLoweringObjectFile:: 52219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 52319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 52419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 52519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCSymbol *TargetLoweringObjectFileMachO:: 52619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 52719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfo *MMI) const { 52819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // The mach-o version of this method defaults to returning a stub reference. 52919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfoMachO &MachOMMI = 53019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MMI->getObjFileInfo<MachineModuleInfoMachO>(); 53119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 53219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<128> Name; 53319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mang->getNameWithPrefix(Name, GV, true); 53419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name += "$non_lazy_ptr"; 53519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 53619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Add information about the stub reference to MachOMMI so that the stub 53719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // gets emitted by the asmprinter. 53819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 53919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineModuleInfoImpl::StubValueTy &StubSym = 54019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 54119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachOMMI.getGVStubEntry(SSym); 54219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (StubSym.getPointer() == 0) { 54319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Sym = Mang->getSymbol(GV); 54419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 54519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 54619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 54719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return SSym; 54819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 54919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 55019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 55119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// COFF 55219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 55319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 55419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic unsigned 55519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetCOFFSectionFlags(SectionKind K) { 55619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Flags = 0; 55719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 55819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (K.isMetadata()) 55919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= 56019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_DISCARDABLE; 56119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else if (K.isText()) 56219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= 56319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_EXECUTE | 56419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_READ | 56519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_CNT_CODE; 56619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else if (K.isBSS ()) 56719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= 56819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 56919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_READ | 57019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_WRITE; 57119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else if (K.isReadOnly()) 57219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= 57319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 57419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_READ; 57519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman else if (K.isWriteable()) 57619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Flags |= 57719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 57819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_READ | 57919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_SCN_MEM_WRITE; 58019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 58119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return Flags; 58219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 58319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 58419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileCOFF:: 58519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumangetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 58619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, const TargetMachine &TM) const { 58719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getContext().getCOFFSection(GV->getSection(), 58819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman getCOFFSectionFlags(Kind), 58919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Kind); 59019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 59119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 59219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 59319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isText()) 59419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ".text$"; 59519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isBSS ()) 59619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ".bss$"; 59719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isWriteable()) 59819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ".data$"; 59919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return ".rdata$"; 60019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 60119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 60219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 60319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanconst MCSection *TargetLoweringObjectFileCOFF:: 60419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 60519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Mangler *Mang, const TargetMachine &TM) const { 60619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 60719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 60819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // If this global is linkonce/weak and the target handles this by emitting it 60919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // into a 'uniqued' section name, create and return the section now. 61019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (GV->isWeakForLinker()) { 61119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 61219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 61319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MCSymbol *Sym = Mang->getSymbol(GV); 61419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Name.append(Sym->getName().begin() + 1, Sym->getName().end()); 61519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 61619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Characteristics = getCOFFSectionFlags(Kind); 61719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 61819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 61919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 62019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getContext().getCOFFSection(Name.str(), Characteristics, 62119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman COFF::IMAGE_COMDAT_SELECT_ANY, Kind); 62219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 62319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 62419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman if (Kind.isText()) 62519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getTextSection(); 62619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 62719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return getDataSection(); 62819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 62919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 630