TargetLoweringObjectFile.cpp revision 26630c1180502d07c9b2b4a9a4ba06bc5ddf180b
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; 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner BSSSection_ = 0; 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSDataSection = 0; 38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSBSSSection = 0; 39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner CStringSection_ = 0; 40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 42f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 43f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 44f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 46f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 47f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 48f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 49f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 50f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 51f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 52f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 53f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 56f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isConstantString(const Constant *C) { 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const ConstantArray *CVA = dyn_cast<ConstantArray>(C); 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Check, if initializer is a null-terminated string 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (CVA && CVA->isCString()) 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType())) 78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return (Ty->getElementType() == Type::Int8Ty && 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Ty->getNumElements() == 1); 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic SectionKind::Kind SectionKindForGlobal(const GlobalValue *GV, 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) { 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::Text; 92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ThreadBSS; 98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ThreadData; 99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 100f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 101f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 102f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 103f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::BSS; 104f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 109f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // section if the target has it. 118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isConstantString(C)) 119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::MergeableCString; 120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 123f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case 4: return SectionKind::MergeableConst4; 126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case 8: return SectionKind::MergeableConst8; 127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case 16: return SectionKind::MergeableConst16; 128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: return SectionKind::MergeableConst; 129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ReadOnly; 139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ReadOnlyWithRelLocal; 143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 147f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ReadOnly; 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ReadOnlyWithRel; 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::DataNoRel; 166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::DataNoRel; 171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 172f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::DataRelLocal; 173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::DataRel; 175f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 176f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 180f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 181a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 182e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSectionForGlobal(const GlobalValue *GV, Mangler *Mang, 183e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner "Can only be used for global definitions"); 186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::Kind GVKind = SectionKindForGlobal(GV, TM); 188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind Kind = SectionKind::get(GVKind, GV->isWeakForLinker(), 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner GV->hasSection()); 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->hasSection()) { 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the target has special section hacks for specifically named globals, 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // return them now. 197a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind)) 198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return TS; 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the target has magic semantics for certain section names, make sure to 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // pick up the flags. This allows the user to write things with attribute 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // section and still get the appropriate section flags printed. 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner GVKind = getKindForNamedSection(GV->getSection().c_str(), GVKind); 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getOrCreateSection(GV->getSection().c_str(), false, GVKind); 206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 210e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 214a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 215f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind Kind, 217e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS() && BSSSection_ != 0) 225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return BSSSection_; 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// getSectionForMergableConstant - Given a mergable constant with the 234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 236a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 237f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile:: 238f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionForMergeableConstant(SectionKind Kind) const { 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 246a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 247f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetOrCreateSection(const char *Name, bool isDirective, 248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::Kind Kind) const { 249a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner if (MCSection *S = Ctx->GetSection(Name)) 250a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner return S; 251a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner SectionKind K = SectionKind::get(Kind, false /*weak*/, !isDirective); 252a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner return MCSectionWithKind::Create(Name, K, *Ctx); 253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 261f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 262f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 263a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 264f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!HasCrazyBSS) 265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner BSSSection_ = getOrCreateSection("\t.bss", true, SectionKind::BSS); 266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // PPC/Linux doesn't support the .bss directive, it needs .section .bss. 268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Does .section .bss work everywhere?? 269f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner BSSSection_ = getOrCreateSection("\t.bss", false, SectionKind::BSS); 270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = getOrCreateSection("\t.text", true, SectionKind::Text); 273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel); 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t.rodata", false, SectionKind::ReadOnly); 276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSDataSection = 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t.tdata", false, SectionKind::ThreadData); 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner CStringSection_ = getOrCreateSection("\t.rodata.str", true, 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableCString); 280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSBSSSection = getOrCreateSection("\t.tbss", false, SectionKind::ThreadBSS); 282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelSection = getOrCreateSection("\t.data.rel", false, 284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::DataRel); 285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false, 286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::DataRelLocal); 287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROSection = getOrCreateSection("\t.data.rel.ro", false, 288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::ReadOnlyWithRel); 289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROLocalSection = 290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t.data.rel.ro.local", false, 291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::ReadOnlyWithRelLocal); 292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst4Section = getOrCreateSection(".rodata.cst4", false, 294f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableConst4); 295f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst8Section = getOrCreateSection(".rodata.cst8", false, 296f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableConst8); 297f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst16Section = getOrCreateSection(".rodata.cst16", false, 298f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableConst16); 299f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 300f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 301f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 302f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerSectionKind::Kind TargetLoweringObjectFileELF:: 303f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetKindForNamedSection(const char *Name, SectionKind::Kind K) const { 304f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 305f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 306f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 307f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 308f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 309f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 310f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 311f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::BSS; 312f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 313f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 314f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 315f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 316f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ThreadData; 318f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 319f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 320f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 321f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 322f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 323f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SectionKind::ThreadBSS; 324f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 325f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 326f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 327f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 328f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileELF:: 329f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 330f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 331f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('"'); 332f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 333f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!Kind.isMetadata()) 334f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('a'); 335f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 336f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('x'); 337f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 338f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('w'); 33982987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner if (Kind.isMergeableCString() || 34082987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst4() || 34182987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst8() || 34282987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst16()) 343f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('M'); 344f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableCString()) 345f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('S'); 346f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadLocal()) 347f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('T'); 348f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 349f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('"'); 350f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 351f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 352f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If comment string is '@', e.g. as on ARM - use '%' instead 353f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (AtIsCommentChar) 354f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('%'); 355f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 356f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('@'); 357f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 358f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const char *KindStr; 359bf15e433b9ac6692e76aff0465cd93bb87f68989Chris Lattner if (Kind.isBSS() || Kind.isThreadBSS()) 360f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner KindStr = "nobits"; 361f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 362f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner KindStr = "progbits"; 363f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 364f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.append(KindStr, KindStr+strlen(KindStr)); 365f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 366f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableCString()) { 367f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // TODO: Eventually handle multiple byte character strings. For now, all 368f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable C strings are single byte. 369f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('1'); 371f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst4()) { 372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 373f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('4'); 374f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst8()) { 375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('8'); 377f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst16()) { 378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('1'); 380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('6'); 381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 382f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 383f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 388f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 389f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 394f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 399f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 400f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 401f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 402a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 403f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 404e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 405f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 406f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 407f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 408f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWeak()) { 409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 410b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 411b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner return getOrCreateSection((Prefix+Name).c_str(), false, Kind.getKind()); 412f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 413f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return TextSection; 415e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner 416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableCString()) { 417067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner assert(CStringSection_ && "Should have string section prefix"); 418f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 419067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 420067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 421067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 422067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner unsigned Align = 423067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 424f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 425a679207d5852760c9809157eb67d2609cc3c268aChris Lattner std::string Name = CStringSection_->getName() + "1." + utostr(Align); 426067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner return getOrCreateSection(Name.c_str(), false, 427067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner SectionKind::MergeableCString); 428f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 429f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 430f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst()) { 431f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 432f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 433f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 434f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 435f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst16()) 436f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 437f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 438f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 439f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 440f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 441f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 442f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return TLSDataSection; 443f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 444f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 445f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return BSSSection_; 446f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 447f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return DataSection; 448f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 449f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return DataRelSection; 450f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 451f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 452f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 453f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 454f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 455f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 456f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// getSectionForMergeableConstant - Given a mergeable constant with the 457f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 458f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 459a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 460f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionForMergeableConstant(SectionKind Kind) const { 461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 462f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 463f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 464f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 465f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst16()) 466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 467f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 470f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 471f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 472f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 474f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 477f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 478f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 479f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 480f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 481a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 482f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = getOrCreateSection("\t.text", true, SectionKind::Text); 483f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel); 484f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner CStringSection_ = getOrCreateSection("\t.cstring", true, 486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableCString); 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner FourByteConstantSection = getOrCreateSection("\t.literal4\n", true, 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableConst4); 489f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner EightByteConstantSection = getOrCreateSection("\t.literal8\n", true, 490f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::MergeableConst8); 4914bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner 4924bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 4934bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 4944bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 4954bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 4964bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner SixteenByteConstantSection = 4974bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner getOrCreateSection("\t.literal16\n", true, SectionKind::MergeableConst16); 4984bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner else 4994bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner SixteenByteConstantSection = 0; 500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 501f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = getOrCreateSection("\t.const", true, SectionKind::ReadOnly); 502f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 503f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextCoalSection = 504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions", 505f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner false, SectionKind::Text); 506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced", 507f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner false, SectionKind::Text); 508f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced", 509f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner false, SectionKind::Text); 510f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstDataSection = getOrCreateSection("\t.const_data", true, 511f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner SectionKind::ReadOnlyWithRel); 512f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced", 513f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner false, SectionKind::DataRel); 514f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 515f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 516a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 517e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 518e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 519f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 520f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 521f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 522f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return Kind.isWeak() ? TextCoalSection : TextSection; 523f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 524f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 525f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 526f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWeak()) { 527f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 528f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 529f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 530f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 532f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 533f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableCString()) { 534f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = cast<GlobalVariable>(GV)->getInitializer(); 535f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const Type *Ty = cast<ArrayType>(C->getType())->getElementType(); 536f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetData &TD = *TM.getTargetData(); 537f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner unsigned Size = TD.getTypeAllocSize(Ty); 538f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Size) { 539f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV)); 540f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Align <= 32) 541f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return CStringSection_; 542f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 543f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 544f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 545f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 546f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 547f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst()) { 548f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 549f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 550f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 551f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 5524bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 553f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 557f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: ROData -> const in -static mode that is relocatable but they happen 558f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // by the static linker. Why not mergeable? 559f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 560f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 561f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 564f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRel()) 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 571a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 572f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFileMachO:: 573f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionForMergeableConstant(SectionKind Kind) const { 574f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) 577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 578f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 579f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 580f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 582f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 5834bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 584f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 585f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 587f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 58826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 58926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 59026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 59126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 59226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 59326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 59426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 59526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 59626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 59726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 59826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 59926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 60026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 60126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 60226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 60326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 60426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 60526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 60626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 60726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 60826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 60926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 61026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 611f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 612f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 613f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 614f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 615f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 616f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 617a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 61883d1c3db39dcde56b706b15d6684bc60fda4d276Chris Lattner TextSection = getOrCreateSection("\t.text", true, SectionKind::Text); 61983d1c3db39dcde56b706b15d6684bc60fda4d276Chris Lattner DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel); 620f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 622f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileCOFF:: 623f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Inefficient. 625f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner std::string Res = ",\""; 626f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 627f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += 'x'; 628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 629f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += 'w'; 630f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += "\""; 631f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 632f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.append(Res.begin(), Res.end()); 633f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 634f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 635f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 636f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 637f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 638f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 639f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 640f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 641f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 642f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 643f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 644a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 645f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 646e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 647f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 648f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 649f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 650f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 651f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWeak()) { 652f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 653f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Use mangler interface (PR4584). 654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner std::string Name = Prefix+GV->getNameStr(); 655f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getOrCreateSection(Name.c_str(), false, Kind.getKind()); 656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 657f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 659f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 661a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner if (Kind.isBSS() && BSSSection_ != 0) 662a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner return BSSSection_; 663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 664f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 668f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 670