TargetLoweringObjectFile.cpp revision 42263e2e407ab7d1d805e7b41cffd7217134d3b6
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"
2242263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner#include "llvm/MC/MCStreamer.h"
238da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/MC/MCSymbol.h"
2445111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner#include "llvm/Target/Mangler.h"
25f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h"
265277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner#include "llvm/Target/TargetMachine.h"
27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h"
289184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h"
298f9b0f6e881a63875e7c41319eca31751588799aChris Lattner#include "llvm/Support/ErrorHandling.h"
308da8d4b12a7e36e219894c256f545ddea66a9c49Chris Lattner#include "llvm/Support/raw_ostream.h"
315dc47ff03975b9adde9dd833db2b646eb4295710Chris Lattner#include "llvm/ADT/SmallString.h"
32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm;
33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                              Generic Code
36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
38a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = 0;
40f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = 0;
41824583844a8f334dd261894a3fac7ad476531667Chris Lattner  BSSSection = 0;
42f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection = 0;
4380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection = 0;
4480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection = 0;
45d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection = 0;
4635039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection = 0;
4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection = 0;
4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection = 0;
5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection = 0;
5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection = 0;
5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection = 0;
5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection = 0;
5418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfDebugInlineSection = 0;
5518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection = 0;
5618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection = 0;
5718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection = 0;
5818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection = 0;
5918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection = 0;
6009d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner
6109d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  IsFunctionEHSymbolGlobal = false;
6209d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  IsFunctionEHFrameSymbolPrivate = true;
6309d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  SupportsWeakOmittedEHFrame = true;
64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
66f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) {
70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GV->getInitializer();
718ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
758ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
798ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
878ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
921850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// IsNullTerminatedString - Return true if the specified constant (which is
931850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// known to have a type that is an array of 1/2/4 byte elements) ends with a
941850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner/// nul value and contains no other nuls in it.
951850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattnerstatic bool IsNullTerminatedString(const Constant *C) {
961850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  const ArrayType *ATy = cast<ArrayType>(C->getType());
978ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // First check: is we have constant array of i8 terminated with zero
991850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) {
1001850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    if (ATy->getNumElements() == 0) return false;
1011850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner
1021850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    ConstantInt *Null =
1031850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1));
1041850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    if (Null == 0 || Null->getZExtValue() != 0)
1051850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      return false; // Not null terminated.
1068ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1071850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    // Verify that the null doesn't occur anywhere else in the string.
1081850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i)
1091850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // Reject constantexpr elements etc.
1101850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      if (!isa<ConstantInt>(CVA->getOperand(i)) ||
1111850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          CVA->getOperand(i) == Null)
1121850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        return false;
113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return true;
1141850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner  }
115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
1181850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner    return ATy->getNumElements() == 1;
119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
12358bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner/// getKindForGlobal - This is a top-level target-independent classifier for
124968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable.  Given an global variable and information from TM, it
125968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target
126968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler.  The target implementation is free to ignore this
127968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course.
12858bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalValue *GV,
12958bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner                                                       const TargetMachine &TM){
13058bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
13158bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner         "Can only be used for global definitions");
1328ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
1348ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
1382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getText();
1398ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (isSuitableForBSS(GVar))
1432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getThreadBSS();
1442798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
147a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  // Variables with common linkage always get classified as common.
148a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner  if (GVar->hasCommonLinkage())
149a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner    return SectionKind::getCommon();
150a3839bc3714e6a84222f45cf4c0f1a20a88b10cdChris Lattner
151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
152ce8749e445fdd0493758932874bad50293647df9Chris Lattner  if (isSuitableForBSS(GVar)) {
153ce8749e445fdd0493758932874bad50293647df9Chris Lattner    if (GVar->hasLocalLinkage())
154ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSLocal();
155ce8749e445fdd0493758932874bad50293647df9Chris Lattner    else if (GVar->hasExternalLinkage())
156ce8749e445fdd0493758932874bad50293647df9Chris Lattner      return SectionKind::getBSSExtern();
1572798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
158ce8749e445fdd0493758932874bad50293647df9Chris Lattner  }
159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GVar->getInitializer();
1618ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isConstant()) {
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // relocation, then we may have to drop this into a wriable data section
167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
1698f9b0f6e881a63875e7c41319eca31751588799aChris Lattner    default: assert(0 && "unknown relocation info kind");
170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
1721850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      // section of the right width.
1731850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) {
1748ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov        if (const IntegerType *ITy =
1751850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              dyn_cast<IntegerType>(ATy->getElementType())) {
1761850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 ||
1771850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner               ITy->getBitWidth() == 32) &&
1781850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              IsNullTerminatedString(C)) {
1791850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 8)
1801850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable1ByteCString();
1811850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            if (ITy->getBitWidth() == 16)
1821850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner              return SectionKind::getMergeable2ByteCString();
1838ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
1841850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            assert(ITy->getBitWidth() == 32 && "Unknown width");
1851850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner            return SectionKind::getMergeable4ByteCString();
1861850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner          }
1871850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner        }
1881850e5add1516e945bbabf7e456c305f4bd5cc6fChris Lattner      }
1898ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
1942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 4:  return SectionKind::getMergeableConst4();
1952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 8:  return SectionKind::getMergeableConst8();
1962798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 16: return SectionKind::getMergeableConst16();
1972798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      default: return SectionKind::getMergeableConst();
198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
1998ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2072798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2088ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel.local section.
2112798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRelLocal();
2128ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
2202798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
2218ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
2242798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRel();
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
2342798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
236f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
2378f9b0f6e881a63875e7c41319eca31751588799aChris Lattner  default: assert(0 && "unknown relocation info kind");
238f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
2392798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
2412798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRelLocal();
242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
2432798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRel();
244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
250a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
25158bed8fc29b6e55e7014dcb537808043c946cd73Chris LattnerSectionForGlobal(const GlobalValue *GV, SectionKind Kind, Mangler *Mang,
252e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
25424f654c8a4d14066233480f683d3b0dececf374aChris Lattner  if (GV->hasSection())
25524f654c8a4d14066233480f683d3b0dececf374aChris Lattner    return getExplicitSectionGlobal(GV, Kind, Mang, TM);
2568ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
2578ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
259f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
261f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
26258bed8fc29b6e55e7014dcb537808043c946cd73Chris Lattner
263f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
264a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
265f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
266f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner                                                 SectionKind Kind,
267e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
269f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
2708ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
271f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
2738ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
274824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS() && BSSSection != 0)
275824583844a8f334dd261894a3fac7ad476531667Chris Lattner    return BSSSection;
2768ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
277f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
28383d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the
284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
286a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
28783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
2908ddb569d8a1831f0e061e2f490d61bccd4166ec4Anton Korobeynikov
291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
2943192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner/// getExprForDwarfGlobalReference - Return an MCExpr to use for a
2959184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// reference to the specified global variable from exception
2969184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov/// handling information.
2978c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerconst MCExpr *TargetLoweringObjectFile::
2983192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
2993192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MachineModuleInfo *MMI, unsigned Encoding,
3003192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MCStreamer &Streamer) const {
30145111d160cf0910030eeb6a949c69273502e5ad5Chris Lattner  // FIXME: Use GetGlobalValueSymbol.
3028c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  SmallString<128> Name;
3038c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner  Mang->getNameWithPrefix(Name, GV, false);
30498cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner  const MCSymbol *Sym;
30598cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner
30698cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner  if (GV->hasPrivateLinkage())
30798cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner    Sym = getContext().GetOrCreateTemporarySymbol(Name.str());
30898cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner  else
30998cdab53c302a2d6686fa428c0e896b1fb195311Chris Lattner    Sym = getContext().GetOrCreateSymbol(Name.str());
3109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
31142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner  return getExprForDwarfReference(Sym, Mang, MMI, Encoding, Streamer);
3129184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3139184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovconst MCExpr *TargetLoweringObjectFile::
31542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris LattnergetExprForDwarfReference(const MCSymbol *Sym, Mangler *Mang,
31642263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner                         MachineModuleInfo *MMI, unsigned Encoding,
31742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner                         MCStreamer &Streamer) const {
3189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext());
3199184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3209184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  switch (Encoding & 0xF0) {
3219184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  default:
322b76beda30a3630a9fd5fde10f43d27dd51fb5037Bill Wendling    llvm_report_error("We do not support this DWARF encoding yet!");
3239184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  case dwarf::DW_EH_PE_absptr:
3249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov    // Do nothing special
32542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    return Res;
32642263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner  case dwarf::DW_EH_PE_pcrel: {
32742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    // Emit a label to the streamer for the current position.  This gives us
32842263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    // .-foo addressing.
32942263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    SmallString<128> Name;
33042263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    Mang->getNameWithPrefix(Name, Twine("PCtemp") + Twine(Mang->getUniqueID()),
33142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner                            Mangler::Private);
33242263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner
33342263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    MCSymbol *PCSym = getContext().GetOrCreateTemporarySymbol(Name.str());
33442263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    Streamer.EmitLabel(PCSym);
33542263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext());
33642263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner    return MCBinaryExpr::CreateSub(Res, PC, getContext());
33742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner  }
3389184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  }
3399184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3409184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3419184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getPersonalityEncoding() const {
3429184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3439184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3449184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3459184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getLSDAEncoding() const {
3469184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3479184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
3489184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov
3499184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getFDEEncoding() const {
3509184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3518c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner}
352f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
3539184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovunsigned TargetLoweringObjectFile::getTTypeEncoding() const {
3549184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov  return dwarf::DW_EH_PE_absptr;
3559184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov}
356f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
357