TargetLoweringObjectFileImpl.cpp revision eb40a0fd98c44ecc6360e7fab33cf9e9911bed4f
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" 32362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h" 33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h" 34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/SmallString.h" 35362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/StringExtras.h" 36362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm; 37293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf; 38362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 39362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// ELF 41362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 43362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 47362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov BSSSection = 48287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".bss", MCSectionELF::SHT_NOBITS, 49287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC, 50287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getBSS()); 51362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 52362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection = 53287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".text", MCSectionELF::SHT_PROGBITS, 54287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_EXECINSTR | 55287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC, 56287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getText()); 57362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 58362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection = 59287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".data", MCSectionELF::SHT_PROGBITS, 60287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC, 61287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 62362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 63362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ReadOnlySection = 64287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 65287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC, 66287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnly()); 67362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 68362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TLSDataSection = 69287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 70287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 71287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE, 72287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getThreadData()); 73362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 74362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TLSBSSSection = 75287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 76287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 77287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_WRITE, 78287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getThreadBSS()); 79362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 80362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelSection = 81287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 82287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 83287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 84362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 85362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelLocalSection = 86287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 87287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 88287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRelLocal()); 89362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 90362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelROSection = 91287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 92287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 93287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnlyWithRel()); 94362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 95362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelROLocalSection = 96287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 97287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 98287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnlyWithRelLocal()); 99362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 100362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst4Section = 101287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 102287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, 103287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMergeableConst4()); 104362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 105362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst8Section = 106287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 107287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, 108287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMergeableConst8()); 109362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 110362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst16Section = 111287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 112287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE, 113287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMergeableConst16()); 114362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 115362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection = 116287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 117287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 118287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 119362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 120362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection = 121287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 122287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 123287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 124362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 125362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Exception Handling Sections. 126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // it contains relocatable pointers. In PIC mode, this is probably a big 129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // runtime hit for C++ apps. Either the contents of the LSDA need to be 130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // adjusted or this should be a data section. 131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = 132287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 133287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC, 134287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getReadOnly()); 135362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 136287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 137287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE, 138287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getDataRel()); 139362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 140362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug Info Sections. 141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 142287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 143287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 144362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 145287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 146287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 147362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 148287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 149287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 150362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 151287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 152287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 153362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 154287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 155287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 156362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 157287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 158287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 159362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 160287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 161287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 162362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 163287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 164287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 165362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 166287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 167287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 168362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 169287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 170287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 171362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 172287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getContext().getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 173287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner SectionKind::getMetadata()); 174362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 175362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 176362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind 178362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) { 179362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name.empty() || Name[0] != '.') return K; 180362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Some lame default implementation based on some magic section names. 182362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".bss" || 183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".bss.") || 184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.b.") || 185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.b.") || 186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name == ".sbss" || 187362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".sbss.") || 188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.sb.") || 189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.sb.")) 190362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getBSS(); 191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".tdata" || 193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".tdata.") || 194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.td.") || 195362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.td.")) 196362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getThreadData(); 197362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 198362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".tbss" || 199362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".tbss.") || 200362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.tb.") || 201362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.tb.")) 202362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getThreadBSS(); 203362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 204362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return K; 205362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 206362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 207362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 208362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 209362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".init_array") 211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_INIT_ARRAY; 212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 213362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".fini_array") 214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_FINI_ARRAY; 215362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 216362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".preinit_array") 217362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_PREINIT_ARRAY; 218362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 219362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isBSS() || K.isThreadBSS()) 220362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_NOBITS; 221362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 222362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_PROGBITS; 223362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 224362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 226362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned 227362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) { 228362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Flags = 0; 229362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 230362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!K.isMetadata()) 231362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_ALLOC; 232362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 233362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isText()) 234362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 235362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 236362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isWriteable()) 237362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_WRITE; 238362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 239362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isThreadLocal()) 240362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_TLS; 241362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 242362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // K.isMergeableConst() is left out to honour PR4650 243362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isMergeableCString() || K.isMergeableConst4() || 244362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov K.isMergeableConst8() || K.isMergeableConst16()) 245362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_MERGE; 246362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 247362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isMergeableCString()) 248362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_STRINGS; 249362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 250362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return Flags; 251362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 252362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 253362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 254362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 255362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 257362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StringRef SectionName = GV->getSection(); 258362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 259362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Infer section flags from the section name if we can. 260362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind = getELFKindForNamedSection(SectionName, Kind); 261362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 262287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner return getContext().getELFSection(SectionName, 263287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionType(SectionName, Kind), 264287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionFlags(Kind), Kind, true); 265362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 266362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 267362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 268362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) return ".gnu.linkonce.t."; 269362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 270362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 271362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadData()) return ".gnu.linkonce.td."; 272362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 273362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 274362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 275362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 276362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 277362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".gnu.linkonce.d.rel.ro."; 281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 28343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// getSectionPrefixForGlobal - Return the section prefix name used by options 28443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// FunctionsSections and DataSections. 28543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattnerstatic const char *getSectionPrefixForGlobal(SectionKind Kind) { 28643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isText()) return ".text."; 28743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isReadOnly()) return ".rodata."; 28843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 28943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isThreadData()) return ".tdata."; 29043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isThreadBSS()) return ".tbss."; 29143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 29243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isDataNoRel()) return ".data."; 29343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isDataRelLocal()) return ".data.rel.local."; 29443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isDataRel()) return ".data.rel."; 29543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local."; 29643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 29743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 29843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner return ".data.rel.ro."; 29943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner} 30043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 30143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 302362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 303362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 304362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 30543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner // If we have -ffunction-section or -fdata-section then we should emit the 30643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner // global value to a uniqued section specifically for it. 30743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner bool EmitUniquedSection; 30843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (Kind.isText()) 30943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner EmitUniquedSection = TM.getFunctionSections(); 31043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner else 31143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner EmitUniquedSection = TM.getDataSections(); 312362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 313362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this global is linkonce/weak and the target handles this by emitting it 314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // into a 'uniqued' section name, create and return the section now. 31543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if ((GV->isWeakForLinker() || EmitUniquedSection) && 31643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner !Kind.isCommon() && !Kind.isBSS()) { 31743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner const char *Prefix; 31843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner if (GV->isWeakForLinker()) 31943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner Prefix = getSectionPrefixForUniqueGlobal(Kind); 32043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner else { 32143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner assert(EmitUniquedSection); 32243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner Prefix = getSectionPrefixForGlobal(Kind); 32343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner } 32443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner 3254c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 3264c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 3274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner Name.append(Sym->getName().begin(), Sym->getName().end()); 328287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner return getContext().getELFSection(Name.str(), 329287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionType(Name.str(), Kind), 330287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner getELFSectionFlags(Kind), Kind); 331362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 332362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) return TextSection; 334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable1ByteCString() || 336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable2ByteCString() || 337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable4ByteCString()) { 338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // We also need alignment here. 340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: this is getting the alignment of the character, not the 341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // alignment of the global! 342362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Align = 343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *SizeSpec = ".rodata.str1."; 346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable2ByteCString()) 347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SizeSpec = ".rodata.str2."; 348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov else if (Kind.isMergeable4ByteCString()) 349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SizeSpec = ".rodata.str4."; 350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov else 351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isMergeable1ByteCString() && "unknown string width"); 352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov std::string Name = SizeSpec + utostr(Align); 355287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner return getContext().getELFSection(Name, MCSectionELF::SHT_PROGBITS, 356287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_ALLOC | 357287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_MERGE | 358287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner MCSectionELF::SHF_STRINGS, 359287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner Kind); 360362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 361362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 362362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst()) { 363362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4() && MergeableConst4Section) 364362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst4Section; 365362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8() && MergeableConst8Section) 366362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst8Section; 367362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && MergeableConst16Section) 368362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst16Section; 369362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; // .const 370362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 371362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 372362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) return ReadOnlySection; 373362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 374362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadData()) return TLSDataSection; 375362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadBSS()) return TLSBSSSection; 376362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 377362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Note: we claim that common symbols are put in BSSSection, but they are 378362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // really emitted with the magic .comm directive, which creates a symbol table 379362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // entry but not a section. 380362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 381362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 382362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataNoRel()) return DataSection; 383362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRelLocal()) return DataRelLocalSection; 384362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel()) return DataRelSection; 385362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 386362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 387362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 388362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataRelROSection; 389362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 390362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 391362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the 392362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it 393362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in. 394362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 395362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const { 396362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4() && MergeableConst4Section) 397362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst4Section; 398362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8() && MergeableConst8Section) 399362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst8Section; 400362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && MergeableConst16Section) 401362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst16Section; 402362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 403362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; 404362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 405362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 406362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 407362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataRelROSection; 408362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 409362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 410362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF:: 4113192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 4123192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MachineModuleInfo *MMI, 4133192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner unsigned Encoding, MCStreamer &Streamer) const { 414362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 415362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Encoding & dwarf::DW_EH_PE_indirect) { 416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 419362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 420362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += ".DW.stub"; 421362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 422362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Add information about the stub reference to ELFMMI so that the stub 423362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // gets emitted by the asmprinter. 4249b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 4254c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 426cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) { 4274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 4284c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 429362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 430362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 431362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 4324c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner getExprForDwarfReference(SSym, Mang, MMI, 4333192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 434362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 435362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 436362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 4373192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 438362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 439362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 440362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 441362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// MachO 442362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 443362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 444362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 445362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 44609d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner // _foo.eh symbols are currently always exported so that the linker knows 44709d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner // about them. This is not necessary on 10.6 and later, but it 44809d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner // doesn't hurt anything. 44909d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner // FIXME: I need to get this from Triple. 45009d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner IsFunctionEHSymbolGlobal = true; 45109d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner IsFunctionEHFrameSymbolPrivate = false; 45209d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner SupportsWeakOmittedEHFrame = false; 45309d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner 454362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 455362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 456362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection // .text 45722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__text", 45822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 45922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getText()); 460362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection // .data 46122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__data", 0, 46222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 463362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 464362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov CStringSection // .cstring 46522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__cstring", 46622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_CSTRING_LITERALS, 46722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeable1ByteCString()); 468362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov UStringSection 46922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT","__ustring", 0, 47022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeable2ByteCString()); 471362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov FourByteConstantSection // .literal4 47222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__literal4", 47322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_4BYTE_LITERALS, 47422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeableConst4()); 475362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EightByteConstantSection // .literal8 47622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__literal8", 47722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_8BYTE_LITERALS, 47822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeableConst8()); 479362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 480362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 481362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // to using it in -static mode. 482362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SixteenByteConstantSection = 0; 483362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getRelocationModel() != Reloc::Static && 484362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TM.getTargetData()->getPointerSize() == 32) 485362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SixteenByteConstantSection = // .literal16 48622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__TEXT", "__literal16", 48722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_16BYTE_LITERALS, 48822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMergeableConst16()); 489362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 490362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ReadOnlySection // .const 49122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__const", 0, 49222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnly()); 493362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 494362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextCoalSection 49522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__textcoal_nt", 49622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED | 49722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 49822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getText()); 499362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstTextCoalSection 50022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__const_coal", 50122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED, 50222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getText()); 503362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstDataCoalSection 50422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA","__const_coal", 50522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED, 50622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getText()); 507362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstDataSection // .const_data 50822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__const", 0, 50922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnlyWithRel()); 510362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataCoalSection 51122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA","__datacoal_nt", 51222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED, 51322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 514362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataCommonSection 51522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA","__common", 51622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ZEROFILL, 51722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getBSS()); 518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataBSSSection 51922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, 52022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getBSS()); 521362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 522362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 523362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LazySymbolPointerSection 52422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__la_symbol_ptr", 52522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 52622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 527362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov NonLazySymbolPointerSection 52822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__nl_symbol_ptr", 52922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 53022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 531362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 532362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getRelocationModel() == Reloc::Static) { 533362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection 53422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__constructor", 0, 53522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 536362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection 53722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__TEXT", "__destructor", 0, 53822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 539362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } else { 540362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection 54122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__mod_init_func", 54222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 54322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 544362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection 54522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner = getContext().getMachOSection("__DATA", "__mod_term_func", 54622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 54722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getDataRel()); 548362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 549362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 550362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Exception Handling. 55122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0, 55222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnlyWithRel()); 553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 55422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__TEXT", "__eh_frame", 55522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_COALESCED | 55622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_NO_TOC | 55722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 55822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 55922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getReadOnly()); 560362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 561362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug Information. 562362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 56322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_abbrev", 56422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 56522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 566362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 56722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_info", 56822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 56922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 570362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 57122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_line", 57222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 57322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 574362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 57522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_frame", 57622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 57722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 578362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 57922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_pubnames", 58022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 58122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 582362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 58322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_pubtypes", 58422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 58522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 586362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 58722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_str", 58822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 58922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 590362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 59122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_loc", 59222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 59322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 594362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 59522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_aranges", 59622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 59722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 598362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 59922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_ranges", 60022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 60122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 602362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 60322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_macinfo", 60422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 60522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 606362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfDebugInlineSection = 60722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection("__DWARF", "__debug_inlined", 60822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_DEBUG, 60922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 610362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 611362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 612362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO:: 613362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 614362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 615362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Parse the section specifier and create it if valid. 616362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StringRef Segment, Section; 617362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned TAA, StubSize; 618362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov std::string ErrorCode = 619362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 620362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TAA, StubSize); 621362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!ErrorCode.empty()) { 62275361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner // If invalid, report the error with report_fatal_error. 62375361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Global variable '" + GV->getNameStr() + 624362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "' has an invalid section specifier '" + GV->getSection()+ 625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "': " + ErrorCode + "."); 626362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Fall back to dropping it into the data section. 627362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataSection; 628362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 630362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Get the section. 631362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const MCSectionMachO *S = 63222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 634362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Okay, now that we got the section, verify that the TAA & StubSize agree. 635362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If the user declared multiple globals with different section flags, we need 636362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // to reject it here. 637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 63875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner // If invalid, report the error with report_fatal_error. 63975361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("Global variable '" + GV->getNameStr() + 640362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "' section type or attributes does not match previous" 641362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov " section specifier"); 642362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return S; 645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 646362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO:: 648362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 651362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return GV->isWeakForLinker() ? TextCoalSection : TextSection; 654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 655362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this is weak/linkonce, put this in a coalescable section, either in text 656362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // or data depending on if it is writable. 657362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker()) { 658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstTextCoalSection; 660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataCoalSection; 661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: Alignment check should be handled by section classifier. 66498f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner if (Kind.isMergeable1ByteCString() && 66598f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 66698f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner return CStringSection; 66798f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner 66898f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner // Do not put 16-bit arrays in the UString section if they have an 66998f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner // externally visible label, this runs into issues with certain linker 67098f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner // versions. 67198f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 67298f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32) 67398f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner return UStringSection; 674362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 675362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst()) { 676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4()) 677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return FourByteConstantSection; 678362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8()) 679362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return EightByteConstantSection; 680362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && SixteenByteConstantSection) 681362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SixteenByteConstantSection; 682362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 683362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 684362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, if it is readonly, but not something we can specially optimize, 685362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // just drop it in .const. 686362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 687362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; 688362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 689362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this is marked const, put it into a const section. But if the dynamic 690362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // linker needs to write to it, put it in the data segment. 691362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRel()) 692362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstDataSection; 693362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Put zero initialized globals with strong external linkage in the 695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // DATA, __common section with the .zerofill directive. 696362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSSExtern()) 697362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataCommonSection; 698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 699362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Put zero initialized globals with local linkage in __DATA,__bss directive 700362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // with the .zerofill directive (aka .lcomm). 701362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSSLocal()) 702362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataBSSSection; 703362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 704362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, just drop the variable in the normal data section. 705362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataSection; 706362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 707362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 708362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection * 709362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 710362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this constant requires a relocation, we have to put it in the data 711362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // segment, not in the text segment. 712362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 713362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstDataSection; 714362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 715362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4()) 716362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return FourByteConstantSection; 717362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8()) 718362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return EightByteConstantSection; 719362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && SixteenByteConstantSection) 720362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SixteenByteConstantSection; 721362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; // .const 722362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 723362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// not to emit the UsedDirective for some symbols in llvm.used. 726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// FIXME: REMOVE this (rdar://7071300) 727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovbool TargetLoweringObjectFileMachO:: 728362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 729362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov /// On Darwin, internally linked data beginning with "L" or "l" does not have 730362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov /// the directive emitted (this occurs in ObjC metadata). 731362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!GV) return false; 732362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 733362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 734362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 735362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: ObjC metadata is currently emitted as internal symbols that have 736362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 737362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // this horrible hack can go away. 7384c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 7394c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l') 740362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return false; 741362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 742362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 743362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return true; 744362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 745362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 746362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileMachO:: 7473192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 7483192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MachineModuleInfo *MMI, unsigned Encoding, 7493192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MCStreamer &Streamer) const { 750362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // The mach-o version of this method defaults to returning a stub reference. 751362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 752293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov if (Encoding & DW_EH_PE_indirect) { 753293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MachineModuleInfoMachO &MachOMMI = 754293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MMI->getObjFileInfo<MachineModuleInfoMachO>(); 755293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 756362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 757362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 758362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += "$non_lazy_ptr"; 759293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 760293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov // Add information about the stub reference to MachOMMI so that the stub 761293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov // gets emitted by the asmprinter. 7629b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str()); 7634c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 764cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) { 7654c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 7664c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 767293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov } 768362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 769362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 7704c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner getExprForDwarfReference(SSym, Mang, MMI, 77142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 772362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 773362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 774362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 7753192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 776362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 777362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 778293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const { 779293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 780293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 781293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 782293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const { 783293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_pcrel; 784293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 785293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 786293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getFDEEncoding() const { 787293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_pcrel; 788293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 789293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 790293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const { 791505ad8bed3321bc4b99af8fba4844efe2fe9e67aBill Wendling return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 792293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 793362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 794362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 795362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// COFF 796362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 797362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 798362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 799362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 800362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 801eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner TextSection = 802eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".text", 803eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_CODE | 804eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE | 805eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 806eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getText()); 807eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner DataSection = 808eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".data", 809eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 810eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ | 811eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_WRITE, 812eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 813eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner ReadOnlySection = 814eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".rdata", 815eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 816eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 817eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getReadOnly()); 818362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection = 819eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".ctors", 820eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 821eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ | 822eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_WRITE, 823eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 824362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection = 825eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".dtors", 826eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 827eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ | 828eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_WRITE, 829eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 830362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 831362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: We're emitting LSDA info into a readonly section on COFF, even 832362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // though it contains relocatable pointers. In PIC mode, this is probably a 833362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // big runtime hit for C++ apps. Either the contents of the LSDA need to be 834362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // adjusted or this should be a data section. 835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = 836eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".gcc_except_table", 837eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 838eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 839eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getReadOnly()); 840362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 841eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".eh_frame", 842eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 843eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ | 844eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_WRITE, 845eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getDataRel()); 846362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 847362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug info. 848362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 849eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_abbrev", 850eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 851eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 852eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 853362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 854eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_info", 855eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 856eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 857eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 858362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 859eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_line", 860eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 861eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 862eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 863362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 864eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_frame", 865eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 866eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 867eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 868362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 869eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_pubnames", 870eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 871eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 872eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 873362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 874eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_pubtypes", 875eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 876eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 877eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 878362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 879eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_str", 880eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 881eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 882eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 883362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 884eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_loc", 885eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 886eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 887eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 888362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 889eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_aranges", 890eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 891eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 892eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 893362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 894eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_ranges", 895eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 896eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 897eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 898362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 899eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".debug_macinfo", 900eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE | 901eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ, 902eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 903eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 904eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner DrectveSection = 905eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getContext().getCOFFSection(".drectve", 906eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_LNK_INFO, 907eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner SectionKind::getMetadata()); 908eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner} 909eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 910eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerstatic unsigned 911eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris LattnergetCOFFSectionFlags(SectionKind K) { 912eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner unsigned Flags = 0; 913eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 914eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner if (!K.isMetadata()) 915eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE; 916eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else if (K.isText()) 917eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= 918eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE | 919eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_CODE; 920eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else if (K.isReadOnly()) 921eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= 922eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 923eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ; 924eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner else if (K.isWriteable()) 925eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Flags |= 926eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 927eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_READ | 928eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner MCSectionCOFF::IMAGE_SCN_MEM_WRITE; 929eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner 930eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return Flags; 931362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 932362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 933362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 934362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 935362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 936eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return getContext().getCOFFSection(GV->getSection(), 937eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getCOFFSectionFlags(Kind), 938eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Kind); 939362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 940362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 941362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 942362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 943362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".text$linkonce"; 944362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isWriteable()) 945362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".data$linkonce"; 946362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".rdata$linkonce"; 947362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 948362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 949362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 950362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 951362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 952362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 953362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 954362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 955362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this global is linkonce/weak and the target handles this by emitting it 956362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // into a 'uniqued' section name, create and return the section now. 957362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker()) { 958362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 959362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 9604c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner MCSymbol *Sym = Mang->getSymbol(GV); 9614c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner Name.append(Sym->getName().begin(), Sym->getName().end()); 962eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner return getContext().getCOFFSection(Name.str(), 963eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner getCOFFSectionFlags(Kind), 964eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner Kind); 965362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 966362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 967362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 968362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getTextSection(); 969362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 970362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getDataSection(); 971362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 972362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 973