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" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h" 200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h" 21a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h" 228c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h" 2342263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner#include "llvm/MC/MCStreamer.h" 248da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h" 259184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h" 268f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h" 278da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h" 28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/Mangler.h" 29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 37e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng/// Initialize - this method must be called before any actual lowering is 38e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng/// done. This specifies the current context for codegen, and gives the 39e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng/// lowering implementations a chance to set up their default sections. 40e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Chengvoid TargetLoweringObjectFile::Initialize(MCContext &ctx, 41e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng const TargetMachine &TM) { 42e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng Ctx = &ctx; 43203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng InitMCObjectFileInfo(TM.getTargetTriple(), 44203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng TM.getRelocationModel(), TM.getCodeModel(), *Ctx); 45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 46e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng 47f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 48f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 49f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic bool isSuitableForBSS(const GlobalVariable *GV, bool NoZerosInBSS) { 517d715dfe6d66be257926f626df96a0e2bd38dc1fJay Foad const Constant *C = GV->getInitializer(); 528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 53f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 7529cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner/// nul value and contains no other nuls in it. Note that this is more general 7629cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner/// than ConstantDataSequential::isString because we allow 2 & 4 byte strings. 771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 7829cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner // First check: is we have constant array terminated with zero 7929cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(C)) { 8029cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner unsigned NumElts = CDS->getNumElements(); 8129cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner assert(NumElts != 0 && "Can't have an empty CDS"); 8229cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner 8329cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner if (CDS->getElementAsInteger(NumElts-1) != 0) 8429cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner return false; // Not null terminated. 8529cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner 8629cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner // Verify that the null doesn't occur anywhere else in the string. 8729cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner for (unsigned i = 0; i != NumElts-1; ++i) 8829cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner if (CDS->getElementAsInteger(i) == 0) 8929cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner return false; 9029cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner return true; 9129cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner } 92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 9529cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner return cast<ArrayType>(C->getType())->getNumElements() == 1; 96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1007afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael EspindolaMCSymbol *TargetLoweringObjectFile:: 10160246a96224c8b790177253bf25433b93b335d2bRafael EspindolagetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 1027afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola MachineModuleInfo *MMI) const { 1037afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola return Mang->getSymbol(GV); 10430deafc84adf88f643cdc39dc97a37537155347fRafael Espindola} 10530deafc84adf88f643cdc39dc97a37537155347fRafael Espindola 10630deafc84adf88f643cdc39dc97a37537155347fRafael Espindolavoid TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer, 10730deafc84adf88f643cdc39dc97a37537155347fRafael Espindola const TargetMachine &TM, 10830deafc84adf88f643cdc39dc97a37537155347fRafael Espindola const MCSymbol *Sym) const { 10930deafc84adf88f643cdc39dc97a37537155347fRafael Espindola} 11030deafc84adf88f643cdc39dc97a37537155347fRafael Espindola 11130deafc84adf88f643cdc39dc97a37537155347fRafael Espindola 11258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 113968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 114968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 115968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 116968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 11758bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 11858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 11958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 12058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 1218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 1238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 1288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 1318a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky if (isSuitableForBSS(GVar, TM.Options.NoZerosInBSS)) 1322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 136a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner // Variables with common linkage always get classified as common. 137a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (GVar->hasCommonLinkage()) 138a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner return SectionKind::getCommon(); 139a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 1418a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky if (isSuitableForBSS(GVar, TM.Options.NoZerosInBSS)) { 142ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (GVar->hasLocalLinkage()) 143ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSLocal(); 144ce8749e445fdd0493758932874bad50293647df9Chris Lattner else if (GVar->hasExternalLinkage()) 145ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSExtern(); 1462798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 147ce8749e445fdd0493758932874bad50293647df9Chris Lattner } 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1497d715dfe6d66be257926f626df96a0e2bd38dc1fJay Foad const Constant *C = GVar->getInitializer(); 1508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 15332899199c043269b4dfab7f0429cc946e67bd54dChris Lattner if (GVar->isConstant()) { 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 155f2eed387d48e36f12a9945c6b71b20bdc7f46e3aEric Christopher // relocation, then we may have to drop this into a writable data section 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 15932899199c043269b4dfab7f0429cc946e67bd54dChris Lattner // If the global is required to have a unique address, it can't be put 16032899199c043269b4dfab7f0429cc946e67bd54dChris Lattner // into a mergable section: just drop it into the general read-only 16132899199c043269b4dfab7f0429cc946e67bd54dChris Lattner // section instead. 16232899199c043269b4dfab7f0429cc946e67bd54dChris Lattner if (!GVar->hasUnnamedAddr()) 16332899199c043269b4dfab7f0429cc946e67bd54dChris Lattner return SectionKind::getReadOnly(); 16432899199c043269b4dfab7f0429cc946e67bd54dChris Lattner 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1661850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 167db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner if (ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 168db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner if (IntegerType *ITy = 1691850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1778ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1821850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 1873574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow switch (TM.getDataLayout()->getTypeAllocSize(C->getType())) { 1882798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 2052798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 2068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2142798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2182798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2282798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2342798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2362798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 238732f05c41f177a0bc4d47e93a5d02120f146cb4cChandler Carruth llvm_unreachable("Invalid relocation"); 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 244a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 24558bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 246e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 24824f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 24924f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 253f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 25658bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 258a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 259f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 260f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 261e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 265f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 268824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 269824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 271f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 27783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 280a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 28183d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 28825efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov/// getTTypeGlobalReference - Return an MCExpr to use for a 2899184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// reference to the specified global variable from exception 2909184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// handling information. 2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 29225efd6d556718295a63d37f5294985746af354f6Anton KorobeynikovgetTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 29325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding, 29425efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov MCStreamer &Streamer) const { 29525efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov const MCSymbolRefExpr *Ref = 29625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov MCSymbolRefExpr::Create(Mang->getSymbol(GV), getContext()); 29725efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov 29825efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov return getTTypeReference(Ref, Encoding, Streamer); 2999184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3009184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3019184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFile:: 30225efd6d556718295a63d37f5294985746af354f6Anton KorobeynikovgetTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding, 30325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov MCStreamer &Streamer) const { 304f0adba9a7ec8a3031876575a6ffb7db5f1b6f855Rafael Espindola switch (Encoding & 0x70) { 3059184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov default: 30675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner report_fatal_error("We do not support this DWARF encoding yet!"); 3079184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov case dwarf::DW_EH_PE_absptr: 3089184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // Do nothing special 30925efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov return Sym; 31042263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner case dwarf::DW_EH_PE_pcrel: { 31142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner // Emit a label to the streamer for the current position. This gives us 31242263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner // .-foo addressing. 31377e76940269b1bed36bc31ee5139b5c90fd13836Chris Lattner MCSymbol *PCSym = getContext().CreateTempSymbol(); 31442263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner Streamer.EmitLabel(PCSym); 31542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext()); 31625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov return MCBinaryExpr::CreateSub(Sym, PC, getContext()); 31742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner } 3189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 3199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 320