TargetLoweringObjectFile.cpp revision cab16cc9a34b8a18e9f91c99085b2f0a1d287e12
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" 18ffef8acc3e3398bdd04e947c7949befdd52faf86Dan Gohman#include "llvm/Function.h" 19f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/GlobalVariable.h" 20a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h" 218c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h" 22f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h" 23b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCSectionELF.h" 24f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h" 255277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h" 26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h" 278f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h" 28a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/Support/Mangler.h" 295dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h" 30f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h" 31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm; 32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Generic Code 35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 37a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner TextSection = 0; 39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner DataSection = 0; 40824583844a8f334dd261894a3fac7ad476531667Chris Lattner BSSSection = 0; 41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner ReadOnlySection = 0; 4280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 0; 4380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 0; 44d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 0; 4535039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 0; 4618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfAbbrevSection = 0; 4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfInfoSection = 0; 4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLineSection = 0; 5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfFrameSection = 0; 5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 0; 5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 0; 5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfDebugInlineSection = 0; 5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfStrSection = 0; 5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfLocSection = 0; 5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfARangesSection = 0; 5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfRangesSection = 0; 5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfMacroInfoSection = 0; 59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 61f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() { 62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) { 65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GV->getInitializer(); 668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Must have zero initializer. 68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!C->isNullValue()) 69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Leave constant zeros in readonly constant sections, so they can be shared. 72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GV->isConstant()) 73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global has an explicit section specified, don't put it in BSS. 76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (!GV->getSection().empty()) 77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If -nozero-initialized-in-bss is specified, don't ever use BSS. 80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (NoZerosInBSS) 81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, put it in BSS! 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is 881850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a 891850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it. 901850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) { 911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner const ArrayType *ATy = cast<ArrayType>(C->getType()); 928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // First check: is we have constant array of i8 terminated with zero 941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ATy->getNumElements() == 0) return false; 961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner 971850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ConstantInt *Null = 981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (Null == 0 || Null->getZExtValue() != 0) 1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; // Not null terminated. 1018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Verify that the null doesn't occur anywhere else in the string. 1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // Reject constantexpr elements etc. 1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (!isa<ConstantInt>(CVA->getOperand(i)) || 1061850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner CVA->getOperand(i) == Null) 1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return false; 108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return true; 1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Another possibility: [1 x i8] zeroinitializer 112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isa<ConstantAggregateZero>(C)) 1131850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return ATy->getNumElements() == 1; 114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return false; 116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 11858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for 119968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable. Given an global variable and information from TM, it 120968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target 121968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler. The target implementation is free to ignore this 122968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course. 12358bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV, 12458bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner const TargetMachine &TM){ 12558bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 12658bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner "Can only be used for global definitions"); 1278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Reloc::Model ReloModel = TM.getRelocationModel(); 1298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Early exit - functions should be always in text sections. 131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar == 0) 1332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getText(); 1348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Handle thread-local data first. 136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isThreadLocal()) { 137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 1392798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Variable can be easily put to BSS section. 143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (isSuitableForBSS(GVar)) 1442798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner Constant *C = GVar->getInitializer(); 1478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the global is marked constant, we can put it into a mergable section, 149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a mergable string section, or general .data if it contains relocations. 150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (GVar->isConstant()) { 151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If the initializer for the global contains something that requires a 152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // relocation, then we may have to drop this into a wriable data section 153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // even though it is marked const. 154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 1558f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If initializer is a null-terminated string, put it in a "cstring" 1581850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner // section of the right width. 1591850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 1608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov if (const IntegerType *ITy = 1611850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner dyn_cast<IntegerType>(ATy->getElementType())) { 1621850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 1631850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner ITy->getBitWidth() == 32) && 1641850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner IsNullTerminatedString(C)) { 1651850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 8) 1661850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable1ByteCString(); 1671850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner if (ITy->getBitWidth() == 16) 1681850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable2ByteCString(); 1698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner assert(ITy->getBitWidth() == 32 && "Unknown width"); 1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner return SectionKind::getMergeable4ByteCString(); 1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner } 1758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 176f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop it into a mergable constant section. If we have 177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // a section for this size, use it, otherwise use the arbitrary sized 178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // mergable section. 179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 1802798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: return SectionKind::getMergeableConst4(); 1812798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: return SectionKind::getMergeableConst8(); 1822798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: return SectionKind::getMergeableConst16(); 1832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: return SectionKind::getMergeableConst(); 184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 1858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 1948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel.local section. 1972798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRelLocal(); 1988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // In static relocation model, the linker will resolve all addresses, so 201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the relocation entries will actually be constants by the time the app 202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // starts up. However, we can't put this into a mergable section, because 203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // the linker doesn't take relocations into consideration when it tries to 204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // merge entries in the section. 205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnly(); 2078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, the dynamic linker needs to fix it up, put it in the 209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // writable data.rel section. 2102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getReadOnlyWithRel(); 211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Okay, this isn't a constant. If the initializer for the global is going 215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // to require a runtime relocation by the dynamic linker, put it into a more 216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // specific section to improve startup time of the app. This coalesces these 217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // globals together onto fewer pages, improving the locality of the dynamic 218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker. 219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (ReloModel == Reloc::Static) 2202798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner switch (C->getRelocationInfo()) { 2238f9b0f6e881a63875e7c41319eca31751588799aChris Lattner default: assert(0 && "unknown relocation info kind"); 224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::NoRelocation: 2252798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataNoRel(); 226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::LocalRelocation: 2272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRelLocal(); 228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner case Constant::GlobalRelocations: 2292798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getDataRel(); 230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit 234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition. This should not 235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals. 236a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile:: 23758bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang, 238e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner const TargetMachine &TM) const { 239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Select section name. 24024f654c8a4d14066233480f683d3b0dececf374aChris Lattner if (GV->hasSection()) 24124f654c8a4d14066233480f683d3b0dececf374aChris Lattner return getExplicitSectionGlobal(GV, Kind, Mang, TM); 2428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 2438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Use default section depending on the 'type' of global 245f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner return SelectSectionForGlobal(GV, Kind, Mang, TM); 246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 24858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner 249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global. 250a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 251f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 252f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner SectionKind Kind, 253e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, 254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner const TargetMachine &TM) const{ 255f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 2568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 257f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 2598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 260824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS() && BSSSection != 0) 261824583844a8f334dd261894a3fac7ad476531667Chris Lattner return BSSSection; 2628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 264f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 26983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the 270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 272a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 27383d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly() && ReadOnlySection != 0) 275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 2768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 2808c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a 2818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// pc-relative reference to the specified global variable from exception 2828c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// handling information. In addition to the symbol, this returns 2838c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// by-reference: 2848c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2858c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsIndirect - True if the returned symbol is actually a stub that contains 2868c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the address of the symbol, false if the symbol is the global itself. 2878c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2888c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsPCRel - True if the symbol reference is already pc-relative, false if 2898c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// the caller needs to subtract off the address of the reference from the 2908c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// symbol. 2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// 2928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile:: 2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 2948609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 2958c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The generic implementation of this just returns a direct reference to the 2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // symbol. 2988c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = false; 2998c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 3008c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 3048c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 305f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 306f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 307f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 308f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// ELF 309f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 31038cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy; 31138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 31238cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() { 31338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // If we have the section uniquing map, free it. 31438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (ELFUniqueMapTy*)UniquingMap; 31538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 316f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 317fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 318b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags, 319b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind Kind, bool IsExplicit) const { 32038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 32138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new ELFUniqueMapTy(); 32238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap; 3238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 32438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 325b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const MCSectionELF *&Entry = Map[Section]; 32638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 3278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 328fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit, 329fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes getContext()); 330fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 331fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 332f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 333f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 33476d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 33576d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((ELFUniqueMapTy*)UniquingMap)->clear(); 336a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 337f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 3388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov BSSSection = 339b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".bss", MCSectionELF::SHT_NOBITS, 340b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 341b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getBSS()); 3428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TextSection = 344b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".text", MCSectionELF::SHT_PROGBITS, 345b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC, 346b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getText()); 347b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataSection = 349b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data", MCSectionELF::SHT_PROGBITS, 350b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC, 351b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 352b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov ReadOnlySection = 3548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".rodata", MCSectionELF::SHT_PROGBITS, 3558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC, 356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnly()); 357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSDataSection = 359b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tdata", MCSectionELF::SHT_PROGBITS, 3608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 361b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadData()); 3628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov TLSBSSSection = 364b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".tbss", MCSectionELF::SHT_NOBITS, 365b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS | 366b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS()); 367b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelSection = 369b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS, 370b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 371b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 372b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelLocalSection = 374b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS, 375b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 376b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRelLocal()); 377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROSection = 379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS, 380b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 381b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRel()); 382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DataRelROLocalSection = 384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS, 385b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 386b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getReadOnlyWithRelLocal()); 3878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 3888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst4Section = 389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS, 390b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 391b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst4()); 392b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst8Section = 394b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS, 395b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 396b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst8()); 397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 3988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MergeableConst16Section = 399b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS, 400b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE, 401b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMergeableConst16()); 40280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 40380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 4048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".ctors", MCSectionELF::SHT_PROGBITS, 405b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 406b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 40880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 409b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".dtors", MCSectionELF::SHT_PROGBITS, 410b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 411b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getDataRel()); 4128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 41318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling Sections. 4148ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 415d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 416d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // it contains relocatable pointers. In PIC mode, this is probably a big 417d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // runtime hit for C++ apps. Either the contents of the LSDA need to be 418d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner // adjusted or this should be a data section. 419d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner LSDASection = 420b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS, 421b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly()); 42235039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 4238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS, 424b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE, 425b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner SectionKind::getDataRel()); 4268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 42718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Info Sections. 4288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 4298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0, 430b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 4328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0, 433b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 4358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0, 436b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 4388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0, 439b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 4418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0, 442b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 4448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0, 445b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 447b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0, 448b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0, 451b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 4538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0, 454b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 4568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0, 457b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 4588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 4598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0, 460b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes SectionKind::getMetadata()); 461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 462f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 463f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 4648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind 46524f654c8a4d14066233480f683d3b0dececf374aChris LattnergetELFKindForNamedSection(const char *Name, SectionKind K) { 466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Name[0] != '.') return K; 4678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Some lame default implementation based on some magic section names. 4694c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov if (strcmp(Name, ".bss") == 0 || 4704c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".bss.", 5) == 0 || 4714c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 472f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 4734c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strcmp(Name, ".sbss") == 0 || 4744c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov strncmp(Name, ".sbss.", 6) == 0 || 475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 4772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getBSS(); 4788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 479f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tdata") == 0 || 480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tdata.", 7) == 0 || 481f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 482f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 4832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadData(); 4848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (strcmp(Name, ".tbss") == 0 || 486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".tbss.", 6) == 0 || 487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 4892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner return SectionKind::getThreadBSS(); 4908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return K; 492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 494b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4954813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) { 496b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 4974813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".init_array") 498b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_INIT_ARRAY; 499b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5004813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".fini_array") 501b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_FINI_ARRAY; 502b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5034813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner if (Name == ".preinit_array") 504b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PREINIT_ARRAY; 505b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 506b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isBSS() || K.isThreadBSS()) 507b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_NOBITS; 508b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 509b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return MCSectionELF::SHT_PROGBITS; 510b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 511b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 512b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 513b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned 514b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) { 515b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes unsigned Flags = 0; 516b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 517b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (!K.isMetadata()) 518b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_ALLOC; 5198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 520848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov if (K.isText()) 521848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov Flags |= MCSectionELF::SHF_EXECINSTR; 5228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 523b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isWriteable()) 524b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_WRITE; 5258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 526b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isThreadLocal()) 527b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_TLS; 5288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 529b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes // K.isMergeableConst() is left out to honour PR4650 530b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString() || K.isMergeableConst4() || 531b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes K.isMergeableConst8() || K.isMergeableConst16()) 532b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_MERGE; 533b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 534b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes if (K.isMergeableCString()) 535b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Flags |= MCSectionELF::SHF_STRINGS; 536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 537b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes return Flags; 538b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes} 539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 540b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54124f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 5428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 54324f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes const char *SectionName = GV->getSection().c_str(); 545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 54624f654c8a4d14066233480f683d3b0dececf374aChris Lattner // Infer section flags from the section name if we can. 547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind = getELFKindForNamedSection(SectionName, Kind); 5488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(SectionName, 5508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionType(SectionName, Kind), 551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes getELFSectionFlags(Kind), Kind, true); 55224f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 553f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) return ".gnu.linkonce.t."; 556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 5578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 558f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadData()) return ".gnu.linkonce.td."; 559f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 5608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 561f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isBSS()) return ".gnu.linkonce.b."; 562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 564f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 5668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".gnu.linkonce.d.rel.ro."; 569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 571a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 572f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 573e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 5748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 57727602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 578f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 5794813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name; 5804813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Name.append(Prefix, Prefix+strlen(Prefix)); 5814d5f06fbe55ef7dd1d7709407d7b963965c077cfChris Lattner // FIXME: This will fail for weak globals with no names, this also depends 5824d5f06fbe55ef7dd1d7709407d7b963965c077cfChris Lattner // on the mangling behavior of makeNameProper to mangle the section name 5834d5f06fbe55ef7dd1d7709407d7b963965c077cfChris Lattner // before construction. Instead, this should use getNameWithPrefix on the 5844d5f06fbe55ef7dd1d7709407d7b963965c077cfChris Lattner // global variable and the MCSection printing code should do the mangling. 5854813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner Mang->makeNameProper(Name, GV->getName()); 586b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes 5874813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getELFSection(Name.str(), 5884813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner getELFSectionType(Name.str(), Kind), 5898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov getELFSectionFlags(Kind), 590b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 591f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 5928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 593f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) return TextSection; 5948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 5953b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable1ByteCString() || 5963b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable2ByteCString() || 5973b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner Kind.isMergeable4ByteCString()) { 5988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 599067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // We also need alignment here. 600067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // FIXME: this is getting the alignment of the character, not the 601067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner // alignment of the global! 6028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov unsigned Align = 603067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 6048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6057e88a50428377813606c66ac47111d9c3ea44febChris Lattner const char *SizeSpec = ".rodata.str1."; 6063b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner if (Kind.isMergeable2ByteCString()) 6077e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str2."; 6083b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else if (Kind.isMergeable4ByteCString()) 6097e88a50428377813606c66ac47111d9c3ea44febChris Lattner SizeSpec = ".rodata.str4."; 6103b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner else 6113b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner assert(Kind.isMergeable1ByteCString() && "unknown string width"); 6128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6147e88a50428377813606c66ac47111d9c3ea44febChris Lattner std::string Name = SizeSpec + utostr(Align); 6158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS, 6168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_ALLOC | 6178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_MERGE | 6188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov MCSectionELF::SHF_STRINGS, 619b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes Kind); 620f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 622f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 623203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst4() && MergeableConst4Section) 624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 625203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst8() && MergeableConst8Section) 626f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 627203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner if (Kind.isMergeableConst16() && MergeableConst16Section) 628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 629f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 630f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 6318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 632f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) return ReadOnlySection; 6338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 634f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadData()) return TLSDataSection; 635f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isThreadBSS()) return TLSBSSSection; 6368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 637824583844a8f334dd261894a3fac7ad476531667Chris Lattner if (Kind.isBSS()) return BSSSection; 6388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 639f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataNoRel()) return DataSection; 640f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRelLocal()) return DataRelLocalSection; 641f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isDataRel()) return DataRelSection; 642f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 6438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 644f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 645f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 646f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 647f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 64883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the 649f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it 650f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in. 651a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF:: 65283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const { 6532a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst4() && MergeableConst4Section) 654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst4Section; 6552a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst8() && MergeableConst8Section) 656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst8Section; 6572a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne if (Kind.isMergeableConst16() && MergeableConst16Section) 658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return MergeableConst16Section; 659f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnly()) 660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 6618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 662f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 664f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataRelROSection; 665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 668f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// MachO 669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 670f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 6715dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy; 6725dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6735dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() { 6745dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // If we have the MachO uniquing map, free it. 6755dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner delete (MachOUniqueMapTy*)UniquingMap; 6765dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner} 6770c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 6785dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 6795dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO:: 6802928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section, 681ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TypeAndAttributes, 682ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned Reserved2, SectionKind Kind) const { 6835dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // We unique sections by their segment/section pair. The returned section 6845dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // may not have the same flags as the requested section, if so this should be 6855dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // diagnosed by the client as an error. 6868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6875dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Create the map if it doesn't already exist. 6885dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (UniquingMap == 0) 6895dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner UniquingMap = new MachOUniqueMapTy(); 6905dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap; 6918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6925dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Form the name to look up. 6935dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner SmallString<64> Name; 69416df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Segment; 6955dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Name.push_back(','); 69616df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar Name += Section; 6978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 6985dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Do the lookup, if we have a hit, return it. 69916df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar const MCSectionMachO *&Entry = Map[Name.str()]; 7005dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner if (Entry) return Entry; 7015dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner 7025dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner // Otherwise, return a new section. 7035dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes, 7045dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner Reserved2, Kind, getContext()); 705fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 706fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 70711e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner 708f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 709f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 71076d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 71176d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((MachOUniqueMapTy*)UniquingMap)->clear(); 712a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 7138ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 714ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextSection // .text 715ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__text", 716ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 717ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 718ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataSection // .data 719ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel()); 7208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 721ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner CStringSection // .cstring 722ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS, 723ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable1ByteCString()); 724ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner UStringSection 725ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT","__ustring", 0, 726ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeable2ByteCString()); 727ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner FourByteConstantSection // .literal4 728ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS, 729ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst4()); 730ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner EightByteConstantSection // .literal8 731ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS, 732ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getMergeableConst8()); 7338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 7344bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 7354bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner // to using it in -static mode. 736ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = 0; 7374bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (TM.getRelocationModel() != Reloc::Static && 7384bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner TM.getTargetData()->getPointerSize() == 32) 739ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SixteenByteConstantSection = // .literal16 740ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS, 7410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMergeableConst16()); 7428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ReadOnlySection // .const 744ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly()); 7458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 746ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TextCoalSection 747ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__textcoal_nt", 748ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 749ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 750ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 751ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstTextCoalSection 752ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED, 753ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 754ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataCoalSection 755ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED, 756ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getText()); 757ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner ConstDataSection // .const_data 758ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__const", 0, 759ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnlyWithRel()); 760ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner DataCoalSection 761ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED, 762ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 76380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner 7648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 765e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner LazySymbolPointerSection 766e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__la_symbol_ptr", 767e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 768e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 769e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner NonLazySymbolPointerSection 770e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner = getMachOSection("__DATA", "__nl_symbol_ptr", 771e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 772e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner SectionKind::getMetadata()); 7738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 77480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner if (TM.getRelocationModel() == Reloc::Static) { 775ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 776ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel()); 777ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 778ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel()); 77980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } else { 780ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticCtorSection 781ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner = getMachOSection("__DATA", "__mod_init_func", 782ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 783ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 784ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StaticDtorSection 7858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov = getMachOSection("__DATA", "__mod_term_func", 786ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 787ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getDataRel()); 78880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner } 7898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 79018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Exception Handling. 791fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0, 792fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling SectionKind::getDataRel()); 79335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner EHFrameSection = 794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__TEXT", "__eh_frame", 795ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_COALESCED | 796ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_NO_TOC | 797ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 798ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::S_ATTR_LIVE_SUPPORT, 799ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner SectionKind::getReadOnly()); 80018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 80118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug Information. 8028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 803ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG, 8040c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 806ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG, 8070c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 809ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG, 8100c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 812ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG, 8130c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8148ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubNamesSection = 815ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG, 8160c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfPubTypesSection = 818ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG, 8190c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 821ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG, 8220c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 824ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG, 8250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 827ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG, 8280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 830ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG, 8310c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 833ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG, 8340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 8358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfDebugInlineSection = 836ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG, 8370c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner SectionKind::getMetadata()); 838f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 839f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 840a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 8418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 84224f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner // Parse the section specifier and create it if valid. 844ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner StringRef Segment, Section; 845ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner unsigned TAA, StubSize; 846ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner std::string ErrorCode = 847ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 848ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner TAA, StubSize); 849e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (!ErrorCode.empty()) { 850e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 851e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 852e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' has an invalid section specifier '" + GV->getSection()+ 853e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "': " + ErrorCode + "."); 854e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Fall back to dropping it into the data section. 855e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return DataSection; 856e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 858e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Get the section. 859e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner const MCSectionMachO *S = 860e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner getMachOSection(Segment, Section, TAA, StubSize, Kind); 8618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 862e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // Okay, now that we got the section, verify that the TAA & StubSize agree. 863e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If the user declared multiple globals with different section flags, we need 864e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // to reject it here. 865e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 866e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner // If invalid, report the error with llvm_report_error. 867e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner llvm_report_error("Global variable '" + GV->getNameStr() + 868e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner "' section type or attributes does not match previous" 869e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner " section specifier"); 870e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner } 8718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 872e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner return S; 87324f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 87424f654c8a4d14066233480f683d3b0dececf374aChris Lattner 87524f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO:: 876f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 877e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 878f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 8798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 880f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 88127602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner return GV->isWeakForLinker() ? TextCoalSection : TextSection; 8828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 883f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is weak/linkonce, put this in a coalescable section, either in text 884f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // or data depending on if it is writable. 88527602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 886f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 887f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstTextCoalSection; 888f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataCoalSection; 889f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 8908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 891f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // FIXME: Alignment check should be handled by section classifier. 892ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString() || 893ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner Kind.isMergeable2ByteCString()) { 894ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (TM.getTargetData()->getPreferredAlignment( 895ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner cast<GlobalVariable>(GV)) < 32) { 896ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner if (Kind.isMergeable1ByteCString()) 897824583844a8f334dd261894a3fac7ad476531667Chris Lattner return CStringSection; 898ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner assert(Kind.isMergeable2ByteCString()); 899ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner return UStringSection; 900f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 901f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 9028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 903f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst()) { 904f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst4()) 905f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 906f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst8()) 907f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 908f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 909f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 910f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 911ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner 912ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // Otherwise, if it is readonly, but not something we can specially optimize, 913ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner // just drop it in .const. 914f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnly()) 915f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; 916f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 917f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this is marked const, put it into a const section. But if the dynamic 918f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // linker needs to write to it, put it in the data segment. 919f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isReadOnlyWithRel()) 920f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 922f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // Otherwise, just drop the variable in the normal data section. 923f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return DataSection; 924f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 925f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 926a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection * 92783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 928f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this constant requires a relocation, we have to put it in the data 929f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // segment, not in the text segment. 930a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher if (Kind.isDataRel() || Kind.isReadOnlyWithRel()) 931f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ConstDataSection; 9328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 933f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst4()) 934f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return FourByteConstantSection; 935f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isMergeableConst8()) 936f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return EightByteConstantSection; 9374bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner if (Kind.isMergeableConst16() && SixteenByteConstantSection) 938f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return SixteenByteConstantSection; 939f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ReadOnlySection; // .const 940f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 941f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 94226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 94326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used. 94426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300) 94526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO:: 94626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 94726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// On Darwin, internally linked data beginning with "L" or "l" does not have 94826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner /// the directive emitted (this occurs in ObjC metadata). 94926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (!GV) return false; 9508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 95126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 95226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 95326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // FIXME: ObjC metadata is currently emitted as internal symbols that have 95426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 95526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner // this horrible hack can go away. 95626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner const std::string &Name = Mang->getMangledName(GV); 95726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (Name[0] == 'L' || Name[0] == 'l') 95826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return false; 95926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner } 9608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 96126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner return true; 96226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner} 96326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 9648c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO:: 9658c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 9668609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner MachineModuleInfo *MMI, 9678c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner bool &IsIndirect, bool &IsPCRel) const { 9688c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // The mach-o version of this method defaults to returning a stub reference. 9698c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsIndirect = true; 9708c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner IsPCRel = false; 9718c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 9728c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner SmallString<128> Name; 9738c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Mang->getNameWithPrefix(Name, GV, true); 9748c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner Name += "$non_lazy_ptr"; 9758c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner return MCSymbolRefExpr::Create(Name.str(), getContext()); 9768c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner} 9778c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 97826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner 979f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 980f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// COFF 981f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===// 982f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 98338cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy; 98438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 98538cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() { 98638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner delete (COFFUniqueMapTy*)UniquingMap; 98738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner} 98838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner 9890c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner 99011e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 9914813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const { 99238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Create the map if it doesn't already exist. 99338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (UniquingMap == 0) 99438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner UniquingMap = new MachOUniqueMapTy(); 99538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap; 9968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 99738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner // Do the lookup, if we have a hit, return it. 99838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner const MCSectionCOFF *&Entry = Map[Name]; 99938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner if (Entry) return Entry; 10008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 100138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext()); 1002fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner} 1003fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner 1004f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 1005f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const TargetMachine &TM) { 100676d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer if (UniquingMap != 0) 100776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer ((COFFUniqueMapTy*)UniquingMap)->clear(); 1008a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner TargetLoweringObjectFile::Initialize(Ctx, TM); 10090c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner TextSection = getCOFFSection("\t.text", true, SectionKind::getText()); 10100c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel()); 101180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticCtorSection = 10120c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".ctors", false, SectionKind::getDataRel()); 101380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner StaticDtorSection = 10140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection(".dtors", false, SectionKind::getDataRel()); 10158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 101635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // FIXME: We're emitting LSDA info into a readonly section on COFF, even 101735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // though it contains relocatable pointers. In PIC mode, this is probably a 101835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // big runtime hit for C++ apps. Either the contents of the LSDA need to be 101935c3531754c392a533921a465a22f67f7e8fb743Chris Lattner // adjusted or this should be a data section. 102035c3531754c392a533921a465a22f67f7e8fb743Chris Lattner LSDASection = 102135c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly()); 102235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner EHFrameSection = 102335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner getCOFFSection(".eh_frame", false, SectionKind::getDataRel()); 10248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 102518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // Debug info. 102618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner // FIXME: Don't use 'directive' mode here. 10278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfAbbrevSection = 10280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_abbrev,\"dr\"", 10290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfInfoSection = 10310c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_info,\"dr\"", 10320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLineSection = 10340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_line,\"dr\"", 10350c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfFrameSection = 10370c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_frame,\"dr\"", 10380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 103918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubNamesSection = 10400c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubnames,\"dr\"", 10410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 104218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner DwarfPubTypesSection = 10430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"", 10440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfStrSection = 10460c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_str,\"dr\"", 10470c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfLocSection = 10490c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_loc,\"dr\"", 10500c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfARangesSection = 10520c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_aranges,\"dr\"", 10530c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfRangesSection = 10550c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_ranges,\"dr\"", 10560c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 10578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov DwarfMacroInfoSection = 10580c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner getCOFFSection("\t.section\t.debug_macinfo,\"dr\"", 10590c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner true, SectionKind::getMetadata()); 1060f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1061f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 106224f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 10638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 106424f654c8a4d14066233480f683d3b0dececf374aChris Lattner Mangler *Mang, const TargetMachine &TM) const { 10650c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner return getCOFFSection(GV->getSection().c_str(), false, Kind); 106624f654c8a4d14066233480f683d3b0dececf374aChris Lattner} 106724f654c8a4d14066233480f683d3b0dececf374aChris Lattner 1068f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 1069f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isText()) 1070f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".text$linkonce"; 1071f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner if (Kind.isWriteable()) 1072f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".data$linkonce"; 1073f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return ".rdata$linkonce"; 1074f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 1075f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1076f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 1077a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF:: 1078f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 1079e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner Mangler *Mang, const TargetMachine &TM) const { 1080f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 10818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1082f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // If this global is linkonce/weak and the target handles this by emitting it 1083f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner // into a 'uniqued' section name, create and return the section now. 108427602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner if (GV->isWeakForLinker()) { 1085f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 10864813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<128> Name(Prefix, Prefix+strlen(Prefix)); 1087cab16cc9a34b8a18e9f91c99085b2f0a1d287e12Chris Lattner Mang->getNameWithPrefix(Name, GV, false); 10884813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return getCOFFSection(Name.str(), false, Kind); 1089f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner } 10908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1091f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner if (Kind.isText()) 1092f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getTextSection(); 10938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov 1094f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return getDataSection(); 1095f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 10968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 1097