TargetLoweringObjectFileImpl.cpp revision c85dca66e68c9fa6ffa8471c64113b12d8d94fb1
1362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===// 2362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// 3362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// The LLVM Compiler Infrastructure 4362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// 5362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// This file is distributed under the University of Illinois Open Source 6362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// License. See LICENSE.TXT for details. 7362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// 8362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 9362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// 10362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// This file implements classes used to handle lowerings specific to common 11362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// object file formats. 12362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// 13362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 14362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 15362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 16362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Constants.h" 17362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/DerivedTypes.h" 18362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Function.h" 19362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/GlobalVariable.h" 20362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/CodeGen/MachineModuleInfoImpls.h" 21362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCContext.h" 22362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCExpr.h" 23362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSectionMachO.h" 24362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSectionELF.h" 25eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSectionCOFF.h" 26362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSymbol.h" 27362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/Mangler.h" 28362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetData.h" 29362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetMachine.h" 30362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetOptions.h" 31362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/Dwarf.h" 32c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h" 33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h" 34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h" 35362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/SmallString.h" 36362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/StringExtras.h" 378048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner#include "llvm/ADT/Triple.h" 38362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm; 39293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf; 40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 41362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// ELF 43362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 47362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 48362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 49362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov BSSSection = 50c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".bss", ELF::SHT_NOBITS, 51287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC, 52287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getBSS()); 53362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 54362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection = 55c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".text", ELF::SHT_PROGBITS, 56287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_EXECINSTR | 57287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC, 58287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getText()); 59362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 60362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection = 61c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".data", ELF::SHT_PROGBITS, 62287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC, 63287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 64362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 65362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ReadOnlySection = 66c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".rodata", ELF::SHT_PROGBITS, 67287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC, 68287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnly()); 69362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 70362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TLSDataSection = 71c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".tdata", ELF::SHT_PROGBITS, 72287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 73287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE, 74287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getThreadData()); 75362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 76362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TLSBSSSection = 77c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".tbss", ELF::SHT_NOBITS, 78287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 79287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE, 80287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getThreadBSS()); 81362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 82362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelSection = 83c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS, 84287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 85287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 86362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 87362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelLocalSection = 88c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS, 89287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 90287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRelLocal()); 91362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 92362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelROSection = 93c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, 94287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 95287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnlyWithRel()); 96362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 97362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelROLocalSection = 98c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, 99287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 100287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnlyWithRelLocal()); 101362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 102362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst4Section = 103c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, 104287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, 105287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMergeableConst4()); 106362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 107362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst8Section = 108c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, 109287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, 110287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMergeableConst8()); 111362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 112362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst16Section = 113c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, 114287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, 115287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMergeableConst16()); 116362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 117362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection = 118c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".ctors", ELF::SHT_PROGBITS, 119287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 120287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 121362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 122362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection = 123c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".dtors", ELF::SHT_PROGBITS, 124287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 125287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Exception Handling Sections. 128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // it contains relocatable pointers. In PIC mode, this is probably a big 131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // runtime hit for C++ apps. Either the contents of the LSDA need to be 132362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // adjusted or this should be a data section. 133362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = 134c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, 135287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC, 136287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnly()); 137362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 138c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS, 13989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola MCSectionELF::SHF_ALLOC, 140287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 142362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug Info Sections. 143362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 144c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0, 145287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 146362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 147c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, 148287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 149362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 150c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0, 151287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 152362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 153c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0, 154287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 155362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 156c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0, 157287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 158362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 159c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0, 160287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 161362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 162c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0, 163287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 164362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 165c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0, 166287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 167362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 168c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0, 169287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 170362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 171c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, 172287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 173362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 174c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0, 175287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 176362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 178362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 179362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind 180362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) { 181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name.empty() || Name[0] != '.') return K; 182362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Some lame default implementation based on some magic section names. 184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".bss" || 185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".bss.") || 186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.b.") || 187362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.b.") || 188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name == ".sbss" || 189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".sbss.") || 190362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.sb.") || 191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.sb.")) 192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getBSS(); 193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".tdata" || 195362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".tdata.") || 196362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.td.") || 197362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.td.")) 198362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getThreadData(); 199362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 200362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".tbss" || 201362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".tbss.") || 202362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.tb.") || 203362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.tb.")) 204362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getThreadBSS(); 205362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 206362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return K; 207362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 208362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 209362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".init_array") 213c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return ELF::SHT_INIT_ARRAY; 214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 215362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".fini_array") 216c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return ELF::SHT_FINI_ARRAY; 217362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 218362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".preinit_array") 219c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return ELF::SHT_PREINIT_ARRAY; 220362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 221362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isBSS() || K.isThreadBSS()) 222c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return ELF::SHT_NOBITS; 223362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 224c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return ELF::SHT_PROGBITS; 225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 226362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 227362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 228362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned 229362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) { 230362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Flags = 0; 231362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 232362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!K.isMetadata()) 233362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_ALLOC; 234362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 235362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isText()) 236362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 237362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 238362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isWriteable()) 239362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_WRITE; 240362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 241362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isThreadLocal()) 242362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_TLS; 243362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 244362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // K.isMergeableConst() is left out to honour PR4650 245362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isMergeableCString() || K.isMergeableConst4() || 246362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov K.isMergeableConst8() || K.isMergeableConst16()) 247362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_MERGE; 248362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 249362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isMergeableCString()) 250362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_STRINGS; 251362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 252362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return Flags; 253362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 254362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 255362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 257362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 258362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 259362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StringRef SectionName = GV->getSection(); 260362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 261362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Infer section flags from the section name if we can. 262362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind = getELFKindForNamedSection(SectionName, Kind); 263362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 264287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner return getContext().getELFSection(SectionName, 265287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionType(SectionName, Kind), 26634be396a12b00a95a1353c356d64868798ea3098Rafael Espindola getELFSectionFlags(Kind), Kind); 267362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 268362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 269362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 270362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) return ".gnu.linkonce.t."; 271362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 272362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 273362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadData()) return ".gnu.linkonce.td."; 274362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 275362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 276362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 277362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".gnu.linkonce.d.rel.ro."; 283362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 284362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 28543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// getSectionPrefixForGlobal - Return the section prefix name used by options 28643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// FunctionsSections and DataSections. 28743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattnerstatic const char *getSectionPrefixForGlobal(SectionKind Kind) { 28843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isText()) return ".text."; 28943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isReadOnly()) return ".rodata."; 29043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 29143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isThreadData()) return ".tdata."; 29243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isThreadBSS()) return ".tbss."; 29343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 29443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isDataNoRel()) return ".data."; 29543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isDataRelLocal()) return ".data.rel.local."; 29643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isDataRel()) return ".data.rel."; 29743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 29843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 29943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 30043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner return ".data.rel.ro."; 30143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner} 30243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 30343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 304362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 305362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 306362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 30743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner // If we have -ffunction-section or -fdata-section then we should emit the 30843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner // global value to a uniqued section specifically for it. 30943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner bool EmitUniquedSection; 31043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isText()) 31143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner EmitUniquedSection = TM.getFunctionSections(); 312579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer else 31343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner EmitUniquedSection = TM.getDataSections(); 314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 315362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this global is linkonce/weak and the target handles this by emitting it 316362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // into a 'uniqued' section name, create and return the section now. 31743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if ((GV->isWeakForLinker() || EmitUniquedSection) && 31843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner !Kind.isCommon() && !Kind.isBSS()) { 31943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner const char *Prefix; 32043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (GV->isWeakForLinker()) 32143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner Prefix = getSectionPrefixForUniqueGlobal(Kind); 32243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner else { 32343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner assert(EmitUniquedSection); 32443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner Prefix = getSectionPrefixForGlobal(Kind); 32543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner } 32643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 3274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 3284c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 3294c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner Name.append(Sym->getName().begin(), Sym->getName().end()); 330287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner return getContext().getELFSection(Name.str(), 331287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionType(Name.str(), Kind), 332287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionFlags(Kind), Kind); 333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) return TextSection; 336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable1ByteCString() || 338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable2ByteCString() || 339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable4ByteCString()) { 340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // We also need alignment here. 342362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: this is getting the alignment of the character, not the 343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // alignment of the global! 344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Align = 345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *SizeSpec = ".rodata.str1."; 348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable2ByteCString()) 349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SizeSpec = ".rodata.str2."; 350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov else if (Kind.isMergeable4ByteCString()) 351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SizeSpec = ".rodata.str4."; 352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov else 353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isMergeable1ByteCString() && "unknown string width"); 354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 355362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 356362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov std::string Name = SizeSpec + utostr(Align); 357c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return getContext().getELFSection(Name, ELF::SHT_PROGBITS, 358287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC | 359287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_MERGE | 360287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_STRINGS, 361287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner Kind); 362362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 363362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 364362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst()) { 365362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4() && MergeableConst4Section) 366362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst4Section; 367362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8() && MergeableConst8Section) 368362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst8Section; 369362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && MergeableConst16Section) 370362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst16Section; 371362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; // .const 372362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 373362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 374362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) return ReadOnlySection; 375362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 376362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadData()) return TLSDataSection; 377362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadBSS()) return TLSBSSSection; 378362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 379362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Note: we claim that common symbols are put in BSSSection, but they are 380362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // really emitted with the magic .comm directive, which creates a symbol table 381362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // entry but not a section. 382362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 383362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 384362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataNoRel()) return DataSection; 385362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRelLocal()) return DataRelLocalSection; 386362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel()) return DataRelSection; 387362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 388362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 389362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 390362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataRelROSection; 391362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 392362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 393362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the 394362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it 395362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in. 396362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 397362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const { 398362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4() && MergeableConst4Section) 399362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst4Section; 400362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8() && MergeableConst8Section) 401362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst8Section; 402362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && MergeableConst16Section) 403362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst16Section; 404362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 405362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; 406362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 407362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 408362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 409362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataRelROSection; 410362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 411362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 412362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF:: 4133192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 4143192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MachineModuleInfo *MMI, 4153192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner unsigned Encoding, MCStreamer &Streamer) const { 416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Encoding & dwarf::DW_EH_PE_indirect) { 418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 419362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 420362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 421362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 422362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += ".DW.stub"; 423362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 424362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Add information about the stub reference to ELFMMI so that the stub 425362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // gets emitted by the asmprinter. 4269b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 4274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 428cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) { 4294c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 4304c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 431362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 432362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 433362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 4344c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner getExprForDwarfReference(SSym, Mang, MMI, 4353192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 436362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 437362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 438362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 4393192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 440362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 441362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 442362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 443362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// MachO 444362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 445362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 446362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 447362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 4482ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling // _foo.eh symbols are currently always exported so that the linker knows 4492ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling // about them. This is not necessary on 10.6 and later, but it 4502ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling // doesn't hurt anything. 4512ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling // FIXME: I need to get this from Triple. 45209d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner IsFunctionEHSymbolGlobal = true; 45309d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner IsFunctionEHFrameSymbolPrivate = false; 45409d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner SupportsWeakOmittedEHFrame = false; 4558048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner 4568048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner Triple T(((LLVMTargetMachine&)TM).getTargetTriple()); 4578048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner if (T.getOS() == Triple::Darwin) { 4582ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling switch (T.getDarwinMajorNumber()) { 4592ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling case 7: // 10.3 Panther. 4602ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling case 8: // 10.4 Tiger. 4618048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner CommDirectiveSupportsAlignment = false; 4622ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling break; 4632ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling case 9: // 10.5 Leopard. 4642ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling case 10: // 10.6 SnowLeopard. 4652ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling break; 4662ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling } 4678048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner } 468579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 469362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 470362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 471362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection // .text 47222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__text", 47322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 47422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getText()); 475362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection // .data 47622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__data", 0, 47722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 478362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 479423c9e3e589a79be757842d421600590c68d5b43Eric Christopher TLSDataSection // .tdata 480423c9e3e589a79be757842d421600590c68d5b43Eric Christopher = getContext().getMachOSection("__DATA", "__thread_data", 481423c9e3e589a79be757842d421600590c68d5b43Eric Christopher MCSectionMachO::S_THREAD_LOCAL_REGULAR, 482423c9e3e589a79be757842d421600590c68d5b43Eric Christopher SectionKind::getDataRel()); 483423c9e3e589a79be757842d421600590c68d5b43Eric Christopher TLSBSSSection // .tbss 484423c9e3e589a79be757842d421600590c68d5b43Eric Christopher = getContext().getMachOSection("__DATA", "__thread_bss", 485423c9e3e589a79be757842d421600590c68d5b43Eric Christopher MCSectionMachO::S_THREAD_LOCAL_ZEROFILL, 486423c9e3e589a79be757842d421600590c68d5b43Eric Christopher SectionKind::getThreadBSS()); 487579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 488423c9e3e589a79be757842d421600590c68d5b43Eric Christopher // TODO: Verify datarel below. 489423c9e3e589a79be757842d421600590c68d5b43Eric Christopher TLSTLVSection // .tlv 490423c9e3e589a79be757842d421600590c68d5b43Eric Christopher = getContext().getMachOSection("__DATA", "__thread_vars", 491423c9e3e589a79be757842d421600590c68d5b43Eric Christopher MCSectionMachO::S_THREAD_LOCAL_VARIABLES, 492423c9e3e589a79be757842d421600590c68d5b43Eric Christopher SectionKind::getDataRel()); 493579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 494c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher TLSThreadInitSection 495c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher = getContext().getMachOSection("__DATA", "__thread_init", 496c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, 497c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher SectionKind::getDataRel()); 498579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 499362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov CStringSection // .cstring 500579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer = getContext().getMachOSection("__TEXT", "__cstring", 50122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_CSTRING_LITERALS, 50222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeable1ByteCString()); 503362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov UStringSection 50422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT","__ustring", 0, 50522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeable2ByteCString()); 506362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov FourByteConstantSection // .literal4 50722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__literal4", 50822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_4BYTE_LITERALS, 50922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeableConst4()); 510362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EightByteConstantSection // .literal8 511579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer = getContext().getMachOSection("__TEXT", "__literal8", 51222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_8BYTE_LITERALS, 51322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeableConst8()); 514362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 515362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 516362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // to using it in -static mode. 517362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SixteenByteConstantSection = 0; 518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getRelocationModel() != Reloc::Static && 519362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TM.getTargetData()->getPointerSize() == 32) 520362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SixteenByteConstantSection = // .literal16 52122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__TEXT", "__literal16", 52222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_16BYTE_LITERALS, 52322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeableConst16()); 524362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 525362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ReadOnlySection // .const 52622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__const", 0, 52722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnly()); 528362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 529362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextCoalSection 53022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__textcoal_nt", 53122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED | 53222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 53322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getText()); 534362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstTextCoalSection 535579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer = getContext().getMachOSection("__TEXT", "__const_coal", 53622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED, 5376a624a65f47c850bbcbfc7eff4fd057be824027cChris Lattner SectionKind::getReadOnly()); 538362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstDataSection // .const_data 53922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__const", 0, 54022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnlyWithRel()); 541362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataCoalSection 542579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer = getContext().getMachOSection("__DATA","__datacoal_nt", 54322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED, 54422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 545362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataCommonSection 54622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA","__common", 54722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ZEROFILL, 54822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getBSS()); 549362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataBSSSection 55022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, 55122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getBSS()); 552579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 554362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LazySymbolPointerSection 55522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__la_symbol_ptr", 55622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 55722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 558362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov NonLazySymbolPointerSection 55922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__nl_symbol_ptr", 56022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 56122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 562362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 563362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getRelocationModel() == Reloc::Static) { 564362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection 56522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__constructor", 0, 56622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 567362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection 56822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__destructor", 0, 56922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 570362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } else { 571362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection 57222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__mod_init_func", 57322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 57422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 575362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection 57622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__mod_term_func", 57722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 57822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 579362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 580362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 581362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Exception Handling. 58222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0, 58322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnlyWithRel()); 584362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 58522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__TEXT", "__eh_frame", 58622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED | 58722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_NO_TOC | 58822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 58922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 59022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnly()); 591362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 592362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug Information. 593362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 594579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer getContext().getMachOSection("__DWARF", "__debug_abbrev", 59522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 59622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 597362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 59822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_info", 59922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 60022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 601362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 60222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_line", 60322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 60422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 605362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 60622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_frame", 60722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 60822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 609362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 61022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_pubnames", 61122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 61222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 613362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 61422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_pubtypes", 61522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 61622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 617362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 61822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_str", 61922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 62022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 621362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 62222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_loc", 62322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 62422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 62622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_aranges", 62722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 62822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 63022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_ranges", 63122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 63222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 63422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_macinfo", 63522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 63622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfDebugInlineSection = 63822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_inlined", 63922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 64022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 641579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 6428116ca5134b355b897450f9a537c9c77e1f08723Eric Christopher TLSExtraDataSection = TLSTLVSection; 643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO:: 646362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 648362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Parse the section specifier and create it if valid. 649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StringRef Segment, Section; 650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned TAA, StubSize; 651362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov std::string ErrorCode = 652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TAA, StubSize); 654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!ErrorCode.empty()) { 65575361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner // If invalid, report the error with report_fatal_error. 65675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Global variable '" + GV->getNameStr() + 657362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "' has an invalid section specifier '" + GV->getSection()+ 658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "': " + ErrorCode + "."); 659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Fall back to dropping it into the data section. 660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataSection; 661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Get the section. 664362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const MCSectionMachO *S = 66522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 666362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 667362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Okay, now that we got the section, verify that the TAA & StubSize agree. 668362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If the user declared multiple globals with different section flags, we need 669362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // to reject it here. 670362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 67175361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner // If invalid, report the error with report_fatal_error. 67275361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Global variable '" + GV->getNameStr() + 673362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "' section type or attributes does not match previous" 674362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov " section specifier"); 675362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return S; 678362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 679362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 680362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO:: 681362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 6828116ca5134b355b897450f9a537c9c77e1f08723Eric Christopher Mangler *Mang, const TargetMachine &TM) const { 683579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 68402b46bc9426925b90137d264216a54aa413335fdEric Christopher // Handle thread local data. 6858116ca5134b355b897450f9a537c9c77e1f08723Eric Christopher if (Kind.isThreadBSS()) return TLSBSSSection; 68602b46bc9426925b90137d264216a54aa413335fdEric Christopher if (Kind.isThreadData()) return TLSDataSection; 687362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 688362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 689362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return GV->isWeakForLinker() ? TextCoalSection : TextSection; 690362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 691362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this is weak/linkonce, put this in a coalescable section, either in text 692362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // or data depending on if it is writable. 693362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker()) { 694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstTextCoalSection; 696362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataCoalSection; 697362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 699362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: Alignment check should be handled by section classifier. 70098f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner if (Kind.isMergeable1ByteCString() && 70198f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 70298f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner return CStringSection; 703579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 70498f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner // Do not put 16-bit arrays in the UString section if they have an 70598f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner // externally visible label, this runs into issues with certain linker 70698f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner // versions. 70798f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 70898f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 70998f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner return UStringSection; 710362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 711362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst()) { 712362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4()) 713362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return FourByteConstantSection; 714362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8()) 715362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return EightByteConstantSection; 716362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && SixteenByteConstantSection) 717362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SixteenByteConstantSection; 718362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 719362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 720362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, if it is readonly, but not something we can specially optimize, 721362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // just drop it in .const. 722362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 723362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; 724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this is marked const, put it into a const section. But if the dynamic 726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // linker needs to write to it, put it in the data segment. 727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRel()) 728362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstDataSection; 729362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 730362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Put zero initialized globals with strong external linkage in the 731362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // DATA, __common section with the .zerofill directive. 732362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSSExtern()) 733362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataCommonSection; 734362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 735362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Put zero initialized globals with local linkage in __DATA,__bss directive 736362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // with the .zerofill directive (aka .lcomm). 737362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSSLocal()) 738362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataBSSSection; 739579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer 740362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, just drop the variable in the normal data section. 741362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataSection; 742362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 743362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 744362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection * 745362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 746362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this constant requires a relocation, we have to put it in the data 747362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // segment, not in the text segment. 748362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 749362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstDataSection; 750362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 751362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4()) 752362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return FourByteConstantSection; 753362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8()) 754362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return EightByteConstantSection; 755362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && SixteenByteConstantSection) 756362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SixteenByteConstantSection; 757362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; // .const 758362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 759362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 760362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 761362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// not to emit the UsedDirective for some symbols in llvm.used. 762362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// FIXME: REMOVE this (rdar://7071300) 763362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovbool TargetLoweringObjectFileMachO:: 764362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 765362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov /// On Darwin, internally linked data beginning with "L" or "l" does not have 766362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov /// the directive emitted (this occurs in ObjC metadata). 767362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!GV) return false; 768362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 76907d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 770362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 771362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: ObjC metadata is currently emitted as internal symbols that have 77207d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 77307d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling // this horrible hack can go away. 7744c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 7754c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l') 776362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return false; 777362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 778362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 779362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return true; 780362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 781362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 782362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileMachO:: 7833192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 7843192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MachineModuleInfo *MMI, unsigned Encoding, 7853192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MCStreamer &Streamer) const { 786362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // The mach-o version of this method defaults to returning a stub reference. 787362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 788293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov if (Encoding & DW_EH_PE_indirect) { 789293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MachineModuleInfoMachO &MachOMMI = 790293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MMI->getObjFileInfo<MachineModuleInfoMachO>(); 791293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 792362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 793362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 794362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += "$non_lazy_ptr"; 795293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 796293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov // Add information about the stub reference to MachOMMI so that the stub 797293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov // gets emitted by the asmprinter. 7989b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 7994c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 800cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) { 8014c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 8024c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 803293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov } 804362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 805362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 8064c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner getExprForDwarfReference(SSym, Mang, MMI, 80742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 808362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 809362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 810362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 8113192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 812362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 813362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 814293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const { 815293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 816293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 817293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 818293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const { 819293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_pcrel; 820293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 821293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 822293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getFDEEncoding() const { 823293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_pcrel; 824293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 825293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 826293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const { 827505ad8bed3321bc4b99af8fba4844efe2fe9e67aBill Wendling return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 828293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 829362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 830362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 831362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// COFF 832362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 833362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 834362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 836362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 837eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner TextSection = 838eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".text", 83994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_CODE | 84094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_EXECUTE | 84194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 842eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getText()); 843eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner DataSection = 844eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".data", 84594610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 84694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ | 84794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_WRITE, 848eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 849eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner ReadOnlySection = 850eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".rdata", 85194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 85294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 853eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getReadOnly()); 854362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection = 855eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".ctors", 85694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 85794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ | 85894610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_WRITE, 859eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 860362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection = 861eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".dtors", 86294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 86394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ | 86494610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_WRITE, 865eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 866362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 867362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: We're emitting LSDA info into a readonly section on COFF, even 868362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // though it contains relocatable pointers. In PIC mode, this is probably a 869362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // big runtime hit for C++ apps. Either the contents of the LSDA need to be 870362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // adjusted or this should be a data section. 871362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = 872eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".gcc_except_table", 87394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 87494610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 875eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getReadOnly()); 876362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 877eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".eh_frame", 87894610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 87994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ | 88094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_WRITE, 881eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 882362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 883362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug info. 884362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 885eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_abbrev", 88694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 88794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 888eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 889362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 890eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_info", 89194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 89294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 893eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 894362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 895eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_line", 89694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 89794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 898eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 899362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 900eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_frame", 90194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 90294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 903eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 904362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 905eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_pubnames", 90694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 90794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 908eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 909362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 910eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_pubtypes", 91194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 91294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 913eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 914362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 915eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_str", 91694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 91794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 918eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 919362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 920eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_loc", 92194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 92294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 923eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 924362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 925eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_aranges", 92694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 92794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 928eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 929362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 930eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_ranges", 93194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 93294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 933eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 934362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 935eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_macinfo", 93694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE | 93794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ, 938eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 939eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 940eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner DrectveSection = 941eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".drectve", 94294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_LNK_INFO, 943eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 944eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner} 945eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 946eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerstatic unsigned 947eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris LattnergetCOFFSectionFlags(SectionKind K) { 948eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner unsigned Flags = 0; 949eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 95036335be3b95f856b7eb7e0766e01ba423315e1abAnton Korobeynikov if (K.isMetadata()) 9516e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner Flags |= 95294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_DISCARDABLE; 953eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else if (K.isText()) 954eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= 95594610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_EXECUTE | 9563931b54a5f274183f850b912e0003f9aa1600584Michael J. Spencer COFF::IMAGE_SCN_MEM_READ | 95794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_CODE; 9586e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner else if (K.isBSS ()) 9596e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner Flags |= 96094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 96194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ | 96294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_WRITE; 963eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else if (K.isReadOnly()) 964eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= 96594610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 96694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ; 967eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else if (K.isWriteable()) 968eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= 96994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 97094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_READ | 97194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar COFF::IMAGE_SCN_MEM_WRITE; 972eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 973eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return Flags; 974362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 975362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 976362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 977362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 978362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 979eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return getContext().getCOFFSection(GV->getSection(), 980eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getCOFFSectionFlags(Kind), 981eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Kind); 982362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 983362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 984362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 985362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 9863b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi return ".text$"; 9876e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner if (Kind.isBSS ()) 9883b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi return ".bss$"; 989362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isWriteable()) 9903b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi return ".data$"; 9913b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi return ".rdata$"; 992362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 993362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 994362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 995362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 996362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 997362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 998362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 999362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 1000362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this global is linkonce/weak and the target handles this by emitting it 1001362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // into a 'uniqued' section name, create and return the section now. 1002362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker()) { 1003362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 1004362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 10054c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 10063b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi Name.append(Sym->getName().begin() + 1, Sym->getName().end()); 10076e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner 10086e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner unsigned Characteristics = getCOFFSectionFlags(Kind); 10096e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner 101094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 10116e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner 10126e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner return getContext().getCOFFSection(Name.str(), Characteristics, 1013657985eb8b8cbbde2391befafccfafbddf04242aAnton Korobeynikov COFF::IMAGE_COMDAT_SELECT_ANY, Kind); 1014362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 1015362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 1016362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 1017362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getTextSection(); 1018362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 1019362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getDataSection(); 1020362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 1021362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 1022