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"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
21a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h"
228c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner#include "llvm/MC/MCExpr.h"
2342263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner#include "llvm/MC/MCStreamer.h"
248da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h"
259184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h"
268f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h"
278da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h"
28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/Mangler.h"
29d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h"
30d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h"
31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm;
32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                              Generic Code
35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
37e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng/// Initialize - this method must be called before any actual lowering is
38e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng/// done.  This specifies the current context for codegen, and gives the
39e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng/// lowering implementations a chance to set up their default sections.
40e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Chengvoid TargetLoweringObjectFile::Initialize(MCContext &ctx,
41e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng                                          const TargetMachine &TM) {
42e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng  Ctx = &ctx;
43203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng  InitMCObjectFileInfo(TM.getTargetTriple(),
44203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng                       TM.getRelocationModel(), TM.getCodeModel(), *Ctx);
45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
46e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng
47f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
48f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
49f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
508a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewyckystatic bool isSuitableForBSS(const GlobalVariable *GV, bool NoZerosInBSS) {
517d715dfe6d66be257926f626df96a0e2bd38dc1fJay Foad  const Constant *C = GV->getInitializer();
528ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
53f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
608ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
688ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is
741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a
7529cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner/// nul value and contains no other nuls in it.  Note that this is more general
7629cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner/// than ConstantDataSequential::isString because we allow 2 & 4 byte strings.
771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) {
7829cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner  // First check: is we have constant array terminated with zero
7929cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner  if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(C)) {
8029cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    unsigned NumElts = CDS->getNumElements();
8129cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    assert(NumElts != 0 && "Can't have an empty CDS");
8229cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner
8329cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    if (CDS->getElementAsInteger(NumElts-1) != 0)
8429cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner      return false; // Not null terminated.
8529cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner
8629cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    // Verify that the null doesn't occur anywhere else in the string.
8729cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    for (unsigned i = 0; i != NumElts-1; ++i)
8829cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner      if (CDS->getElementAsInteger(i) == 0)
8929cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner        return false;
9029cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    return true;
9129cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner  }
92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
9529cc6cb4d1aa22f0a27edf4e5b363071a83a65d8Chris Lattner    return cast<ArrayType>(C->getType())->getNumElements() == 1;
96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1007afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael EspindolaMCSymbol *TargetLoweringObjectFile::
10160246a96224c8b790177253bf25433b93b335d2bRafael EspindolagetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
1027afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola                        MachineModuleInfo *MMI) const {
1037afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola  return Mang->getSymbol(GV);
10430deafc84adf88f643cdc39dc97a37537155347fRafael Espindola}
10530deafc84adf88f643cdc39dc97a37537155347fRafael Espindola
10630deafc84adf88f643cdc39dc97a37537155347fRafael Espindolavoid TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer,
10730deafc84adf88f643cdc39dc97a37537155347fRafael Espindola                                                    const TargetMachine &TM,
10830deafc84adf88f643cdc39dc97a37537155347fRafael Espindola                                                    const MCSymbol *Sym) const {
10930deafc84adf88f643cdc39dc97a37537155347fRafael Espindola}
11030deafc84adf88f643cdc39dc97a37537155347fRafael Espindola
11130deafc84adf88f643cdc39dc97a37537155347fRafael Espindola
11258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for
113968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable.  Given an global variable and information from TM, it
114968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target
115968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler.  The target implementation is free to ignore this
116968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course.
11758bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV,
11858bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner                                                       const TargetMachine &TM){
11958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
12058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner         "Can only be used for global definitions");
1218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
1238ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
1272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getText();
1288ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
1318a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky    if (isSuitableForBSS(GVar, TM.Options.NoZerosInBSS))
1322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getThreadBSS();
1332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
136a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  // Variables with common linkage always get classified as common.
137a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  if (GVar->hasCommonLinkage())
138a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner    return SectionKind::getCommon();
139a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner
140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
1418a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky  if (isSuitableForBSS(GVar, TM.Options.NoZerosInBSS)) {
142ce8749e445fdd0493758932874bad50293647df9Chris Lattner    if (GVar->hasLocalLinkage())
143ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSLocal();
144ce8749e445fdd0493758932874bad50293647df9Chris Lattner    else if (GVar->hasExternalLinkage())
145ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSExtern();
1462798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
147ce8749e445fdd0493758932874bad50293647df9Chris Lattner  }
148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1497d715dfe6d66be257926f626df96a0e2bd38dc1fJay Foad  const Constant *C = GVar->getInitializer();
1508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
15332899199c043269b4dfab7f0429cc946e67bd54dChris Lattner  if (GVar->isConstant()) {
154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
155f2eed387d48e36f12a9945c6b71b20bdc7f46e3aEric Christopher    // relocation, then we may have to drop this into a writable data section
156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
15932899199c043269b4dfab7f0429cc946e67bd54dChris Lattner      // If the global is required to have a unique address, it can't be put
16032899199c043269b4dfab7f0429cc946e67bd54dChris Lattner      // into a mergable section: just drop it into the general read-only
16132899199c043269b4dfab7f0429cc946e67bd54dChris Lattner      // section instead.
16232899199c043269b4dfab7f0429cc946e67bd54dChris Lattner      if (!GVar->hasUnnamedAddr())
16332899199c043269b4dfab7f0429cc946e67bd54dChris Lattner        return SectionKind::getReadOnly();
16432899199c043269b4dfab7f0429cc946e67bd54dChris Lattner
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
1661850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // section of the right width.
167db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner      if (ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
168db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner        if (IntegerType *ITy =
1691850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              dyn_cast<IntegerType>(ATy->getElementType())) {
1701850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 ||
1711850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner               ITy->getBitWidth() == 32) &&
1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              IsNullTerminatedString(C)) {
1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 8)
1741850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable1ByteCString();
1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 16)
1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable2ByteCString();
1778ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            assert(ITy->getBitWidth() == 32 && "Unknown width");
1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            return SectionKind::getMergeable4ByteCString();
1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          }
1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        }
1821850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      }
1838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
1873574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow      switch (TM.getDataLayout()->getTypeAllocSize(C->getType())) {
1882798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 4:  return SectionKind::getMergeableConst4();
1892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 8:  return SectionKind::getMergeableConst8();
1902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 16: return SectionKind::getMergeableConst16();
1912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      default: return SectionKind::getMergeableConst();
192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
1938ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2028ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel.local section.
2052798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRelLocal();
2068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2142798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2158ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
2182798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRel();
219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
2282798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
2322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
2342798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRelLocal();
235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
2362798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRel();
237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
238732f05c41f177a0bc4d47e93a5d02120f146cb4cChandler Carruth  llvm_unreachable("Invalid relocation");
239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
244a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
24558bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang,
246e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
24824f654c8a4d14066233480f683d3b0dececf374aChris Lattner  if (GV->hasSection())
24924f654c8a4d14066233480f683d3b0dececf374aChris Lattner    return getExplicitSectionGlobal(GV, Kind, Mang, TM);
2508ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
2518ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
253f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
25658bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner
257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
258a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
259f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
260f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner                                                 SectionKind Kind,
261e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
263f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
2648ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
265f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
2678ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
268824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS() && BSSSection != 0)
269824583844a8f334dd261894a3fac7ad476531667Chris Lattner    return BSSSection;
2708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
271f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
27783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
280a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
28183d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
2848ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
28825efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov/// getTTypeGlobalReference - Return an MCExpr to use for a
2899184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// reference to the specified global variable from exception
2909184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// handling information.
2918c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile::
29225efd6d556718295a63d37f5294985746af354f6Anton KorobeynikovgetTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
29325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov                        MachineModuleInfo *MMI, unsigned Encoding,
29425efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov                        MCStreamer &Streamer) const {
29525efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov  const MCSymbolRefExpr *Ref =
29625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    MCSymbolRefExpr::Create(Mang->getSymbol(GV), getContext());
29725efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
29825efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov  return getTTypeReference(Ref, Encoding, Streamer);
2999184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3009184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3019184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFile::
30225efd6d556718295a63d37f5294985746af354f6Anton KorobeynikovgetTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
30325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov                  MCStreamer &Streamer) const {
304f0adba9a7ec8a3031876575a6ffb7db5f1b6f855Rafael Espindola  switch (Encoding & 0x70) {
3059184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  default:
30675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("We do not support this DWARF encoding yet!");
3079184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  case dwarf::DW_EH_PE_absptr:
3089184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    // Do nothing special
30925efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    return Sym;
31042263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner  case dwarf::DW_EH_PE_pcrel: {
31142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    // Emit a label to the streamer for the current position.  This gives us
31242263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    // .-foo addressing.
31377e76940269b1bed36bc31ee5139b5c90fd13836Chris Lattner    MCSymbol *PCSym = getContext().CreateTempSymbol();
31442263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    Streamer.EmitLabel(PCSym);
31542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext());
31625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov    return MCBinaryExpr::CreateSub(Sym, PC, getContext());
31742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner  }
3189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  }
3199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
320