TargetLoweringObjectFile.cpp revision 42263e2e407ab7d1d805e7b41cffd7217134d3b6
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" 2242263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner#include "llvm/MC/MCStreamer.h" 238da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h" 2445111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h" 25f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 265277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h" 27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 289184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h" 298f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h" 308da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h" 315dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h" 32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 38a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 41824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 42f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 4380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 4480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 45d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4635039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 5918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 6009d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner 6109d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner IsFunctionEHSymbolGlobal = false; 6209d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner IsFunctionEHFrameSymbolPrivate = true; 6309d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner SupportsWeakOmittedEHFrame = true; 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 66f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it. 951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner const ArrayType *ATy = cast<ArrayType>(C->getType()); 978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ATy->getNumElements() == 0) return false; 1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ConstantInt *Null = 1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (Null == 0 || Null->getZExtValue() != 0) 1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; // Not null terminated. 1068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Verify that the null doesn't occur anywhere else in the string. 1081850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Reject constantexpr elements etc. 1101850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (!isa<ConstantInt>(CVA->getOperand(i)) || 1111850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner CVA->getOperand(i) == Null) 1121850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; 113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 1141850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 1181850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return ATy->getNumElements() == 1; 119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 12358bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 124968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 125968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 126968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 127968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 12858bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 12958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 13058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 13158bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 1328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 1348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 1398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1442798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 147a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner // Variables with common linkage always get classified as common. 148a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (GVar->hasCommonLinkage()) 149a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner return SectionKind::getCommon(); 150a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 152ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (isSuitableForBSS(GVar)) { 153ce8749e445fdd0493758932874bad50293647df9Chris Lattner if (GVar->hasLocalLinkage()) 154ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSLocal(); 155ce8749e445fdd0493758932874bad50293647df9Chris Lattner else if (GVar->hasExternalLinkage()) 156ce8749e445fdd0493758932874bad50293647df9Chris Lattner return SectionKind::getBSSExtern(); 1572798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 158ce8749e445fdd0493758932874bad50293647df9Chris Lattner } 159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 1618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 1698f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov if (const IntegerType *ITy = 1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1821850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1861850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1881850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1972798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2072798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 2112798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 2128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2202798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2242798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2342798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 236f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 2378f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 238f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2392798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2412798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 250a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 25158bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 252e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 25424f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 25524f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 259f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 261f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 26258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 263f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 264a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 265f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 266f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 267e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 269f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 271f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 274824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 275824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 277f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 28383d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 286a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 28783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2943192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner/// getExprForDwarfGlobalReference - Return an MCExpr to use for a 2959184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// reference to the specified global variable from exception 2969184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// handling information. 2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 2983192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 2993192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MachineModuleInfo *MMI, unsigned Encoding, 3003192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner MCStreamer &Streamer) const { 30145111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner // FIXME: Use GetGlobalValueSymbol. 3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 30498cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner const MCSymbol *Sym; 30598cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner 30698cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner if (GV->hasPrivateLinkage()) 30798cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner Sym = getContext().GetOrCreateTemporarySymbol(Name.str()); 30898cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner else 30998cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner Sym = getContext().GetOrCreateSymbol(Name.str()); 3109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 31142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner return getExprForDwarfReference(Sym, Mang, MMI, Encoding, Streamer); 3129184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3139184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFile:: 31542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris LattnergetExprForDwarfReference(const MCSymbol *Sym, Mangler *Mang, 31642263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner MachineModuleInfo *MMI, unsigned Encoding, 31742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner MCStreamer &Streamer) const { 3189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext()); 3199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov switch (Encoding & 0xF0) { 3219184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov default: 322b76beda30a3630a9fd5fde10f43d27dd51fb5037Bill Wendling llvm_report_error("We do not support this DWARF encoding yet!"); 3239184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov case dwarf::DW_EH_PE_absptr: 3249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // Do nothing special 32542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner return Res; 32642263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner case dwarf::DW_EH_PE_pcrel: { 32742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner // Emit a label to the streamer for the current position. This gives us 32842263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner // .-foo addressing. 32942263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner SmallString<128> Name; 33042263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner Mang->getNameWithPrefix(Name, Twine("PCtemp") + Twine(Mang->getUniqueID()), 33142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner Mangler::Private); 33242263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner 33342263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner MCSymbol *PCSym = getContext().GetOrCreateTemporarySymbol(Name.str()); 33442263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner Streamer.EmitLabel(PCSym); 33542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext()); 33642263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner return MCBinaryExpr::CreateSub(Res, PC, getContext()); 33742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner } 3389184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 3399184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3409184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3419184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getPersonalityEncoding() const { 3429184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3439184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3449184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3459184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getLSDAEncoding() const { 3469184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3479184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 3489184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 3499184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getFDEEncoding() const { 3509184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3518c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 352f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3539184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getTTypeEncoding() const { 3549184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return dwarf::DW_EH_PE_absptr; 3559184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 356f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 357