TargetLoweringObjectFile.cpp revision ce8749e445fdd0493758932874bad50293647df9
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" 20a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h" 218c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h" 22f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h" 23b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCSectionELF.h" 248da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h" 2545111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h" 26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 275277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h" 28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 298f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h" 308da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h" 315dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h" 32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 39a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 42824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 43f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 4480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 4580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 46d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4735039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 5918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 6018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 63f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 891850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 901850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it. 921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner const ArrayType *ATy = cast<ArrayType>(C->getType()); 948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 971850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ATy->getNumElements() == 0) return false; 981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ConstantInt *Null = 1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (Null == 0 || Null->getZExtValue() != 0) 1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; // Not null terminated. 1038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Verify that the null doesn't occur anywhere else in the string. 1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 1061850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Reject constantexpr elements etc. 1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (!isa<ConstantInt>(CVA->getOperand(i)) || 1081850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner CVA->getOperand(i) == Null) 1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; 110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 1111850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 1151850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return ATy->getNumElements() == 1; 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 12058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 121968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 122968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 123968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 124968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 12558bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 12658bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 12758bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 12858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 1298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 1318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 1368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1402798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1412798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 144a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner // Variables with common linkage always get classified as common. 145a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (GVar->hasCommonLinkage()) 146a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner return SectionKind::getCommon(); 147a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 149ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (isSuitableForBSS(GVar)) { 150ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (GVar->hasLocalLinkage()) 151ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSLocal(); 152ce8749e445fdd0493758932874bad50293647df9Chris Lattner else if (GVar->hasExternalLinkage()) 153ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSExtern(); 1542798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 155ce8749e445fdd0493758932874bad50293647df9Chris Lattner } 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 1588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 1668f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1691850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov if (const IntegerType *ITy = 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1821850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1831850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1922798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2042798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 2082798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 2098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2172798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2212798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2312798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 2348f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2362798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2402798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 247a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 24858bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 249e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 250f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 25124f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 25224f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 256f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 25958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 261a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 262f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 264e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 266f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 268f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 269f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 271824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 272824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 274f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 28083d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 283a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 28483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a 2928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// pc-relative reference to the specified global variable from exception 2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// handling information. In addition to the symbol, this returns 2948c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// by-reference: 2958c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsIndirect - True if the returned symbol is actually a stub that contains 2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the address of the symbol, false if the symbol is the global itself. 2988c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2998c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsPCRel - True if the symbol reference is already pc-relative, false if 3008c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the caller needs to subtract off the address of the reference from the 3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// symbol. 3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 3048c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 3058609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 3068c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 3078c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The generic implementation of this just returns a direct reference to the 3088c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // symbol. 3098c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = false; 3108c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 3118c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 31245111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner // FIXME: Use GetGlobalValueSymbol. 3138c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 3148c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 3158c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 3168c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 318f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 319f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 320f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 321f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 32238cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 32338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 32438cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { 32538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // If we have the section uniquing map, free it. 32638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (ELFUniqueMapTy*)UniquingMap; 32738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 328f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 329fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 330b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags, 331b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind Kind, bool IsExplicit) const { 33238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 33338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new ELFUniqueMapTy(); 33438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; 3358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 33638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 337b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const MCSectionELF *&Entry = Map[Section]; 33838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 3398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 340fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit, 341fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes getContext()); 342fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 343fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 344f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 345f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 34676d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 34776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((ELFUniqueMapTy*)UniquingMap)->clear(); 348a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 349f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov BSSSection = 351b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".bss", MCSectionELF::SHT_NOBITS, 352b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 353b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getBSS()); 3548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TextSection = 356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".text", MCSectionELF::SHT_PROGBITS, 357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC, 358b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getText()); 359b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataSection = 361b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data", MCSectionELF::SHT_PROGBITS, 362b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 363b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 364b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov ReadOnlySection = 3668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 3678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC, 368b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnly()); 369b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSDataSection = 371b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 3728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 373b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadData()); 3748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSBSSSection = 376b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 378b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS()); 379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelSection = 381b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 383b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelLocalSection = 386b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 387b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 388b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRelLocal()); 389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROSection = 391b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 392b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 393b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRel()); 394b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROLocalSection = 396b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 398b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRelLocal()); 3998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 4008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst4Section = 401b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 402b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 403b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst4()); 404b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst8Section = 406b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 408b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst8()); 409b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst16Section = 411b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 412b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 413b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst16()); 41480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 41580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 4168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 417b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 418b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 419b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 42080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 421b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 422b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 423b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 4248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 42518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 4268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 427d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 428d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 429d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 430d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 431d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 432b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 433b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly()); 43435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 4358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 436b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 437b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner SectionKind::getDataRel()); 4388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 43918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 4408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 4418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 442b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 4448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 445b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 4478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 448b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 451b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 4538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 454b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 4568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 457b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 459b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 460b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 4628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 463b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 4658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 466b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 4688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 469b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 4718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 472b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 474f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind 47724f654c8a4d14066233480f683d3b0dececf374aChris LattnergetELFKindForNamedSection(const char *Name, SectionKind K) { 478f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 4798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 4814c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov if (strcmp(Name, ".bss") == 0 || 4824c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".bss.", 5) == 0 || 4834c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 484f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 4854c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strcmp(Name, ".sbss") == 0 || 4864c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".sbss.", 6) == 0 || 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 4892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 4908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 4952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 4968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 497f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 498f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 499f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 5012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 5028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 503f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 505f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 506b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5074813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 508b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5094813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".init_array") 510b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_INIT_ARRAY; 511b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5124813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".fini_array") 513b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_FINI_ARRAY; 514b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5154813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".preinit_array") 516b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PREINIT_ARRAY; 517b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 518b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isBSS() || K.isThreadBSS()) 519b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_NOBITS; 520b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 521b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PROGBITS; 522b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 523b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 524b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 525b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 526b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) { 527b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes unsigned Flags = 0; 528b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 529b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (!K.isMetadata()) 530b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_ALLOC; 5318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 532848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov if (K.isText()) 533848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 5348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 535b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isWriteable()) 536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_WRITE; 5378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 538b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isThreadLocal()) 539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_TLS; 5408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 541b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes // K.isMergeableConst() is left out to honour PR4650 542b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString() || K.isMergeableConst4() || 543b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes K.isMergeableConst8() || K.isMergeableConst16()) 544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_MERGE; 545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 546b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString()) 547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_STRINGS; 548b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 549b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return Flags; 550b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 552b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 55324f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 5548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 55524f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 556b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const char *SectionName = GV->getSection().c_str(); 557b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 55824f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 559b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind = getELFKindForNamedSection(SectionName, Kind); 5608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(SectionName, 5628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType(SectionName, Kind), 563b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSectionFlags(Kind), Kind, true); 56424f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 5698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 5728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 573f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 574f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 5778ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 578f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 579f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 580f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 582a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 583f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 584e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 5858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 587f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 588c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) { 589f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 590acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner SmallString<128> Name; 5914813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Name.append(Prefix, Prefix+strlen(Prefix)); 5928da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 593acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind), 594acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner getELFSectionFlags(Kind), Kind); 595f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 5968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 597f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 5988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5993b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 6003b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 6013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 6028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 603067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 604067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 605067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 6068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov unsigned Align = 607067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 6088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6097e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 6103b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 6117e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 6123b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 6137e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 6143b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 6153b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 6168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6187e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 6198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS, 6208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | 6218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_MERGE | 6228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_STRINGS, 623b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 626f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 627203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst4() && MergeableConst4Section) 628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 629203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst8() && MergeableConst8Section) 630f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 631203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst16() && MergeableConst16Section) 632f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 633f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 634f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 636f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 6378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 638f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 639f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 6408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 641c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // Note: we claim that common symbols are put in BSSSection, but they are 642c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // really emitted with the magic .comm directive, which creates a symbol table 643c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // entry but not a section. 644a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 6458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 646f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 647f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 648f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 649f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 6508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 651f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 652f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 653f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 65583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 657f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 658a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 65983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 6602a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst4() && MergeableConst4Section) 661f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 6622a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst8() && MergeableConst8Section) 663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 6642a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst16() && MergeableConst16Section) 665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 6688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 670f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 671f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 673f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 674f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 675f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 676f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 677f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 6785dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 6795dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6805dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 6815dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // If we have the MachO uniquing map, free it. 6825dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner delete (MachOUniqueMapTy*)UniquingMap; 6835dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner} 6840c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 6855dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6865dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO:: 6872928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section, 688ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 689ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 6905dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // We unique sections by their segment/section pair. The returned section 6915dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // may not have the same flags as the requested section, if so this should be 6925dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // diagnosed by the client as an error. 6938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6945dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Create the map if it doesn't already exist. 6955dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (UniquingMap == 0) 6965dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner UniquingMap = new MachOUniqueMapTy(); 6975dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 6988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6995dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Form the name to look up. 7005dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner SmallString<64> Name; 70116df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Segment; 7025dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Name.push_back(','); 70316df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Section; 7048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7055dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Do the lookup, if we have a hit, return it. 70616df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar const MCSectionMachO *&Entry = Map[Name.str()]; 7075dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (Entry) return Entry; 7085dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 7095dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Otherwise, return a new section. 7105dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 7115dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Reserved2, Kind, getContext()); 712fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 713fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 71411e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 715f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 716f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 71776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 71876d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((MachOUniqueMapTy*)UniquingMap)->clear(); 719a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 721ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 722ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 723ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 724ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 725ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 726ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 7278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 728ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 729ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 730ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 731ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 732ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 733ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 734ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 735ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 736ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 737ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 738ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 739ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 7408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7414bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 7424bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 7444bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 7454bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 746ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 747ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 7480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 7498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 750ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 751ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 7528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 753ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 754ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 755ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 756ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 757ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 758ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 759ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 760ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 761ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 762ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 763ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 764aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner DataCommonSection 765aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL, 766aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner SectionKind::getBSS()); 767ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 768ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 769ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 770ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 771ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 772ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 77380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 7748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 775e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner LazySymbolPointerSection 776e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__la_symbol_ptr", 777e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 778e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 779e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner NonLazySymbolPointerSection 780e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__nl_symbol_ptr", 781e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 782e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 7838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 78480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 785ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 786ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 787ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 788ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 78980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 790ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 793ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 7958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 796ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 797ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 79880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 7998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 80018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 801fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 802fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling SectionKind::getDataRel()); 80335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 804ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 805ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 806ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 807ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 808ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 809ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 81018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 81118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 8128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 813ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 8140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 816ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 8170c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 819ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 8200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 822ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 8230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 825ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 8260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 828ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 8290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 831ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 8320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 834ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 8350c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 837ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 8380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 840ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 8410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 8440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfDebugInlineSection = 846ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 8470c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 848f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 849f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 850a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 8518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 85224f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 853ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 854ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 855ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 856ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 857ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 858ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 859e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (!ErrorCode.empty()) { 860e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 861e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 862e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' has an invalid section specifier '" + GV->getSection()+ 863e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "': " + ErrorCode + "."); 864e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Fall back to dropping it into the data section. 865e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return DataSection; 866e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 868e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Get the section. 869e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner const MCSectionMachO *S = 870e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner getMachOSection(Segment, Section, TAA, StubSize, Kind); 8718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 872e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Okay, now that we got the section, verify that the TAA & StubSize agree. 873e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If the user declared multiple globals with different section flags, we need 874e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // to reject it here. 875e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 876e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 877e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 878e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' section type or attributes does not match previous" 879e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner " section specifier"); 880e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 882e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return S; 88324f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 88424f654c8a4d14066233480f683d3b0dececf374aChris Lattner 88524f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 886f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 887e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 888f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 8898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 890f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 89127602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 8928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 893f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 894f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 89527602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 896f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 897f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 898f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 899f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 9008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 901f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 902ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 903ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 904ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 905ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 906ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 907824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 908ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 909ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 910f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 911f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 9128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 913f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 914f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 915f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 916f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 917f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 918f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 919f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 920f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 921ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 922ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 923ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 924f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 925f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 926f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 927f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 928f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 929f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 930f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 932aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner // Put zero initialized globals with strong external linkage in the 933aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner // DATA, __common section with the .zerofill directive. 934ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (Kind.isBSSExtern()) 935aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner return DataCommonSection; 936aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner 937f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 938f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 939f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 940f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 941a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 94283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 943f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 944f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 945a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 946f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 948f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 949f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 950f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 951f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 9524bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 953f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 954f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 955f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 956f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 95726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 95826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 95926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 96026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 96126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 96226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 96326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 96426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 9658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 96626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 96726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 96826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 96926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 97026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 9710b3735e65af1cc3ff7fb76e2b30e2ffb2604f400Chris Lattner SmallString<64> Name; 972036d8f9581c76b68cac08876be65b362c3a54bc3Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 97326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 97426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 97526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 9768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 97726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 97826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 97926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 9808c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO:: 9818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 9828609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 9838c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 9848c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The mach-o version of this method defaults to returning a stub reference. 9858c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = true; 9868c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 9878c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 9888c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 9898c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, true); 9908c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Name += "$non_lazy_ptr"; 9918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 9928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 9938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 99426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 995f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 996f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 997f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 998f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 99938cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 100038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 100138cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 100238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (COFFUniqueMapTy*)UniquingMap; 100338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 100438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 10050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 100611e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10074813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const { 100838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Create the map if it doesn't already exist. 100938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 101038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new MachOUniqueMapTy(); 101138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 10128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 101338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 101438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner const MCSectionCOFF *&Entry = Map[Name]; 101538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 10168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 101738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 1018fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 1019fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 1020f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 1021f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 102276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 102376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((COFFUniqueMapTy*)UniquingMap)->clear(); 1024a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 10250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 10260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 102780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 10280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 102980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 10300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 10318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 103235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on COFF, even 103335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // though it contains relocatable pointers. In PIC mode, this is probably a 103435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // big runtime hit for C++ apps. Either the contents of the LSDA need to be 103535c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // adjusted or this should be a data section. 103635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner LSDASection = 103735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 103835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner EHFrameSection = 103935c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 10408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 104118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 104218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 10438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 10440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 10450c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 10470c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 10480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 10500c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 10510c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 10530c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 10540c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 105518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 10560c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 10570c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 105818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 10590c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 10600c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 10620c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 10630c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 10650c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 10660c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 10680c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 10690c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 10710c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 10720c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 10740c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 10750c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 1076f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1077f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 107824f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 108024f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 10810c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection(GV->getSection().c_str(), false, Kind); 108224f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 108324f654c8a4d14066233480f683d3b0dececf374aChris Lattner 1084f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1085f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 1086f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 1087f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 1088f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 1089f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 1090f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1091f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1092f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1093a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 1094f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1095e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 1096f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 10978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1098f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 1099f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 110027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 1101f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 11024813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 1103cab16cc9a34b8a18e9f91c99085b2f0a1d287e12Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 11044813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getCOFFSection(Name.str(), false, Kind); 1105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 11068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1107f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 1108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 11098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 1111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 11128c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 1113