TargetLoweringObjectFileImpl.cpp revision 293d592bf9cff6c3679998dde32f3cfd3cd53bc4
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" 25362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSymbol.h" 26362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/Mangler.h" 27362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetData.h" 28362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetMachine.h" 29362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetOptions.h" 30362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/Dwarf.h" 31362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h" 32362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h" 33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/SmallString.h" 34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/StringExtras.h" 35362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm; 36293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf; 37362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 38362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 39362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// ELF 40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 41362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovtypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 43362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { 44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If we have the section uniquing map, free it. 45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov delete (ELFUniqueMapTy*)UniquingMap; 46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 47362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 48362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 49362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSection(StringRef Section, unsigned Type, unsigned Flags, 50362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind Kind, bool IsExplicit) const { 51362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (UniquingMap == 0) 52362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov UniquingMap = new ELFUniqueMapTy(); 53362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; 54362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 55362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Do the lookup, if we have a hit, return it. 56362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const MCSectionELF *&Entry = Map[Section]; 57362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Entry) return Entry; 58362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 59362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit, 60362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getContext()); 61362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 62362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 63362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 64362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 65362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (UniquingMap != 0) 66362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ((ELFUniqueMapTy*)UniquingMap)->clear(); 67362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 68362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 69362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov BSSSection = 70362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".bss", MCSectionELF::SHT_NOBITS, 71362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 72362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getBSS()); 73362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 74362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection = 75362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".text", MCSectionELF::SHT_PROGBITS, 76362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC, 77362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getText()); 78362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 79362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection = 80362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".data", MCSectionELF::SHT_PROGBITS, 81362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 82362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 83362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 84362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ReadOnlySection = 85362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 86362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC, 87362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getReadOnly()); 88362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 89362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TLSDataSection = 90362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 91362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 92362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_WRITE, SectionKind::getThreadData()); 93362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 94362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TLSBSSSection = 95362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 96362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 97362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS()); 98362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 99362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelSection = 100362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 101362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 102362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 103362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 104362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelLocalSection = 105362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 106362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 107362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRelLocal()); 108362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 109362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelROSection = 110362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 111362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 112362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getReadOnlyWithRel()); 113362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 114362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataRelROLocalSection = 115362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 116362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 117362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getReadOnlyWithRelLocal()); 118362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 119362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst4Section = 120362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 121362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 122362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeableConst4()); 123362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 124362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst8Section = 125362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeableConst8()); 128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MergeableConst16Section = 130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 132362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeableConst16()); 133362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 134362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection = 135362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 136362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 137362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 138362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 139362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection = 140362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 142362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 143362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 144362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Exception Handling Sections. 145362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 146362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 147362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // it contains relocatable pointers. In PIC mode, this is probably a big 148362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // runtime hit for C++ apps. Either the contents of the LSDA need to be 149362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // adjusted or this should be a data section. 150362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = 151362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 152362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly()); 153362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 154362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 155362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 156362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 157362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 158362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug Info Sections. 159362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 160362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 161362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 162362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 163362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 164362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 165362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 166362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 167362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 168362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 169362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 170362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 171362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 172362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 173362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 174362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 175362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 176362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 178362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 179362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 180362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 182362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 187362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 190362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 195362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind 196362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) { 197362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name.empty() || Name[0] != '.') return K; 198362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 199362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Some lame default implementation based on some magic section names. 200362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".bss" || 201362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".bss.") || 202362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.b.") || 203362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.b.") || 204362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name == ".sbss" || 205362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".sbss.") || 206362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.sb.") || 207362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.sb.")) 208362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getBSS(); 209362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".tdata" || 211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".tdata.") || 212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.td.") || 213362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.td.")) 214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getThreadData(); 215362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 216362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".tbss" || 217362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".tbss.") || 218362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".gnu.linkonce.tb.") || 219362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.startswith(".llvm.linkonce.tb.")) 220362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SectionKind::getThreadBSS(); 221362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 222362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return K; 223362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 224362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 226362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 227362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 228362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".init_array") 229362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_INIT_ARRAY; 230362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 231362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".fini_array") 232362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_FINI_ARRAY; 233362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 234362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name == ".preinit_array") 235362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_PREINIT_ARRAY; 236362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 237362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isBSS() || K.isThreadBSS()) 238362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_NOBITS; 239362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 240362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MCSectionELF::SHT_PROGBITS; 241362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 242362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 243362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 244362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned 245362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) { 246362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Flags = 0; 247362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 248362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!K.isMetadata()) 249362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_ALLOC; 250362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 251362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isText()) 252362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 253362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 254362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isWriteable()) 255362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_WRITE; 256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 257362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isThreadLocal()) 258362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_TLS; 259362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 260362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // K.isMergeableConst() is left out to honour PR4650 261362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isMergeableCString() || K.isMergeableConst4() || 262362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov K.isMergeableConst8() || K.isMergeableConst16()) 263362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_MERGE; 264362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 265362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (K.isMergeableCString()) 266362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Flags |= MCSectionELF::SHF_STRINGS; 267362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 268362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return Flags; 269362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 270362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 271362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 272362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 273362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 274362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 275362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StringRef SectionName = GV->getSection(); 276362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 277362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Infer section flags from the section name if we can. 278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind = getELFKindForNamedSection(SectionName, Kind); 279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getELFSection(SectionName, 281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSectionType(SectionName, Kind), 282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSectionFlags(Kind), Kind, true); 283362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 284362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 285362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 286362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) return ".gnu.linkonce.t."; 287362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 288362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 289362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadData()) return ".gnu.linkonce.td."; 290362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 291362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 292362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 293362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 294362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 295362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 296362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 297362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 298362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".gnu.linkonce.d.rel.ro."; 299362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 300362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 301362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 302362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 303362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 304362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 305362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this global is linkonce/weak and the target handles this by emitting it 306362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // into a 'uniqued' section name, create and return the section now. 307362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) { 308362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 309362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 310362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.append(Prefix, Prefix+strlen(Prefix)); 311362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, false); 312362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind), 313362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getELFSectionFlags(Kind), Kind); 314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 315362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 316362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) return TextSection; 317362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 318362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable1ByteCString() || 319362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable2ByteCString() || 320362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable4ByteCString()) { 321362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 322362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // We also need alignment here. 323362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: this is getting the alignment of the character, not the 324362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // alignment of the global! 325362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Align = 326362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 327362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 328362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *SizeSpec = ".rodata.str1."; 329362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable2ByteCString()) 330362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SizeSpec = ".rodata.str2."; 331362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov else if (Kind.isMergeable4ByteCString()) 332362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SizeSpec = ".rodata.str4."; 333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov else 334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isMergeable1ByteCString() && "unknown string width"); 335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov std::string Name = SizeSpec + utostr(Align); 338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getELFSection(Name, MCSectionELF::SHT_PROGBITS, 339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_ALLOC | 340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_MERGE | 341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionELF::SHF_STRINGS, 342362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind); 343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst()) { 346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4() && MergeableConst4Section) 347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst4Section; 348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8() && MergeableConst8Section) 349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst8Section; 350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && MergeableConst16Section) 351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst16Section; 352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; // .const 353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 355362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) return ReadOnlySection; 356362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 357362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadData()) return TLSDataSection; 358362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isThreadBSS()) return TLSBSSSection; 359362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 360362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Note: we claim that common symbols are put in BSSSection, but they are 361362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // really emitted with the magic .comm directive, which creates a symbol table 362362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // entry but not a section. 363362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 364362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 365362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataNoRel()) return DataSection; 366362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRelLocal()) return DataRelLocalSection; 367362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel()) return DataRelSection; 368362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 369362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 370362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 371362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataRelROSection; 372362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 373362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 374362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the 375362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it 376362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in. 377362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF:: 378362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const { 379362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4() && MergeableConst4Section) 380362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst4Section; 381362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8() && MergeableConst8Section) 382362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst8Section; 383362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && MergeableConst16Section) 384362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return MergeableConst16Section; 385362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 386362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; 387362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 388362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 389362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 390362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataRelROSection; 391362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 392362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 393362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF:: 394362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 395362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding) const { 396362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 397362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Encoding & dwarf::DW_EH_PE_indirect) { 398362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 399362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 400362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 401362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 402362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += ".DW.stub"; 403362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 404362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Add information about the stub reference to ELFMMI so that the stub 405362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // gets emitted by the asmprinter. 406362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str()); 407362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSymbol *&StubSym = ELFMMI.getGVStubEntry(Sym); 408362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (StubSym == 0) { 409362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.clear(); 410362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, false); 411362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StubSym = getContext().GetOrCreateSymbol(Name.str()); 412362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 413362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 414362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 415362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getSymbolForDwarfReference(Sym, MMI, 416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Encoding & ~dwarf::DW_EH_PE_indirect); 417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 419362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 420362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding); 421362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 422362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 423362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 424362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// MachO 425362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 426362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 427362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovtypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 428362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 429362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 430362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If we have the MachO uniquing map, free it. 431362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov delete (MachOUniqueMapTy*)UniquingMap; 432362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 433362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 434362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 435362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSectionMachO *TargetLoweringObjectFileMachO:: 436362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetMachOSection(StringRef Segment, StringRef Section, 437362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned TypeAndAttributes, 438362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned Reserved2, SectionKind Kind) const { 439362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // We unique sections by their segment/section pair. The returned section 440362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // may not have the same flags as the requested section, if so this should be 441362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // diagnosed by the client as an error. 442362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 443362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Create the map if it doesn't already exist. 444362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (UniquingMap == 0) 445362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov UniquingMap = new MachOUniqueMapTy(); 446362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 447362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 448362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Form the name to look up. 449362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<64> Name; 450362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += Segment; 451362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name.push_back(','); 452362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += Section; 453362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 454362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Do the lookup, if we have a hit, return it. 455362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const MCSectionMachO *&Entry = Map[Name.str()]; 456362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Entry) return Entry; 457362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 458362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, return a new section. 459362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 460362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Reserved2, Kind, getContext()); 461362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 462362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 463362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 464362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 465362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 466362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (UniquingMap != 0) 467362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ((MachOUniqueMapTy*)UniquingMap)->clear(); 468362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 469362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 470362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection // .text 471362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__text", 472362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 473362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getText()); 474362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection // .data 475362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 476362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 477362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov CStringSection // .cstring 478362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 479362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeable1ByteCString()); 480362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov UStringSection 481362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT","__ustring", 0, 482362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeable2ByteCString()); 483362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov FourByteConstantSection // .literal4 484362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 485362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeableConst4()); 486362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EightByteConstantSection // .literal8 487362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 488362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeableConst8()); 489362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 490362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 491362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // to using it in -static mode. 492362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SixteenByteConstantSection = 0; 493362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getRelocationModel() != Reloc::Static && 494362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TM.getTargetData()->getPointerSize() == 32) 495362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SixteenByteConstantSection = // .literal16 496362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 497362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMergeableConst16()); 498362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 499362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ReadOnlySection // .const 500362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 501362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 502362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextCoalSection 503362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__textcoal_nt", 504362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_COALESCED | 505362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 506362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getText()); 507362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstTextCoalSection 508362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 509362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getText()); 510362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstDataCoalSection 511362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 512362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getText()); 513362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ConstDataSection // .const_data 514362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA", "__const", 0, 515362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getReadOnlyWithRel()); 516362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataCoalSection 517362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 519362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataCommonSection 520362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL, 521362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getBSS()); 522362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataBSSSection 523362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, 524362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getBSS()); 525362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 526362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 527362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LazySymbolPointerSection 528362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA", "__la_symbol_ptr", 529362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 530362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 531362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov NonLazySymbolPointerSection 532362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA", "__nl_symbol_ptr", 533362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 534362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 535362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 536362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getRelocationModel() == Reloc::Static) { 537362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection 538362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 539362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection 540362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 541362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } else { 542362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection 543362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA", "__mod_init_func", 544362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 545362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 546362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection 547362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 548362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 549362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 550362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 551362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 552362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Exception Handling. 553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 554362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getDataRel()); 555362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 556362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__TEXT", "__eh_frame", 557362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_COALESCED | 558362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_ATTR_NO_TOC | 559362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 560362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::S_ATTR_LIVE_SUPPORT, 561362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getReadOnly()); 562362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 563362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug Information. 564362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 565362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 566362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 567362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 568362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 569362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 570362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 571362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 572362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 573362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 574362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 575362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 576362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 577362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 578362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 579362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 580362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 581362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 582362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 583362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 584362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 585362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 586362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 587362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 588362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 589362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 590362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 591362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 592362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 593362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 594362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 595362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 596362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 597362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfDebugInlineSection = 598362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 599362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SectionKind::getMetadata()); 600362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 601362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 602362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO:: 603362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 604362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 605362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Parse the section specifier and create it if valid. 606362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StringRef Segment, Section; 607362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov unsigned TAA, StubSize; 608362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov std::string ErrorCode = 609362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 610362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TAA, StubSize); 611362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!ErrorCode.empty()) { 612362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If invalid, report the error with llvm_report_error. 613362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov llvm_report_error("Global variable '" + GV->getNameStr() + 614362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "' has an invalid section specifier '" + GV->getSection()+ 615362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "': " + ErrorCode + "."); 616362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Fall back to dropping it into the data section. 617362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataSection; 618362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 619362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 620362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Get the section. 621362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const MCSectionMachO *S = 622362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getMachOSection(Segment, Section, TAA, StubSize, Kind); 623362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 624362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Okay, now that we got the section, verify that the TAA & StubSize agree. 625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If the user declared multiple globals with different section flags, we need 626362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // to reject it here. 627362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 628362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If invalid, report the error with llvm_report_error. 629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov llvm_report_error("Global variable '" + GV->getNameStr() + 630362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov "' section type or attributes does not match previous" 631362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov " section specifier"); 632362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 634362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return S; 635362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 636362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO:: 638362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 639362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 640362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 641362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 642362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return GV->isWeakForLinker() ? TextCoalSection : TextSection; 644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this is weak/linkonce, put this in a coalescable section, either in text 646362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // or data depending on if it is writable. 647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker()) { 648362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstTextCoalSection; 650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataCoalSection; 651362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: Alignment check should be handled by section classifier. 654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable1ByteCString() || 655362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Kind.isMergeable2ByteCString()) { 656362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (TM.getTargetData()->getPreferredAlignment( 657362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov cast<GlobalVariable>(GV)) < 32) { 658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeable1ByteCString()) 659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return CStringSection; 660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(Kind.isMergeable2ByteCString()); 661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return UStringSection; 662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 664362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 665362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst()) { 666362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4()) 667362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return FourByteConstantSection; 668362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8()) 669362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return EightByteConstantSection; 670362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && SixteenByteConstantSection) 671362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SixteenByteConstantSection; 672362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 673362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 674362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, if it is readonly, but not something we can specially optimize, 675362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // just drop it in .const. 676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnly()) 677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; 678362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 679362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this is marked const, put it into a const section. But if the dynamic 680362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // linker needs to write to it, put it in the data segment. 681362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isReadOnlyWithRel()) 682362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstDataSection; 683362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 684362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Put zero initialized globals with strong external linkage in the 685362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // DATA, __common section with the .zerofill directive. 686362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSSExtern()) 687362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataCommonSection; 688362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 689362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Put zero initialized globals with local linkage in __DATA,__bss directive 690362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // with the .zerofill directive (aka .lcomm). 691362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isBSSLocal()) 692362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataBSSSection; 693362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Otherwise, just drop the variable in the normal data section. 695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return DataSection; 696362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 697362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection * 699362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 700362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this constant requires a relocation, we have to put it in the data 701362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // segment, not in the text segment. 702362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 703362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ConstDataSection; 704362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 705362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst4()) 706362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return FourByteConstantSection; 707362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst8()) 708362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return EightByteConstantSection; 709362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isMergeableConst16() && SixteenByteConstantSection) 710362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return SixteenByteConstantSection; 711362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ReadOnlySection; // .const 712362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 713362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 714362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 715362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// not to emit the UsedDirective for some symbols in llvm.used. 716362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// FIXME: REMOVE this (rdar://7071300) 717362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovbool TargetLoweringObjectFileMachO:: 718362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 719362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov /// On Darwin, internally linked data beginning with "L" or "l" does not have 720362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov /// the directive emitted (this occurs in ObjC metadata). 721362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (!GV) return false; 722362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 723362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: ObjC metadata is currently emitted as internal symbols that have 726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // this horrible hack can go away. 728362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<64> Name; 729362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, false); 730362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Name[0] == 'L' || Name[0] == 'l') 731362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return false; 732362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 733362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 734362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return true; 735362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 736362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 737362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileMachO:: 738362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 739362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding) const { 740362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // The mach-o version of this method defaults to returning a stub reference. 741362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 742293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov if (Encoding & DW_EH_PE_indirect) { 743293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MachineModuleInfoMachO &MachOMMI = 744293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MMI->getObjFileInfo<MachineModuleInfoMachO>(); 745293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 746362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name; 747362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 748362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Name += "$non_lazy_ptr"; 749293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 750293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov // Add information about the stub reference to MachOMMI so that the stub 751293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov // gets emitted by the asmprinter. 752362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str()); 753293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov MCSymbol *&StubSym = MachOMMI.getGVStubEntry(Sym); 754293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov if (StubSym == 0) { 755293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov Name.clear(); 756293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, false); 757293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov StubSym = getContext().GetOrCreateSymbol(Name.str()); 758293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov } 759362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 760362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 761362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getSymbolForDwarfReference(Sym, MMI, 762362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Encoding & ~dwarf::DW_EH_PE_indirect); 763362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 764362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 765362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return TargetLoweringObjectFile:: 766362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding); 767362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 768362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 769293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const { 770293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 771293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 772293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 773293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const { 774293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_pcrel; 775293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 776293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 777293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getFDEEncoding() const { 778293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_pcrel; 779293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 780293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov 781293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const { 782293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 783293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov} 784362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 785362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 786362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// COFF 787362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===// 788362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 789362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovtypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 790362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 791362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 792362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov delete (COFFUniqueMapTy*)UniquingMap; 793362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 794362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 795362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 796362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 797362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const { 798362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Create the map if it doesn't already exist. 799362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (UniquingMap == 0) 800362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov UniquingMap = new MachOUniqueMapTy(); 801362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 802362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 803362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Do the lookup, if we have a hit, return it. 804362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const MCSectionCOFF *&Entry = Map[Name]; 805362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Entry) return Entry; 806362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 807362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 808362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 809362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 810362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 811362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const TargetMachine &TM) { 812362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (UniquingMap != 0) 813362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov ((COFFUniqueMapTy*)UniquingMap)->clear(); 814362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TargetLoweringObjectFile::Initialize(Ctx, TM); 815362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 816362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 817362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticCtorSection = 818362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection(".ctors", false, SectionKind::getDataRel()); 819362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov StaticDtorSection = 820362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection(".dtors", false, SectionKind::getDataRel()); 821362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 822362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: We're emitting LSDA info into a readonly section on COFF, even 823362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // though it contains relocatable pointers. In PIC mode, this is probably a 824362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // big runtime hit for C++ apps. Either the contents of the LSDA need to be 825362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // adjusted or this should be a data section. 826362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov LSDASection = 827362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 828362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov EHFrameSection = 829362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 830362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 831362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // Debug info. 832362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // FIXME: Don't use 'directive' mode here. 833362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfAbbrevSection = 834362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 836362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfInfoSection = 837362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_info,\"dr\"", 838362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 839362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLineSection = 840362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_line,\"dr\"", 841362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 842362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfFrameSection = 843362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_frame,\"dr\"", 844362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 845362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubNamesSection = 846362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 847362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 848362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfPubTypesSection = 849362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 850362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 851362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfStrSection = 852362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_str,\"dr\"", 853362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 854362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfLocSection = 855362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_loc,\"dr\"", 856362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 857362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfARangesSection = 858362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 859362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 860362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfRangesSection = 861362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 862362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 863362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov DwarfMacroInfoSection = 864362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 865362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov true, SectionKind::getMetadata()); 866362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 867362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 868362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 869362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 870362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 871362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getCOFFSection(GV->getSection(), false, Kind); 872362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 873362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 874362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 875362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 876362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".text$linkonce"; 877362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isWriteable()) 878362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".data$linkonce"; 879362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return ".rdata$linkonce"; 880362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 881362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 882362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 883362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF:: 884362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 885362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mangler *Mang, const TargetMachine &TM) const { 886362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 887362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 888362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // If this global is linkonce/weak and the target handles this by emitting it 889362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov // into a 'uniqued' section name, create and return the section now. 890362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (GV->isWeakForLinker()) { 891362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 892362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 893362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, false); 894362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getCOFFSection(Name.str(), false, Kind); 895362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov } 896362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 897362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov if (Kind.isText()) 898362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getTextSection(); 899362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 900362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov return getDataSection(); 901362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov} 902362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov 903