TargetLoweringObjectFile.cpp revision 3b24c0172069a2546cd095e4b91f8b88c1ea0722
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;
4118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
4218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection = 0;
4318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection = 0;
4418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection = 0;
4518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection = 0;
4618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection = 0;
4718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection = 0;
4818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfDebugInlineSection = 0;
4918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection = 0;
5018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection = 0;
5118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection = 0;
5218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection = 0;
5318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection = 0;
54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
56f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) {
60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GV->getInitializer();
61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isConstantString(const Constant *C) {
83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // First check: is we have constant array of i8 terminated with zero
84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Check, if initializer is a null-terminated string
86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (CVA && CVA->isCString())
87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return true;
88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType()))
92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return (Ty->getElementType() == Type::Int8Ty &&
93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner              Ty->getNumElements() == 1);
94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
98968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// SectionKindForGlobal - This is a top-level target-independent classifier for
99968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// a global variable.  Given an global variable and information from TM, it
100968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// classifies the global in a variety of ways that make various target
101968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// implementations simpler.  The target implementation is free to ignore this
102968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner/// extra info of course.
103968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattnerstatic SectionKind SectionKindForGlobal(const GlobalValue *GV,
104968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                        const TargetMachine &TM) {
105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
109f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
1102798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getText();
111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (isSuitableForBSS(GVar))
1162798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getThreadBSS();
1172798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isSuitableForBSS(GVar))
1222798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
123f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GVar->getInitializer();
125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isConstant()) {
129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // relocation, then we may have to drop this into a wriable data section
131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    default: llvm_unreachable("unknown relocation info kind");
134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // section if the target has it.
137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (isConstantString(C))
1383b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner        return SectionKind::getMergeable1ByteCString();
139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
1403b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      // FIXME: Detect 2/4 byte strings.
1413b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner
142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
1462798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 4:  return SectionKind::getMergeableConst4();
1472798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 8:  return SectionKind::getMergeableConst8();
1482798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      case 16: return SectionKind::getMergeableConst16();
1492798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      default: return SectionKind::getMergeableConst();
150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
1592798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel.local section.
1632798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRelLocal();
164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
1722798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner        return SectionKind::getReadOnly();
173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
175f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
1762798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner      return SectionKind::getReadOnlyWithRel();
177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
180f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
181f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
1862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  default: llvm_unreachable("unknown relocation info kind");
190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
1912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataNoRel();
192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
1932798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRelLocal();
194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
1952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getDataRel();
196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
202a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
203e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSectionForGlobal(const GlobalValue *GV, Mangler *Mang,
204e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner         "Can only be used for global definitions");
207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
208968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  SectionKind Kind = SectionKindForGlobal(GV, TM);
209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->hasSection()) {
212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the target has special section hacks for specifically named globals,
213f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // return them now.
214f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind))
215f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return TS;
216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the target has magic semantics for certain section names, make sure to
218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // pick up the flags.  This allows the user to write things with attribute
219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // section and still get the appropriate section flags printed.
220968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    Kind = getKindForNamedSection(GV->getSection().c_str(), Kind);
221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
222968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    return getOrCreateSection(GV->getSection().c_str(), false, Kind);
223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
227f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
231a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
232f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
233f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner                                                 SectionKind Kind,
234e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
235f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
236f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
238f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
241824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS() && BSSSection != 0)
242824583844a8f334dd261894a3fac7ad476531667Chris Lattner    return BSSSection;
243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
244f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
245f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
25083d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergable constant with the
251f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
253a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
25483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
261f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
262a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFile::
263968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetOrCreateSection(const char *Name, bool isDirective, SectionKind Kind) const {
264a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  if (MCSection *S = Ctx->GetSection(Name))
265a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner    return S;
266968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  return MCSection::Create(Name, isDirective, Kind, *Ctx);
267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
269f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  ELF
273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
275f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
276f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                             const TargetMachine &TM) {
277a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!HasCrazyBSS)
2792798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    BSSSection = getOrCreateSection("\t.bss", true, SectionKind::getBSS());
280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // PPC/Linux doesn't support the .bss directive, it needs .section .bss.
282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // FIXME: Does .section .bss work everywhere??
283968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    // FIXME2: this should just be handle by the section printer.  We should get
284968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    // away from syntactic view of the sections and MCSection should just be a
285968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    // semantic view.
2862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    BSSSection = getOrCreateSection("\t.bss", false, SectionKind::getBSS());
287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
2892798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner  TextSection = getOrCreateSection("\t.text", true, SectionKind::getText());
2902798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner  DataSection = getOrCreateSection("\t.data", true, SectionKind::getDataRel());
291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection =
2922798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    getOrCreateSection("\t.rodata", false, SectionKind::getReadOnly());
293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TLSDataSection =
2942798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    getOrCreateSection("\t.tdata", false, SectionKind::getThreadData());
2953b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner
2963b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  // FIXME: No reason to make this.
297824583844a8f334dd261894a3fac7ad476531667Chris Lattner  CStringSection = getOrCreateSection("\t.rodata.str", true,
2983b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner                               SectionKind::getMergeable1ByteCString());
299f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
300968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  TLSBSSSection = getOrCreateSection("\t.tbss", false,
3012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                     SectionKind::getThreadBSS());
302f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
303f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelSection = getOrCreateSection("\t.data.rel", false,
3042798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                      SectionKind::getDataRel());
305f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false,
3062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getDataRelLocal());
307f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelROSection = getOrCreateSection("\t.data.rel.ro", false,
3082798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getReadOnlyWithRel());
309f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelROLocalSection =
310f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    getOrCreateSection("\t.data.rel.ro.local", false,
3112798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                       SectionKind::getReadOnlyWithRelLocal());
312f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
313f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst4Section = getOrCreateSection(".rodata.cst4", false,
3142798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst4());
315f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst8Section = getOrCreateSection(".rodata.cst8", false,
3162798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst8());
317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst16Section = getOrCreateSection(".rodata.cst16", false,
3182798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                               SectionKind::getMergeableConst16());
31980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
32080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
32180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".ctors", false, SectionKind::getDataRel());
32280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
32380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".dtors", false, SectionKind::getDataRel());
324d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner
32518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Exception Handling Sections.
326d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner
327d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
328d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // it contains relocatable pointers.  In PIC mode, this is probably a big
329d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
330d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  // adjusted or this should be a data section.
331d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection =
332d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner    getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly());
33335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
33435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner    getOrCreateSection(".eh_frame", false, SectionKind::getDataRel());
33518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
33618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug Info Sections.
33718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection =
33818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_abbrev", false, SectionKind::getMetadata());
33918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection =
34018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_info", false, SectionKind::getMetadata());
34118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection =
34218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_line", false, SectionKind::getMetadata());
34318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection =
34418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_frame", false, SectionKind::getMetadata());
34518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection =
34618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_pubnames", false, SectionKind::getMetadata());
34718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection =
34818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_pubtypes", false, SectionKind::getMetadata());
34918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection =
35018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_str", false, SectionKind::getMetadata());
35118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection =
35218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_loc", false, SectionKind::getMetadata());
35318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection =
35418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_aranges", false, SectionKind::getMetadata());
35518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection =
35618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_ranges", false, SectionKind::getMetadata());
35718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection =
35818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".debug_macinfo", false, SectionKind::getMetadata());
359f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
360f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
361f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
362968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnerSectionKind TargetLoweringObjectFileELF::
363968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnergetKindForNamedSection(const char *Name, SectionKind K) const {
364f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Name[0] != '.') return K;
365f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
366f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Some lame default implementation based on some magic section names.
367f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
368f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.b.", 17) == 0 ||
369f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 ||
370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.sb.", 18) == 0)
3712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getBSS();
372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
373f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tdata") == 0 ||
374f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tdata.", 7) == 0 ||
375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
3772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadData();
378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tbss") == 0 ||
380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tbss.", 6) == 0 ||
381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
382f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
3832798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner    return SectionKind::getThreadBSS();
384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return K;
386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
388f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileELF::
389f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back(',');
391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back('"');
392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!Kind.isMetadata())
394f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('a');
395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('x');
397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('w');
3993b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString() ||
4003b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable2ByteCString() ||
4013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable4ByteCString() ||
40282987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst4() ||
40382987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst8() ||
40482987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst16())
405f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('M');
4063b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString() ||
4073b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable2ByteCString() ||
4083b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable4ByteCString())
409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('S');
410f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadLocal())
411f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('T');
412f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
413f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back('"');
414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back(',');
415f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If comment string is '@', e.g. as on ARM - use '%' instead
417f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (AtIsCommentChar)
418f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('%');
419f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
420f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('@');
421f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
422f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const char *KindStr;
423bf15e433b9ac6692e76aff0465cd93bb87f68989Chris Lattner  if (Kind.isBSS() || Kind.isThreadBSS())
424f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    KindStr = "nobits";
425f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
426f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    KindStr = "progbits";
427f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
428f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.append(KindStr, KindStr+strlen(KindStr));
429f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
4303b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString()) {
431f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
432f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('1');
4333b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  } else if (Kind.isMergeable2ByteCString()) {
4343b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    Str.push_back(',');
4353b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    Str.push_back('2');
4363b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  } else if (Kind.isMergeable4ByteCString()) {
4373b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    Str.push_back(',');
4383b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    Str.push_back('4');
439f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst4()) {
440f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
441f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('4');
442f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst8()) {
443f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
444f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('8');
445f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst16()) {
446f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
447f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('1');
448f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('6');
449f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
450f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
451f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
452f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
453f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
454f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())                 return ".gnu.linkonce.t.";
455f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
456f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
457f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
458f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
459f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
460f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isBSS())                  return ".gnu.linkonce.b.";
461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
462f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
463f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
464f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
465f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
467f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".gnu.linkonce.d.rel.ro.";
468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
470a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
471f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
472e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
474f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
47627602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
477f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
478b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner    std::string Name = Mang->makeNameProper(GV->getNameStr());
479f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    return getOrCreateSection((Prefix+Name).c_str(), false, Kind);
480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
481f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
482f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText()) return TextSection;
483e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner
4843b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString() ||
4853b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable2ByteCString() ||
4863b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      Kind.isMergeable4ByteCString()) {
487824583844a8f334dd261894a3fac7ad476531667Chris Lattner   assert(CStringSection && "Should have string section prefix");
488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
489067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // We also need alignment here.
490067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // FIXME: this is getting the alignment of the character, not the
491067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // alignment of the global!
492067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    unsigned Align =
493067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
494f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
4953b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    const char *SizeSpec = "1.";
4963b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    if (Kind.isMergeable2ByteCString())
4973b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      SizeSpec = "2.";
4983b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    else if (Kind.isMergeable4ByteCString())
4993b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      SizeSpec = "4.";
5003b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    else
5013b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner      assert(Kind.isMergeable1ByteCString() && "unknown string width");
5023b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner
5033b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner
5043b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    std::string Name = CStringSection->getName() + SizeSpec + utostr(Align);
5053b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner    return getOrCreateSection(Name.c_str(), false, Kind);
506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
507f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
508f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
509f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst4())
510f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst4Section;
511f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst8())
512f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst8Section;
513f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst16())
514f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst16Section;
515f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
516f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
517f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
518f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())             return ReadOnlySection;
519f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
520f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadData())           return TLSDataSection;
521f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isThreadBSS())            return TLSBSSSection;
522f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
523824583844a8f334dd261894a3fac7ad476531667Chris Lattner  if (Kind.isBSS())                  return BSSSection;
524f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
525f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataNoRel())            return DataSection;
526f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRelLocal())         return DataRelLocalSection;
527f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isDataRel())              return DataRelSection;
528f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
529f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
530f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
532f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
533f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
53483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner/// getSectionForConstant - Given a mergeable constant with the
535f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
536f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
537a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileELF::
53883d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnergetSectionForConstant(SectionKind Kind) const {
539f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
540f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst4Section;
541f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
542f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst8Section;
543f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst16())
544f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst16Section;
545f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())
546f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
547f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
548f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
549f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
550f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
551f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
552f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
553f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                 MachO
555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
55711e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
55811e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris LattnergetMachOSection(const char *Name, bool isDirective, SectionKind K) {
55911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner  // FOR NOW, Just forward.
56011e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner  return getOrCreateSection(Name, isDirective, K);
56111e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner}
56211e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner
56311e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner
56411e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner
565f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
566f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                               const TargetMachine &TM) {
567a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
568968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  TextSection = getOrCreateSection("\t.text", true,
5692798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getText());
570968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  DataSection = getOrCreateSection("\t.data", true,
5712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getDataRel());
572f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
573824583844a8f334dd261894a3fac7ad476531667Chris Lattner  CStringSection = getOrCreateSection("\t.cstring", true,
5743b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner                               SectionKind::getMergeable1ByteCString());
575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  FourByteConstantSection = getOrCreateSection("\t.literal4\n", true,
5762798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst4());
577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  EightByteConstantSection = getOrCreateSection("\t.literal8\n", true,
5782798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getMergeableConst8());
5794bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner
5804bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
5814bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // to using it in -static mode.
5824bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (TM.getRelocationModel() != Reloc::Static &&
5834bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner      TM.getTargetData()->getPointerSize() == 32)
5844bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    SixteenByteConstantSection =
585968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner      getOrCreateSection("\t.literal16\n", true,
5862798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                         SectionKind::getMergeableConst16());
5874bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  else
5884bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    SixteenByteConstantSection = 0;
589f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
590968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  ReadOnlySection = getOrCreateSection("\t.const", true,
5912798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                       SectionKind::getReadOnly());
592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
593f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextCoalSection =
594f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions",
5952798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                     false, SectionKind::getText());
596f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced",
597968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                            false,
5982798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                           SectionKind::getText());
599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced",
600968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                            false,
6012798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                          SectionKind::getText());
602f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstDataSection = getOrCreateSection("\t.const_data", true,
6032798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                SectionKind::getReadOnlyWithRel());
604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced",
605968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner                                       false,
6062798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                       SectionKind::getDataRel());
60780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
60880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  if (TM.getRelocationModel() == Reloc::Static) {
60980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticCtorSection =
61080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".constructor", true, SectionKind::getDataRel());
61180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticDtorSection =
61280ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".destructor", true, SectionKind::getDataRel());
61380ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  } else {
61480ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticCtorSection =
61580ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".mod_init_func", true, SectionKind::getDataRel());
61680ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    StaticDtorSection =
61780ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner      getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel());
61880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  }
61980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner
62018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Exception Handling.
621d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner  LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false,
622d5bbb07ec806e6fa1e804afd7073987fdacc83e4Chris Lattner                                   SectionKind::getDataRel());
62335039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner  EHFrameSection =
62435039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner    getOrCreateSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms"
62535039ac24163e99cfab161620a9fb41f944a63d5Chris Lattner                       "+live_support", false, SectionKind::getReadOnly());
62618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
62718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug Information.
62818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // FIXME: Don't use 'directive' syntax: need flags for debug/regular??
62918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // FIXME: Need __DWARF segment.
63018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection =
63118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_abbrev,regular,debug", true,
63218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
63318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection =
63418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_info,regular,debug", true,
63518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
63618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection =
63718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_line,regular,debug", true,
63818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
63918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection =
64018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_frame,regular,debug", true,
64118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
64218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection =
64318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_pubnames,regular,debug", true,
64418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
64518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection =
64618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_pubtypes,regular,debug", true,
64718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
64818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection =
64918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_str,regular,debug", true,
65018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
65118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection =
65218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_loc,regular,debug", true,
65318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
65418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection =
65518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_aranges,regular,debug", true,
65618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
65718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection =
65818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_ranges,regular,debug", true,
65918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
66018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection =
66118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_macinfo,regular,debug", true,
66218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
66318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfDebugInlineSection =
66418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection(".section __DWARF,__debug_inlined,regular,debug", true,
66518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       SectionKind::getMetadata());
666f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
667f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
668a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileMachO::
669f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
670e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
671f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
672f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
673f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
67427602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
675f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
676f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is weak/linkonce, put this in a coalescable section, either in text
677f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // or data depending on if it is writable.
67827602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
679f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isReadOnly())
680f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return ConstTextCoalSection;
681f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return DataCoalSection;
682f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
683f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
684f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Alignment check should be handled by section classifier.
6853b24c0172069a2546cd095e4b91f8b88c1ea0722Chris Lattner  if (Kind.isMergeable1ByteCString()) {
686f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Constant *C = cast<GlobalVariable>(GV)->getInitializer();
687f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
688f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const TargetData &TD = *TM.getTargetData();
689f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    unsigned Size = TD.getTypeAllocSize(Ty);
690f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Size) {
691f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV));
692f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (Align <= 32)
693824583844a8f334dd261894a3fac7ad476531667Chris Lattner        return CStringSection;
694f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
695f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
696f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
697f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
698f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
699f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isMergeableConst()) {
700f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst4())
701f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return FourByteConstantSection;
702f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst8())
703f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return EightByteConstantSection;
704f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
705f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SixteenByteConstantSection;
706f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
707f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
708f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
709f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: ROData -> const in -static mode that is relocatable but they happen
710f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // by the static linker.  Why not mergeable?
711f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnly())
712f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
713f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
714f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is marked const, put it into a const section.  But if the dynamic
715f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker needs to write to it, put it in the data segment.
716f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isReadOnlyWithRel())
717f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
718f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
719f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, just drop the variable in the normal data section.
720f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
721f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
722f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
723a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *
72483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris LattnerTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
725f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this constant requires a relocation, we have to put it in the data
726f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // segment, not in the text segment.
727f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())
728f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
729f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
730f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
731f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return FourByteConstantSection;
732f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
733f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return EightByteConstantSection;
7344bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
735f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SixteenByteConstantSection;
736f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ReadOnlySection;  // .const
737f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
738f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
73926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
74026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner/// not to emit the UsedDirective for some symbols in llvm.used.
74126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner// FIXME: REMOVE this (rdar://7071300)
74226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattnerbool TargetLoweringObjectFileMachO::
74326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris LattnershouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
74426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// On Darwin, internally linked data beginning with "L" or "l" does not have
74526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  /// the directive emitted (this occurs in ObjC metadata).
74626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (!GV) return false;
74726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
74826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
74926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
75026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // FIXME: ObjC metadata is currently emitted as internal symbols that have
75126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
75226630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    // this horrible hack can go away.
75326630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    const std::string &Name = Mang->getMangledName(GV);
75426630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner    if (Name[0] == 'L' || Name[0] == 'l')
75526630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner      return false;
75626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  }
75726630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
75826630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner  return true;
75926630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner}
76026630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
76126630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner
762f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
763f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  COFF
764f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
765f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
76611e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
76711e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris LattnergetCOFFSection(const char *Name, bool isDirective, SectionKind K) {
76811e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner  return getOrCreateSection(Name, isDirective, K);
76911e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner}
77011e9657eeb76dff6baaab1cbac0b1fb7e1abb439Chris Lattner
771f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
772f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                              const TargetMachine &TM) {
773a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner  TargetLoweringObjectFile::Initialize(Ctx, TM);
774968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  TextSection = getOrCreateSection("\t.text", true,
7752798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getText());
776968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner  DataSection = getOrCreateSection("\t.data", true,
7772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner                                   SectionKind::getDataRel());
77880ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticCtorSection =
77980ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".ctors", false, SectionKind::getDataRel());
78080ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner  StaticDtorSection =
78180ec2792b2b271eca55743a3cc4c8bca214fa705Chris Lattner    getOrCreateSection(".dtors", false, SectionKind::getDataRel());
78218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
78318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner
78418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // Debug info.
78518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  // FIXME: Don't use 'directive' mode here.
78618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfAbbrevSection =
78718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_abbrev,\"dr\"",
78818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
78918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfInfoSection =
79018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_info,\"dr\"",
79118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
79218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLineSection =
79318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_line,\"dr\"",
79418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
79518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfFrameSection =
79618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_frame,\"dr\"",
79718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
79818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubNamesSection =
79918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_pubnames,\"dr\"",
80018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
80118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfPubTypesSection =
80218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_pubtypes,\"dr\"",
80318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
80418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfStrSection =
80518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_str,\"dr\"",
80618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
80718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfLocSection =
80818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_loc,\"dr\"",
80918a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
81018a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfARangesSection =
81118a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_aranges,\"dr\"",
81218a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
81318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfRangesSection =
81418a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_ranges,\"dr\"",
81518a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
81618a4c16726db2b8874c7b84d04650dda80746074Chris Lattner  DwarfMacroInfoSection =
81718a4c16726db2b8874c7b84d04650dda80746074Chris Lattner    getOrCreateSection("\t.section\t.debug_macinfo,\"dr\"",
81818a4c16726db2b8874c7b84d04650dda80746074Chris Lattner                       true, SectionKind::getMetadata());
819f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
820f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
821f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileCOFF::
822f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
823f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Inefficient.
824f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  std::string Res = ",\"";
825f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
826f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Res += 'x';
827f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
828f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Res += 'w';
829f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Res += "\"";
830f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
831f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.append(Res.begin(), Res.end());
832f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
833f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
834f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
835f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
836f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".text$linkonce";
837f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
838f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".data$linkonce";
839f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".rdata$linkonce";
840f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
841f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
842f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
843a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattnerconst MCSection *TargetLoweringObjectFileCOFF::
844f9650c061ee89ac55740555530ca5c2842c28738Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
845e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
846f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
847f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
848f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
849f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
85027602b82c2a12b9f99c1f7fcbfb4be5ba97dbd7dChris Lattner  if (GV->isWeakForLinker()) {
851f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
852968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner    std::string Name = Mang->makeNameProper(GV->getNameStr());
853f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner    return getOrCreateSection((Prefix+Name).c_str(), false, Kind);
854f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
855f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
856f9650c061ee89ac55740555530ca5c2842c28738Chris Lattner  if (Kind.isText())
857f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
858f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
859f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
860f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
861f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
862