TargetLoweringObjectFile.cpp revision 4813035b726e7f0a3fd17bec437185fc72a50988
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" 24f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 255277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h" 26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 278f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h" 28a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/Support/Mangler.h" 295dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h" 30f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 37a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 40824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 4280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 4380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 44d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4535039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 4618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 61f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 881850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 891850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it. 901850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner const ArrayType *ATy = cast<ArrayType>(C->getType()); 928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ATy->getNumElements() == 0) return false; 961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 971850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ConstantInt *Null = 981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (Null == 0 || Null->getZExtValue() != 0) 1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; // Not null terminated. 1018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Verify that the null doesn't occur anywhere else in the string. 1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Reject constantexpr elements etc. 1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (!isa<ConstantInt>(CVA->getOperand(i)) || 1061850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner CVA->getOperand(i) == Null) 1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; 108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 1131850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return ATy->getNumElements() == 1; 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 11858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 119968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 120968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 121968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 122968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 12358bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 12458bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 12558bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 12658bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 1278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 1298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 1348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1392798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1442798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 1478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 1558f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1581850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1591850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov if (const IntegerType *ITy = 1611850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1621850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1631850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1641850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1651850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1661850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1671850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1681850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 176f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1802798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1812798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1822798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 1948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 1972798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 1988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2202798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 2238f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2252798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2292798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 236a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 23758bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 238e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 24024f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 24124f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 245f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 24858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 250a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 251f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 252f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 253e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 255f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 257f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 260824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 261824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 264f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 26983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 272a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 27383d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2808c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a 2818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// pc-relative reference to the specified global variable from exception 2828c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// handling information. In addition to the symbol, this returns 2838c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// by-reference: 2848c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2858c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsIndirect - True if the returned symbol is actually a stub that contains 2868c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the address of the symbol, false if the symbol is the global itself. 2878c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2888c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsPCRel - True if the symbol reference is already pc-relative, false if 2898c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the caller needs to subtract off the address of the reference from the 2908c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// symbol. 2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 2948609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 2958c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The generic implementation of this just returns a direct reference to the 2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // symbol. 2988c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = false; 2998c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 3008c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 3048c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 305f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 306f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 307f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 308f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 309f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 31038cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 31138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 31238cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { 31338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // If we have the section uniquing map, free it. 31438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (ELFUniqueMapTy*)UniquingMap; 31538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 316f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 317fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 318b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags, 319b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind Kind, bool IsExplicit) const { 32038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 32138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new ELFUniqueMapTy(); 32238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; 3238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 32438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 325b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const MCSectionELF *&Entry = Map[Section]; 32638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 3278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 328fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit, 329fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes getContext()); 330fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 331fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 332f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 333f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 33476d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 33576d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((ELFUniqueMapTy*)UniquingMap)->clear(); 336a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 337f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov BSSSection = 339b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".bss", MCSectionELF::SHT_NOBITS, 340b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 341b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getBSS()); 3428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TextSection = 344b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".text", MCSectionELF::SHT_PROGBITS, 345b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC, 346b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getText()); 347b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataSection = 349b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data", MCSectionELF::SHT_PROGBITS, 350b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 351b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 352b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov ReadOnlySection = 3548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 3558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC, 356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnly()); 357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSDataSection = 359b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 3608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 361b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadData()); 3628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSBSSSection = 364b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 365b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 366b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS()); 367b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelSection = 369b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 370b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 371b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 372b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelLocalSection = 374b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 375b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 376b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRelLocal()); 377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROSection = 379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 380b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 381b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRel()); 382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROLocalSection = 384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 385b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 386b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRelLocal()); 3878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst4Section = 389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 390b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 391b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst4()); 392b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst8Section = 394b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 395b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 396b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst8()); 397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst16Section = 399b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 400b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 401b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst16()); 40280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 40380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 4048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 405b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 406b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 40880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 409b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 410b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 411b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 4128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 41318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 4148ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 415d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 416d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 417d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 418d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 419d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 420b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 421b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly()); 42235039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 4238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 424b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 425b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner SectionKind::getDataRel()); 4268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 42718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 4288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 4298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 430b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 4328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 433b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 4358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 436b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 4388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 439b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 4418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 442b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 4448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 445b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 447b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 448b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 451b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 4538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 454b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 4568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 457b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 4598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 460b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 462f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 463f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind 46524f654c8a4d14066233480f683d3b0dececf374aChris LattnergetELFKindForNamedSection(const char *Name, SectionKind K) { 466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 4678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 4694c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov if (strcmp(Name, ".bss") == 0 || 4704c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".bss.", 5) == 0 || 4714c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 472f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 4734c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strcmp(Name, ".sbss") == 0 || 4744c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".sbss.", 6) == 0 || 475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 4772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 4788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 479f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 481f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 482f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 4832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 4848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 4892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 4908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 494b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4954813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 496b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4974813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".init_array") 498b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_INIT_ARRAY; 499b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5004813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".fini_array") 501b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_FINI_ARRAY; 502b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5034813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".preinit_array") 504b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PREINIT_ARRAY; 505b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 506b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isBSS() || K.isThreadBSS()) 507b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_NOBITS; 508b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 509b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PROGBITS; 510b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 511b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 512b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 513b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 514b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) { 515b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes unsigned Flags = 0; 516b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 517b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (!K.isMetadata()) 518b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_ALLOC; 5198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 520848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov if (K.isText()) 521848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 5228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 523b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isWriteable()) 524b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_WRITE; 5258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 526b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isThreadLocal()) 527b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_TLS; 5288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 529b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes // K.isMergeableConst() is left out to honour PR4650 530b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString() || K.isMergeableConst4() || 531b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes K.isMergeableConst8() || K.isMergeableConst16()) 532b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_MERGE; 533b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 534b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString()) 535b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_STRINGS; 536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 537b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return Flags; 538b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 540b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54124f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 5428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 54324f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const char *SectionName = GV->getSection().c_str(); 545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54624f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind = getELFKindForNamedSection(SectionName, Kind); 5488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(SectionName, 5508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType(SectionName, Kind), 551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSectionFlags(Kind), Kind, true); 55224f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 553f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 5578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 558f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 559f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 5608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 561f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 564f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 5668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 571a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 572f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 573e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 5748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 57727602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 578f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 5794813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name; 5804813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Name.append(Prefix, Prefix+strlen(Prefix)); 5814813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Mang->makeNameProper(Name, GV->getName()); 582b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5834813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getELFSection(Name.str(), 5844813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner getELFSectionType(Name.str(), Kind), 5858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionFlags(Kind), 586b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 587f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 5888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 589f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 5908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5913b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 5923b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 5933b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 5948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 595067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 596067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 597067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 5988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov unsigned Align = 599067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 6008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6017e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 6023b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 6037e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 6043b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 6057e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 6063b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 6073b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 6088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6107e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 6118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS, 6128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | 6138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_MERGE | 6148ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_STRINGS, 615b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 616f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 618f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 619203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst4() && MergeableConst4Section) 620f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 621203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst8() && MergeableConst8Section) 622f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 623203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst16() && MergeableConst16Section) 624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 625f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 626f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 628f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 6298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 630f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 631f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 6328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 633824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS()) return BSSSection; 6348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 635f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 636f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 637f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 638f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 6398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 640f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 641f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 642f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 643f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 64483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 645f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 646f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 647a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 64883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 6492a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst4() && MergeableConst4Section) 650f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 6512a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst8() && MergeableConst8Section) 652f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 6532a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst16() && MergeableConst16Section) 654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 655f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 6578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 659f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 661f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 662f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 664f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 6675dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 6685dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6695dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 6705dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // If we have the MachO uniquing map, free it. 6715dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner delete (MachOUniqueMapTy*)UniquingMap; 6725dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner} 6730c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 6745dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6755dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO:: 6762928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section, 677ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 678ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 6795dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // We unique sections by their segment/section pair. The returned section 6805dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // may not have the same flags as the requested section, if so this should be 6815dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // diagnosed by the client as an error. 6828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6835dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Create the map if it doesn't already exist. 6845dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (UniquingMap == 0) 6855dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner UniquingMap = new MachOUniqueMapTy(); 6865dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 6878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6885dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Form the name to look up. 6895dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner SmallString<64> Name; 69016df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Segment; 6915dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Name.push_back(','); 69216df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Section; 6938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6945dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Do the lookup, if we have a hit, return it. 69516df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar const MCSectionMachO *&Entry = Map[Name.str()]; 6965dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (Entry) return Entry; 6975dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6985dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Otherwise, return a new section. 6995dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 7005dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Reserved2, Kind, getContext()); 701fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 702fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 70311e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 704f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 705f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 70676d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 70776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((MachOUniqueMapTy*)UniquingMap)->clear(); 708a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 710ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 711ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 712ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 713ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 714ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 715ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 7168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 717ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 718ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 719ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 720ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 721ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 722ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 723ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 724ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 725ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 726ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 727ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 728ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 7298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7304bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 7314bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 732ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 7334bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 7344bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 735ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 736ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 7370c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 7388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 739ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 740ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 7418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 742ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 744ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 745ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 746ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 747ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 748ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 749ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 750ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 751ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 752ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 753ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 754ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 755ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 756ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 757ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 758ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 75980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 7608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 761e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner LazySymbolPointerSection 762e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__la_symbol_ptr", 763e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 764e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 765e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner NonLazySymbolPointerSection 766e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__nl_symbol_ptr", 767e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 768e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 7698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 77080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 771ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 772ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 773ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 774ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 77580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 776ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 777ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 778ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 779ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 780ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 7818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 782ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 783ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 78480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 7858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 78618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 787fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 788fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling SectionKind::getDataRel()); 78935039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 790ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 793ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 795ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 79618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 79718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 7988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 799ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 8000c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 802ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 8030c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 805ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 8060c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 808ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 8090c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 811ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 8120c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 814ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 8150c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 817ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 8180c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 820ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 8210c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 823ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 8240c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 826ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 8270c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 829ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 8300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfDebugInlineSection = 832ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 8330c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 834f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 835f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 836a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 8378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 83824f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 839ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 840ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 841ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 842ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 844ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 845e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (!ErrorCode.empty()) { 846e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 847e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 848e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' has an invalid section specifier '" + GV->getSection()+ 849e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "': " + ErrorCode + "."); 850e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Fall back to dropping it into the data section. 851e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return DataSection; 852e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 854e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Get the section. 855e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner const MCSectionMachO *S = 856e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner getMachOSection(Segment, Section, TAA, StubSize, Kind); 8578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 858e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Okay, now that we got the section, verify that the TAA & StubSize agree. 859e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If the user declared multiple globals with different section flags, we need 860e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // to reject it here. 861e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 862e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 863e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 864e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' section type or attributes does not match previous" 865e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner " section specifier"); 866e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 868e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return S; 86924f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 87024f654c8a4d14066233480f683d3b0dececf374aChris Lattner 87124f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 872f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 873e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 874f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 8758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 876f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 87727602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 8788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 879f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 880f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 88127602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 882f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 883f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 884f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 885f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 8868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 887f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 888ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 889ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 890ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 891ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 892ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 893824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 894ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 895ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 896f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 897f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 8988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 899f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 900f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 901f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 902f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 903f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 904f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 905f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 906f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 907ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 908ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 909ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 910f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 911f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 912f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 913f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 914f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 915f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 916f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 918f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 919f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 920f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 921f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 922a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 92383d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 924f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 925f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 926a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 927f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 929f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 930f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 931f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 932f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 9334bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 934f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 935f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 936f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 937f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 93826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 93926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 94026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 94126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 94226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 94326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 94426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 94526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 9468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 94726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 94826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 94926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 95026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 95126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 95226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 95326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 95426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 95526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 9568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 95726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 95826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 95926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 9608c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO:: 9618c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 9628609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 9638c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 9648c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The mach-o version of this method defaults to returning a stub reference. 9658c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = true; 9668c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 9678c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 9688c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 9698c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, true); 9708c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Name += "$non_lazy_ptr"; 9718c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 9728c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 9738c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 97426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 975f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 976f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 977f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 978f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 97938cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 98038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 98138cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 98238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (COFFUniqueMapTy*)UniquingMap; 98338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 98438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 9850c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 98611e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 9874813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const { 98838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Create the map if it doesn't already exist. 98938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 99038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new MachOUniqueMapTy(); 99138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 9928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 99338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 99438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner const MCSectionCOFF *&Entry = Map[Name]; 99538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 9968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 99738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 998fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 999fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 1000f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 1001f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 100276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 100376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((COFFUniqueMapTy*)UniquingMap)->clear(); 1004a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 10050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 10060c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 100780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 10080c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 100980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 10100c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 10118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 101235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on COFF, even 101335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // though it contains relocatable pointers. In PIC mode, this is probably a 101435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // big runtime hit for C++ apps. Either the contents of the LSDA need to be 101535c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // adjusted or this should be a data section. 101635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner LSDASection = 101735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 101835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner EHFrameSection = 101935c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 10208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 102118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 102218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 10238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 10240c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 10250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 10270c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 10280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 10300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 10310c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 10330c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 10340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 103518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 10360c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 10370c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 103818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 10390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 10400c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 10420c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 10430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 10450c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 10460c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 10480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 10490c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 10510c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 10520c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 10540c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 10550c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 1056f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1057f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 105824f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 106024f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 10610c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection(GV->getSection().c_str(), false, Kind); 106224f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 106324f654c8a4d14066233480f683d3b0dececf374aChris Lattner 1064f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1065f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 1066f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 1067f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 1068f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 1069f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 1070f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1071f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1072f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1073a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 1074f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1075e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 1076f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 10778ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1078f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 1079f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 108027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 1081f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 10824813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 10834813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Mang->makeNameProper(Name, GV->getNameStr()); 10844813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getCOFFSection(Name.str(), false, Kind); 1085f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 10868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1087f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 1088f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 10898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1090f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 1091f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 10928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 1093