TargetLoweringObjectFile.cpp revision ce8749e445fdd0493758932874bad50293647df9
1f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===-- llvm/Target/TargetLoweringObjectFile.cpp - Object File Info -------===//
2f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//
3f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                     The LLVM Compiler Infrastructure
4f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//
5f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// This file is distributed under the University of Illinois Open Source
6f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// License. See LICENSE.TXT for details.
7f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//
8f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
9f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//
10f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// This file implements classes used to handle lowerings specific to common
11f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// object file formats.
12f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//
13f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
14f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
15f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetLoweringObjectFile.h"
16f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Constants.h"
17f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/DerivedTypes.h"
18ffef8acc3e3398bdd04e947c7949befdd52faf86Dan Gohman#include "llvm/Function.h"
19f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/GlobalVariable.h"
20a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h"
218c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h"
22f9bdeddb96043559c61f176f8077e3b91a0c544fChris Lattner#include "llvm/MC/MCSectionMachO.h"
23b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCSectionELF.h"
248da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h"
2545111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h"
26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h"
275277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h"
28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h"
298f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h"
308da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h"
315dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h"
32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h"
33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm;
34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                              Generic Code
37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
39a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = 0;
41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = 0;
42824583844a8f334dd261894a3fac7ad476531667Chris Lattner  BSSSection = 0;
43f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection = 0;
4480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection = 0;
4580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection = 0;
46d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection = 0;
4735039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection = 0;
4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection = 0;
5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection = 0;
5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection = 0;
5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection = 0;
5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection = 0;
5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection = 0;
5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfDebugInlineSection = 0;
5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection = 0;
5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection = 0;
5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection = 0;
5918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection = 0;
6018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection = 0;
61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
63f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) {
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GV->getInitializer();
688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
891850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is
901850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a
911850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it.
921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) {
931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  const ArrayType *ATy = cast<ArrayType>(C->getType());
948ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // First check: is we have constant array of i8 terminated with zero
961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) {
971850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    if (ATy->getNumElements() == 0) return false;
981850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner
991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    ConstantInt *Null =
1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1));
1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    if (Null == 0 || Null->getZExtValue() != 0)
1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      return false; // Not null terminated.
1038ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    // Verify that the null doesn't occur anywhere else in the string.
1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i)
1061850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // Reject constantexpr elements etc.
1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      if (!isa<ConstantInt>(CVA->getOperand(i)) ||
1081850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          CVA->getOperand(i) == Null)
1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        return false;
110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return true;
1111850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  }
112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
1151850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    return ATy->getNumElements() == 1;
116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
12058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for
121968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable.  Given an global variable and information from TM, it
122968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target
123968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler.  The target implementation is free to ignore this
124968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course.
12558bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV,
12658bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner                                                       const TargetMachine &TM){
12758bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
12858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner         "Can only be used for global definitions");
1298ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
1318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
1352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getText();
1368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (isSuitableForBSS(GVar))
1402798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getThreadBSS();
1412798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
144a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  // Variables with common linkage always get classified as common.
145a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  if (GVar->hasCommonLinkage())
146a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner    return SectionKind::getCommon();
147a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner
148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
149ce8749e445fdd0493758932874bad50293647df9Chris Lattner  if (isSuitableForBSS(GVar)) {
150ce8749e445fdd0493758932874bad50293647df9Chris Lattner    if (GVar->hasLocalLinkage())
151ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSLocal();
152ce8749e445fdd0493758932874bad50293647df9Chris Lattner    else if (GVar->hasExternalLinkage())
153ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSExtern();
1542798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
155ce8749e445fdd0493758932874bad50293647df9Chris Lattner  }
156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GVar->getInitializer();
1588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isConstant()) {
162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // relocation, then we may have to drop this into a wriable data section
164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
1668f9b0f6e881a63875e7c41319eca31751588799aChris Lattner    default: assert(0 && "unknown relocation info kind");
167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
1691850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // section of the right width.
1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
1718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov        if (const IntegerType *ITy =
1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              dyn_cast<IntegerType>(ATy->getElementType())) {
1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 ||
1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner               ITy->getBitWidth() == 32) &&
1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              IsNullTerminatedString(C)) {
1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 8)
1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable1ByteCString();
1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 16)
1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable2ByteCString();
1808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            assert(ITy->getBitWidth() == 32 && "Unknown width");
1821850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            return SectionKind::getMergeable4ByteCString();
1831850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          }
1841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        }
1851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      }
1868ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
1912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 4:  return SectionKind::getMergeableConst4();
1922798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 8:  return SectionKind::getMergeableConst8();
1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 16: return SectionKind::getMergeableConst16();
1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      default: return SectionKind::getMergeableConst();
195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
1968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2042798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel.local section.
2082798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRelLocal();
2098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2172798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
2212798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRel();
222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
2312798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
2348f9b0f6e881a63875e7c41319eca31751588799aChris Lattner  default: assert(0 && "unknown relocation info kind");
235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
2362798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
2382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRelLocal();
239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
2402798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRel();
241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
247a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
24858bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang,
249e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
250f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
25124f654c8a4d14066233480f683d3b0dececf374aChris Lattner  if (GV->hasSection())
25224f654c8a4d14066233480f683d3b0dececf374aChris Lattner    return getExplicitSectionGlobal(GV, Kind, Mang, TM);
2538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
2548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
256f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
25958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner
260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
261a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
262f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner                                                 SectionKind Kind,
264e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
266f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
2678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
268f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
269f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
2708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
271824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS() && BSSSection != 0)
272824583844a8f334dd261894a3fac7ad476531667Chris Lattner    return BSSSection;
2738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
274f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
28083d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the
281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
283a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
28483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
2878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// getSymbolForDwarfGlobalReference - Return an MCExpr to use for a
2928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// pc-relative reference to the specified global variable from exception
2938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// handling information.  In addition to the symbol, this returns
2948c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// by-reference:
2958c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner///
2968c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsIndirect - True if the returned symbol is actually a stub that contains
2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner///    the address of the symbol, false if the symbol is the global itself.
2988c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner///
2998c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner/// IsPCRel - True if the symbol reference is already pc-relative, false if
3008c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner///    the caller needs to subtract off the address of the reference from the
3018c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner///    symbol.
3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner///
3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile::
3048c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
3058609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner                                 MachineModuleInfo *MMI,
3068c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner                                 bool &IsIndirect, bool &IsPCRel) const {
3078c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  // The generic implementation of this just returns a direct reference to the
3088c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  // symbol.
3098c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  IsIndirect = false;
3108c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  IsPCRel    = false;
3118c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner
31245111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner  // FIXME: Use GetGlobalValueSymbol.
3138c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  SmallString<128> Name;
3148c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  Mang->getNameWithPrefix(Name, GV, false);
3158c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  return MCSymbolRefExpr::Create(Name.str(), getContext());
3168c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner}
317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
318f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
319f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
320f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  ELF
321f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
32238cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionELF*> ELFUniqueMapTy;
32338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner
32438cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() {
32538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // If we have the section uniquing map, free it.
32638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  delete (ELFUniqueMapTy*)UniquingMap;
32738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner}
328f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
329fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
330b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSection(StringRef Section, unsigned Type, unsigned Flags,
331b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes              SectionKind Kind, bool IsExplicit) const {
33238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (UniquingMap == 0)
33338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner    UniquingMap = new ELFUniqueMapTy();
33438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap;
3358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
33638cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // Do the lookup, if we have a hit, return it.
337b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  const MCSectionELF *&Entry = Map[Section];
33838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (Entry) return Entry;
3398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
340fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes  return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit,
341fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes                                      getContext());
342fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner}
343fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner
344f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
345f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                             const TargetMachine &TM) {
34676d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer  if (UniquingMap != 0)
34776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer    ((ELFUniqueMapTy*)UniquingMap)->clear();
348a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
349f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
3508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  BSSSection =
351b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".bss", MCSectionELF::SHT_NOBITS,
352b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
353b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getBSS());
3548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
3558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  TextSection =
356b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".text", MCSectionELF::SHT_PROGBITS,
357b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC,
358b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getText());
359b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataSection =
361b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data", MCSectionELF::SHT_PROGBITS,
362b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
363b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
364b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  ReadOnlySection =
3668ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".rodata", MCSectionELF::SHT_PROGBITS,
3678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                  MCSectionELF::SHF_ALLOC,
368b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getReadOnly());
369b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  TLSDataSection =
371b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".tdata", MCSectionELF::SHT_PROGBITS,
3728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
373b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE, SectionKind::getThreadData());
3748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
3758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  TLSBSSSection =
376b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".tbss", MCSectionELF::SHT_NOBITS,
377b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
378b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS());
379b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3808ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelSection =
381b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS,
382b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
383b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
384b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelLocalSection =
386b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS,
387b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
388b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRelLocal());
389b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelROSection =
391b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS,
392b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
393b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getReadOnlyWithRel());
394b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DataRelROLocalSection =
396b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS,
397b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
398b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getReadOnlyWithRelLocal());
3998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
4008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  MergeableConst4Section =
401b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS,
402b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
403b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMergeableConst4());
404b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4058ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  MergeableConst8Section =
406b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS,
407b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
408b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMergeableConst8());
409b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
4108ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  MergeableConst16Section =
411b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS,
412b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
413b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMergeableConst16());
41480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
41580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
4168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".ctors", MCSectionELF::SHT_PROGBITS,
417b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
418b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
419b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
42080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
421b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".dtors", MCSectionELF::SHT_PROGBITS,
422b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
423b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getDataRel());
4248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
42518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Exception Handling Sections.
4268ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
427d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
428d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // it contains relocatable pointers.  In PIC mode, this is probably a big
429d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
430d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // adjusted or this should be a data section.
431d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection =
432b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS,
433b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly());
43435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
4358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS,
436b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
437b6ab29940de8ead5b5612ae5414adc4d11e0b2e7Chris Lattner                  SectionKind::getDataRel());
4388ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
43918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug Info Sections.
4408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfAbbrevSection =
4418ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0,
442b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfInfoSection =
4448ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0,
445b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLineSection =
4478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0,
448b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfFrameSection =
4508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0,
451b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubNamesSection =
4538ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0,
454b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4558ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubTypesSection =
4568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0,
457b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4588ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfStrSection =
459b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0,
460b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLocSection =
4628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0,
463b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfARangesSection =
4658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0,
466b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfRangesSection =
4688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0,
469b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
4708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfMacroInfoSection =
4718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0,
472b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                  SectionKind::getMetadata());
473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
474f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
4768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikovstatic SectionKind
47724f654c8a4d14066233480f683d3b0dececf374aChris LattnergetELFKindForNamedSection(const char *Name, SectionKind K) {
478f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Name[0] != '.') return K;
4798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Some lame default implementation based on some magic section names.
4814c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov  if (strcmp(Name, ".bss") == 0 ||
4824c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov      strncmp(Name, ".bss.", 5) == 0 ||
4834c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov      strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
484f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.b.", 17) == 0 ||
4854c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov      strcmp(Name, ".sbss") == 0 ||
4864c0b349253d6de7054fd38fe8492fb32a19f21b6Anton Korobeynikov      strncmp(Name, ".sbss.", 6) == 0 ||
487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 ||
488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.sb.", 18) == 0)
4892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
4908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tdata") == 0 ||
492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tdata.", 7) == 0 ||
493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
4952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
4968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
497f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tbss") == 0 ||
498f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tbss.", 6) == 0 ||
499f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
500f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
5012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadBSS();
5028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
503f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return K;
504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
505f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
506b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5074813035b726e7f0a3fd17bec437185fc72a50988Chris Lattnerstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
508b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5094813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner  if (Name == ".init_array")
510b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_INIT_ARRAY;
511b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5124813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner  if (Name == ".fini_array")
513b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_FINI_ARRAY;
514b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
5154813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner  if (Name == ".preinit_array")
516b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_PREINIT_ARRAY;
517b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
518b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isBSS() || K.isThreadBSS())
519b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return MCSectionELF::SHT_NOBITS;
520b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
521b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  return MCSectionELF::SHT_PROGBITS;
522b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes}
523b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
524b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
525b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesstatic unsigned
526b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso LopesgetELFSectionFlags(SectionKind K) {
527b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  unsigned Flags = 0;
528b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
529b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (!K.isMetadata())
530b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_ALLOC;
5318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
532848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov  if (K.isText())
533848c29396271b8255653b6c6b61b5482bd72c293Anton Korobeynikov    Flags |= MCSectionELF::SHF_EXECINSTR;
5348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
535b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isWriteable())
536b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_WRITE;
5378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
538b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isThreadLocal())
539b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_TLS;
5408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
541b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  // K.isMergeableConst() is left out to honour PR4650
542b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isMergeableCString() || K.isMergeableConst4() ||
543b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes      K.isMergeableConst8() || K.isMergeableConst16())
544b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_MERGE;
545b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
546b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  if (K.isMergeableCString())
547b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    Flags |= MCSectionELF::SHF_STRINGS;
548b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
549b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  return Flags;
550b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes}
551b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
552b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
55324f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileELF::
5548ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
55524f654c8a4d14066233480f683d3b0dececf374aChris Lattner                         Mangler *Mang, const TargetMachine &TM) const {
556b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  const char *SectionName = GV->getSection().c_str();
557b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
55824f654c8a4d14066233480f683d3b0dececf374aChris Lattner  // Infer section flags from the section name if we can.
559b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  Kind = getELFKindForNamedSection(SectionName, Kind);
5608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
5618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  return getELFSection(SectionName,
5628ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                       getELFSectionType(SectionName, Kind),
563b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                       getELFSectionFlags(Kind), Kind, true);
56424f654c8a4d14066233480f683d3b0dececf374aChris Lattner}
565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())                 return ".gnu.linkonce.t.";
568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
5698ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
5728ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
573f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
574f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
5778ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
578f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
579f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".gnu.linkonce.d.rel.ro.";
580f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
582a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
583f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
584e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
5858ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
587f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
588c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) {
589f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
590acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner    SmallString<128> Name;
5914813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner    Name.append(Prefix, Prefix+strlen(Prefix));
5928da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner    Mang->getNameWithPrefix(Name, GV, false);
593acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner    return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind),
594acd03ae6791fc0fb9f1b05247a1dc082b46b8d8bChris Lattner                         getELFSectionFlags(Kind), Kind);
595f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
5968ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
597f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText()) return TextSection;
5988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
5993b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString() ||
6003b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable2ByteCString() ||
6013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable4ByteCString()) {
6028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
603067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // We also need alignment here.
604067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // FIXME: this is getting the alignment of the character, not the
605067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // alignment of the global!
6068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    unsigned Align =
607067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
6088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6097e88a50428377813606c66ac47111d9c3ea44febChris Lattner    const char *SizeSpec = ".rodata.str1.";
6103b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    if (Kind.isMergeable2ByteCString())
6117e88a50428377813606c66ac47111d9c3ea44febChris Lattner      SizeSpec = ".rodata.str2.";
6123b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    else if (Kind.isMergeable4ByteCString())
6137e88a50428377813606c66ac47111d9c3ea44febChris Lattner      SizeSpec = ".rodata.str4.";
6143b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    else
6153b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      assert(Kind.isMergeable1ByteCString() && "unknown string width");
6168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6178ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6187e88a50428377813606c66ac47111d9c3ea44febChris Lattner    std::string Name = SizeSpec + utostr(Align);
6198ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov    return getELFSection(Name.c_str(), MCSectionELF::SHT_PROGBITS,
6208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                         MCSectionELF::SHF_ALLOC |
6218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                         MCSectionELF::SHF_MERGE |
6228ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov                         MCSectionELF::SHF_STRINGS,
623b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes                         Kind);
624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
6258ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
626f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
627203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner    if (Kind.isMergeableConst4() && MergeableConst4Section)
628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst4Section;
629203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner    if (Kind.isMergeableConst8() && MergeableConst8Section)
630f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst8Section;
631203b3e9e2a61be88e8d36a58c5615712e34c6a47Chris Lattner    if (Kind.isMergeableConst16() && MergeableConst16Section)
632f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst16Section;
633f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
634f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
6358ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
636f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())             return ReadOnlySection;
6378ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
638f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadData())           return TLSDataSection;
639f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadBSS())            return TLSBSSSection;
6408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
641c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  // Note: we claim that common symbols are put in BSSSection, but they are
642c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  // really emitted with the magic .comm directive, which creates a symbol table
643c7fbe903898ebf322cc375127bca85f4011cb266Chris Lattner  // entry but not a section.
644a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
6458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
646f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataNoRel())            return DataSection;
647f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRelLocal())         return DataRelLocalSection;
648f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRel())              return DataRelSection;
649f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
6508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
651f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
652f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
653f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
65583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the
656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
657f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
658a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
65983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const {
6602a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne  if (Kind.isMergeableConst4() && MergeableConst4Section)
661f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst4Section;
6622a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne  if (Kind.isMergeableConst8() && MergeableConst8Section)
663f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst8Section;
6642a5e23b44ddf1efde1d98bd3379489d93a90d55aRichard Osborne  if (Kind.isMergeableConst16() && MergeableConst16Section)
665f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst16Section;
666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())
667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
6688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
670f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
671f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
673f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
674f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
675f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                 MachO
676f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
677f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
6785dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnertypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy;
6795dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner
6805dc47ff03975b9adde9dd833db2b646eb4295710Chris LattnerTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() {
6815dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // If we have the MachO uniquing map, free it.
6825dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  delete (MachOUniqueMapTy*)UniquingMap;
6835dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner}
6840c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner
6855dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner
6865dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattnerconst MCSectionMachO *TargetLoweringObjectFileMachO::
6872928c83b010f7cfdb0f819199d806f6942a7d995Daniel DunbargetMachOSection(StringRef Segment, StringRef Section,
688ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                unsigned TypeAndAttributes,
689ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                unsigned Reserved2, SectionKind Kind) const {
6905dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // We unique sections by their segment/section pair.  The returned section
6915dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // may not have the same flags as the requested section, if so this should be
6925dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // diagnosed by the client as an error.
6938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6945dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Create the map if it doesn't already exist.
6955dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  if (UniquingMap == 0)
6965dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner    UniquingMap = new MachOUniqueMapTy();
6975dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap;
6988ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
6995dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Form the name to look up.
7005dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  SmallString<64> Name;
70116df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar  Name += Segment;
7025dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  Name.push_back(',');
70316df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar  Name += Section;
7048ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
7055dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Do the lookup, if we have a hit, return it.
70616df208d4eff8414cf4294f9953caabffed1386bDaniel Dunbar  const MCSectionMachO *&Entry = Map[Name.str()];
7075dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  if (Entry) return Entry;
7085dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner
7095dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  // Otherwise, return a new section.
7105dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner  return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes,
7115dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner                                        Reserved2, Kind, getContext());
712fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner}
713fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner
71411e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner
715f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
716f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                               const TargetMachine &TM) {
71776d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer  if (UniquingMap != 0)
71876d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer    ((MachOUniqueMapTy*)UniquingMap)->clear();
719a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
7208ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
721ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  TextSection // .text
722ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__text",
723ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
724ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
725ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  DataSection // .data
726ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel());
7278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
728ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  CStringSection // .cstring
729ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS,
730ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeable1ByteCString());
731ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  UStringSection
732ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT","__ustring", 0,
733ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeable2ByteCString());
734ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  FourByteConstantSection // .literal4
735ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS,
736ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeableConst4());
737ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  EightByteConstantSection // .literal8
738ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS,
739ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getMergeableConst8());
7408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
7414bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
7424bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // to using it in -static mode.
743ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  SixteenByteConstantSection = 0;
7444bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (TM.getRelocationModel() != Reloc::Static &&
7454bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner      TM.getTargetData()->getPointerSize() == 32)
746ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    SixteenByteConstantSection =   // .literal16
747ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS,
7480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                      SectionKind::getMergeableConst16());
7498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
750ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ReadOnlySection  // .const
751ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly());
7528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
753ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  TextCoalSection
754ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__textcoal_nt",
755ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      MCSectionMachO::S_COALESCED |
756ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
757ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
758ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ConstTextCoalSection
759ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED,
760ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
761ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ConstDataCoalSection
762ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED,
763ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getText());
764aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  DataCommonSection
765aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner    = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
766aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner                      SectionKind::getBSS());
767ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  ConstDataSection  // .const_data
768ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA", "__const", 0,
769ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getReadOnlyWithRel());
770ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  DataCoalSection
771ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
772ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                      SectionKind::getDataRel());
77380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
7748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
775e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  LazySymbolPointerSection
776e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    = getMachOSection("__DATA", "__la_symbol_ptr",
777e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
778e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      SectionKind::getMetadata());
779e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  NonLazySymbolPointerSection
780e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    = getMachOSection("__DATA", "__nl_symbol_ptr",
781e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
782e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      SectionKind::getMetadata());
7838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
78480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  if (TM.getRelocationModel() == Reloc::Static) {
785ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticCtorSection
786ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
787ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticDtorSection
788ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel());
78980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  } else {
790ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticCtorSection
791ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner      = getMachOSection("__DATA", "__mod_init_func",
792ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
793ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        SectionKind::getDataRel());
794ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    StaticDtorSection
7958ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov      = getMachOSection("__DATA", "__mod_term_func",
796ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
797ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                        SectionKind::getDataRel());
79880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  }
7998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
80018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Exception Handling.
801fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling  LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0,
802fb7634f1c7a804829fc55e3711ba62c8ade818d0Bill Wendling                                SectionKind::getDataRel());
80335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
804ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__TEXT", "__eh_frame",
805ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_COALESCED |
806ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_ATTR_NO_TOC |
807ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
808ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    MCSectionMachO::S_ATTR_LIVE_SUPPORT,
809ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                    SectionKind::getReadOnly());
81018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
81118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug Information.
8128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfAbbrevSection =
813ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG,
8140c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfInfoSection =
816ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG,
8170c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8188ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLineSection =
819ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG,
8200c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfFrameSection =
822ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG,
8230c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8248ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubNamesSection =
825ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG,
8260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8278ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfPubTypesSection =
828ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG,
8290c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8308ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfStrSection =
831ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG,
8320c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8338ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLocSection =
834ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG,
8350c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8368ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfARangesSection =
837ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG,
8380c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfRangesSection =
840ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG,
8410c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8428ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfMacroInfoSection =
843ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG,
8440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
8458ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfDebugInlineSection =
846ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG,
8470c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                    SectionKind::getMetadata());
848f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
849f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
850a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
8518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
85224f654c8a4d14066233480f683d3b0dececf374aChris Lattner                         Mangler *Mang, const TargetMachine &TM) const {
853ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  // Parse the section specifier and create it if valid.
854ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  StringRef Segment, Section;
855ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  unsigned TAA, StubSize;
856ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner  std::string ErrorCode =
857ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
858ff4bc460c52c1f285d8a56da173641bf92d49e3fChris Lattner                                          TAA, StubSize);
859e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  if (!ErrorCode.empty()) {
860e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    // If invalid, report the error with llvm_report_error.
861e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    llvm_report_error("Global variable '" + GV->getNameStr() +
862e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      "' has an invalid section specifier '" + GV->getSection()+
863e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      "': " + ErrorCode + ".");
864e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    // Fall back to dropping it into the data section.
865e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    return DataSection;
866e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  }
8678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
868e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // Get the section.
869e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  const MCSectionMachO *S =
870e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    getMachOSection(Segment, Section, TAA, StubSize, Kind);
8718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
872e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // Okay, now that we got the section, verify that the TAA & StubSize agree.
873e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // If the user declared multiple globals with different section flags, we need
874e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  // to reject it here.
875e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
876e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    // If invalid, report the error with llvm_report_error.
877e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner    llvm_report_error("Global variable '" + GV->getNameStr() +
878e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      "' section type or attributes does not match previous"
879e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner                      " section specifier");
880e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  }
8818ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
882e309cfa0d8945af47dd798357549c815164d53d6Chris Lattner  return S;
88324f654c8a4d14066233480f683d3b0dececf374aChris Lattner}
88424f654c8a4d14066233480f683d3b0dececf374aChris Lattner
88524f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
886f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
887e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
888f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
8898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
890f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
89127602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
8928ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
893f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is weak/linkonce, put this in a coalescable section, either in text
894f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // or data depending on if it is writable.
89527602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
896f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isReadOnly())
897f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return ConstTextCoalSection;
898f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return DataCoalSection;
899f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
9008ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
901f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Alignment check should be handled by section classifier.
902ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner  if (Kind.isMergeable1ByteCString() ||
903ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      Kind.isMergeable2ByteCString()) {
904ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner    if (TM.getTargetData()->getPreferredAlignment(
905ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner                                              cast<GlobalVariable>(GV)) < 32) {
906ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      if (Kind.isMergeable1ByteCString())
907824583844a8f334dd261894a3fac7ad476531667Chris Lattner        return CStringSection;
908ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      assert(Kind.isMergeable2ByteCString());
909ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner      return UStringSection;
910f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
911f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
9128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
913f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
914f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst4())
915f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return FourByteConstantSection;
916f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst8())
917f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return EightByteConstantSection;
918f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
919f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SixteenByteConstantSection;
920f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
921ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner
922ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner  // Otherwise, if it is readonly, but not something we can specially optimize,
923ec409759e94cc395e4896ba6ade3fa77200c5cfdChris Lattner  // just drop it in .const.
924f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())
925f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
926f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
927f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is marked const, put it into a const section.  But if the dynamic
928f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker needs to write to it, put it in the data segment.
929f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRel())
930f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
9318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
932aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  // Put zero initialized globals with strong external linkage in the
933aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  // DATA, __common section with the .zerofill directive.
934ce8749e445fdd0493758932874bad50293647df9Chris Lattner  if (Kind.isBSSExtern())
935aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner    return DataCommonSection;
936aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner
937f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, just drop the variable in the normal data section.
938f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
939f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
940f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
941a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
94283d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
943f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this constant requires a relocation, we have to put it in the data
944f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // segment, not in the text segment.
945a07b7504050e10508144b294b2c7996fe8794e0cEric Christopher  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
946f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
9478ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
948f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
949f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return FourByteConstantSection;
950f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
951f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return EightByteConstantSection;
9524bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
953f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SixteenByteConstantSection;
954f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ReadOnlySection;  // .const
955f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
956f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
95726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
95826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used.
95926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300)
96026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO::
96126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
96226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// On Darwin, internally linked data beginning with "L" or "l" does not have
96326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// the directive emitted (this occurs in ObjC metadata).
96426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (!GV) return false;
9658ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
96626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
96726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
96826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // FIXME: ObjC metadata is currently emitted as internal symbols that have
96926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
97026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // this horrible hack can go away.
9710b3735e65af1cc3ff7fb76e2b30e2ffb2604f400Chris Lattner    SmallString<64> Name;
972036d8f9581c76b68cac08876be65b362c3a54bc3Chris Lattner    Mang->getNameWithPrefix(Name, GV, false);
97326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    if (Name[0] == 'L' || Name[0] == 'l')
97426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner      return false;
97526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  }
9768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
97726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  return true;
97826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner}
97926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
9808c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFileMachO::
9818c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris LattnergetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
9828609c7c931c0213d6d29f665df2110cf3c709e4cChris Lattner                                 MachineModuleInfo *MMI,
9838c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner                                 bool &IsIndirect, bool &IsPCRel) const {
9848c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  // The mach-o version of this method defaults to returning a stub reference.
9858c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  IsIndirect = true;
9868c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  IsPCRel    = false;
9878c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner
9888c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  SmallString<128> Name;
9898c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  Mang->getNameWithPrefix(Name, GV, true);
9908c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  Name += "$non_lazy_ptr";
9918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  return MCSymbolRefExpr::Create(Name.str(), getContext());
9928c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner}
9938c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner
99426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
995f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
996f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  COFF
997f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
998f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
99938cff389af1d78bd80df0479ef258493e0c5897eChris Lattnertypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
100038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner
100138cff389af1d78bd80df0479ef258493e0c5897eChris LattnerTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() {
100238cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  delete (COFFUniqueMapTy*)UniquingMap;
100338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner}
100438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner
10050c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner
100611e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
10074813035b726e7f0a3fd17bec437185fc72a50988Chris LattnergetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const {
100838cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // Create the map if it doesn't already exist.
100938cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (UniquingMap == 0)
101038cff389af1d78bd80df0479ef258493e0c5897eChris Lattner    UniquingMap = new MachOUniqueMapTy();
101138cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap;
10128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
101338cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  // Do the lookup, if we have a hit, return it.
101438cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  const MCSectionCOFF *&Entry = Map[Name];
101538cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  if (Entry) return Entry;
10168ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
101738cff389af1d78bd80df0479ef258493e0c5897eChris Lattner  return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext());
1018fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner}
1019fbf1d271e6a7157c1b5432e84d5633f63869b5a8Chris Lattner
1020f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
1021f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                              const TargetMachine &TM) {
102276d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer  if (UniquingMap != 0)
102376d5ccf6afd5ae253cf3d5c2cf6acc712643d8cbBenjamin Kramer    ((COFFUniqueMapTy*)UniquingMap)->clear();
1024a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
10250c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner  TextSection = getCOFFSection("\t.text", true, SectionKind::getText());
10260c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner  DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel());
102780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
10280c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection(".ctors", false, SectionKind::getDataRel());
102980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
10300c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection(".dtors", false, SectionKind::getDataRel());
10318ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
103235c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
103335c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // though it contains relocatable pointers.  In PIC mode, this is probably a
103435c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
103535c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  // adjusted or this should be a data section.
103635c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  LSDASection =
103735c3531754c392a533921a465a22f67f7e8fb743Chris Lattner    getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly());
103835c3531754c392a533921a465a22f67f7e8fb743Chris Lattner  EHFrameSection =
103935c3531754c392a533921a465a22f67f7e8fb743Chris Lattner    getCOFFSection(".eh_frame", false, SectionKind::getDataRel());
10408ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
104118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug info.
104218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // FIXME: Don't use 'directive' mode here.
10438ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfAbbrevSection =
10440c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_abbrev,\"dr\"",
10450c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10468ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfInfoSection =
10470c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_info,\"dr\"",
10480c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10498ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLineSection =
10500c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_line,\"dr\"",
10510c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfFrameSection =
10530c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_frame,\"dr\"",
10540c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
105518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection =
10560c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_pubnames,\"dr\"",
10570c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
105818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection =
10590c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"",
10600c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfStrSection =
10620c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_str,\"dr\"",
10630c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfLocSection =
10650c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_loc,\"dr\"",
10660c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfARangesSection =
10680c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_aranges,\"dr\"",
10690c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfRangesSection =
10710c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_ranges,\"dr\"",
10720c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
10738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov  DwarfMacroInfoSection =
10740c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner    getCOFFSection("\t.section\t.debug_macinfo,\"dr\"",
10750c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner                   true, SectionKind::getMetadata());
1076f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
1077f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
107824f654c8a4d14066233480f683d3b0dececf374aChris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
10798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
108024f654c8a4d14066233480f683d3b0dececf374aChris Lattner                         Mangler *Mang, const TargetMachine &TM) const {
10810c0cb7123346beab4e0d3ad6ce9570560b14971eChris Lattner  return getCOFFSection(GV->getSection().c_str(), false, Kind);
108224f654c8a4d14066233480f683d3b0dececf374aChris Lattner}
108324f654c8a4d14066233480f683d3b0dececf374aChris Lattner
1084f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
1085f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
1086f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".text$linkonce";
1087f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
1088f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".data$linkonce";
1089f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".rdata$linkonce";
1090f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
1091f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1092f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1093a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
1094f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
1095e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
1096f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
10978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1098f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
1099f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
110027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
1101f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
11024813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
1103cab16cc9a34b8a18e9f91c99085b2f0a1d287e12Chris Lattner    Mang->getNameWithPrefix(Name, GV, false);
11044813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner    return getCOFFSection(Name.str(), false, Kind);
1105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
11068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1107f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
1108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
11098ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
1111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
11128c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner
1113