TargetLoweringObjectFile.cpp revision f26e03bc7e30162197641406e37e662a15d80f7e
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"
19b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner#include "llvm/Support/Mangler.h"
20f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetMachine.h"
21f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetData.h"
22f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetOptions.h"
23f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/ADT/StringExtras.h"
24f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerusing namespace llvm;
25f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
26f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
27f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                              Generic Code
28f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
29f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
30f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::TargetLoweringObjectFile() {
31f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = 0;
32f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = 0;
33f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  BSSSection_ = 0;
34f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection = 0;
35f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TLSDataSection = 0;
36f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TLSBSSSection = 0;
37f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  CStringSection_ = 0;
38f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
39f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
40f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::~TargetLoweringObjectFile() {
41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
42f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
43f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isSuitableForBSS(const GlobalVariable *GV) {
44f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GV->getInitializer();
45f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
46f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Must have zero initializer.
47f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!C->isNullValue())
48f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
49f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
50f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Leave constant zeros in readonly constant sections, so they can be shared.
51f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->isConstant())
52f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
53f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global has an explicit section specified, don't put it in BSS.
55f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!GV->getSection().empty())
56f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
57f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
58f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
59f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (NoZerosInBSS)
60f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return false;
61f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
62f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, put it in BSS!
63f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return true;
64f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
65f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
66f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic bool isConstantString(const Constant *C) {
67f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // First check: is we have constant array of i8 terminated with zero
68f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
69f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Check, if initializer is a null-terminated string
70f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (CVA && CVA->isCString())
71f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return true;
72f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
73f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Another possibility: [1 x i8] zeroinitializer
74f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isa<ConstantAggregateZero>(C))
75f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType()))
76f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return (Ty->getElementType() == Type::Int8Ty &&
77f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner              Ty->getNumElements() == 1);
78f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
79f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return false;
80f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
81f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
82f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic SectionKind::Kind SectionKindForGlobal(const GlobalValue *GV,
83f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                              const TargetMachine &TM) {
84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Reloc::Model ReloModel = TM.getRelocationModel();
85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Early exit - functions should be always in text sections.
87f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
88f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar == 0)
89f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::Text;
90f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
91f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
92f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Handle thread-local data first.
93f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isThreadLocal()) {
94f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (isSuitableForBSS(GVar))
95f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SectionKind::ThreadBSS;
96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::ThreadData;
97f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Variable can be easily put to BSS section.
100f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (isSuitableForBSS(GVar))
101f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::BSS;
102f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
103f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Constant *C = GVar->getInitializer();
104f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
105f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If the global is marked constant, we can put it into a mergable section,
106f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // a mergable string section, or general .data if it contains relocations.
107f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GVar->isConstant()) {
108f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the initializer for the global contains something that requires a
109f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // relocation, then we may have to drop this into a wriable data section
110f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // even though it is marked const.
111f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    switch (C->getRelocationInfo()) {
112f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    default: llvm_unreachable("unknown relocation info kind");
113f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::NoRelocation:
114f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // If initializer is a null-terminated string, put it in a "cstring"
115f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // section if the target has it.
116f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (isConstantString(C))
117f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner        return SectionKind::MergeableCString;
118f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
119f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, just drop it into a mergable constant section.  If we have
120f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // a section for this size, use it, otherwise use the arbitrary sized
121f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // mergable section.
122f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
123f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      case 4:  return SectionKind::MergeableConst4;
124f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      case 8:  return SectionKind::MergeableConst8;
125f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      case 16: return SectionKind::MergeableConst16;
126f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      default: return SectionKind::MergeableConst;
127f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      }
128f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
129f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::LocalRelocation:
130f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
131f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
132f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
133f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
134f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
135f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
136f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner        return SectionKind::ReadOnly;
137f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
138f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
139f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel.local section.
140f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SectionKind::ReadOnlyWithRelLocal;
141f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
142f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    case Constant::GlobalRelocations:
143f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // In static relocation model, the linker will resolve all addresses, so
144f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the relocation entries will actually be constants by the time the app
145f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // starts up.  However, we can't put this into a mergable section, because
146f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // the linker doesn't take relocations into consideration when it tries to
147f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // merge entries in the section.
148f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (ReloModel == Reloc::Static)
149f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner        return SectionKind::ReadOnly;
150f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
151f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // Otherwise, the dynamic linker needs to fix it up, put it in the
152f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      // writable data.rel section.
153f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SectionKind::ReadOnlyWithRel;
154f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
155f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
156f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
157f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Okay, this isn't a constant.  If the initializer for the global is going
158f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // to require a runtime relocation by the dynamic linker, put it into a more
159f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // specific section to improve startup time of the app.  This coalesces these
160f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // globals together onto fewer pages, improving the locality of the dynamic
161f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker.
162f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (ReloModel == Reloc::Static)
163f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::DataNoRel;
164f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
165f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  switch (C->getRelocationInfo()) {
166f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  default: llvm_unreachable("unknown relocation info kind");
167f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::NoRelocation:
168f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::DataNoRel;
169f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::LocalRelocation:
170f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::DataRelLocal;
171f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  case Constant::GlobalRelocations:
172f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::DataRel;
173f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
174f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
175f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
176f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// SectionForGlobal - This method computes the appropriate section to emit
177f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// the specified global variable or function definition.  This should not
178f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// be passed external (or available externally) globals.
179f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *TargetLoweringObjectFile::
180e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSectionForGlobal(const GlobalValue *GV, Mangler *Mang,
181e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                 const TargetMachine &TM) const {
182f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
183f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner         "Can only be used for global definitions");
184f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
185f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  SectionKind::Kind GVKind = SectionKindForGlobal(GV, TM);
186f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
187f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  SectionKind Kind = SectionKind::get(GVKind, GV->isWeakForLinker(),
188f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                      GV->hasSection());
189f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
190f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
191f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Select section name.
192f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (GV->hasSection()) {
193f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the target has special section hacks for specifically named globals,
194f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // return them now.
195e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner    if (const Section *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind))
196f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return TS;
197f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
198f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // If the target has magic semantics for certain section names, make sure to
199f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // pick up the flags.  This allows the user to write things with attribute
200f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // section and still get the appropriate section flags printed.
201f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    GVKind = getKindForNamedSection(GV->getSection().c_str(), GVKind);
202f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
203f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getOrCreateSection(GV->getSection().c_str(), false, GVKind);
204f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
205f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
206f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
207f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Use default section depending on the 'type' of global
208e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner  return SelectSectionForGlobal(GV, Kind, Mang, TM);
209f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
210f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
211f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner// Lame default implementation. Calculate the section name for global.
212f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section*
213f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
214f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 SectionKind Kind,
215e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                                                 Mangler *Mang,
216f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                 const TargetMachine &TM) const{
217f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
218f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
219f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
220f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
221f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
222f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isBSS() && BSSSection_ != 0)
223f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return BSSSection_;
224f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
225f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
226f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
227f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
228f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
229f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
230f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
231f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// getSectionForMergableConstant - Given a mergable constant with the
232f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
233f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
234f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *
235f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFile::
236f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionForMergeableConstant(SectionKind Kind) const {
237f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
238f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
239f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
240f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
241f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
242f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
243f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
244f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *TargetLoweringObjectFile::
245f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetOrCreateSection(const char *Name, bool isDirective,
246f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                   SectionKind::Kind Kind) const {
247f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Section &S = Sections[Name];
248f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
249f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // This is newly-created section, set it up properly.
250f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (S.Name.empty()) {
251f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    S.Kind = SectionKind::get(Kind, false /*weak*/, !isDirective);
252f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    S.Name = Name;
253f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
254f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
255f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return &S;
256f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
257f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
258f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
259f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
260f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
261f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  ELF
262f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
263f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
264f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
265f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                             const TargetMachine &TM) {
266f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!HasCrazyBSS)
267f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    BSSSection_ = getOrCreateSection("\t.bss", true, SectionKind::BSS);
268f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
269f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // PPC/Linux doesn't support the .bss directive, it needs .section .bss.
270f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // FIXME: Does .section .bss work everywhere??
271f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    BSSSection_ = getOrCreateSection("\t.bss", false, SectionKind::BSS);
272f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
273f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
274f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = getOrCreateSection("\t.text", true, SectionKind::Text);
275f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel);
276f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection =
277f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    getOrCreateSection("\t.rodata", false, SectionKind::ReadOnly);
278f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TLSDataSection =
279f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    getOrCreateSection("\t.tdata", false, SectionKind::ThreadData);
280f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  CStringSection_ = getOrCreateSection("\t.rodata.str", true,
281f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                       SectionKind::MergeableCString);
282f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
283f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TLSBSSSection = getOrCreateSection("\t.tbss", false, SectionKind::ThreadBSS);
284f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
285f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelSection = getOrCreateSection("\t.data.rel", false,
286f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                      SectionKind::DataRel);
287f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false,
288f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                           SectionKind::DataRelLocal);
289f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelROSection = getOrCreateSection("\t.data.rel.ro", false,
290f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                        SectionKind::ReadOnlyWithRel);
291f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataRelROLocalSection =
292f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    getOrCreateSection("\t.data.rel.ro.local", false,
293f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                       SectionKind::ReadOnlyWithRelLocal);
294f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
295f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst4Section = getOrCreateSection(".rodata.cst4", false,
296f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                              SectionKind::MergeableConst4);
297f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst8Section = getOrCreateSection(".rodata.cst8", false,
298f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                              SectionKind::MergeableConst8);
299f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  MergeableConst16Section = getOrCreateSection(".rodata.cst16", false,
300f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                               SectionKind::MergeableConst16);
301f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
302f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
303f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
304f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerSectionKind::Kind TargetLoweringObjectFileELF::
305f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetKindForNamedSection(const char *Name, SectionKind::Kind K) const {
306f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Name[0] != '.') return K;
307f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
308f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Some lame default implementation based on some magic section names.
309f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
310f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.b.", 17) == 0 ||
311f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 ||
312f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.sb.", 18) == 0)
313f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::BSS;
314f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
315f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tdata") == 0 ||
316f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tdata.", 7) == 0 ||
317f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
318f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
319f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::ThreadData;
320f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
321f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (strcmp(Name, ".tbss") == 0 ||
322f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".tbss.", 6) == 0 ||
323f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
324f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
325f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SectionKind::ThreadBSS;
326f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
327f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return K;
328f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
329f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
330f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileELF::
331f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
332f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back(',');
333f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back('"');
334f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
335f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (!Kind.isMetadata())
336f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('a');
337f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
338f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('x');
339f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
340f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('w');
34182987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner  if (Kind.isMergeableCString() ||
34282987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst4() ||
34382987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst8() ||
34482987bfe9b6ae85a8836c9f2d2e9f0ef9866edb1Chris Lattner      Kind.isMergeableConst16())
345f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('M');
346f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableCString())
347f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('S');
348f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadLocal())
349f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('T');
350f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
351f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back('"');
352f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.push_back(',');
353f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
354f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If comment string is '@', e.g. as on ARM - use '%' instead
355f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (AtIsCommentChar)
356f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('%');
357f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
358f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('@');
359f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
360f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  const char *KindStr;
361bf15e433b9ac6692e76aff0465cd93bb87f68989Chris Lattner  if (Kind.isBSS() || Kind.isThreadBSS())
362f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    KindStr = "nobits";
363f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  else
364f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    KindStr = "progbits";
365f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
366f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.append(KindStr, KindStr+strlen(KindStr));
367f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
368f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableCString()) {
369f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // TODO: Eventually handle multiple byte character strings.  For now, all
370f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // mergable C strings are single byte.
371f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
372f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('1');
373f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst4()) {
374f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
375f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('4');
376f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst8()) {
377f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
378f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('8');
379f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  } else if (Kind.isMergeableConst16()) {
380f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back(',');
381f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('1');
382f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Str.push_back('6');
383f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
384f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
385f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
386f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
387f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
388f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())                 return ".gnu.linkonce.t.";
389f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
390f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
391f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
392f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
393f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
394f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isBSS())                  return ".gnu.linkonce.b.";
395f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
396f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
397f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
398f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
399f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
400f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
401f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".gnu.linkonce.d.rel.ro.";
402f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
403f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
404f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *TargetLoweringObjectFileELF::
405f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
406e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
407f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
408f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
409f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
410f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWeak()) {
411f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
412b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner    std::string Name = Mang->makeNameProper(GV->getNameStr());
413b8f396bdbb06b585b480ada31ec8c2ab35916a55Chris Lattner    return getOrCreateSection((Prefix+Name).c_str(), false, Kind.getKind());
414f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
415f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
416f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText()) return TextSection;
417e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner
418f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableCString()) {
419067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner   assert(CStringSection_ && "Should have string section prefix");
420f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
421067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // We also need alignment here.
422067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // FIXME: this is getting the alignment of the character, not the
423067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    // alignment of the global!
424067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    unsigned Align =
425067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
426f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
427a679207d5852760c9809157eb67d2609cc3c268aChris Lattner    std::string Name = CStringSection_->getName() + "1." + utostr(Align);
428067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner    return getOrCreateSection(Name.c_str(), false,
429067fe1ae5488764afb8d8fdafba65899dc221887Chris Lattner                              SectionKind::MergeableCString);
430f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
431f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
432f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst()) {
433f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Kind.isMergeableConst4())
434f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst4Section;
435f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Kind.isMergeableConst8())
436f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst8Section;
437f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Kind.isMergeableConst16())
438f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return MergeableConst16Section;
439f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
440f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
441f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
442f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())             return ReadOnlySection;
443f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
444f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadData())           return TLSDataSection;
445f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isThreadBSS())            return TLSBSSSection;
446f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
447f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isBSS())                  return BSSSection_;
448f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
449f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataNoRel())            return DataSection;
450f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRelLocal())         return DataRelLocalSection;
451f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())              return DataRelSection;
452f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
453f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
454f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
455f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
456f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
457f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
458f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// getSectionForMergeableConstant - Given a mergeable constant with the
459f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// specified size and relocation information, return a section that it
460f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner/// should be placed in.
461f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *TargetLoweringObjectFileELF::
462f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionForMergeableConstant(SectionKind Kind) const {
463f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
464f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst4Section;
465f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
466f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst8Section;
467f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst16())
468f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return MergeableConst16Section;
469f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())
470f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
471f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
472f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
473f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
474f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataRelROSection;
475f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
476f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
477f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
478f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                 MachO
479f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
480f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
481f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
482f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                               const TargetMachine &TM) {
483f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextSection = getOrCreateSection("\t.text", true, SectionKind::Text);
484f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel);
485f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
486f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  CStringSection_ = getOrCreateSection("\t.cstring", true,
487f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                       SectionKind::MergeableCString);
488f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  FourByteConstantSection = getOrCreateSection("\t.literal4\n", true,
489f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                               SectionKind::MergeableConst4);
490f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  EightByteConstantSection = getOrCreateSection("\t.literal8\n", true,
491f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                                SectionKind::MergeableConst8);
4924bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner
4934bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
4944bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  // to using it in -static mode.
4954bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (TM.getRelocationModel() != Reloc::Static &&
4964bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner      TM.getTargetData()->getPointerSize() == 32)
4974bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    SixteenByteConstantSection =
4984bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner      getOrCreateSection("\t.literal16\n", true, SectionKind::MergeableConst16);
4994bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  else
5004bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    SixteenByteConstantSection = 0;
501f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
502f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ReadOnlySection = getOrCreateSection("\t.const", true, SectionKind::ReadOnly);
503f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
504f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  TextCoalSection =
505f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions",
506f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                     false, SectionKind::Text);
507f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced",
508f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                            false, SectionKind::Text);
509f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced",
510f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                            false, SectionKind::Text);
511f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  ConstDataSection = getOrCreateSection("\t.const_data", true,
512f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                        SectionKind::ReadOnlyWithRel);
513f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced",
514f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner                                       false, SectionKind::DataRel);
515f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
516f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
517e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattnerconst Section *TargetLoweringObjectFileMachO::
518e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
519e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
520f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
521f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
522f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
523f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return Kind.isWeak() ? TextCoalSection : TextSection;
524f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
525f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is weak/linkonce, put this in a coalescable section, either in text
526f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // or data depending on if it is writable.
527f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWeak()) {
528f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Kind.isReadOnly())
529f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return ConstTextCoalSection;
530f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return DataCoalSection;
531f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
532f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
533f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Alignment check should be handled by section classifier.
534f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableCString()) {
535f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Constant *C = cast<GlobalVariable>(GV)->getInitializer();
536f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
537f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const TargetData &TD = *TM.getTargetData();
538f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    unsigned Size = TD.getTypeAllocSize(Ty);
539f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Size) {
540f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV));
541f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      if (Align <= 32)
542f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner        return CStringSection_;
543f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    }
544f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
545f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
546f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
547f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
548f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst()) {
549f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Kind.isMergeableConst4())
550f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return FourByteConstantSection;
551f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (Kind.isMergeableConst8())
552f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return EightByteConstantSection;
5534bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
554f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return SixteenByteConstantSection;
555f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;  // .const
556f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
557f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
558f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: ROData -> const in -static mode that is relocatable but they happen
559f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // by the static linker.  Why not mergeable?
560f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly())
561f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
562f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
563f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this is marked const, put it into a const section.  But if the dynamic
564f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // linker needs to write to it, put it in the data segment.
565f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnlyWithRel())
566f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
567f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
568f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // Otherwise, just drop the variable in the normal data section.
569f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return DataSection;
570f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
571f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
572f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *
573f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerTargetLoweringObjectFileMachO::
574f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionForMergeableConstant(SectionKind Kind) const {
575f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this constant requires a relocation, we have to put it in the data
576f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // segment, not in the text segment.
577f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isDataRel())
578f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ConstDataSection;
579f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
580f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst4())
581f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return FourByteConstantSection;
582f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isMergeableConst8())
583f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return EightByteConstantSection;
5844bb253c60f895131371aa2ad1bfa5a2bea213f78Chris Lattner  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
585f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return SixteenByteConstantSection;
586f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ReadOnlySection;  // .const
587f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
588f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
589f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
590f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//                                  COFF
591f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner//===----------------------------------------------------------------------===//
592f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
593f26e03bc7e30162197641406e37e662a15d80f7eChris Lattnervoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
594f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner                                              const TargetMachine &TM) {
59583d1c3db39dcde56b706b15d6684bc60fda4d276Chris Lattner  TextSection = getOrCreateSection("\t.text", true, SectionKind::Text);
59683d1c3db39dcde56b706b15d6684bc60fda4d276Chris Lattner  DataSection = getOrCreateSection("\t.data", true, SectionKind::DataRel);
597f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
598f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
599f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnervoid TargetLoweringObjectFileCOFF::
600f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnergetSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
601f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // FIXME: Inefficient.
602f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  std::string Res = ",\"";
603f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
604f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Res += 'x';
605f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
606f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    Res += 'w';
607f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Res += "\"";
608f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
609f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  Str.append(Res.begin(), Res.end());
610f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
611f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
612f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
613f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
614f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".text$linkonce";
615f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWriteable())
616f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ".data$linkonce";
617f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return ".rdata$linkonce";
618f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
619f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
620f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
621f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattnerconst Section *TargetLoweringObjectFileCOFF::
622f0144127b98425d214e59e4a1a4b342b78e3642bChris LattnerSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
623e53a600f065075731d0aeb9dc8f4f3d75f5a05f8Chris Lattner                       Mangler *Mang, const TargetMachine &TM) const {
624f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
625f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
626f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // If this global is linkonce/weak and the target handles this by emitting it
627f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  // into a 'uniqued' section name, create and return the section now.
628f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isWeak()) {
629f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
630f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    // FIXME: Use mangler interface (PR4584).
631f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    std::string Name = Prefix+GV->getNameStr();
632f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getOrCreateSection(Name.c_str(), false, Kind.getKind());
633f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  }
634f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
635f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isText())
636f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return getTextSection();
637f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
638f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isBSS())
639f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    if (const Section *S = BSSSection_)
640f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner      return S;
641f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
642f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  if (Kind.isReadOnly() && ReadOnlySection != 0)
643f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner    return ReadOnlySection;
644f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
645f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner  return getDataSection();
646f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner}
647f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner
648