TargetLoweringObjectFile.cpp revision 9184b25fa543a900463215c11635c2c014ddb623
1f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===-- llvm/Target/TargetLoweringObjectFile.cpp - Object File Info -------===// 2f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 3f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// The LLVM Compiler Infrastructure 4f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 5f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// This file is distributed under the University of Illinois Open Source 6f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// License. See LICENSE.TXT for details. 7f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 8f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 9f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 10f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// This file implements classes used to handle lowerings specific to common 11f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// object file formats. 12f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 13f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 14f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 15f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetLoweringObjectFile.h" 16f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Constants.h" 17f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/DerivedTypes.h" 18ffef8acc3e3398bdd04e947c7949befdd52faf86Dan Gohman#include "llvm/Function.h" 19f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/GlobalVariable.h" 209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/CodeGen/MachineModuleInfoImpls.h" 21a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h" 228c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h" 23f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h" 24b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCSectionELF.h" 258da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h" 2645111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h" 27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 285277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h" 29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 309184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h" 318f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h" 328da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h" 335dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h" 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 41a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 42f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 43f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 44824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 4680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 4780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 48d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4935039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 6018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 6118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 6218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 65f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it. 941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner const ArrayType *ATy = cast<ArrayType>(C->getType()); 968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ATy->getNumElements() == 0) return false; 1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ConstantInt *Null = 1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (Null == 0 || Null->getZExtValue() != 0) 1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; // Not null terminated. 1058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1061850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Verify that the null doesn't occur anywhere else in the string. 1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 1081850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Reject constantexpr elements etc. 1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (!isa<ConstantInt>(CVA->getOperand(i)) || 1101850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner CVA->getOperand(i) == Null) 1111850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 1131850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 1171850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return ATy->getNumElements() == 1; 118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 12258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 123968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 124968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 125968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 126968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 12758bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 12858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 12958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 13058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 1318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 1338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1372798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 1388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1422798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 146a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner // Variables with common linkage always get classified as common. 147a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (GVar->hasCommonLinkage()) 148a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner return SectionKind::getCommon(); 149a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 151ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (isSuitableForBSS(GVar)) { 152ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (GVar->hasLocalLinkage()) 153ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSLocal(); 154ce8749e445fdd0493758932874bad50293647df9Chris Lattner else if (GVar->hasExternalLinkage()) 155ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSExtern(); 1562798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 157ce8749e445fdd0493758932874bad50293647df9Chris Lattner } 158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 1608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 1688f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov if (const IntegerType *ITy = 1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1831850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1861850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 2102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 2118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2192798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2232798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 2368f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2402798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2422798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 249a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 25058bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 251e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 25324f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 25424f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 258f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 26158bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 263a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 264f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 265f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 266e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 268f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 270f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 273824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 274824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 276f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 28283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 285a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 28683d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a 2949184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// reference to the specified global variable from exception 2959184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// handling information. 2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 2989184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding) const { 29945111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner // FIXME: Use GetGlobalValueSymbol. 3008c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 3029184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov const MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str()); 3039184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3049184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return getSymbolForDwarfReference(Sym, MMI, Encoding); 3059184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3069184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3079184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFile:: 3089184b25fa543a900463215c11635c2c014ddb623Anton KorobeynikovgetSymbolForDwarfReference(const MCSymbol *Sym, MachineModuleInfo *MMI, 3099184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov unsigned Encoding) const { 3109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext()); 3119184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3129184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov switch (Encoding & 0xF0) { 3139184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov default: 3149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov llvm_report_error("Do not support this DWARF encoding yet!"); 3159184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov break; 3169184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov case dwarf::DW_EH_PE_absptr: 3179184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // Do nothing special 3189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov break; 3199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov case dwarf::DW_EH_PE_pcrel: 3209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // FIXME: PCSymbol 3219184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov const MCExpr *PC = MCSymbolRefExpr::Create(".", getContext()); 3229184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Res = MCBinaryExpr::CreateSub(Res, PC, getContext()); 3239184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov break; 3249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 3259184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3269184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return Res; 3279184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3289184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3299184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getPersonalityEncoding() const { 3309184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3319184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3329184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3339184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getLSDAEncoding() const { 3349184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3359184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3369184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3379184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getFDEEncoding() const { 3389184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3398c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 340f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3419184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getTTypeEncoding() const { 3429184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3439184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 344f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 345f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 346f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 347f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 34838cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 34938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 35038cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { 35138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // If we have the section uniquing map, free it. 35238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (ELFUniqueMapTy*)UniquingMap; 35338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 354f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 355fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags, 357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind Kind, bool IsExplicit) const { 35838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 35938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new ELFUniqueMapTy(); 36038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; 3618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 36238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 363b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const MCSectionELF *&Entry = Map[Section]; 36438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 3658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 366fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit, 367fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes getContext()); 368fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 369fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 370f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 371f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 37276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 37376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((ELFUniqueMapTy*)UniquingMap)->clear(); 374a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov BSSSection = 377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".bss", MCSectionELF::SHT_NOBITS, 378b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getBSS()); 3808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TextSection = 382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".text", MCSectionELF::SHT_PROGBITS, 383b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC, 384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getText()); 385b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataSection = 387b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data", MCSectionELF::SHT_PROGBITS, 388b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 390b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov ReadOnlySection = 3928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 3938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC, 394b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnly()); 395b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSDataSection = 397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 3988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 399b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadData()); 4008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 4018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSBSSSection = 402b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 403b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 404b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS()); 405b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelSection = 407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 408b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 409b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 410b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelLocalSection = 412b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 413b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 414b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRelLocal()); 415b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROSection = 417b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 418b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 419b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRel()); 420b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROLocalSection = 422b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 423b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 424b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRelLocal()); 4258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 4268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst4Section = 427b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 428b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 429b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst4()); 430b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst8Section = 432b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 433b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 434b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst8()); 435b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst16Section = 437b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 438b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 439b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst16()); 44080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 44180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 4428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 443b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 444b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 445b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 44680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 447b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 448b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 449b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 45118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 4528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 453d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 454d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 455d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 456d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 457d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 458b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 459b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly()); 46035039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 4618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 462b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 463b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner SectionKind::getDataRel()); 4648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 46518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 4668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 4678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 468b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 4708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 471b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 4738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 474b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 4768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 477b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 4798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 480b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 4828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 483b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 485b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 486b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 4888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 489b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 4918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 492b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 4948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 495b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 4978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 498b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 499f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 501f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 5028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind 503a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin KramergetELFKindForNamedSection(StringRef Name, SectionKind K) { 504a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer if (Name.empty() || Name[0] != '.') return K; 5058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 507a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer if (Name == ".bss" || 508a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".bss.") || 509a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".gnu.linkonce.b.") || 510a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".llvm.linkonce.b.") || 511a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name == ".sbss" || 512a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".sbss.") || 513a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".gnu.linkonce.sb.") || 514a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".llvm.linkonce.sb.")) 5152798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 5168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 517a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer if (Name == ".tdata" || 518a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".tdata.") || 519a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".gnu.linkonce.td.") || 520a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".llvm.linkonce.td.")) 5212798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 5228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 523a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer if (Name == ".tbss" || 524a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".tbss.") || 525a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".gnu.linkonce.tb.") || 526a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer Name.startswith(".llvm.linkonce.tb.")) 5272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 5288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 529f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 530f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 532b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5334813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 534b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5354813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".init_array") 536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_INIT_ARRAY; 537b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5384813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".fini_array") 539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_FINI_ARRAY; 540b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5414813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".preinit_array") 542b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PREINIT_ARRAY; 543b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isBSS() || K.isThreadBSS()) 545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_NOBITS; 546b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PROGBITS; 548b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 549b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 550b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 552b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) { 553b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes unsigned Flags = 0; 554b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 555b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (!K.isMetadata()) 556b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_ALLOC; 5578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 558848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov if (K.isText()) 559848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 5608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 561b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isWriteable()) 562b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_WRITE; 5638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 564b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isThreadLocal()) 565b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_TLS; 5668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 567b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes // K.isMergeableConst() is left out to honour PR4650 568b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString() || K.isMergeableConst4() || 569b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes K.isMergeableConst8() || K.isMergeableConst16()) 570b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_MERGE; 571b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 572b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString()) 573b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_STRINGS; 574b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 575b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return Flags; 576b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 577b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 578b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 57924f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 5808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 58124f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 582a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer StringRef SectionName = GV->getSection(); 583b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 58424f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 585b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind = getELFKindForNamedSection(SectionName, Kind); 5868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(SectionName, 5888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType(SectionName, Kind), 589b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSectionFlags(Kind), Kind, true); 59024f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 591f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 593f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 594f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 5958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 596f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 597f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 5988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 600f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 601f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 602f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 6038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 605f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 606f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 607f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 608a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 609f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 610e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 6118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 612f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 613f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 614c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) { 615f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 616acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner SmallString<128> Name; 6174813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Name.append(Prefix, Prefix+strlen(Prefix)); 6188da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 619acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind), 620acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner getELFSectionFlags(Kind), Kind); 621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 623f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 6248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6253b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 6263b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 6273b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 6288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 629067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 630067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 631067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 6328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov unsigned Align = 633067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 6348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6357e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 6363b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 6377e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 6383b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 6397e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 6403b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 6413b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 6428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6447e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 645a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer return getELFSection(Name, MCSectionELF::SHT_PROGBITS, 6468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | 6478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_MERGE | 6488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_STRINGS, 649b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 650f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 652f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 653203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst4() && MergeableConst4Section) 654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 655203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst8() && MergeableConst8Section) 656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 657203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst16() && MergeableConst16Section) 658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 659f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 662f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 6638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 664f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 665f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 6668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 667c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // Note: we claim that common symbols are put in BSSSection, but they are 668c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // really emitted with the magic .comm directive, which creates a symbol table 669c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // entry but not a section. 670a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 6718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 672f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 673f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 674f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 675f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 6768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 677f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 678f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 679f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 680f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 68183d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 682f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 683f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 684a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 68583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 6862a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst4() && MergeableConst4Section) 687f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 6882a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst8() && MergeableConst8Section) 689f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 6902a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst16() && MergeableConst16Section) 691f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 692f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 693f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 6948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 695f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 696f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 699f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 7009184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF:: 7019184b25fa543a900463215c11635c2c014ddb623Anton KorobeynikovgetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 7029184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding) const { 7039184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 7049184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov if (Encoding & dwarf::DW_EH_PE_indirect) { 7059184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 7069184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 7079184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov SmallString<128> Name; 7089184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 7099184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 7109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // Add information about the stub reference to ELFMMI so that the stub 7119184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // gets emitted by the asmprinter. 7129184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str()); 7139184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MCSymbol *&StubSym = ELFMMI.getGVStubEntry(Sym); 7149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov if (StubSym == 0) { 7159184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Name.clear(); 7169184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, false); 7179184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov StubSym = getContext().GetOrCreateSymbol(Name.str()); 7189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 7199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 7209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return TargetLoweringObjectFile:: 7219184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov getSymbolForDwarfReference(Sym, MMI, 7229184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Encoding & ~dwarf::DW_EH_PE_indirect); 7239184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 7249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 7259184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return TargetLoweringObjectFile:: 7269184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding); 7279184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 7289184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 729f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 730f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 731f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 732f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 7335dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 7345dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 7355dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 7365dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // If we have the MachO uniquing map, free it. 7375dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner delete (MachOUniqueMapTy*)UniquingMap; 7385dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner} 7390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 7405dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 7415dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO:: 7422928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section, 743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 744ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 7455dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // We unique sections by their segment/section pair. The returned section 7465dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // may not have the same flags as the requested section, if so this should be 7475dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // diagnosed by the client as an error. 7488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7495dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Create the map if it doesn't already exist. 7505dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (UniquingMap == 0) 7515dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner UniquingMap = new MachOUniqueMapTy(); 7525dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 7538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7545dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Form the name to look up. 7555dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner SmallString<64> Name; 75616df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Segment; 7575dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Name.push_back(','); 75816df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Section; 7598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7605dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Do the lookup, if we have a hit, return it. 76116df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar const MCSectionMachO *&Entry = Map[Name.str()]; 7625dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (Entry) return Entry; 7635dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 7645dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Otherwise, return a new section. 7655dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 7665dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Reserved2, Kind, getContext()); 767fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 768fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 76911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 770f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 771f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 77276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 77376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((MachOUniqueMapTy*)UniquingMap)->clear(); 774a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 776ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 777ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 778ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 779ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 780ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 781ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 7828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 783ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 784ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 785ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 786ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 787ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 788ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 789ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 790ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 793ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 7958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7964bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 7974bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 798ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 7994bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 8004bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 801ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 802ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 8030c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 8048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 805ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 806ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 8078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 808ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 809ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 810ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 811ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 812ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 813ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 814ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 815ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 816ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 817ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 818ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 819ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 820ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 821ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 822ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 823ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 824ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 825814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner DataCommonSection 826814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL, 827814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner SectionKind::getBSS()); 828814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner DataBSSSection 829814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner = getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, 830814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner SectionKind::getBSS()); 831814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner 8328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 833e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner LazySymbolPointerSection 834e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__la_symbol_ptr", 835e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 836e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 837e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner NonLazySymbolPointerSection 838e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__nl_symbol_ptr", 839e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 840e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 8418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 84280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 844ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 845ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 846ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 84780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 848ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 849ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 850ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 851ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 852ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 8538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 854ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 855ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 85680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 8578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 85818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 859fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 860fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling SectionKind::getDataRel()); 86135039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 862ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 863ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 864ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 865ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 866ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 867ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 86818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 86918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 8708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 871ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 8720c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 874ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 8750c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 877ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 8780c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 880ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 8810c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 883ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 8840c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 886ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 8870c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 889ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 8900c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 892ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 8930c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 895ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 8960c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 898ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 8990c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 9008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 901ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 9020c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 9038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfDebugInlineSection = 904ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 9050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 906f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 907f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 908a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 9098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 91024f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 911ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 912ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 913ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 914ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 915ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 916ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 917e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (!ErrorCode.empty()) { 918e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 919e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 920e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' has an invalid section specifier '" + GV->getSection()+ 921e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "': " + ErrorCode + "."); 922e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Fall back to dropping it into the data section. 923e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return DataSection; 924e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 9258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 926e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Get the section. 927e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner const MCSectionMachO *S = 928e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner getMachOSection(Segment, Section, TAA, StubSize, Kind); 9298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 930e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Okay, now that we got the section, verify that the TAA & StubSize agree. 931e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If the user declared multiple globals with different section flags, we need 932e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // to reject it here. 933e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 934e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 935e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 936e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' section type or attributes does not match previous" 937e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner " section specifier"); 938e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 9398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 940e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return S; 94124f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 94224f654c8a4d14066233480f683d3b0dececf374aChris Lattner 94324f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 944f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 945e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 946f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 9478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 948f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 94927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 9508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 951f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 952f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 95327602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 954f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 955f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 956f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 957f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 9588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 959f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 960ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 961ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 962ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 963ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 964ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 965824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 966ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 967ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 968f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 969f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 9708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 971f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 972f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 973f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 974f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 975f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 976f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 977f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 978f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 979ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 980ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 981ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 982f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 983f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 984f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 985f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 986f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 987f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 988f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 990aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner // Put zero initialized globals with strong external linkage in the 991aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner // DATA, __common section with the .zerofill directive. 992ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (Kind.isBSSExtern()) 993aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner return DataCommonSection; 994814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner 995814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner // Put zero initialized globals with local linkage in __DATA,__bss directive 996814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner // with the .zerofill directive (aka .lcomm). 997814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner if (Kind.isBSSLocal()) 998814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner return DataBSSSection; 999aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner 1000f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 1001f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 1002f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1003f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1004a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 100583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 1006f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 1007f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 1008a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 1009f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 10108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1011f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 1012f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 1013f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 1014f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 10154bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 1016f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 1017f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 1018f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1019f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 102026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 102126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 102226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 102326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 102426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 102526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 102626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 102726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 10288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 102926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 103026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 103126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 103226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 103326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 10340b3735e65af1cc3ff7fb76e2b30e2ffb2604f400Chris Lattner SmallString<64> Name; 1035036d8f9581c76b68cac08876be65b362c3a54bc3Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 103626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 103726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 103826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 10398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 104026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 104126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 104226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 10438c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO:: 10448c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 10459184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding) const { 10468c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The mach-o version of this method defaults to returning a stub reference. 10479184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 10489184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov if (Encoding & dwarf::DW_EH_PE_indirect) { 10499184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov SmallString<128> Name; 10509184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Mang->getNameWithPrefix(Name, GV, true); 10519184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Name += "$non_lazy_ptr"; 10529184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str()); 10539184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 10549184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return TargetLoweringObjectFile:: 10559184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov getSymbolForDwarfReference(Sym, MMI, 10569184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Encoding & ~dwarf::DW_EH_PE_indirect); 10579184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 10589184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 10599184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return TargetLoweringObjectFile:: 10609184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding); 10618c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 10628c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 106326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 1064f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 1065f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 1066f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 1067f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 106838cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 106938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 107038cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 107138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (COFFUniqueMapTy*)UniquingMap; 107238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 107338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 10740c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 107511e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10764813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const { 107738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Create the map if it doesn't already exist. 107838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 107938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new MachOUniqueMapTy(); 108038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 10818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 108238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 108338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner const MCSectionCOFF *&Entry = Map[Name]; 108438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 10858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 108638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 1087fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 1088fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 1089f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 1090f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 109176d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 109276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((COFFUniqueMapTy*)UniquingMap)->clear(); 1093a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 10940c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 10950c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 109680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 10970c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 109880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 10990c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 11008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 110135c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on COFF, even 110235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // though it contains relocatable pointers. In PIC mode, this is probably a 110335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // big runtime hit for C++ apps. Either the contents of the LSDA need to be 110435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // adjusted or this should be a data section. 110535c3531754c392a533921a465a22f67f7e8fb743Chris Lattner LSDASection = 110635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 110735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner EHFrameSection = 110835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 11098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 111018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 111118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 11128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 11130c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 11140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 11160c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 11170c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 11190c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 11200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 11220c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 11230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 112418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 11250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 11260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 112718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 11280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 11290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 11310c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 11320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 11340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 11350c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 11370c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 11380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 11400c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 11410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 11428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 11430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 11440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 1145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 114724f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 11488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 114924f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 1150a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer return getCOFFSection(GV->getSection(), false, Kind); 115124f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 115224f654c8a4d14066233480f683d3b0dececf374aChris Lattner 1153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 1155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 1156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 1157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 1158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 1159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1162a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 1163f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1164e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 1165f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 11668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 1168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 116927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 1170f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 11714813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 1172cab16cc9a34b8a18e9f91c99085b2f0a1d287e12Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 11734813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getCOFFSection(Name.str(), false, Kind); 1174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 11758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1176f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 1177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 11788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 1180f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 11818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 1182