TargetLoweringObjectFile.cpp revision f9bdeddb96043559c61f176f8077e3b91a0c544f
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" 18f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/GlobalVariable.h" 19a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h" 20f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h" 215277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetAsmInfo.h" 22f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 235277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h" 24f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 25a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/Support/Mangler.h" 26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 30f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 33a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 36824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 3880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 3980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 40d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4135039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 4218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 4318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 4418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 4518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 4618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 56f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 57f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 831850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it. 861850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner const ArrayType *ATy = cast<ArrayType>(C->getType()); 881850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 901850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ATy->getNumElements() == 0) return false; 921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ConstantInt *Null = 941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (Null == 0 || Null->getZExtValue() != 0) 961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; // Not null terminated. 971850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Verify that the null doesn't occur anywhere else in the string. 991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Reject constantexpr elements etc. 1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (!isa<ConstantInt>(CVA->getOperand(i)) || 1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner CVA->getOperand(i) == Null) 1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; 104f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return ATy->getNumElements() == 1; 110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 11458bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 115968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 116968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 117968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 118968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 11958bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 12058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 12158bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 12258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 12358bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1292798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1362798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1412798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 147f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1551850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1561850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1571850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const IntegerType *ITy = 1581850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1591850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1601850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1611850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1621850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1631850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1641850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1651850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1661850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 1671850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1681850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1691850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1723b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 175f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 176f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1782798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1792798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1802798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 181f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2072798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2172798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2222798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2242798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2262798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 233a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 23458bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 235e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 236f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 23724f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 23824f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 23924f654c8a4d14066233480f683d3b0dececf374aChris Lattner 240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 242f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 24558bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 247a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 248f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 249f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 250e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 251f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 252f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 254f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 257824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 258824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 260f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 261f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 263f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 264f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 26683d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 269a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 27083d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 283fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 2840c0cb7123346beab4e0d3ad6ce9570560b14971eChris LattnergetELFSection(const char *Name, bool isDirective, SectionKind Kind) const { 285fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner if (MCSection *S = getContext().GetSection(Name)) 286fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner return S; 2877c599d056a41262681aa7fcd771eeed53a8e0bd2Chris Lattner return MCSectionELF::Create(Name, isDirective, Kind, getContext()); 288fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 289fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 290f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 291f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 292a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!HasCrazyBSS) 2940c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner BSSSection = getELFSection("\t.bss", true, SectionKind::getBSS()); 295f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 296f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // PPC/Linux doesn't support the .bss directive, it needs .section .bss. 297f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Does .section .bss work everywhere?? 298968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // FIXME2: this should just be handle by the section printer. We should get 299968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // away from syntactic view of the sections and MCSection should just be a 300968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // semantic view. 3010c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner BSSSection = getELFSection("\t.bss", false, SectionKind::getBSS()); 302f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 303f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3040c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getELFSection("\t.text", true, SectionKind::getText()); 3050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getELFSection("\t.data", true, SectionKind::getDataRel()); 306f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 3070c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection("\t.rodata", false, SectionKind::getReadOnly()); 308f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSDataSection = 3090c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection("\t.tdata", false, SectionKind::getThreadData()); 3103b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 3110c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TLSBSSSection = getELFSection("\t.tbss", false, 3122798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getThreadBSS()); 313f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataRelSection = getELFSection("\t.data.rel", false, 3152798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 3160c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataRelLocalSection = getELFSection("\t.data.rel.local", false, 3172798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRelLocal()); 3180c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataRelROSection = getELFSection("\t.data.rel.ro", false, 3192798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRel()); 320f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROLocalSection = 3210c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection("\t.data.rel.ro.local", false, 3222798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRelLocal()); 323f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3240c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner MergeableConst4Section = getELFSection(".rodata.cst4", false, 3252798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst4()); 3260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner MergeableConst8Section = getELFSection(".rodata.cst8", false, 3272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst8()); 3280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner MergeableConst16Section = getELFSection(".rodata.cst16", false, 3292798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst16()); 33080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 33180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 3320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".ctors", false, SectionKind::getDataRel()); 33380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 3340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".dtors", false, SectionKind::getDataRel()); 335d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner 33618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 337d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner 338d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 339d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 340d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 341d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 342d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 3430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 34435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 3450c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".eh_frame", false, SectionKind::getDataRel()); 34618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 34718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 34818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 3490c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_abbrev", false, SectionKind::getMetadata()); 35018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 3510c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_info", false, SectionKind::getMetadata()); 35218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 3530c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_line", false, SectionKind::getMetadata()); 35418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 3550c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_frame", false, SectionKind::getMetadata()); 35618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 3570c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_pubnames", false, SectionKind::getMetadata()); 35818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 3590c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_pubtypes", false, SectionKind::getMetadata()); 36018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 3610c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_str", false, SectionKind::getMetadata()); 36218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 3630c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_loc", false, SectionKind::getMetadata()); 36418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 3650c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_aranges", false, SectionKind::getMetadata()); 36618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 3670c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_ranges", false, SectionKind::getMetadata()); 36818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 3690c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getELFSection(".debug_macinfo", false, SectionKind::getMetadata()); 370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 371f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 37324f654c8a4d14066233480f683d3b0dececf374aChris Lattnerstatic SectionKind 37424f654c8a4d14066233480f683d3b0dececf374aChris LattnergetELFKindForNamedSection(const char *Name, SectionKind K) { 375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 377f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 3822798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 383f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 3882798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 389f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 3942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 39924f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 40024f654c8a4d14066233480f683d3b0dececf374aChris LattnergetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 40124f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 40224f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 40324f654c8a4d14066233480f683d3b0dececf374aChris Lattner Kind = getELFKindForNamedSection(GV->getSection().c_str(), Kind); 40424f654c8a4d14066233480f683d3b0dececf374aChris Lattner 4050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getELFSection(GV->getSection().c_str(), false, Kind); 40624f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 407f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 408f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 410f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 411f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 412f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 413f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 415f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 417f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 418f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 419f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 420f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 421f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 422f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 423f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 424f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 425a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 426f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 427e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 428f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 429f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 430f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 43127602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 432f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 433b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 4340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getELFSection((Prefix+Name).c_str(), false, Kind); 435f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 436f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 437f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 438e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner 4393b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 4403b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 4413b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 442f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 443067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 444067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 445067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 446067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner unsigned Align = 447067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 448f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4497e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 4503b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 4517e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 4523b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 4537e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 4543b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 4553b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 4563b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 4573b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 4587e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 4590c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getELFSection(Name.c_str(), false, Kind); 460f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 462f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 463f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 464f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 465f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 467f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16()) 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 470f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 471f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 472f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 474f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 475f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 477824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS()) return BSSSection; 478f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 479f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 480f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 481f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 482f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 483f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 484f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 48883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 489f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 490f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 491a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 49283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 495f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 496f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 497f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst16()) 498f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 499f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 501f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 502f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 503f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 505f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 507f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 508f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 509f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 510f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 5110c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 51211e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 513ff4bc460c52c1f285d8a56da173641bf92d49e3fChris LattnergetMachOSection(StringRef Segment, StringRef Section, 514ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 515ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 516ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // FIXME: UNIQUE HERE. 517ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner //if (MCSection *S = getContext().GetSection(Name)) 518ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // return S; 519ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 520ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner return MCSectionMachO::Create(Segment, Section, TypeAndAttributes, Reserved2, 521ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner Kind, getContext()); 522fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 523fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 52411e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 525f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 526f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 527a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 528ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 529ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 530ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 531ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 532ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 533ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 534ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 535ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 536ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 537ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 538ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 539ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 540ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 541ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 542ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 543ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 544ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 545ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 546ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 547ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 5484bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner 5494bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 5504bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 551ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 5524bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 5534bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 554ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 555ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 5560c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 557ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 558ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 559ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 560ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 561ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 562ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 563ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 564ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 565ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 566ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 567ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 568ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 569ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 570ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 571ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 572ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 573ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 574ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 575ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 576ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 577ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 57880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 57980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 580ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 581ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 582ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 583ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 58480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 585ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 586ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 587ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 588ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 589ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 590ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_term_func", 591ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 592ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 59380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 59480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 59518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 596ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 5970c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getDataRel()); 59835039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 599ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 600ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 601ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 602ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 603ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 604ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 60518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 60618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 60718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 608ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 6090c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 61018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 611ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 6120c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 61318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 614ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 6150c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 61618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 617ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 6180c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 61918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 620ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 6210c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 62218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 623ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 6240c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 62518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 626ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 6270c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 62818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 629ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 6300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 63118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 632ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 6330c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 63418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 635ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 6360c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 63718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 638ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 6390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 64018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 641ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 6420c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 643f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 644f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 645ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner/// getLazySymbolPointerSection - Return the section corresponding to 646ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner/// the .lazy_symbol_pointer directive. 647ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 648ff4bc460c52c1f285d8a56da173641bf92d49e3fChris LattnergetLazySymbolPointerSection() const { 649ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner return getMachOSection("__DATA", "__la_symbol_ptr", 650ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 651ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMetadata()); 652ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner} 653ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 654ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner/// getNonLazySymbolPointerSection - Return the section corresponding to 655ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner/// the .non_lazy_symbol_pointer directive. 656ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 657ff4bc460c52c1f285d8a56da173641bf92d49e3fChris LattnergetNonLazySymbolPointerSection() const { 658ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner return getMachOSection("__DATA", "__nl_symbol_ptr", 659ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 660ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMetadata()); 661ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner} 662ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 663ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 664a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 66524f654c8a4d14066233480f683d3b0dececf374aChris LattnergetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 66624f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 667ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 668ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 669ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 670ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 671ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 672ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 673ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner if (ErrorCode.empty()) 674ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner return getMachOSection(Segment, Section, TAA, StubSize, Kind); 675ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 676ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner 677ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // If invalid, report the error with llvm_report_error. 678ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 679ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner "' has an invalid section specifier '" + GV->getSection() + 680ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner "': " + ErrorCode + "."); 681ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Fall back to dropping it into the data section. 682ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner return DataSection; 68324f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 68424f654c8a4d14066233480f683d3b0dececf374aChris Lattner 68524f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 686f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 687e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 688f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 689f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 690f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 69127602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 692f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 693f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 694f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 69527602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 696f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 699f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 700f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 701f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 702ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 703ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 704ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 705ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 706ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 707824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 708ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 709ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 710f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 711f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 712f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 713f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 714f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 715f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 716f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 717f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 718f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 719f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 720f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 721ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 722ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 723ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 724f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 725f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 726f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 727f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 728f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 729f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 730f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 731f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 732f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 733f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 734f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 735f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 736a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 73783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 738f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 739f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 740f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) 741f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 742f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 743f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 744f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 745f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 746f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 7474bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 748f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 749f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 750f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 751f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 75226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 75326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 75426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 75526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 75626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 75726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 75826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 75926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 76026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 76126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 76226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 76326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 76426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 76526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 76626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 76726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 76826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 76926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 77026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 77126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 77226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 77326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 77426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 775f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 776f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 777f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 778f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 7790c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 78011e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 7810c0cb7123346beab4e0d3ad6ce9570560b14971eChris LattnergetCOFFSection(const char *Name, bool isDirective, SectionKind Kind) const { 782fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner if (MCSection *S = getContext().GetSection(Name)) 783fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner return S; 7847c599d056a41262681aa7fcd771eeed53a8e0bd2Chris Lattner return MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 785fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 786fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 787f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 788f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 789a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7900c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 7910c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 79280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 7930c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 79480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 7950c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 79618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 79718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 79818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 79918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 80018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 8010c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 8020c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 80318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 8040c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 8050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 80618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 8070c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 8080c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 80918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 8100c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 8110c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 81218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 8130c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 8140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 81518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 8160c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 8170c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 81818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 8190c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 8200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 82118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 8220c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 8230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 82418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 8250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 8260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 82718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 8280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 8290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 83018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 8310c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 8320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 833f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 834f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 83524f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 83624f654c8a4d14066233480f683d3b0dececf374aChris LattnergetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 83724f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 8380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection(GV->getSection().c_str(), false, Kind); 83924f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 84024f654c8a4d14066233480f683d3b0dececf374aChris Lattner 841f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 842f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 843f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 844f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 845f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 846f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 847f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 848f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 849f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 850a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 851f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 852e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 853f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 854f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 855f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 856f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 85727602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 858f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 859968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 8600c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection((Prefix+Name).c_str(), false, Kind); 861f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 862f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 863f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 864f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 865f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 866f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 867f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 868f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 869