TargetLoweringObjectFile.cpp revision 3b24c0172069a2546cd095e4b91f8b88c1ea0722
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" 20a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCSection.h" 21f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetMachine.h" 22f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 23f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 24a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/Support/Mangler.h" 25f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 30f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 32a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 35824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 3780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 3880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 39d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4035039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 4118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 4218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 4318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 4418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 4518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 4618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 56f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isConstantString(const Constant *C) { 83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const ConstantArray *CVA = dyn_cast<ConstantArray>(C); 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Check, if initializer is a null-terminated string 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (CVA && CVA->isCString()) 87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType())) 92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return (Ty->getElementType() == Type::Int8Ty && 93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Ty->getNumElements() == 1); 94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 98968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// SectionKindForGlobal - This is a top-level target-independent classifier for 99968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 100968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 101968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 102968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 103968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattnerstatic SectionKind SectionKindForGlobal(const GlobalValue *GV, 104968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner const TargetMachine &TM) { 105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 109f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1162798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1172798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1222798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 123f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // section if the target has it. 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isConstantString(C)) 1383b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner return SectionKind::getMergeable1ByteCString(); 139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1403b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner // FIXME: Detect 2/4 byte strings. 1413b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1462798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1472798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1482798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1492798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1592798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 1632798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1722798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 175f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 1762798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 180f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 181f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 1912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 1952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 202a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 203e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSectionForGlobal(const GlobalValue *GV, Mangler *Mang, 204e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner "Can only be used for global definitions"); 207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 208968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner SectionKind Kind = SectionKindForGlobal(GV, TM); 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->hasSection()) { 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the target has special section hacks for specifically named globals, 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // return them now. 214f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind)) 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return TS; 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the target has magic semantics for certain section names, make sure to 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // pick up the flags. This allows the user to write things with attribute 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // section and still get the appropriate section flags printed. 220968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner Kind = getKindForNamedSection(GV->getSection().c_str(), Kind); 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 222968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner return getOrCreateSection(GV->getSection().c_str(), false, Kind); 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 227f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 231a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 232f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 233f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 234e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 236f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 238f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 241824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 242824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 244f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 25083d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 251f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 253a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 25483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 261f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 262a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 263968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetOrCreateSection(const char *Name, bool isDirective, SectionKind Kind) const { 264a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner if (MCSection *S = Ctx->GetSection(Name)) 265a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner return S; 266968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner return MCSection::Create(Name, isDirective, Kind, *Ctx); 267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 269f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 275f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 276f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 277a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!HasCrazyBSS) 2792798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner BSSSection = getOrCreateSection("\t.bss", true, SectionKind::getBSS()); 280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // PPC/Linux doesn't support the .bss directive, it needs .section .bss. 282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Does .section .bss work everywhere?? 283968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // FIXME2: this should just be handle by the section printer. We should get 284968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // away from syntactic view of the sections and MCSection should just be a 285968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // semantic view. 2862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner BSSSection = getOrCreateSection("\t.bss", false, SectionKind::getBSS()); 287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner TextSection = getOrCreateSection("\t.text", true, SectionKind::getText()); 2902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner DataSection = getOrCreateSection("\t.data", true, SectionKind::getDataRel()); 291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 2922798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner getOrCreateSection("\t.rodata", false, SectionKind::getReadOnly()); 293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSDataSection = 2942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner getOrCreateSection("\t.tdata", false, SectionKind::getThreadData()); 2953b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 2963b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner // FIXME: No reason to make this. 297824583844a8f334dd261894a3fac7ad476531667Chris Lattner CStringSection = getOrCreateSection("\t.rodata.str", true, 2983b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner SectionKind::getMergeable1ByteCString()); 299f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 300968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner TLSBSSSection = getOrCreateSection("\t.tbss", false, 3012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getThreadBSS()); 302f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 303f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelSection = getOrCreateSection("\t.data.rel", false, 3042798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 305f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false, 3062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRelLocal()); 307f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROSection = getOrCreateSection("\t.data.rel.ro", false, 3082798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRel()); 309f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROLocalSection = 310f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t.data.rel.ro.local", false, 3112798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRelLocal()); 312f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 313f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst4Section = getOrCreateSection(".rodata.cst4", false, 3142798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst4()); 315f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst8Section = getOrCreateSection(".rodata.cst8", false, 3162798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst8()); 317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst16Section = getOrCreateSection(".rodata.cst16", false, 3182798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst16()); 31980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 32080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 32180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".ctors", false, SectionKind::getDataRel()); 32280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 32380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".dtors", false, SectionKind::getDataRel()); 324d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner 32518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 326d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner 327d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 328d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 329d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 330d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 331d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 332d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly()); 33335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 33435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner getOrCreateSection(".eh_frame", false, SectionKind::getDataRel()); 33518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 33618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 33718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 33818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_abbrev", false, SectionKind::getMetadata()); 33918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 34018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_info", false, SectionKind::getMetadata()); 34118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 34218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_line", false, SectionKind::getMetadata()); 34318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 34418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_frame", false, SectionKind::getMetadata()); 34518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 34618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_pubnames", false, SectionKind::getMetadata()); 34718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 34818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_pubtypes", false, SectionKind::getMetadata()); 34918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 35018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_str", false, SectionKind::getMetadata()); 35118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 35218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_loc", false, SectionKind::getMetadata()); 35318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 35418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_aranges", false, SectionKind::getMetadata()); 35518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 35618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_ranges", false, SectionKind::getMetadata()); 35718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 35818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".debug_macinfo", false, SectionKind::getMetadata()); 359f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 360f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 361f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 362968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnerSectionKind TargetLoweringObjectFileELF:: 363968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetKindForNamedSection(const char *Name, SectionKind K) const { 364f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 365f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 366f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 367f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 368f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 369f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 3712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 373f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 374f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 3772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 382f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 3832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 388f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileELF:: 389f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('"'); 392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!Kind.isMetadata()) 394f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('a'); 395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('x'); 397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('w'); 3993b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 4003b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 4013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString() || 40282987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst4() || 40382987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst8() || 40482987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst16()) 405f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('M'); 4063b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 4073b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 4083b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) 409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('S'); 410f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadLocal()) 411f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('T'); 412f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 413f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('"'); 414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 415f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If comment string is '@', e.g. as on ARM - use '%' instead 417f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (AtIsCommentChar) 418f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('%'); 419f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 420f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('@'); 421f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 422f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const char *KindStr; 423bf15e433b9ac6692e76aff0465cd93bb87f68989Chris Lattner if (Kind.isBSS() || Kind.isThreadBSS()) 424f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner KindStr = "nobits"; 425f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 426f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner KindStr = "progbits"; 427f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 428f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.append(KindStr, KindStr+strlen(KindStr)); 429f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4303b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString()) { 431f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 432f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('1'); 4333b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner } else if (Kind.isMergeable2ByteCString()) { 4343b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Str.push_back(','); 4353b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Str.push_back('2'); 4363b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner } else if (Kind.isMergeable4ByteCString()) { 4373b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Str.push_back(','); 4383b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Str.push_back('4'); 439f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst4()) { 440f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 441f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('4'); 442f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst8()) { 443f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 444f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('8'); 445f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst16()) { 446f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 447f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('1'); 448f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('6'); 449f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 450f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 451f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 452f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 453f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 454f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 455f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 456f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 457f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 458f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 459f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 460f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 462f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 463f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 464f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 465f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 467f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 470a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 471f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 472e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 474f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 47627602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 477f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 478b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 479f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return getOrCreateSection((Prefix+Name).c_str(), false, Kind); 480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 481f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 482f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 483e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner 4843b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 4853b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 4863b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 487824583844a8f334dd261894a3fac7ad476531667Chris Lattner assert(CStringSection && "Should have string section prefix"); 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 489067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 490067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 491067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 492067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner unsigned Align = 493067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4953b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner const char *SizeSpec = "1."; 4963b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 4973b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner SizeSpec = "2."; 4983b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 4993b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner SizeSpec = "4."; 5003b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 5013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 5023b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 5033b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner 5043b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner std::string Name = CStringSection->getName() + SizeSpec + utostr(Align); 5053b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner return getOrCreateSection(Name.c_str(), false, Kind); 506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 507f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 508f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 509f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 510f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 511f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 512f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 513f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16()) 514f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 515f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 516f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 517f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 518f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 519f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 520f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 521f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 522f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 523824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS()) return BSSSection; 524f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 525f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 526f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 527f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 528f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 529f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 530f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 532f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 533f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 53483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 535f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 536f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 537a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 53883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 539f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 540f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 541f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 542f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 543f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst16()) 544f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 545f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 546f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 547f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 548f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 549f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 550f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 551f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 552f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 553f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 55711e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 55811e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris LattnergetMachOSection(const char *Name, bool isDirective, SectionKind K) { 55911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner // FOR NOW, Just forward. 56011e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner return getOrCreateSection(Name, isDirective, K); 56111e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner} 56211e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 56311e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 56411e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 565f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 566f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 567a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 568968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner TextSection = getOrCreateSection("\t.text", true, 5692798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 570968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner DataSection = getOrCreateSection("\t.data", true, 5712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 572f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 573824583844a8f334dd261894a3fac7ad476531667Chris Lattner CStringSection = getOrCreateSection("\t.cstring", true, 5743b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner SectionKind::getMergeable1ByteCString()); 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner FourByteConstantSection = getOrCreateSection("\t.literal4\n", true, 5762798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst4()); 577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner EightByteConstantSection = getOrCreateSection("\t.literal8\n", true, 5782798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst8()); 5794bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner 5804bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 5814bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 5824bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 5834bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 5844bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner SixteenByteConstantSection = 585968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner getOrCreateSection("\t.literal16\n", true, 5862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst16()); 5874bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner else 5884bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner SixteenByteConstantSection = 0; 589f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 590968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner ReadOnlySection = getOrCreateSection("\t.const", true, 5912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnly()); 592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 593f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextCoalSection = 594f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions", 5952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner false, SectionKind::getText()); 596f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced", 597968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner false, 5982798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced", 600968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner false, 6012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 602f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstDataSection = getOrCreateSection("\t.const_data", true, 6032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRel()); 604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced", 605968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner false, 6062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 60780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 60880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 60980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 61080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".constructor", true, SectionKind::getDataRel()); 61180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 61280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".destructor", true, SectionKind::getDataRel()); 61380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 61480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 61580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".mod_init_func", true, SectionKind::getDataRel()); 61680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 61780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel()); 61880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 61980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 62018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 621d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false, 622d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner SectionKind::getDataRel()); 62335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 62435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner getOrCreateSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms" 62535039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner "+live_support", false, SectionKind::getReadOnly()); 62618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 62718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 62818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' syntax: need flags for debug/regular?? 62918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Need __DWARF segment. 63018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 63118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_abbrev,regular,debug", true, 63218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 63318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 63418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_info,regular,debug", true, 63518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 63618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 63718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_line,regular,debug", true, 63818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 63918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 64018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_frame,regular,debug", true, 64118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 64218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 64318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_pubnames,regular,debug", true, 64418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 64518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 64618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_pubtypes,regular,debug", true, 64718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 64818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 64918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_str,regular,debug", true, 65018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 65118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 65218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_loc,regular,debug", true, 65318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 65418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 65518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_aranges,regular,debug", true, 65618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 65718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 65818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_ranges,regular,debug", true, 65918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 66018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 66118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_macinfo,regular,debug", true, 66218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 66318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 66418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection(".section __DWARF,__debug_inlined,regular,debug", true, 66518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner SectionKind::getMetadata()); 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 668a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 669f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 670e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 671f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 673f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 67427602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 675f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 676f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 677f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 67827602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 679f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 680f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 681f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 682f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 683f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 684f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 6853b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString()) { 686f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = cast<GlobalVariable>(GV)->getInitializer(); 687f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const Type *Ty = cast<ArrayType>(C->getType())->getElementType(); 688f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetData &TD = *TM.getTargetData(); 689f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner unsigned Size = TD.getTypeAllocSize(Ty); 690f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Size) { 691f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV)); 692f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Align <= 32) 693824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 694f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 695f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 696f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 699f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 700f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 701f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 702f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 703f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 704f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 705f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 706f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 707f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 708f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 709f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: ROData -> const in -static mode that is relocatable but they happen 710f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // by the static linker. Why not mergeable? 711f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 712f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 713f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 714f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 715f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 716f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 717f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 718f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 719f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 720f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 721f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 722f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 723a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 72483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 725f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 726f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 727f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) 728f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 729f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 730f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 731f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 732f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 733f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 7344bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 735f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 736f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 737f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 738f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 73926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 74026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 74126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 74226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 74326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 74426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 74526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 74626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 74726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 74826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 74926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 75026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 75126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 75226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 75326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 75426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 75526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 75626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 75726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 75826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 75926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 76026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 76126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 762f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 763f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 764f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 765f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 76611e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 76711e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris LattnergetCOFFSection(const char *Name, bool isDirective, SectionKind K) { 76811e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner return getOrCreateSection(Name, isDirective, K); 76911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner} 77011e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 771f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 772f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 773a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 774968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner TextSection = getOrCreateSection("\t.text", true, 7752798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 776968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner DataSection = getOrCreateSection("\t.data", true, 7772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 77880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 77980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".ctors", false, SectionKind::getDataRel()); 78080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 78180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".dtors", false, SectionKind::getDataRel()); 78218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 78318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 78418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 78518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 78618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 78718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_abbrev,\"dr\"", 78818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 78918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 79018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_info,\"dr\"", 79118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 79218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 79318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_line,\"dr\"", 79418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 79518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 79618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_frame,\"dr\"", 79718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 79818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 79918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_pubnames,\"dr\"", 80018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 80118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 80218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_pubtypes,\"dr\"", 80318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 80418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 80518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_str,\"dr\"", 80618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 80718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 80818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_loc,\"dr\"", 80918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 81018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 81118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_aranges,\"dr\"", 81218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 81318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 81418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_ranges,\"dr\"", 81518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 81618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 81718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner getOrCreateSection("\t.section\t.debug_macinfo,\"dr\"", 81818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner true, SectionKind::getMetadata()); 819f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 820f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 821f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileCOFF:: 822f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 823f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Inefficient. 824f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner std::string Res = ",\""; 825f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 826f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += 'x'; 827f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 828f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += 'w'; 829f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += "\""; 830f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 831f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.append(Res.begin(), Res.end()); 832f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 833f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 834f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 835f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 836f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 837f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 838f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 839f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 840f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 841f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 842f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 843a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 844f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 845e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 846f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 847f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 848f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 849f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 85027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 851f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 852968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 853f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return getOrCreateSection((Prefix+Name).c_str(), false, Kind); 854f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 855f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 856f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 857f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 858f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 859f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 860f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 861f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 862