TargetLoweringObjectFile.cpp revision 9184b25fa543a900463215c11635c2c014ddb623
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"
209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/CodeGen/MachineModuleInfoImpls.h"
21a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h"
228c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h"
23f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h"
24b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCSectionELF.h"
258da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h"
2645111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h"
27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h"
285277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h"
29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h"
309184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h"
318f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h"
328da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h"
335dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h"
34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h"
35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm;
36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                              Generic Code
39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
41a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
42f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = 0;
43f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = 0;
44824583844a8f334dd261894a3fac7ad476531667Chris Lattner  BSSSection = 0;
45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection = 0;
4680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection = 0;
4780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection = 0;
48d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection = 0;
4935039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection = 0;
5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection = 0;
5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection = 0;
5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection = 0;
5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection = 0;
5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection = 0;
5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection = 0;
5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfDebugInlineSection = 0;
5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection = 0;
5918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection = 0;
6018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection = 0;
6118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection = 0;
6218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection = 0;
63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
65f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) {
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GV->getInitializer();
708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is
921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a
931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it.
941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) {
951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  const ArrayType *ATy = cast<ArrayType>(C->getType());
968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // First check: is we have constant array of i8 terminated with zero
981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) {
991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    if (ATy->getNumElements() == 0) return false;
1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner
1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    ConstantInt *Null =
1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1));
1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    if (Null == 0 || Null->getZExtValue() != 0)
1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      return false; // Not null terminated.
1058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1061850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    // Verify that the null doesn't occur anywhere else in the string.
1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i)
1081850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // Reject constantexpr elements etc.
1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      if (!isa<ConstantInt>(CVA->getOperand(i)) ||
1101850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          CVA->getOperand(i) == Null)
1111850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        return false;
112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return true;
1131850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  }
114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
1171850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    return ATy->getNumElements() == 1;
118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
12258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for
123968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable.  Given an global variable and information from TM, it
124968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target
125968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler.  The target implementation is free to ignore this
126968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course.
12758bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV,
12858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner                                                       const TargetMachine &TM){
12958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
13058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner         "Can only be used for global definitions");
1318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
1338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
1372798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getText();
1388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (isSuitableForBSS(GVar))
1422798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getThreadBSS();
1432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
146a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  // Variables with common linkage always get classified as common.
147a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  if (GVar->hasCommonLinkage())
148a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner    return SectionKind::getCommon();
149a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner
150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
151ce8749e445fdd0493758932874bad50293647df9Chris Lattner  if (isSuitableForBSS(GVar)) {
152ce8749e445fdd0493758932874bad50293647df9Chris Lattner    if (GVar->hasLocalLinkage())
153ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSLocal();
154ce8749e445fdd0493758932874bad50293647df9Chris Lattner    else if (GVar->hasExternalLinkage())
155ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSExtern();
1562798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
157ce8749e445fdd0493758932874bad50293647df9Chris Lattner  }
158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GVar->getInitializer();
1608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isConstant()) {
164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // relocation, then we may have to drop this into a wriable data section
166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
1688f9b0f6e881a63875e7c41319eca31751588799aChris Lattner    default: assert(0 && "unknown relocation info kind");
169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // section of the right width.
1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
1738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov        if (const IntegerType *ITy =
1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              dyn_cast<IntegerType>(ATy->getElementType())) {
1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 ||
1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner               ITy->getBitWidth() == 32) &&
1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              IsNullTerminatedString(C)) {
1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 8)
1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable1ByteCString();
1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 16)
1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable2ByteCString();
1828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1831850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            assert(ITy->getBitWidth() == 32 && "Unknown width");
1841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            return SectionKind::getMergeable4ByteCString();
1851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          }
1861850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        }
1871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      }
1888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 4:  return SectionKind::getMergeableConst4();
1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 8:  return SectionKind::getMergeableConst8();
1952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 16: return SectionKind::getMergeableConst16();
1962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      default: return SectionKind::getMergeableConst();
197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
1988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
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.local section.
2102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRelLocal();
2118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2192798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
2232798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRel();
224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
2332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
2368f9b0f6e881a63875e7c41319eca31751588799aChris Lattner  default: assert(0 && "unknown relocation info kind");
237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
2382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
2402798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRelLocal();
241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
2422798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRel();
243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
249a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
25058bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang,
251e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
25324f654c8a4d14066233480f683d3b0dececf374aChris Lattner  if (GV->hasSection())
25424f654c8a4d14066233480f683d3b0dececf374aChris Lattner    return getExplicitSectionGlobal(GV, Kind, Mang, TM);
2558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
2568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
258f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
26158bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner
262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
263a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
264f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
265f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner                                                 SectionKind Kind,
266e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
268f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
2698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
270f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
2728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
273824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS() && BSSSection != 0)
274824583844a8f334dd261894a3fac7ad476531667Chris Lattner    return BSSSection;
2758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
276f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
28283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the
283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
285a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
28683d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
2898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a
2949184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// reference to the specified global variable from exception
2959184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// handling information.
2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile::
2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
2989184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov                             MachineModuleInfo *MMI, unsigned Encoding) const {
29945111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner  // FIXME: Use GetGlobalValueSymbol.
3008c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  SmallString<128> Name;
3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  Mang->getNameWithPrefix(Name, GV, false);
3029184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  const MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
3039184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3049184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return getSymbolForDwarfReference(Sym, MMI, Encoding);
3059184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3069184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3079184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFile::
3089184b25fa543a900463215c11635c2c014ddb623Anton KorobeynikovgetSymbolForDwarfReference(const MCSymbol *Sym, MachineModuleInfo *MMI,
3099184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov                           unsigned Encoding) const {
3109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext());
3119184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3129184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  switch (Encoding & 0xF0) {
3139184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  default:
3149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    llvm_report_error("Do not support this DWARF encoding yet!");
3159184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    break;
3169184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  case dwarf::DW_EH_PE_absptr:
3179184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    // Do nothing special
3189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    break;
3199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  case dwarf::DW_EH_PE_pcrel:
3209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    // FIXME: PCSymbol
3219184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    const MCExpr *PC = MCSymbolRefExpr::Create(".", getContext());
3229184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    Res = MCBinaryExpr::CreateSub(Res, PC, getContext());
3239184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    break;
3249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  }
3259184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3269184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return Res;
3279184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3289184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3299184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getPersonalityEncoding() const {
3309184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3319184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3329184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3339184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getLSDAEncoding() const {
3349184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3359184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3369184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3379184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getFDEEncoding() const {
3389184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3398c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner}
340f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
3419184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getTTypeEncoding() const {
3429184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3439184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
344f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
345f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
346f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  ELF
347f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
34838cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy;
34938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner
35038cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() {
35138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // If we have the section uniquing map, free it.
35238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  delete (ELFUniqueMapTy*)UniquingMap;
35338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner}
354f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
355fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags,
357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes              SectionKind Kind, bool IsExplicit) const {
35838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (UniquingMap == 0)
35938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner    UniquingMap = new ELFUniqueMapTy();
36038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap;
3618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
36238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // Do the lookup, if we have a hit, return it.
363b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  const MCSectionELF *&Entry = Map[Section];
36438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (Entry) return Entry;
3658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
366fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes  return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit,
367fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes                                      getContext());
368fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner}
369fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner
370f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
371f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                             const TargetMachine &TM) {
37276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer  if (UniquingMap != 0)
37376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer    ((ELFUniqueMapTy*)UniquingMap)->clear();
374a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
3768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  BSSSection =
377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".bss", MCSectionELF::SHT_NOBITS,
378b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getBSS());
3808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
3818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  TextSection =
382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".text", MCSectionELF::SHT_PROGBITS,
383b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC,
384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getText());
385b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataSection =
387b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data", MCSectionELF::SHT_PROGBITS,
388b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
390b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  ReadOnlySection =
3928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".rodata", MCSectionELF::SHT_PROGBITS,
3938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                  MCSectionELF::SHF_ALLOC,
394b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getReadOnly());
395b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  TLSDataSection =
397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".tdata", MCSectionELF::SHT_PROGBITS,
3988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
399b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE, SectionKind::getThreadData());
4008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
4018ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  TLSBSSSection =
402b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".tbss", MCSectionELF::SHT_NOBITS,
403b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
404b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS());
405b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelSection =
407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS,
408b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
409b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
410b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelLocalSection =
412b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS,
413b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
414b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRelLocal());
415b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelROSection =
417b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS,
418b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
419b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getReadOnlyWithRel());
420b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelROLocalSection =
422b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS,
423b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
424b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getReadOnlyWithRelLocal());
4258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
4268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  MergeableConst4Section =
427b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS,
428b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
429b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMergeableConst4());
430b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  MergeableConst8Section =
432b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS,
433b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
434b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMergeableConst8());
435b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  MergeableConst16Section =
437b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS,
438b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
439b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMergeableConst16());
44080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
44180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
4428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".ctors", MCSectionELF::SHT_PROGBITS,
443b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
444b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
445b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
44680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
447b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".dtors", MCSectionELF::SHT_PROGBITS,
448b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
449b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
45118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Exception Handling Sections.
4528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
453d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
454d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // it contains relocatable pointers.  In PIC mode, this is probably a big
455d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
456d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // adjusted or this should be a data section.
457d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection =
458b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS,
459b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly());
46035039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
4618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS,
462b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
463b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner                  SectionKind::getDataRel());
4648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
46518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug Info Sections.
4668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfAbbrevSection =
4678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0,
468b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfInfoSection =
4708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0,
471b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLineSection =
4738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0,
474b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfFrameSection =
4768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0,
477b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubNamesSection =
4798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0,
480b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubTypesSection =
4828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0,
483b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfStrSection =
485b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0,
486b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLocSection =
4888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0,
489b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfARangesSection =
4918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0,
492b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfRangesSection =
4948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0,
495b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfMacroInfoSection =
4978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0,
498b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
499f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
501f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
5028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind
503a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin KramergetELFKindForNamedSection(StringRef Name, SectionKind K) {
504a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  if (Name.empty() || Name[0] != '.') return K;
5058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Some lame default implementation based on some magic section names.
507a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  if (Name == ".bss" ||
508a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".bss.") ||
509a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".gnu.linkonce.b.") ||
510a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".llvm.linkonce.b.") ||
511a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name == ".sbss" ||
512a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".sbss.") ||
513a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".gnu.linkonce.sb.") ||
514a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".llvm.linkonce.sb."))
5152798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
5168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
517a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  if (Name == ".tdata" ||
518a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".tdata.") ||
519a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".gnu.linkonce.td.") ||
520a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".llvm.linkonce.td."))
5212798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
5228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
523a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  if (Name == ".tbss" ||
524a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".tbss.") ||
525a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".gnu.linkonce.tb.") ||
526a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      Name.startswith(".llvm.linkonce.tb."))
5272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadBSS();
5288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
529f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return K;
530f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
532b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5334813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
534b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5354813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner  if (Name == ".init_array")
536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_INIT_ARRAY;
537b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5384813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner  if (Name == ".fini_array")
539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_FINI_ARRAY;
540b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5414813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner  if (Name == ".preinit_array")
542b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_PREINIT_ARRAY;
543b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isBSS() || K.isThreadBSS())
545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_NOBITS;
546b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  return MCSectionELF::SHT_PROGBITS;
548b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes}
549b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
550b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned
552b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) {
553b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  unsigned Flags = 0;
554b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
555b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (!K.isMetadata())
556b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_ALLOC;
5578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
558848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov  if (K.isText())
559848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov    Flags |= MCSectionELF::SHF_EXECINSTR;
5608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
561b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isWriteable())
562b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_WRITE;
5638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
564b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isThreadLocal())
565b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_TLS;
5668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
567b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  // K.isMergeableConst() is left out to honour PR4650
568b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isMergeableCString() || K.isMergeableConst4() ||
569b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes      K.isMergeableConst8() || K.isMergeableConst16())
570b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_MERGE;
571b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
572b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isMergeableCString())
573b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_STRINGS;
574b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
575b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  return Flags;
576b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes}
577b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
578b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
57924f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF::
5808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
58124f654c8a4d14066233480f683d3b0dececf374aChris Lattner                         Mangler *Mang, const TargetMachine &TM) const {
582a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  StringRef SectionName = GV->getSection();
583b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
58424f654c8a4d14066233480f683d3b0dececf374aChris Lattner  // Infer section flags from the section name if we can.
585b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  Kind = getELFKindForNamedSection(SectionName, Kind);
5868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
5878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  return getELFSection(SectionName,
5888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                       getELFSectionType(SectionName, Kind),
589b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                       getELFSectionFlags(Kind), Kind, true);
59024f654c8a4d14066233480f683d3b0dececf374aChris Lattner}
591f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
593f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())                 return ".gnu.linkonce.t.";
594f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
5958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
596f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
597f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
5988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
600f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
601f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
602f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
6038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
605f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".gnu.linkonce.d.rel.ro.";
606f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
607f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
608a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
609f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
610e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
6118ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
612f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
613f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
614c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) {
615f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
616acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner    SmallString<128> Name;
6174813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner    Name.append(Prefix, Prefix+strlen(Prefix));
6188da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner    Mang->getNameWithPrefix(Name, GV, false);
619acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner    return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind),
620acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner                         getELFSectionFlags(Kind), Kind);
621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
6228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
623f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText()) return TextSection;
6248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6253b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString() ||
6263b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable2ByteCString() ||
6273b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable4ByteCString()) {
6288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
629067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // We also need alignment here.
630067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // FIXME: this is getting the alignment of the character, not the
631067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // alignment of the global!
6328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    unsigned Align =
633067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
6348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6357e88a50428377813606c66ac47111d9c3ea44febChris Lattner    const char *SizeSpec = ".rodata.str1.";
6363b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    if (Kind.isMergeable2ByteCString())
6377e88a50428377813606c66ac47111d9c3ea44febChris Lattner      SizeSpec = ".rodata.str2.";
6383b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    else if (Kind.isMergeable4ByteCString())
6397e88a50428377813606c66ac47111d9c3ea44febChris Lattner      SizeSpec = ".rodata.str4.";
6403b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    else
6413b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      assert(Kind.isMergeable1ByteCString() && "unknown string width");
6428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6447e88a50428377813606c66ac47111d9c3ea44febChris Lattner    std::string Name = SizeSpec + utostr(Align);
645a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer    return getELFSection(Name, MCSectionELF::SHT_PROGBITS,
6468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                         MCSectionELF::SHF_ALLOC |
6478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                         MCSectionELF::SHF_MERGE |
6488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                         MCSectionELF::SHF_STRINGS,
649b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                         Kind);
650f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
6518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
652f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
653203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner    if (Kind.isMergeableConst4() && MergeableConst4Section)
654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst4Section;
655203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner    if (Kind.isMergeableConst8() && MergeableConst8Section)
656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst8Section;
657203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner    if (Kind.isMergeableConst16() && MergeableConst16Section)
658f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst16Section;
659f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
660f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
6618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
662f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())             return ReadOnlySection;
6638ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
664f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadData())           return TLSDataSection;
665f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadBSS())            return TLSBSSSection;
6668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
667c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  // Note: we claim that common symbols are put in BSSSection, but they are
668c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  // really emitted with the magic .comm directive, which creates a symbol table
669c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  // entry but not a section.
670a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
6718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
672f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataNoRel())            return DataSection;
673f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRelLocal())         return DataRelLocalSection;
674f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRel())              return DataRelSection;
675f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
6768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
677f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
678f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
679f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
680f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
68183d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the
682f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
683f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
684a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
68583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const {
6862a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne  if (Kind.isMergeableConst4() && MergeableConst4Section)
687f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst4Section;
6882a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne  if (Kind.isMergeableConst8() && MergeableConst8Section)
689f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst8Section;
6902a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne  if (Kind.isMergeableConst16() && MergeableConst16Section)
691f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst16Section;
692f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())
693f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
6948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
695f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
696f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
699f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
7009184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF::
7019184b25fa543a900463215c11635c2c014ddb623Anton KorobeynikovgetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
7029184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov                             MachineModuleInfo *MMI, unsigned Encoding) const {
7039184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
7049184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  if (Encoding & dwarf::DW_EH_PE_indirect) {
7059184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
7069184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
7079184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    SmallString<128> Name;
7089184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
7099184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
7109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    // Add information about the stub reference to ELFMMI so that the stub
7119184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    // gets emitted by the asmprinter.
7129184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
7139184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    MCSymbol *&StubSym = ELFMMI.getGVStubEntry(Sym);
7149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    if (StubSym == 0) {
7159184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov      Name.clear();
7169184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov      Mang->getNameWithPrefix(Name, GV, false);
7179184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov      StubSym = getContext().GetOrCreateSymbol(Name.str());
7189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    }
7199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
7209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    return TargetLoweringObjectFile::
7219184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov      getSymbolForDwarfReference(Sym, MMI,
7229184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov                                 Encoding & ~dwarf::DW_EH_PE_indirect);
7239184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  }
7249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
7259184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return TargetLoweringObjectFile::
7269184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
7279184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
7289184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
729f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
730f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                 MachO
731f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
732f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
7335dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy;
7345dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner
7355dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() {
7365dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // If we have the MachO uniquing map, free it.
7375dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  delete (MachOUniqueMapTy*)UniquingMap;
7385dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner}
7390c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner
7405dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner
7415dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO::
7422928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section,
743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                unsigned TypeAndAttributes,
744ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                unsigned Reserved2, SectionKind Kind) const {
7455dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // We unique sections by their segment/section pair.  The returned section
7465dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // may not have the same flags as the requested section, if so this should be
7475dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // diagnosed by the client as an error.
7488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
7495dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Create the map if it doesn't already exist.
7505dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  if (UniquingMap == 0)
7515dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner    UniquingMap = new MachOUniqueMapTy();
7525dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap;
7538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
7545dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Form the name to look up.
7555dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  SmallString<64> Name;
75616df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar  Name += Segment;
7575dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  Name.push_back(',');
75816df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar  Name += Section;
7598ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
7605dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Do the lookup, if we have a hit, return it.
76116df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar  const MCSectionMachO *&Entry = Map[Name.str()];
7625dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  if (Entry) return Entry;
7635dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner
7645dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Otherwise, return a new section.
7655dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes,
7665dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner                                        Reserved2, Kind, getContext());
767fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner}
768fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner
76911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner
770f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
771f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                               const TargetMachine &TM) {
77276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer  if (UniquingMap != 0)
77376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer    ((MachOUniqueMapTy*)UniquingMap)->clear();
774a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
7758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
776ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  TextSection // .text
777ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__text",
778ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
779ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
780ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  DataSection // .data
781ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel());
7828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
783ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  CStringSection // .cstring
784ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS,
785ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeable1ByteCString());
786ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  UStringSection
787ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT","__ustring", 0,
788ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeable2ByteCString());
789ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  FourByteConstantSection // .literal4
790ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS,
791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeableConst4());
792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  EightByteConstantSection // .literal8
793ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS,
794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeableConst8());
7958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
7964bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
7974bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // to using it in -static mode.
798ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  SixteenByteConstantSection = 0;
7994bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (TM.getRelocationModel() != Reloc::Static &&
8004bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner      TM.getTargetData()->getPointerSize() == 32)
801ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    SixteenByteConstantSection =   // .literal16
802ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS,
8030c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                      SectionKind::getMergeableConst16());
8048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
805ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ReadOnlySection  // .const
806ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly());
8078ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
808ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  TextCoalSection
809ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__textcoal_nt",
810ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      MCSectionMachO::S_COALESCED |
811ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
812ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
813ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ConstTextCoalSection
814ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED,
815ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
816ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ConstDataCoalSection
817ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED,
818ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
819ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ConstDataSection  // .const_data
820ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA", "__const", 0,
821ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getReadOnlyWithRel());
822ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  DataCoalSection
823ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
824ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getDataRel());
825814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner  DataCommonSection
826814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner    = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
827814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner                      SectionKind::getBSS());
828814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner  DataBSSSection
829814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner    = getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
830814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner                    SectionKind::getBSS());
831814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner
8328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
833e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  LazySymbolPointerSection
834e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    = getMachOSection("__DATA", "__la_symbol_ptr",
835e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
836e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      SectionKind::getMetadata());
837e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  NonLazySymbolPointerSection
838e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    = getMachOSection("__DATA", "__nl_symbol_ptr",
839e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
840e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      SectionKind::getMetadata());
8418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
84280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  if (TM.getRelocationModel() == Reloc::Static) {
843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticCtorSection
844ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
845ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticDtorSection
846ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel());
84780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  } else {
848ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticCtorSection
849ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      = getMachOSection("__DATA", "__mod_init_func",
850ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
851ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        SectionKind::getDataRel());
852ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticDtorSection
8538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov      = getMachOSection("__DATA", "__mod_term_func",
854ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
855ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        SectionKind::getDataRel());
85680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  }
8578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
85818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Exception Handling.
859fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling  LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0,
860fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling                                SectionKind::getDataRel());
86135039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
862ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__TEXT", "__eh_frame",
863ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_COALESCED |
864ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_ATTR_NO_TOC |
865ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
866ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_ATTR_LIVE_SUPPORT,
867ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    SectionKind::getReadOnly());
86818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
86918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug Information.
8708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfAbbrevSection =
871ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG,
8720c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfInfoSection =
874ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG,
8750c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLineSection =
877ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG,
8780c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfFrameSection =
880ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG,
8810c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8828ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubNamesSection =
883ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG,
8840c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubTypesSection =
886ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG,
8870c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8888ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfStrSection =
889ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG,
8900c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8918ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLocSection =
892ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG,
8930c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfARangesSection =
895ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG,
8960c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfRangesSection =
898ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG,
8990c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
9008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfMacroInfoSection =
901ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG,
9020c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
9038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfDebugInlineSection =
904ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG,
9050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
906f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
907f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
908a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
9098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
91024f654c8a4d14066233480f683d3b0dececf374aChris Lattner                         Mangler *Mang, const TargetMachine &TM) const {
911ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  // Parse the section specifier and create it if valid.
912ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  StringRef Segment, Section;
913ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  unsigned TAA, StubSize;
914ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  std::string ErrorCode =
915ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
916ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                                          TAA, StubSize);
917e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  if (!ErrorCode.empty()) {
918e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    // If invalid, report the error with llvm_report_error.
919e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    llvm_report_error("Global variable '" + GV->getNameStr() +
920e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      "' has an invalid section specifier '" + GV->getSection()+
921e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      "': " + ErrorCode + ".");
922e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    // Fall back to dropping it into the data section.
923e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    return DataSection;
924e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  }
9258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
926e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // Get the section.
927e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  const MCSectionMachO *S =
928e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    getMachOSection(Segment, Section, TAA, StubSize, Kind);
9298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
930e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // Okay, now that we got the section, verify that the TAA & StubSize agree.
931e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // If the user declared multiple globals with different section flags, we need
932e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // to reject it here.
933e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
934e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    // If invalid, report the error with llvm_report_error.
935e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    llvm_report_error("Global variable '" + GV->getNameStr() +
936e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      "' section type or attributes does not match previous"
937e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      " section specifier");
938e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  }
9398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
940e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  return S;
94124f654c8a4d14066233480f683d3b0dececf374aChris Lattner}
94224f654c8a4d14066233480f683d3b0dececf374aChris Lattner
94324f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
944f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
945e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
946f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
9478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
948f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
94927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
9508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
951f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is weak/linkonce, put this in a coalescable section, either in text
952f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // or data depending on if it is writable.
95327602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
954f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isReadOnly())
955f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return ConstTextCoalSection;
956f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return DataCoalSection;
957f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
9588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
959f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Alignment check should be handled by section classifier.
960ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner  if (Kind.isMergeable1ByteCString() ||
961ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      Kind.isMergeable2ByteCString()) {
962ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner    if (TM.getTargetData()->getPreferredAlignment(
963ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner                                              cast<GlobalVariable>(GV)) < 32) {
964ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      if (Kind.isMergeable1ByteCString())
965824583844a8f334dd261894a3fac7ad476531667Chris Lattner        return CStringSection;
966ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      assert(Kind.isMergeable2ByteCString());
967ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      return UStringSection;
968f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
969f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
9708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
971f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
972f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst4())
973f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return FourByteConstantSection;
974f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst8())
975f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return EightByteConstantSection;
976f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
977f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SixteenByteConstantSection;
978f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
979ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner
980ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner  // Otherwise, if it is readonly, but not something we can specially optimize,
981ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner  // just drop it in .const.
982f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())
983f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
984f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
985f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is marked const, put it into a const section.  But if the dynamic
986f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker needs to write to it, put it in the data segment.
987f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRel())
988f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
9898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
990aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  // Put zero initialized globals with strong external linkage in the
991aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  // DATA, __common section with the .zerofill directive.
992ce8749e445fdd0493758932874bad50293647df9Chris Lattner  if (Kind.isBSSExtern())
993aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner    return DataCommonSection;
994814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner
995814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner  // Put zero initialized globals with local linkage in __DATA,__bss directive
996814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner  // with the .zerofill directive (aka .lcomm).
997814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner  if (Kind.isBSSLocal())
998814819f6ea7fb0638fe73920299fda0da941a59eChris Lattner    return DataBSSSection;
999aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner
1000f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, just drop the variable in the normal data section.
1001f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
1002f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
1003f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1004a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
100583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
1006f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this constant requires a relocation, we have to put it in the data
1007f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // segment, not in the text segment.
1008a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
1009f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
10108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1011f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
1012f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return FourByteConstantSection;
1013f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
1014f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return EightByteConstantSection;
10154bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
1016f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SixteenByteConstantSection;
1017f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ReadOnlySection;  // .const
1018f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
1019f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
102026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
102126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used.
102226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300)
102326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO::
102426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
102526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// On Darwin, internally linked data beginning with "L" or "l" does not have
102626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// the directive emitted (this occurs in ObjC metadata).
102726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (!GV) return false;
10288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
102926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
103026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
103126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // FIXME: ObjC metadata is currently emitted as internal symbols that have
103226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
103326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // this horrible hack can go away.
10340b3735e65af1cc3ff7fb76e2b30e2ffb2604f400Chris Lattner    SmallString<64> Name;
1035036d8f9581c76b68cac08876be65b362c3a54bc3Chris Lattner    Mang->getNameWithPrefix(Name, GV, false);
103626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    if (Name[0] == 'L' || Name[0] == 'l')
103726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner      return false;
103826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  }
10398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
104026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  return true;
104126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner}
104226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
10438c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO::
10448c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
10459184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov                             MachineModuleInfo *MMI, unsigned Encoding) const {
10468c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  // The mach-o version of this method defaults to returning a stub reference.
10479184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
10489184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  if (Encoding & dwarf::DW_EH_PE_indirect) {
10499184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    SmallString<128> Name;
10509184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
10519184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    Name += "$non_lazy_ptr";
10529184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
10539184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
10549184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    return TargetLoweringObjectFile::
10559184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov      getSymbolForDwarfReference(Sym, MMI,
10569184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov                                 Encoding & ~dwarf::DW_EH_PE_indirect);
10579184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  }
10589184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
10599184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return TargetLoweringObjectFile::
10609184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
10618c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner}
10628c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner
106326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
1064f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
1065f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  COFF
1066f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
1067f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
106838cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
106938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner
107038cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() {
107138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  delete (COFFUniqueMapTy*)UniquingMap;
107238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner}
107338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner
10740c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner
107511e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
10764813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const {
107738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // Create the map if it doesn't already exist.
107838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (UniquingMap == 0)
107938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner    UniquingMap = new MachOUniqueMapTy();
108038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap;
10818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
108238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // Do the lookup, if we have a hit, return it.
108338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  const MCSectionCOFF *&Entry = Map[Name];
108438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (Entry) return Entry;
10858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
108638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext());
1087fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner}
1088fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner
1089f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
1090f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                              const TargetMachine &TM) {
109176d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer  if (UniquingMap != 0)
109276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer    ((COFFUniqueMapTy*)UniquingMap)->clear();
1093a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
10940c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner  TextSection = getCOFFSection("\t.text", true, SectionKind::getText());
10950c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner  DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel());
109680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
10970c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection(".ctors", false, SectionKind::getDataRel());
109880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
10990c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection(".dtors", false, SectionKind::getDataRel());
11008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
110135c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
110235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // though it contains relocatable pointers.  In PIC mode, this is probably a
110335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
110435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // adjusted or this should be a data section.
110535c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  LSDASection =
110635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner    getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly());
110735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  EHFrameSection =
110835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner    getCOFFSection(".eh_frame", false, SectionKind::getDataRel());
11098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
111018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug info.
111118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // FIXME: Don't use 'directive' mode here.
11128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfAbbrevSection =
11130c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_abbrev,\"dr\"",
11140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfInfoSection =
11160c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_info,\"dr\"",
11170c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLineSection =
11190c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_line,\"dr\"",
11200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfFrameSection =
11220c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_frame,\"dr\"",
11230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
112418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection =
11250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_pubnames,\"dr\"",
11260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
112718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection =
11280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"",
11290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfStrSection =
11310c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_str,\"dr\"",
11320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLocSection =
11340c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_loc,\"dr\"",
11350c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfARangesSection =
11370c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_aranges,\"dr\"",
11380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfRangesSection =
11400c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_ranges,\"dr\"",
11410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
11428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfMacroInfoSection =
11430c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_macinfo,\"dr\"",
11440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
1145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
1146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
114724f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
11488ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
114924f654c8a4d14066233480f683d3b0dececf374aChris Lattner                         Mangler *Mang, const TargetMachine &TM) const {
1150a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  return getCOFFSection(GV->getSection(), false, Kind);
115124f654c8a4d14066233480f683d3b0dececf374aChris Lattner}
115224f654c8a4d14066233480f683d3b0dececf374aChris Lattner
1153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
1154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
1155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".text$linkonce";
1156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
1157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".data$linkonce";
1158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".rdata$linkonce";
1159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
1160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1162a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
1163f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
1164e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
1165f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
11668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
1168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
116927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
1170f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
11714813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
1172cab16cc9a34b8a18e9f91c99085b2f0a1d287e12Chris Lattner    Mang->getNameWithPrefix(Name, GV, false);
11734813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner    return getCOFFSection(Name.str(), false, Kind);
1174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
11758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1176f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
1177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
11788ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
1180f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
11818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner
1182