TargetLoweringObjectFile.cpp revision 35039ac24163e99cfab161620a9fb41f944a63d5
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"
18f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/GlobalVariable.h"
19a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCContext.h"
20a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCSection.h"
21f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetMachine.h"
22f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h"
23f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h"
24a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/Support/Mangler.h"
25f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h"
26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm;
27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                              Generic Code
30f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
32a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = 0;
34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = 0;
35824583844a8f334dd261894a3fac7ad476531667Chris Lattner  BSSSection = 0;
36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection = 0;
3780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection = 0;
3880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection = 0;
39d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection = 0;
4035039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection = 0;
41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
42f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
43f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
44f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
46f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) {
47f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GV->getInitializer();
48f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
49f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
50f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
51f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
52f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
53f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
56f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isConstantString(const Constant *C) {
70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // First check: is we have constant array of i8 terminated with zero
71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Check, if initializer is a null-terminated string
73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (CVA && CVA->isCString())
74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return true;
75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType()))
79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return (Ty->getElementType() == Type::Int8Ty &&
80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner              Ty->getNumElements() == 1);
81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
85968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// SectionKindForGlobal - This is a top-level target-independent classifier for
86968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable.  Given an global variable and information from TM, it
87968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target
88968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler.  The target implementation is free to ignore this
89968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course.
90968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattnerstatic SectionKind SectionKindForGlobal(const GlobalValue *GV,
91968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                        const TargetMachine &TM) {
92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
972798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getText();
98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
100f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
101f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
102f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (isSuitableForBSS(GVar))
1032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getThreadBSS();
1042798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isSuitableForBSS(GVar))
1092798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GVar->getInitializer();
112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isConstant()) {
116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // relocation, then we may have to drop this into a wriable data section
118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    default: llvm_unreachable("unknown relocation info kind");
121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
123f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // section if the target has it.
124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (isConstantString(C))
1252798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getMergeableCString();
126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
1312798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 4:  return SectionKind::getMergeableConst4();
1322798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 8:  return SectionKind::getMergeableConst8();
1332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 16: return SectionKind::getMergeableConst16();
1342798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      default: return SectionKind::getMergeableConst();
135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
1442798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
147f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel.local section.
1482798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRelLocal();
149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
1572798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
1612798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRel();
162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
1712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
172f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  default: llvm_unreachable("unknown relocation info kind");
175f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
1762798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
1782798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRelLocal();
179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
1802798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRel();
181f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
187a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
188e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSectionForGlobal(const GlobalValue *GV, Mangler *Mang,
189e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner         "Can only be used for global definitions");
192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
193968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  SectionKind Kind = SectionKindForGlobal(GV, TM);
194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
195f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->hasSection()) {
197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the target has special section hacks for specifically named globals,
198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // return them now.
199f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind))
200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return TS;
201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the target has magic semantics for certain section names, make sure to
203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // pick up the flags.  This allows the user to write things with attribute
204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // section and still get the appropriate section flags printed.
205968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    Kind = getKindForNamedSection(GV->getSection().c_str(), Kind);
206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
207968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    return getOrCreateSection(GV->getSection().c_str(), false, Kind);
208f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
212f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
216a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
217f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
218f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner                                                 SectionKind Kind,
219e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
221f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
223f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
226824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS() && BSSSection != 0)
227824583844a8f334dd261894a3fac7ad476531667Chris Lattner    return BSSSection;
228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
229f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
23583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the
236f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
238a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
23983d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
247a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
248968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetOrCreateSection(const char *Name, bool isDirective, SectionKind Kind) const {
249a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  if (MCSection *S = Ctx->GetSection(Name))
250a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner    return S;
251968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  return MCSection::Create(Name, isDirective, Kind, *Ctx);
252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  ELF
258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
260f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
261f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                             const TargetMachine &TM) {
262a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
263f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!HasCrazyBSS)
2642798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    BSSSection = getOrCreateSection("\t.bss", true, SectionKind::getBSS());
265f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // PPC/Linux doesn't support the .bss directive, it needs .section .bss.
267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // FIXME: Does .section .bss work everywhere??
268968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    // FIXME2: this should just be handle by the section printer.  We should get
269968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    // away from syntactic view of the sections and MCSection should just be a
270968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    // semantic view.
2712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    BSSSection = getOrCreateSection("\t.bss", false, SectionKind::getBSS());
272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
2742798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner  TextSection = getOrCreateSection("\t.text", true, SectionKind::getText());
2752798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner  DataSection = getOrCreateSection("\t.data", true, SectionKind::getDataRel());
276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection =
2772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    getOrCreateSection("\t.rodata", false, SectionKind::getReadOnly());
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TLSDataSection =
2792798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    getOrCreateSection("\t.tdata", false, SectionKind::getThreadData());
280824583844a8f334dd261894a3fac7ad476531667Chris Lattner  CStringSection = getOrCreateSection("\t.rodata.str", true,
2812798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                               SectionKind::getMergeableCString());
282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
283968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  TLSBSSSection = getOrCreateSection("\t.tbss", false,
2842798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                     SectionKind::getThreadBSS());
285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelSection = getOrCreateSection("\t.data.rel", false,
2872798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                      SectionKind::getDataRel());
288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false,
2892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getDataRelLocal());
290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelROSection = getOrCreateSection("\t.data.rel.ro", false,
2912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getReadOnlyWithRel());
292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelROLocalSection =
293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    getOrCreateSection("\t.data.rel.ro.local", false,
2942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                       SectionKind::getReadOnlyWithRelLocal());
295f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
296f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst4Section = getOrCreateSection(".rodata.cst4", false,
2972798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst4());
298f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst8Section = getOrCreateSection(".rodata.cst8", false,
2992798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst8());
300f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst16Section = getOrCreateSection(".rodata.cst16", false,
3012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                               SectionKind::getMergeableConst16());
30280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
30380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
30480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".ctors", false, SectionKind::getDataRel());
30580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
30680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".dtors", false, SectionKind::getDataRel());
307d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner
308d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner
309d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
310d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // it contains relocatable pointers.  In PIC mode, this is probably a big
311d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
312d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // adjusted or this should be a data section.
313d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection =
314d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner    getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly());
31535039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
31635039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner    getOrCreateSection(".eh_frame", false, SectionKind::getDataRel());
317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
318f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
319f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
320968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnerSectionKind TargetLoweringObjectFileELF::
321968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetKindForNamedSection(const char *Name, SectionKind K) const {
322f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Name[0] != '.') return K;
323f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
324f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Some lame default implementation based on some magic section names.
325f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
326f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.b.", 17) == 0 ||
327f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 ||
328f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.sb.", 18) == 0)
3292798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
330f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
331f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tdata") == 0 ||
332f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tdata.", 7) == 0 ||
333f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
334f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
3352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
336f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
337f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tbss") == 0 ||
338f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tbss.", 6) == 0 ||
339f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
340f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
3412798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadBSS();
342f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
343f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return K;
344f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
345f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
346f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileELF::
347f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
348f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back(',');
349f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back('"');
350f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
351f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!Kind.isMetadata())
352f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('a');
353f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
354f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('x');
355f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
356f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('w');
35782987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner  if (Kind.isMergeableCString() ||
35882987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst4() ||
35982987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst8() ||
36082987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst16())
361f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('M');
362f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableCString())
363f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('S');
364f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadLocal())
365f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('T');
366f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
367f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back('"');
368f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back(',');
369f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If comment string is '@', e.g. as on ARM - use '%' instead
371f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (AtIsCommentChar)
372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('%');
373f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
374f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('@');
375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const char *KindStr;
377bf15e433b9ac6692e76aff0465cd93bb87f68989Chris Lattner  if (Kind.isBSS() || Kind.isThreadBSS())
378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    KindStr = "nobits";
379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    KindStr = "progbits";
381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
382f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.append(KindStr, KindStr+strlen(KindStr));
383f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableCString()) {
385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // TODO: Eventually handle multiple byte character strings.  For now, all
386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // mergable C strings are single byte.
387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
388f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('1');
389f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst4()) {
390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('4');
392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst8()) {
393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
394f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('8');
395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst16()) {
396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('1');
398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('6');
399f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
400f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
401f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
402f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
403f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
404f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())                 return ".gnu.linkonce.t.";
405f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
406f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
407f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
408f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
410f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isBSS())                  return ".gnu.linkonce.b.";
411f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
412f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
413f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
415f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
417f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".gnu.linkonce.d.rel.ro.";
418f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
419f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
420a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
421f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
422e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
423f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
424f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
425f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
42627602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
427f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
428b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner    std::string Name = Mang->makeNameProper(GV->getNameStr());
429f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    return getOrCreateSection((Prefix+Name).c_str(), false, Kind);
430f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
431f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
432f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText()) return TextSection;
433e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner
434f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableCString()) {
435824583844a8f334dd261894a3fac7ad476531667Chris Lattner   assert(CStringSection && "Should have string section prefix");
436f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
437067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // We also need alignment here.
438067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // FIXME: this is getting the alignment of the character, not the
439067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // alignment of the global!
440067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    unsigned Align =
441067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
442f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
443824583844a8f334dd261894a3fac7ad476531667Chris Lattner    std::string Name = CStringSection->getName() + "1." + utostr(Align);
444067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    return getOrCreateSection(Name.c_str(), false,
4452798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                              SectionKind::getMergeableCString());
446f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
447f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
448f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
449f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst4())
450f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst4Section;
451f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst8())
452f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst8Section;
453f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst16())
454f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst16Section;
455f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
456f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
457f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
458f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())             return ReadOnlySection;
459f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
460f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadData())           return TLSDataSection;
461f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadBSS())            return TLSBSSSection;
462f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
463824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS())                  return BSSSection;
464f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
465f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataNoRel())            return DataSection;
466f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRelLocal())         return DataRelLocalSection;
467f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRel())              return DataRelSection;
468f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
470f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
471f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
472f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
47483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the
475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
477a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
47883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const {
479f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst4Section;
481f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
482f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst8Section;
483f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst16())
484f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst16Section;
485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())
486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
489f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
490f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
492f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
493f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                 MachO
495f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
496f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
497f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
498f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                               const TargetMachine &TM) {
499a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
500968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  TextSection = getOrCreateSection("\t.text", true,
5012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getText());
502968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  DataSection = getOrCreateSection("\t.data", true,
5032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getDataRel());
504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
505824583844a8f334dd261894a3fac7ad476531667Chris Lattner  CStringSection = getOrCreateSection("\t.cstring", true,
5062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                               SectionKind::getMergeableCString());
507f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  FourByteConstantSection = getOrCreateSection("\t.literal4\n", true,
5082798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst4());
509f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  EightByteConstantSection = getOrCreateSection("\t.literal8\n", true,
5102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst8());
5114bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner
5124bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
5134bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // to using it in -static mode.
5144bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (TM.getRelocationModel() != Reloc::Static &&
5154bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner      TM.getTargetData()->getPointerSize() == 32)
5164bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    SixteenByteConstantSection =
517968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner      getOrCreateSection("\t.literal16\n", true,
5182798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                         SectionKind::getMergeableConst16());
5194bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  else
5204bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    SixteenByteConstantSection = 0;
521f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
522968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  ReadOnlySection = getOrCreateSection("\t.const", true,
5232798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                       SectionKind::getReadOnly());
524f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
525f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextCoalSection =
526f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions",
5272798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                     false, SectionKind::getText());
528f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced",
529968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                            false,
5302798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                           SectionKind::getText());
531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced",
532968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                            false,
5332798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                          SectionKind::getText());
534f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstDataSection = getOrCreateSection("\t.const_data", true,
5352798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getReadOnlyWithRel());
536f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced",
537968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                       false,
5382798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                       SectionKind::getDataRel());
53980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
54080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  if (TM.getRelocationModel() == Reloc::Static) {
54180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticCtorSection =
54280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".constructor", true, SectionKind::getDataRel());
54380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticDtorSection =
54480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".destructor", true, SectionKind::getDataRel());
54580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  } else {
54680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticCtorSection =
54780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".mod_init_func", true, SectionKind::getDataRel());
54880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticDtorSection =
54980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel());
55080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  }
55180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
552d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false,
553d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner                                   SectionKind::getDataRel());
55435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
55535039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner    getOrCreateSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms"
55635039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner                       "+live_support", false, SectionKind::getReadOnly());
557f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
558f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
559a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
560f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
561e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
562f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
564f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
56527602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is weak/linkonce, put this in a coalescable section, either in text
568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // or data depending on if it is writable.
56927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
570f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isReadOnly())
571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return ConstTextCoalSection;
572f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return DataCoalSection;
573f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
574f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Alignment check should be handled by section classifier.
576f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableCString()) {
577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Constant *C = cast<GlobalVariable>(GV)->getInitializer();
578f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
579f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const TargetData &TD = *TM.getTargetData();
580f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    unsigned Size = TD.getTypeAllocSize(Ty);
581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Size) {
582f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV));
583f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (Align <= 32)
584824583844a8f334dd261894a3fac7ad476531667Chris Lattner        return CStringSection;
585f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
587f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
588f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
589f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
590f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
591f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst4())
592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return FourByteConstantSection;
593f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst8())
594f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return EightByteConstantSection;
595f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
596f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SixteenByteConstantSection;
597f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
598f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
600f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: ROData -> const in -static mode that is relocatable but they happen
601f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // by the static linker.  Why not mergeable?
602f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())
603f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
605f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is marked const, put it into a const section.  But if the dynamic
606f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker needs to write to it, put it in the data segment.
607f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRel())
608f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
609f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
610f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, just drop the variable in the normal data section.
611f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
612f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
613f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
614a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
61583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
616f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this constant requires a relocation, we have to put it in the data
617f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // segment, not in the text segment.
618f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())
619f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
620f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
622f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return FourByteConstantSection;
623f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return EightByteConstantSection;
6254bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
626f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SixteenByteConstantSection;
627f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ReadOnlySection;  // .const
628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
629f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
63026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
63126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used.
63226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300)
63326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO::
63426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
63526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// On Darwin, internally linked data beginning with "L" or "l" does not have
63626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// the directive emitted (this occurs in ObjC metadata).
63726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (!GV) return false;
63826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
63926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
64026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
64126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // FIXME: ObjC metadata is currently emitted as internal symbols that have
64226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
64326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // this horrible hack can go away.
64426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    const std::string &Name = Mang->getMangledName(GV);
64526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    if (Name[0] == 'L' || Name[0] == 'l')
64626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner      return false;
64726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  }
64826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
64926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  return true;
65026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner}
65126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
65226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
653f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
654f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  COFF
655f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
656f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
657f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
658f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                              const TargetMachine &TM) {
659a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
660968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  TextSection = getOrCreateSection("\t.text", true,
6612798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getText());
662968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  DataSection = getOrCreateSection("\t.data", true,
6632798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getDataRel());
66480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
66580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".ctors", false, SectionKind::getDataRel());
66680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
66780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".dtors", false, SectionKind::getDataRel());
668f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
669f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
670f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileCOFF::
671f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Inefficient.
673f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  std::string Res = ",\"";
674f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
675f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Res += 'x';
676f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
677f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Res += 'w';
678f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Res += "\"";
679f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
680f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.append(Res.begin(), Res.end());
681f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
682f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
683f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
684f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
685f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".text$linkonce";
686f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
687f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".data$linkonce";
688f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".rdata$linkonce";
689f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
690f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
691f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
692a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
693f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
694e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
695f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
696f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
69927602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
700f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
701968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    std::string Name = Mang->makeNameProper(GV->getNameStr());
702f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    return getOrCreateSection((Prefix+Name).c_str(), false, Kind);
703f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
704f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
705f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
706f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
707f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
708f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
709f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
710f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
711