TargetLoweringObjectFile.cpp revision fb7634f1c7a804829fc55e3711ba62c8ade818d0
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 495b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 496b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionType(const char *Name, SectionKind K) { 497b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 498fa9ca0f788e96fe1eab506817b23d47eed1a3d36Dan Gohman if (strcmp(Name, ".init_array") == 0) 499b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_INIT_ARRAY; 500b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 501fa9ca0f788e96fe1eab506817b23d47eed1a3d36Dan Gohman if (strcmp(Name, ".fini_array") == 0) 502b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_FINI_ARRAY; 503b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 504fa9ca0f788e96fe1eab506817b23d47eed1a3d36Dan Gohman if (strcmp(Name, ".preinit_array") == 0) 505b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PREINIT_ARRAY; 506b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 507b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isBSS() || K.isThreadBSS()) 508b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_NOBITS; 509b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 510b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PROGBITS; 511b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 512b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 513b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 514b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 515b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) { 516b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes unsigned Flags = 0; 517b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 518b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (!K.isMetadata()) 519b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_ALLOC; 5208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 521848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov if (K.isText()) 522848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 5238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 524b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isWriteable()) 525b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_WRITE; 5268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 527b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isThreadLocal()) 528b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_TLS; 5298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 530b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes // K.isMergeableConst() is left out to honour PR4650 531b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString() || K.isMergeableConst4() || 532b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes K.isMergeableConst8() || K.isMergeableConst16()) 533b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_MERGE; 534b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 535b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString()) 536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_STRINGS; 537b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 538b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return Flags; 539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 540b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 541b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54224f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 5438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 54424f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const char *SectionName = GV->getSection().c_str(); 546b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54724f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 548b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind = getELFKindForNamedSection(SectionName, Kind); 5498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(SectionName, 5518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType(SectionName, Kind), 552b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSectionFlags(Kind), Kind, true); 55324f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 557f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 5588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 559f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 560f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 5618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 564f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 5678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 572a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 573f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 574e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 5758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 57827602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 579f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 580b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 581b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection((Prefix+Name).c_str(), 5838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType((Prefix+Name).c_str(), Kind), 5848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionFlags(Kind), 585b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 5878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 588f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 5898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5903b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 5913b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 5923b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 5938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 594067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 595067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 596067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 5978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov unsigned Align = 598067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 5998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6007e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 6013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 6027e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 6033b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 6047e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 6053b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 6063b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 6078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6097e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 6108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS, 6118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | 6128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_MERGE | 6138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_STRINGS, 614b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 615f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 617f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 618203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst4() && MergeableConst4Section) 619f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 620203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst8() && MergeableConst8Section) 621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 622203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst16() && MergeableConst16Section) 623f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 625f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 627f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 6288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 629f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 630f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 6318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 632824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS()) return BSSSection; 6338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 634f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 635f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 636f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 637f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 6388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 639f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 640f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 641f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 642f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 64383d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 644f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 645f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 646a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 64783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 6482a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst4() && MergeableConst4Section) 649f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 6502a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst8() && MergeableConst8Section) 651f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 6522a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst16() && MergeableConst16Section) 653f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 655f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 6568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 657f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 659f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 661f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 662f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 664f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 6665dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 6675dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6685dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 6695dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // If we have the MachO uniquing map, free it. 6705dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner delete (MachOUniqueMapTy*)UniquingMap; 6715dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner} 6720c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 6735dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6745dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO:: 6752928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section, 676ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 677ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 6785dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // We unique sections by their segment/section pair. The returned section 6795dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // may not have the same flags as the requested section, if so this should be 6805dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // diagnosed by the client as an error. 6818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6825dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Create the map if it doesn't already exist. 6835dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (UniquingMap == 0) 6845dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner UniquingMap = new MachOUniqueMapTy(); 6855dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 6868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6875dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Form the name to look up. 6885dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner SmallString<64> Name; 68916df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Segment; 6905dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Name.push_back(','); 69116df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Section; 6928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6935dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Do the lookup, if we have a hit, return it. 69416df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar const MCSectionMachO *&Entry = Map[Name.str()]; 6955dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (Entry) return Entry; 6965dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6975dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Otherwise, return a new section. 6985dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 6995dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Reserved2, Kind, getContext()); 700fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 701fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 70211e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 703f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 704f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 70576d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 70676d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((MachOUniqueMapTy*)UniquingMap)->clear(); 707a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 709ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 710ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 711ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 712ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 713ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 714ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 7158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 716ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 717ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 718ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 719ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 720ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 721ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 722ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 723ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 724ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 725ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 726ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 727ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 7288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7294bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 7304bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 731ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 7324bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 7334bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 734ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 735ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 7360c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 7378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 738ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 739ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 7408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 741ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 742ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 744ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 745ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 746ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 747ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 748ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 749ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 750ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 751ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 752ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 753ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 754ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 755ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 756ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 757ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 75880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 7598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 760e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner LazySymbolPointerSection 761e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__la_symbol_ptr", 762e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 763e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 764e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner NonLazySymbolPointerSection 765e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__nl_symbol_ptr", 766e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 767e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 7688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 76980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 770ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 771ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 772ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 773ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 77480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 775ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 776ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 777ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 778ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 779ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 7808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 781ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 782ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 78380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 7848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 78518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 786fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 787fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling SectionKind::getDataRel()); 78835039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 789ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 790ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 793ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 79518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 79618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 7978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 798ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 7990c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 801ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 8020c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 804ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 8050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 807ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 8080c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 810ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 8110c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 813ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 8140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 816ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 8170c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 819ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 8200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 822ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 8230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 825ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 8260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 828ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 8290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfDebugInlineSection = 831ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 8320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 833f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 834f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 835a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 8368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 83724f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 838ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 839ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 840ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 841ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 842ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 844e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (!ErrorCode.empty()) { 845e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 846e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 847e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' has an invalid section specifier '" + GV->getSection()+ 848e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "': " + ErrorCode + "."); 849e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Fall back to dropping it into the data section. 850e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return DataSection; 851e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 853e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Get the section. 854e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner const MCSectionMachO *S = 855e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner getMachOSection(Segment, Section, TAA, StubSize, Kind); 8568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 857e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Okay, now that we got the section, verify that the TAA & StubSize agree. 858e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If the user declared multiple globals with different section flags, we need 859e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // to reject it here. 860e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 861e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 862e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 863e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' section type or attributes does not match previous" 864e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner " section specifier"); 865e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 867e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return S; 86824f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 86924f654c8a4d14066233480f683d3b0dececf374aChris Lattner 87024f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 871f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 872e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 873f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 8748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 875f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 87627602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 8778ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 878f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 879f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 88027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 881f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 882f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 883f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 884f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 8858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 886f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 887ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 888ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 889ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 890ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 891ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 892824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 893ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 894ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 895f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 896f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 8978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 898f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 899f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 900f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 901f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 902f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 903f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 904f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 905f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 906ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 907ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 908ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 909f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 910f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 911f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 912f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 913f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 914f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 915f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 917f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 918f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 919f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 920f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 921a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 92283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 923f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 924f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 925f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) 926f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 928f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 929f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 930f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 931f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 9324bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 933f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 934f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 935f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 936f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 93726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 93826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 93926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 94026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 94126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 94226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 94326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 94426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 9458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 94626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 94726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 94826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 94926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 95026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 95126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 95226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 95326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 95426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 9558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 95626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 95726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 95826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 9598c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO:: 9608c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 9618609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 9628c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 9638c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The mach-o version of this method defaults to returning a stub reference. 9648c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = true; 9658c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 9668c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 9678c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 9688c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, true); 9698c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Name += "$non_lazy_ptr"; 9708c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 9718c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 9728c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 97326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 974f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 975f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 976f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 977f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 97838cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 97938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 98038cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 98138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (COFFUniqueMapTy*)UniquingMap; 98238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 98338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 9840c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 98511e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 9860c0cb7123346beab4e0d3ad6ce9570560b14971eChris LattnergetCOFFSection(const char *Name, bool isDirective, SectionKind Kind) const { 98738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Create the map if it doesn't already exist. 98838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 98938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new MachOUniqueMapTy(); 99038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 9918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 99238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 99338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner const MCSectionCOFF *&Entry = Map[Name]; 99438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 9958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 99638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 997fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 998fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 999f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 1000f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 100176d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 100276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((COFFUniqueMapTy*)UniquingMap)->clear(); 1003a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 10040c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 10050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 100680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 10070c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 100880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 10090c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 10108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 101135c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on COFF, even 101235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // though it contains relocatable pointers. In PIC mode, this is probably a 101335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // big runtime hit for C++ apps. Either the contents of the LSDA need to be 101435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // adjusted or this should be a data section. 101535c3531754c392a533921a465a22f67f7e8fb743Chris Lattner LSDASection = 101635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 101735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner EHFrameSection = 101835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 10198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 102018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 102118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 10228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 10230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 10240c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 10260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 10270c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 10290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 10300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 10320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 10330c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 103418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 10350c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 10360c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 103718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 10380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 10390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 10410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 10420c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 10440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 10450c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 10470c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 10480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 10500c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 10510c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 10530c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 10540c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 1055f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1056f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 105724f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 105924f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 10600c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection(GV->getSection().c_str(), false, Kind); 106124f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 106224f654c8a4d14066233480f683d3b0dececf374aChris Lattner 1063f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1064f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 1065f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 1066f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 1067f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 1068f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 1069f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1070f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1071f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1072a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 1073f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1074e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 1075f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 10768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1077f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 1078f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 107927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 1080f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 1081968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 10820c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection((Prefix+Name).c_str(), false, Kind); 1083f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 10848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1085f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 1086f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 10878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1088f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 1089f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 10908c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 1091