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