TargetLoweringObjectFile.cpp revision c7fbe903898ebf322cc375127bca85f4011cb266
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. 149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1502798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 1538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 1618f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1641850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1651850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov if (const IntegerType *ITy = 1671850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1681850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1691850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1872798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1882798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1992798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 2032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 2048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2122798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2162798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2262798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 2298f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2312798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 236f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 238f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 242a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 24358bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 244e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 24624f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 24724f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 250f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 251f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 25458bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 256a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 257f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 258f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 259e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 261f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 264f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 266824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 267824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 269f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 27583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 278a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 27983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2868c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a 2878c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// pc-relative reference to the specified global variable from exception 2888c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// handling information. In addition to the symbol, this returns 2898c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// by-reference: 2908c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsIndirect - True if the returned symbol is actually a stub that contains 2928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the address of the symbol, false if the symbol is the global itself. 2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2948c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsPCRel - True if the symbol reference is already pc-relative, false if 2958c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the caller needs to subtract off the address of the reference from the 2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// symbol. 2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2988c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 2998c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 3008609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The generic implementation of this just returns a direct reference to the 3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // symbol. 3048c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = false; 3058c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 3068c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 30745111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner // FIXME: Use GetGlobalValueSymbol. 3088c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 3098c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 3108c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 3118c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 312f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 313f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 314f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 315f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 316f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 31738cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 31838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 31938cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { 32038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // If we have the section uniquing map, free it. 32138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (ELFUniqueMapTy*)UniquingMap; 32238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 323f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 324fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 325b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags, 326b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind Kind, bool IsExplicit) const { 32738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 32838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new ELFUniqueMapTy(); 32938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; 3308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 33138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 332b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const MCSectionELF *&Entry = Map[Section]; 33338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 3348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 335fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit, 336fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes getContext()); 337fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 338fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 339f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 340f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 34176d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 34276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((ELFUniqueMapTy*)UniquingMap)->clear(); 343a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 344f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov BSSSection = 346b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".bss", MCSectionELF::SHT_NOBITS, 347b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 348b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getBSS()); 3498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TextSection = 351b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".text", MCSectionELF::SHT_PROGBITS, 352b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC, 353b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getText()); 354b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataSection = 356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data", MCSectionELF::SHT_PROGBITS, 357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 358b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 359b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov ReadOnlySection = 3618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 3628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC, 363b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnly()); 364b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSDataSection = 366b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 3678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 368b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadData()); 3698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSBSSSection = 371b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 372b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 373b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS()); 374b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelSection = 376b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 378b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelLocalSection = 381b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 383b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRelLocal()); 384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROSection = 386b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 387b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 388b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRel()); 389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROLocalSection = 391b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 392b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 393b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRelLocal()); 3948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst4Section = 396b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 398b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst4()); 399b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst8Section = 401b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 402b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 403b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst8()); 404b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst16Section = 406b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 408b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst16()); 40980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 41080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 4118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 412b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 413b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 414b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 41580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 416b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 417b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 418b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 4198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 42018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 4218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 422d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 423d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 424d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 425d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 426d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 427b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 428b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly()); 42935039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 4308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 431b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 432b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner SectionKind::getDataRel()); 4338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 43418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 4358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 4368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 437b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 4398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 440b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 4428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 443b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 4458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 446b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 4488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 449b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 4518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 452b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 454b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 455b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 4578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 458b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 4608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 461b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 4638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 464b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 4668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 467b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 470f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind 47224f654c8a4d14066233480f683d3b0dececf374aChris LattnergetELFKindForNamedSection(const char *Name, SectionKind K) { 473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 4748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 4764c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov if (strcmp(Name, ".bss") == 0 || 4774c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".bss.", 5) == 0 || 4784c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 479f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 4804c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strcmp(Name, ".sbss") == 0 || 4814c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".sbss.", 6) == 0 || 482f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 483f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 4842798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 4858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 489f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 4902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 4918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 495f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 4962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 4978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 498f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 499f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 501b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5024813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 503b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5044813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".init_array") 505b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_INIT_ARRAY; 506b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5074813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".fini_array") 508b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_FINI_ARRAY; 509b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5104813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".preinit_array") 511b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PREINIT_ARRAY; 512b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 513b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isBSS() || K.isThreadBSS()) 514b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_NOBITS; 515b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 516b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PROGBITS; 517b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 518b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 519b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 520b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 521b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) { 522b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes unsigned Flags = 0; 523b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 524b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (!K.isMetadata()) 525b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_ALLOC; 5268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 527848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov if (K.isText()) 528848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 5298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 530b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isWriteable()) 531b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_WRITE; 5328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 533b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isThreadLocal()) 534b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_TLS; 5358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes // K.isMergeableConst() is left out to honour PR4650 537b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString() || K.isMergeableConst4() || 538b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes K.isMergeableConst8() || K.isMergeableConst16()) 539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_MERGE; 540b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 541b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString()) 542b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_STRINGS; 543b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return Flags; 545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 546b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54824f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 5498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 55024f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const char *SectionName = GV->getSection().c_str(); 552b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 55324f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 554b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind = getELFKindForNamedSection(SectionName, Kind); 5558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(SectionName, 5578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType(SectionName, Kind), 558b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSectionFlags(Kind), Kind, true); 55924f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 560f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 561f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 5648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 5678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 5728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 573f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 574f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 577a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 578f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 579e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 5808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 582f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 583c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) { 584f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 585acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner SmallString<128> Name; 5864813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Name.append(Prefix, Prefix+strlen(Prefix)); 5878da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 588acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind), 589acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner getELFSectionFlags(Kind), Kind); 590f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 5918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 592f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 5938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5943b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 5953b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 5963b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 5978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 598067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 599067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 600067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 6018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov unsigned Align = 602067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 6038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6047e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 6053b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 6067e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 6073b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 6087e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 6093b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 6103b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 6118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6137e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 6148ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS, 6158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | 6168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_MERGE | 6178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_STRINGS, 618b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 619f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 621f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 622203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst4() && MergeableConst4Section) 623f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 624203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst8() && MergeableConst8Section) 625f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 626203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst16() && MergeableConst16Section) 627f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 629f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 631f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 6328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 633f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 634f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 6358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 636c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // Note: we claim that common symbols are put in BSSSection, but they are 637c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // really emitted with the magic .comm directive, which creates a symbol table 638c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner // entry but not a section. 639a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner if (Kind.isBSS() || Kind.isCommon()) return BSSSection; 6408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 641f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 642f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 643f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 644f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 6458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 646f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 647f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 648f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 649f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 65083d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 651f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 652f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 653a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 65483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 6552a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst4() && MergeableConst4Section) 656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 6572a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst8() && MergeableConst8Section) 658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 6592a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst16() && MergeableConst16Section) 660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 661f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 662f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 6638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 664f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 668f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 670f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 671f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 6735dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 6745dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6755dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 6765dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // If we have the MachO uniquing map, free it. 6775dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner delete (MachOUniqueMapTy*)UniquingMap; 6785dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner} 6790c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 6805dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6815dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO:: 6822928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section, 683ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 684ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 6855dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // We unique sections by their segment/section pair. The returned section 6865dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // may not have the same flags as the requested section, if so this should be 6875dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // diagnosed by the client as an error. 6888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6895dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Create the map if it doesn't already exist. 6905dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (UniquingMap == 0) 6915dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner UniquingMap = new MachOUniqueMapTy(); 6925dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 6938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6945dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Form the name to look up. 6955dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner SmallString<64> Name; 69616df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Segment; 6975dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Name.push_back(','); 69816df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Section; 6998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7005dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Do the lookup, if we have a hit, return it. 70116df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar const MCSectionMachO *&Entry = Map[Name.str()]; 7025dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (Entry) return Entry; 7035dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 7045dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Otherwise, return a new section. 7055dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 7065dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Reserved2, Kind, getContext()); 707fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 708fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 70911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 710f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 711f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 71276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 71376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((MachOUniqueMapTy*)UniquingMap)->clear(); 714a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 716ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 717ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 718ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 719ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 720ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 721ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 7228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 723ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 724ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 725ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 726ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 727ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 728ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 729ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 730ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 731ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 732ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 733ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 734ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 7358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7364bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 7374bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 738ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 7394bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 7404bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 741ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 742ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 7430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 7448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 745ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 746ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 7478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 748ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 749ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 750ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 751ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 752ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 753ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 754ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 755ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 756ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 757ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 758ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 759aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner DataCommonSection 760aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL, 761aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner SectionKind::getBSS()); 762ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 763ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 764ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 765ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 766ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 767ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 76880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 7698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 770e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner LazySymbolPointerSection 771e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__la_symbol_ptr", 772e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 773e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 774e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner NonLazySymbolPointerSection 775e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__nl_symbol_ptr", 776e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 777e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 7788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 77980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 780ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 781ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 782ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 783ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 78480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 785ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 786ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 787ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 788ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 789ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 7908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 79380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 7948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 79518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 796fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 797fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling SectionKind::getDataRel()); 79835039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 799ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 800ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 801ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 802ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 803ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 804ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 80518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 80618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 8078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 808ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 8090c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 811ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 8120c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 814ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 8150c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 817ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 8180c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 820ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 8210c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 823ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 8240c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 826ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 8270c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 829ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 8300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 832ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 8330c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 835ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 8360c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 838ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 8390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfDebugInlineSection = 841ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 8420c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 843f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 844f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 845a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 8468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 84724f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 848ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 849ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 850ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 851ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 852ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 853ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 854e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (!ErrorCode.empty()) { 855e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 856e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 857e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' has an invalid section specifier '" + GV->getSection()+ 858e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "': " + ErrorCode + "."); 859e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Fall back to dropping it into the data section. 860e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return DataSection; 861e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 863e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Get the section. 864e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner const MCSectionMachO *S = 865e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner getMachOSection(Segment, Section, TAA, StubSize, Kind); 8668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 867e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Okay, now that we got the section, verify that the TAA & StubSize agree. 868e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If the user declared multiple globals with different section flags, we need 869e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // to reject it here. 870e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 871e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 872e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 873e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' section type or attributes does not match previous" 874e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner " section specifier"); 875e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 877e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return S; 87824f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 87924f654c8a4d14066233480f683d3b0dececf374aChris Lattner 88024f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 881f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 882e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 883f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 8848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 885f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 88627602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 8878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 888f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 889f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 89027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 891f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 892f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 893f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 894f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 8958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 896f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 897ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 898ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 899ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 900ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 901ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 902824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 903ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 904ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 905f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 906f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 9078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 908f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 909f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 910f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 911f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 912f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 913f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 914f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 915f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 916ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 917ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 918ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 919f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 920f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 921f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 922f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 923f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 924f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 925f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 927aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner // Put zero initialized globals with strong external linkage in the 928aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner // DATA, __common section with the .zerofill directive. 929aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner if (Kind.isBSS() && GV->hasExternalLinkage()) 930aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner return DataCommonSection; 931aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner 932f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 933f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 934f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 935f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 936a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 93783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 938f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 939f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 940a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 941f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 943f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 944f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 945f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 946f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 9474bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 948f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 949f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 950f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 951f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 95226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 95326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 95426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 95526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 95626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 95726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 95826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 95926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 9608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 96126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 96226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 96326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 96426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 96526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 9660b3735e65af1cc3ff7fb76e2b30e2ffb2604f400Chris Lattner SmallString<64> Name; 967036d8f9581c76b68cac08876be65b362c3a54bc3Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 96826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 96926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 97026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 9718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 97226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 97326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 97426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 9758c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO:: 9768c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 9778609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 9788c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 9798c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The mach-o version of this method defaults to returning a stub reference. 9808c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = true; 9818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 9828c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 9838c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 9848c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, true); 9858c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Name += "$non_lazy_ptr"; 9868c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 9878c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 9888c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 98926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 990f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 991f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 992f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 993f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 99438cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 99538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 99638cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 99738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (COFFUniqueMapTy*)UniquingMap; 99838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 99938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 10000c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 100111e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10024813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const { 100338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Create the map if it doesn't already exist. 100438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 100538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new MachOUniqueMapTy(); 100638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 10078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 100838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 100938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner const MCSectionCOFF *&Entry = Map[Name]; 101038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 10118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 101238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 1013fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 1014fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 1015f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 1016f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 101776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 101876d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((COFFUniqueMapTy*)UniquingMap)->clear(); 1019a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 10200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 10210c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 102280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 10230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 102480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 10250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 10268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 102735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on COFF, even 102835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // though it contains relocatable pointers. In PIC mode, this is probably a 102935c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // big runtime hit for C++ apps. Either the contents of the LSDA need to be 103035c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // adjusted or this should be a data section. 103135c3531754c392a533921a465a22f67f7e8fb743Chris Lattner LSDASection = 103235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 103335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner EHFrameSection = 103435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 10358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 103618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 103718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 10388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 10390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 10400c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 10420c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 10430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 10450c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 10460c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 10480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 10490c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 105018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 10510c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 10520c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 105318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 10540c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 10550c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 10570c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 10580c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 10600c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 10610c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 10630c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 10640c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 10660c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 10670c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 10690c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 10700c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 1071f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1072f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 107324f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 107524f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 10760c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection(GV->getSection().c_str(), false, Kind); 107724f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 107824f654c8a4d14066233480f683d3b0dececf374aChris Lattner 1079f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1080f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 1081f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 1082f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 1083f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 1084f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 1085f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1086f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1087f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1088a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 1089f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1090e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 1091f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 10928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1093f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 1094f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 109527602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 1096f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 10974813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 1098cab16cc9a34b8a18e9f91c99085b2f0a1d287e12Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 10994813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getCOFFSection(Name.str(), false, Kind); 1100f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 11018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1102f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 1103f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 11048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 1106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 11078c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 1108