TargetLoweringObjectFile.cpp revision d5bbb07ec806e6fa1e804afd7073987fdacc83e4
1f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===-- llvm/Target/TargetLoweringObjectFile.cpp - Object File Info -------===// 2f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 3f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// The LLVM Compiler Infrastructure 4f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 5f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// This file is distributed under the University of Illinois Open Source 6f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// License. See LICENSE.TXT for details. 7f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 8f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 9f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 10f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// This file implements classes used to handle lowerings specific to common 11f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// object file formats. 12f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// 13f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 14f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 15f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetLoweringObjectFile.h" 16f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Constants.h" 17f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/DerivedTypes.h" 18f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/GlobalVariable.h" 19a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h" 20a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCSection.h" 21f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetMachine.h" 22f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 23f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 24a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/Support/Mangler.h" 25f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 30f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 32a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 35824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 3780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 3880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 39d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 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 84968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// SectionKindForGlobal - This is a top-level target-independent classifier for 85968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 86968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 87968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 88968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 89968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattnerstatic SectionKind SectionKindForGlobal(const GlobalValue *GV, 90968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner const TargetMachine &TM) { 91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 100f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 101f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1022798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 104f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1082798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 109f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // section if the target has it. 123f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isConstantString(C)) 1242798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getMergeableCString(); 125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1302798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1312798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 1472798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1562798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 1602798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1702798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 172f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner default: llvm_unreachable("unknown relocation info kind"); 174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 1752798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 176f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 1772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 1792798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 180f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 181f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 186a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 187e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSectionForGlobal(const GlobalValue *GV, Mangler *Mang, 188e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner "Can only be used for global definitions"); 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 192968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner SectionKind Kind = SectionKindForGlobal(GV, TM); 193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->hasSection()) { 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the target has special section hacks for specifically named globals, 197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // return them now. 198f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind)) 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return TS; 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the target has magic semantics for certain section names, make sure to 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // pick up the flags. This allows the user to write things with attribute 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // section and still get the appropriate section flags printed. 204968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner Kind = getKindForNamedSection(GV->getSection().c_str(), Kind); 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 206968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner return getOrCreateSection(GV->getSection().c_str(), false, Kind); 207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 211f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 215a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 216f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 217f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 218e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 220f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 222f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 225824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 226824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 228f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 23483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 236f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 237a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 23883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(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:: 247968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetOrCreateSection(const char *Name, bool isDirective, SectionKind Kind) const { 248a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner if (MCSection *S = Ctx->GetSection(Name)) 249a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner return S; 250968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner return MCSection::Create(Name, isDirective, Kind, *Ctx); 251f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 259f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 260f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 261a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!HasCrazyBSS) 2632798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner BSSSection = getOrCreateSection("\t.bss", true, SectionKind::getBSS()); 264f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // PPC/Linux doesn't support the .bss directive, it needs .section .bss. 266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Does .section .bss work everywhere?? 267968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // FIXME2: this should just be handle by the section printer. We should get 268968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // away from syntactic view of the sections and MCSection should just be a 269968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner // semantic view. 2702798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner BSSSection = getOrCreateSection("\t.bss", false, SectionKind::getBSS()); 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2732798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner TextSection = getOrCreateSection("\t.text", true, SectionKind::getText()); 2742798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner DataSection = getOrCreateSection("\t.data", true, SectionKind::getDataRel()); 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 2762798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner getOrCreateSection("\t.rodata", false, SectionKind::getReadOnly()); 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TLSDataSection = 2782798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner getOrCreateSection("\t.tdata", false, SectionKind::getThreadData()); 279824583844a8f334dd261894a3fac7ad476531667Chris Lattner CStringSection = getOrCreateSection("\t.rodata.str", true, 2802798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableCString()); 281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 282968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner TLSBSSSection = getOrCreateSection("\t.tbss", false, 2832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getThreadBSS()); 284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelSection = getOrCreateSection("\t.data.rel", false, 2862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false, 2882798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRelLocal()); 289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROSection = getOrCreateSection("\t.data.rel.ro", false, 2902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRel()); 291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataRelROLocalSection = 292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t.data.rel.ro.local", false, 2932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRelLocal()); 294f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 295f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst4Section = getOrCreateSection(".rodata.cst4", false, 2962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst4()); 297f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst8Section = getOrCreateSection(".rodata.cst8", false, 2982798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst8()); 299f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner MergeableConst16Section = getOrCreateSection(".rodata.cst16", false, 3002798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst16()); 30180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 30280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 30380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".ctors", false, SectionKind::getDataRel()); 30480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 30580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".dtors", false, SectionKind::getDataRel()); 306d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner 307d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner 308d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 309d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 310d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 311d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 312d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 313d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly()); 314f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 315f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 316f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 317968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnerSectionKind TargetLoweringObjectFileELF:: 318968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetKindForNamedSection(const char *Name, SectionKind K) const { 319f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 320f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 321f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 322f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 323f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 324f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 325f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 3262798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 327f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 328f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 329f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 330f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 331f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 3322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 333f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 334f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 335f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 336f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 337f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 3382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 339f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 340f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 341f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 342f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 343f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileELF:: 344f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 345f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 346f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('"'); 347f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 348f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!Kind.isMetadata()) 349f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('a'); 350f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 351f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('x'); 352f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 353f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('w'); 35482987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner if (Kind.isMergeableCString() || 35582987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst4() || 35682987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst8() || 35782987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner Kind.isMergeableConst16()) 358f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('M'); 359f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableCString()) 360f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('S'); 361f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadLocal()) 362f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('T'); 363f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 364f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('"'); 365f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 366f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 367f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If comment string is '@', e.g. as on ARM - use '%' instead 368f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (AtIsCommentChar) 369f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('%'); 370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 371f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('@'); 372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 373f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const char *KindStr; 374bf15e433b9ac6692e76aff0465cd93bb87f68989Chris Lattner if (Kind.isBSS() || Kind.isThreadBSS()) 375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner KindStr = "nobits"; 376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner else 377f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner KindStr = "progbits"; 378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.append(KindStr, KindStr+strlen(KindStr)); 380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableCString()) { 382f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // TODO: Eventually handle multiple byte character strings. For now, all 383f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable C strings are single byte. 384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('1'); 386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst4()) { 387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 388f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('4'); 389f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst8()) { 390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('8'); 392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } else if (Kind.isMergeableConst16()) { 393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back(','); 394f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('1'); 395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.push_back('6'); 396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 399f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 400f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 401f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 402f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 403f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 404f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 405f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 406f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 407f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 408f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 410f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 411f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 412f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 413f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 415f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 417a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 418f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 419e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 420f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 421f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 422f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 42327602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 424f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 425b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 426f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return getOrCreateSection((Prefix+Name).c_str(), false, Kind); 427f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 428f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 429f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 430e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner 431f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableCString()) { 432824583844a8f334dd261894a3fac7ad476531667Chris Lattner assert(CStringSection && "Should have string section prefix"); 433f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 434067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 435067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 436067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 437067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner unsigned Align = 438067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 439f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 440824583844a8f334dd261894a3fac7ad476531667Chris Lattner std::string Name = CStringSection->getName() + "1." + utostr(Align); 441067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner return getOrCreateSection(Name.c_str(), false, 4422798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableCString()); 443f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 444f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 445f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 446f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 447f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 448f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 449f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 450f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16()) 451f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 452f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 453f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 454f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 455f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 456f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 457f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 458f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 459f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 460824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS()) return BSSSection; 461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 462f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 463f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 464f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 465f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 467f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 470f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 47183d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 472f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 474a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 47583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 477f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 478f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 479f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst16()) 481f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 482f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 483f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 484f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 489f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 490f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 494f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 495f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 496a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 497968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner TextSection = getOrCreateSection("\t.text", true, 4982798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 499968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner DataSection = getOrCreateSection("\t.data", true, 5002798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 501f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 502824583844a8f334dd261894a3fac7ad476531667Chris Lattner CStringSection = getOrCreateSection("\t.cstring", true, 5032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableCString()); 504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner FourByteConstantSection = getOrCreateSection("\t.literal4\n", true, 5052798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst4()); 506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner EightByteConstantSection = getOrCreateSection("\t.literal8\n", true, 5072798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst8()); 5084bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner 5094bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 5104bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 5114bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 5124bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 5134bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner SixteenByteConstantSection = 514968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner getOrCreateSection("\t.literal16\n", true, 5152798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getMergeableConst16()); 5164bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner else 5174bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner SixteenByteConstantSection = 0; 518f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 519968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner ReadOnlySection = getOrCreateSection("\t.const", true, 5202798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnly()); 521f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 522f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextCoalSection = 523f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions", 5242798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner false, SectionKind::getText()); 525f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced", 526968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner false, 5272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 528f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced", 529968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner false, 5302798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ConstDataSection = getOrCreateSection("\t.const_data", true, 5322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getReadOnlyWithRel()); 533f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced", 534968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner false, 5352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 53680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 53780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 53880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 53980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".constructor", true, SectionKind::getDataRel()); 54080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 54180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".destructor", true, SectionKind::getDataRel()); 54280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 54380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 54480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".mod_init_func", true, SectionKind::getDataRel()); 54580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 54680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel()); 54780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 54880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 549d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false, 550d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner SectionKind::getDataRel()); 551f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 552f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 553a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 554f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 555e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 556f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 557f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 558f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 55927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 560f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 561f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 56327602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 564f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 570f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableCString()) { 571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = cast<GlobalVariable>(GV)->getInitializer(); 572f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const Type *Ty = cast<ArrayType>(C->getType())->getElementType(); 573f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetData &TD = *TM.getTargetData(); 574f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner unsigned Size = TD.getTypeAllocSize(Ty); 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Size) { 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV)); 577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Align <= 32) 578824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 579f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 580f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 582f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 583f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 584f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 585f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 587f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 588f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 589f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 590f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 591f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 593f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 594f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: ROData -> const in -static mode that is relocatable but they happen 595f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // by the static linker. Why not mergeable? 596f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 597f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 598f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 600f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 601f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 602f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 603f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 605f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 606f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 607f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 608a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 60983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 610f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 611f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 612f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) 613f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 614f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 615f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 616f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 617f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 618f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 6194bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 620f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 622f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 623f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 62426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 62526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 62626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 62726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 62826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 62926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 63026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 63126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 63226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 63326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 63426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 63526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 63626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 63726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 63826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 63926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 64026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 64126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 64226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 64326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 64426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 64526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 64626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 647f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 648f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 649f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 650f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 651f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 652f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 653a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 654968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner TextSection = getOrCreateSection("\t.text", true, 6552798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getText()); 656968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner DataSection = getOrCreateSection("\t.data", true, 6572798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner SectionKind::getDataRel()); 65880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 65980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".ctors", false, SectionKind::getDataRel()); 66080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 66180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner getOrCreateSection(".dtors", false, SectionKind::getDataRel()); 662f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 664f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileCOFF:: 665f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Inefficient. 667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner std::string Res = ",\""; 668f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += 'x'; 670f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 671f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += 'w'; 672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Res += "\""; 673f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 674f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Str.append(Res.begin(), Res.end()); 675f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 676f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 677f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 678f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 679f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 680f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 681f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 682f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 683f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 684f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 685f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 686a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 687f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 688e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 689f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 690f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 691f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 692f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 69327602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 694f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 695968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner std::string Name = Mang->makeNameProper(GV->getNameStr()); 696f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return getOrCreateSection((Prefix+Name).c_str(), false, Kind); 697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 699f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 700f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 701f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 702f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 703f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 704f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 705