TargetLoweringObjectFileImpl.cpp revision eb40a0fd98c44ecc6360e7fab33cf9e9911bed4f
1362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
2362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
3362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                     The LLVM Compiler Infrastructure
4362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
5362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
6362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// License. See LICENSE.TXT for details.
7362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
8362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
9362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
10362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// This file implements classes used to handle lowerings specific to common
11362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// object file formats.
12362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//
13362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
14362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
15362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
16362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Constants.h"
17362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/DerivedTypes.h"
18362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Function.h"
19362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/GlobalVariable.h"
20362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/CodeGen/MachineModuleInfoImpls.h"
21362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCContext.h"
22362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCExpr.h"
23362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSectionMachO.h"
24362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSectionELF.h"
25eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner#include "llvm/MC/MCSectionCOFF.h"
26362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSymbol.h"
27362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/Mangler.h"
28362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetData.h"
29362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetMachine.h"
30362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetOptions.h"
31362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/Dwarf.h"
32362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h"
33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h"
34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/SmallString.h"
35362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/StringExtras.h"
36362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm;
37293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf;
38362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
39362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  ELF
41362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
43362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                             const TargetMachine &TM) {
45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
47362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  BSSSection =
48287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".bss", MCSectionELF::SHT_NOBITS,
49287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC,
50287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getBSS());
51362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
52362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection =
53287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".text", MCSectionELF::SHT_PROGBITS,
54287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_EXECINSTR |
55287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC,
56287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getText());
57362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
58362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection =
59287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".data", MCSectionELF::SHT_PROGBITS,
60287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC,
61287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
62362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
63362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ReadOnlySection =
64287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".rodata", MCSectionELF::SHT_PROGBITS,
65287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC,
66287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnly());
67362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
68362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TLSDataSection =
69287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".tdata", MCSectionELF::SHT_PROGBITS,
70287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
71287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE,
72287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getThreadData());
73362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
74362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TLSBSSSection =
75287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".tbss", MCSectionELF::SHT_NOBITS,
76287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
77287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE,
78287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getThreadBSS());
79362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
80362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelSection =
81287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS,
82287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
83287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
84362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
85362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelLocalSection =
86287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS,
87287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
88287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRelLocal());
89362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
90362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelROSection =
91287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS,
92287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
93287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnlyWithRel());
94362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
95362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelROLocalSection =
96287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS,
97287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
98287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnlyWithRelLocal());
99362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
100362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst4Section =
101287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS,
102287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
103287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMergeableConst4());
104362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
105362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst8Section =
106287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS,
107287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
108287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMergeableConst8());
109362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
110362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst16Section =
111287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS,
112287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
113287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMergeableConst16());
114362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
115362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticCtorSection =
116287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".ctors", MCSectionELF::SHT_PROGBITS,
117287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
118287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
119362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
120362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticDtorSection =
121287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".dtors", MCSectionELF::SHT_PROGBITS,
122287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
123287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
124362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
125362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Exception Handling Sections.
126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // it contains relocatable pointers.  In PIC mode, this is probably a big
129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // adjusted or this should be a data section.
131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection =
132287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS,
133287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC,
134287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnly());
135362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
136287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS,
137287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
138287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
139362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
140362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug Info Sections.
141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
142287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0,
143287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
144362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
145287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0,
146287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
147362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
148287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0,
149287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
150362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
151287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0,
152287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
153362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
154287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0,
155287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
156362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
157287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0,
158287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
159362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
160287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0,
161287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
162362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
163287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0,
164287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
165362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
166287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0,
167287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
168362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
169287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0,
170287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
171362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
172287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    getContext().getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0,
173287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
174362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
175362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
176362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind
178362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) {
179362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name.empty() || Name[0] != '.') return K;
180362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Some lame default implementation based on some magic section names.
182362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".bss" ||
183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".bss.") ||
184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.b.") ||
185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.b.") ||
186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name == ".sbss" ||
187362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".sbss.") ||
188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.sb.") ||
189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.sb."))
190362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getBSS();
191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tdata" ||
193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tdata.") ||
194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.td.") ||
195362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.td."))
196362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadData();
197362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
198362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tbss" ||
199362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tbss.") ||
200362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.tb.") ||
201362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.tb."))
202362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadBSS();
203362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
204362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return K;
205362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
206362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
207362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
208362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
209362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".init_array")
211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_INIT_ARRAY;
212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
213362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".fini_array")
214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_FINI_ARRAY;
215362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
216362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".preinit_array")
217362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_PREINIT_ARRAY;
218362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
219362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isBSS() || K.isThreadBSS())
220362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_NOBITS;
221362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
222362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return MCSectionELF::SHT_PROGBITS;
223362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
224362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
226362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned
227362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) {
228362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned Flags = 0;
229362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
230362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!K.isMetadata())
231362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_ALLOC;
232362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
233362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isText())
234362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_EXECINSTR;
235362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
236362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isWriteable())
237362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_WRITE;
238362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
239362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isThreadLocal())
240362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_TLS;
241362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
242362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // K.isMergeableConst() is left out to honour PR4650
243362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString() || K.isMergeableConst4() ||
244362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      K.isMergeableConst8() || K.isMergeableConst16())
245362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_MERGE;
246362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
247362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString())
248362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_STRINGS;
249362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
250362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Flags;
251362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
252362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
253362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
254362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
255362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
257362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef SectionName = GV->getSection();
258362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
259362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Infer section flags from the section name if we can.
260362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Kind = getELFKindForNamedSection(SectionName, Kind);
261362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
262287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner  return getContext().getELFSection(SectionName,
263287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                    getELFSectionType(SectionName, Kind),
264287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                    getELFSectionFlags(Kind), Kind, true);
265362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
266362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
267362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
268362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())                 return ".gnu.linkonce.t.";
269362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
270362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
271362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
272362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
273362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
274362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
275362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
276362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
277362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ".gnu.linkonce.d.rel.ro.";
281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
28343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// getSectionPrefixForGlobal - Return the section prefix name used by options
28443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// FunctionsSections and DataSections.
28543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattnerstatic const char *getSectionPrefixForGlobal(SectionKind Kind) {
28643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isText())                 return ".text.";
28743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isReadOnly())             return ".rodata.";
28843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
28943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isThreadData())           return ".tdata.";
29043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isThreadBSS())            return ".tbss.";
29143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
29243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataNoRel())            return ".data.";
29343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataRelLocal())         return ".data.rel.local.";
29443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataRel())              return ".data.rel.";
29543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
29643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
29743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
29843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  return ".data.rel.ro.";
29943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner}
30043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
30143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
302362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
303362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
304362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
30543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  // If we have -ffunction-section or -fdata-section then we should emit the
30643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  // global value to a uniqued section specifically for it.
30743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  bool EmitUniquedSection;
30843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isText())
30943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    EmitUniquedSection = TM.getFunctionSections();
31043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  else
31143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    EmitUniquedSection = TM.getDataSections();
312362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
313362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
31543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if ((GV->isWeakForLinker() || EmitUniquedSection) &&
31643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      !Kind.isCommon() && !Kind.isBSS()) {
31743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    const char *Prefix;
31843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    if (GV->isWeakForLinker())
31943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      Prefix = getSectionPrefixForUniqueGlobal(Kind);
32043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    else {
32143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      assert(EmitUniquedSection);
32243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      Prefix = getSectionPrefixForGlobal(Kind);
32343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    }
32443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
3254c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
3264c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MCSymbol *Sym = Mang->getSymbol(GV);
3274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    Name.append(Sym->getName().begin(), Sym->getName().end());
328287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    return getContext().getELFSection(Name.str(),
329287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      getELFSectionType(Name.str(), Kind),
330287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      getELFSectionFlags(Kind), Kind);
331362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
332362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText()) return TextSection;
334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeable1ByteCString() ||
336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable2ByteCString() ||
337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable4ByteCString()) {
338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // We also need alignment here.
340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: this is getting the alignment of the character, not the
341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // alignment of the global!
342362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    unsigned Align =
343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *SizeSpec = ".rodata.str1.";
346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeable2ByteCString())
347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str2.";
348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else if (Kind.isMergeable4ByteCString())
349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str4.";
350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else
351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      assert(Kind.isMergeable1ByteCString() && "unknown string width");
352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    std::string Name = SizeSpec + utostr(Align);
355287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    return getContext().getELFSection(Name, MCSectionELF::SHT_PROGBITS,
356287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      MCSectionELF::SHF_ALLOC |
357287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      MCSectionELF::SHF_MERGE |
358287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      MCSectionELF::SHF_STRINGS,
359287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      Kind);
360362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
361362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
362362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
363362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4() && MergeableConst4Section)
364362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst4Section;
365362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8() && MergeableConst8Section)
366362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst8Section;
367362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && MergeableConst16Section)
368362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst16Section;
369362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;  // .const
370362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
371362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
372362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ReadOnlySection;
373362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
374362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return TLSDataSection;
375362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return TLSBSSSection;
376362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
377362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Note: we claim that common symbols are put in BSSSection, but they are
378362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // really emitted with the magic .comm directive, which creates a symbol table
379362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // entry but not a section.
380362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
381362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
382362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return DataSection;
383362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return DataRelLocalSection;
384362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return DataRelSection;
385362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
386362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
387362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
388362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
389362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
390362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
391362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the
392362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it
393362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in.
394362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
395362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const {
396362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4() && MergeableConst4Section)
397362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst4Section;
398362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8() && MergeableConst8Section)
399362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst8Section;
400362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && MergeableConst16Section)
401362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst16Section;
402362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
403362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
404362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
405362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
406362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
407362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
408362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
409362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
410362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF::
4113192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
4123192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MachineModuleInfo *MMI,
4133192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               unsigned Encoding, MCStreamer &Streamer) const {
414362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
415362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Encoding & dwarf::DW_EH_PE_indirect) {
416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
419362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
420362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name += ".DW.stub";
421362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
422362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // Add information about the stub reference to ELFMMI so that the stub
423362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // gets emitted by the asmprinter.
4249b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
4254c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
426cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling    if (StubSym.getPointer() == 0) {
4274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      MCSymbol *Sym = Mang->getSymbol(GV);
4284c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
429362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    }
430362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
431362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
4324c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      getExprForDwarfReference(SSym, Mang, MMI,
4333192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
434362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
435362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
436362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return TargetLoweringObjectFile::
4373192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
438362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
439362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
440362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
441362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                 MachO
442362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
443362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
444362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
445362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                               const TargetMachine &TM) {
44609d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  // _foo.eh symbols are currently always exported so that the linker knows
44709d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  // about them.  This is not necessary on 10.6 and later, but it
44809d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  // doesn't hurt anything.
44909d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  // FIXME: I need to get this from Triple.
45009d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  IsFunctionEHSymbolGlobal = true;
45109d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  IsFunctionEHFrameSymbolPrivate = false;
45209d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  SupportsWeakOmittedEHFrame = false;
45309d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner
454362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
455362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
456362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection // .text
45722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__text",
45822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
45922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getText());
460362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection // .data
46122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__data", 0,
46222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getDataRel());
463362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
464362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  CStringSection // .cstring
46522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__cstring",
46622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_CSTRING_LITERALS,
46722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeable1ByteCString());
468362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  UStringSection
46922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT","__ustring", 0,
47022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeable2ByteCString());
471362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  FourByteConstantSection // .literal4
47222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__literal4",
47322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_4BYTE_LITERALS,
47422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeableConst4());
475362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EightByteConstantSection // .literal8
47622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__literal8",
47722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_8BYTE_LITERALS,
47822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeableConst8());
479362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
480362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
481362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to using it in -static mode.
482362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  SixteenByteConstantSection = 0;
483362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (TM.getRelocationModel() != Reloc::Static &&
484362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      TM.getTargetData()->getPointerSize() == 32)
485362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SixteenByteConstantSection =   // .literal16
48622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      getContext().getMachOSection("__TEXT", "__literal16",
48722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_16BYTE_LITERALS,
48822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeableConst16());
489362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
490362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ReadOnlySection  // .const
49122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__const", 0,
49222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getReadOnly());
493362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
494362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextCoalSection
49522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__textcoal_nt",
49622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED |
49722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
49822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getText());
499362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstTextCoalSection
50022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__const_coal",
50122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED,
50222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getText());
503362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstDataCoalSection
50422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA","__const_coal",
50522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED,
50622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getText());
507362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstDataSection  // .const_data
50822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__const", 0,
50922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getReadOnlyWithRel());
510362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataCoalSection
51122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA","__datacoal_nt",
51222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED,
51322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getDataRel());
514362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataCommonSection
51522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA","__common",
51622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_ZEROFILL,
51722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getBSS());
518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataBSSSection
51922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
52022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getBSS());
521362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
522362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
523362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LazySymbolPointerSection
52422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__la_symbol_ptr",
52522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
52622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMetadata());
527362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  NonLazySymbolPointerSection
52822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
52922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
53022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMetadata());
531362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
532362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (TM.getRelocationModel() == Reloc::Static) {
533362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticCtorSection
53422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__TEXT", "__constructor", 0,
53522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
536362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticDtorSection
53722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__TEXT", "__destructor", 0,
53822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
539362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  } else {
540362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticCtorSection
54122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__DATA", "__mod_init_func",
54222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
54322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
544362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticDtorSection
54522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__DATA", "__mod_term_func",
54622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
54722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
548362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
549362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
550362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Exception Handling.
55122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner  LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
55222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                             SectionKind::getReadOnlyWithRel());
553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
55422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__TEXT", "__eh_frame",
55522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_COALESCED |
55622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_NO_TOC |
55722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
55822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_LIVE_SUPPORT,
55922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getReadOnly());
560362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
561362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug Information.
562362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
56322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_abbrev",
56422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
56522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
566362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
56722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_info",
56822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
56922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
570362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
57122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_line",
57222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
57322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
574362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
57522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_frame",
57622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
57722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
578362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
57922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_pubnames",
58022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
58122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
582362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
58322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_pubtypes",
58422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
58522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
586362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
58722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_str",
58822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
58922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
590362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
59122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_loc",
59222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
59322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
594362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
59522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_aranges",
59622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
59722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
598362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
59922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_ranges",
60022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
60122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
602362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
60322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_macinfo",
60422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
60522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
606362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfDebugInlineSection =
60722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_inlined",
60822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
60922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
610362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
611362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
612362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
613362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
614362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
615362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Parse the section specifier and create it if valid.
616362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef Segment, Section;
617362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned TAA, StubSize;
618362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  std::string ErrorCode =
619362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
620362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                          TAA, StubSize);
621362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!ErrorCode.empty()) {
62275361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    // If invalid, report the error with report_fatal_error.
62375361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("Global variable '" + GV->getNameStr() +
624362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "' has an invalid section specifier '" + GV->getSection()+
625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "': " + ErrorCode + ".");
626362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // Fall back to dropping it into the data section.
627362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataSection;
628362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
630362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Get the section.
631362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionMachO *S =
63222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
634362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Okay, now that we got the section, verify that the TAA & StubSize agree.
635362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If the user declared multiple globals with different section flags, we need
636362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to reject it here.
637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
63875361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    // If invalid, report the error with report_fatal_error.
63975361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("Global variable '" + GV->getNameStr() +
640362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "' section type or attributes does not match previous"
641362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      " section specifier");
642362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return S;
645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
646362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
648362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
651362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
655362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is weak/linkonce, put this in a coalescable section, either in text
656362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // or data depending on if it is writable.
657362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isReadOnly())
659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return ConstTextCoalSection;
660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCoalSection;
661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: Alignment check should be handled by section classifier.
66498f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  if (Kind.isMergeable1ByteCString() &&
66598f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
66698f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner    return CStringSection;
66798f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner
66898f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // Do not put 16-bit arrays in the UString section if they have an
66998f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // externally visible label, this runs into issues with certain linker
67098f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // versions.
67198f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
67298f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
67398f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner    return UStringSection;
674362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
675362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4())
677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return FourByteConstantSection;
678362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8())
679362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return EightByteConstantSection;
680362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
681362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return SixteenByteConstantSection;
682362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
683362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
684362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, if it is readonly, but not something we can specially optimize,
685362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // just drop it in .const.
686362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
687362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
688362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
689362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is marked const, put it into a const section.  But if the dynamic
690362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // linker needs to write to it, put it in the data segment.
691362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRel())
692362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
693362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with strong external linkage in the
695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // DATA, __common section with the .zerofill directive.
696362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSExtern())
697362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCommonSection;
698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
699362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with local linkage in __DATA,__bss directive
700362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // with the .zerofill directive (aka .lcomm).
701362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSLocal())
702362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataBSSSection;
703362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
704362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, just drop the variable in the normal data section.
705362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataSection;
706362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
707362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
708362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *
709362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
710362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this constant requires a relocation, we have to put it in the data
711362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // segment, not in the text segment.
712362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
713362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
714362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
715362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4())
716362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return FourByteConstantSection;
717362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8())
718362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return EightByteConstantSection;
719362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
720362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SixteenByteConstantSection;
721362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ReadOnlySection;  // .const
722362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
723362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// not to emit the UsedDirective for some symbols in llvm.used.
726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// FIXME: REMOVE this (rdar://7071300)
727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovbool TargetLoweringObjectFileMachO::
728362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
729362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  /// On Darwin, internally linked data beginning with "L" or "l" does not have
730362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  /// the directive emitted (this occurs in ObjC metadata).
731362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!GV) return false;
732362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
733362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
734362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
735362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: ObjC metadata is currently emitted as internal symbols that have
736362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
737362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // this horrible hack can go away.
7384c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MCSymbol *Sym = Mang->getSymbol(GV);
7394c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
740362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return false;
741362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
742362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
743362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return true;
744362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
745362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
746362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileMachO::
7473192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
7483192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MachineModuleInfo *MMI, unsigned Encoding,
7493192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MCStreamer &Streamer) const {
750362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // The mach-o version of this method defaults to returning a stub reference.
751362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
752293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  if (Encoding & DW_EH_PE_indirect) {
753293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    MachineModuleInfoMachO &MachOMMI =
754293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      MMI->getObjFileInfo<MachineModuleInfoMachO>();
755293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
756362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
757362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
758362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name += "$non_lazy_ptr";
759293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
760293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // Add information about the stub reference to MachOMMI so that the stub
761293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // gets emitted by the asmprinter.
7629b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
7634c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
764cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling    if (StubSym.getPointer() == 0) {
7654c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      MCSymbol *Sym = Mang->getSymbol(GV);
7664c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
767293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    }
768362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
769362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
7704c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      getExprForDwarfReference(SSym, Mang, MMI,
77142263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner                               Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
772362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
773362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
774362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return TargetLoweringObjectFile::
7753192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
776362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
777362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
778293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
779293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
780293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
781293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
782293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
783293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_pcrel;
784293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
785293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
786293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getFDEEncoding() const {
787293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_pcrel;
788293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
789293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
790293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
791505ad8bed3321bc4b99af8fba4844efe2fe9e67aBill Wendling  return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
792293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
793362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
794362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
795362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  COFF
796362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
797362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
798362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
799362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                              const TargetMachine &TM) {
800362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
801eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  TextSection =
802eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".text",
803eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_CODE |
804eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
805eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
806eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getText());
807eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  DataSection =
808eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".data",
809eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
810eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ |
811eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
812eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
813eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  ReadOnlySection =
814eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".rdata",
815eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
816eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
817eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getReadOnly());
818362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticCtorSection =
819eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".ctors",
820eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
821eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ |
822eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
823eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
824362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticDtorSection =
825eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".dtors",
826eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
827eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ |
828eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
829eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
830362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
831362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
832362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // though it contains relocatable pointers.  In PIC mode, this is probably a
833362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
834362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // adjusted or this should be a data section.
835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection =
836eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".gcc_except_table",
837eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
838eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
839eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getReadOnly());
840362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
841eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".eh_frame",
842eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
843eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ |
844eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_WRITE,
845eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
846362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
847362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug info.
848362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
849eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_abbrev",
850eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
851eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
852eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
853362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
854eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_info",
855eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
856eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
857eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
858362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
859eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_line",
860eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
861eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
862eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
863362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
864eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_frame",
865eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
866eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
867eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
868362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
869eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_pubnames",
870eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
871eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
872eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
873362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
874eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_pubtypes",
875eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
876eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
877eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
878362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
879eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_str",
880eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
881eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
882eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
883362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
884eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_loc",
885eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
886eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
887eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
888362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
889eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_aranges",
890eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
891eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
892eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
893362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
894eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_ranges",
895eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
896eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
897eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
898362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
899eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_macinfo",
900eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE |
901eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_MEM_READ,
902eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
903eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
904eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  DrectveSection =
905eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".drectve",
906eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                MCSectionCOFF::IMAGE_SCN_LNK_INFO,
907eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
908eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner}
909eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
910eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerstatic unsigned
911eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris LattnergetCOFFSectionFlags(SectionKind K) {
912eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  unsigned Flags = 0;
913eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
914eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  if (!K.isMetadata())
915eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |= MCSectionCOFF::IMAGE_SCN_MEM_DISCARDABLE;
916eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isText())
917eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
918eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_MEM_EXECUTE |
919eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_CNT_CODE;
920eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isReadOnly())
921eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
922eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
923eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_MEM_READ;
924eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isWriteable())
925eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
926eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
927eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_MEM_READ |
928eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner      MCSectionCOFF::IMAGE_SCN_MEM_WRITE;
929eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
930eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  return Flags;
931362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
932362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
933362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
934362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
935362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
936eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  return getContext().getCOFFSection(GV->getSection(),
937eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                     getCOFFSectionFlags(Kind),
938eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                     Kind);
939362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
940362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
941362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
942362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
943362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ".text$linkonce";
944362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isWriteable())
945362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ".data$linkonce";
946362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ".rdata$linkonce";
947362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
948362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
949362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
950362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
951362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
952362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
953362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
954362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
955362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
956362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
957362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
958362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
959362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
9604c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MCSymbol *Sym = Mang->getSymbol(GV);
9614c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    Name.append(Sym->getName().begin(), Sym->getName().end());
962eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    return getContext().getCOFFSection(Name.str(),
963eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                       getCOFFSectionFlags(Kind),
964eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                       Kind);
965362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
966362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
967362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
968362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return getTextSection();
969362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
970362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return getDataSection();
971362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
972362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
973