TargetLoweringObjectFileImpl.cpp revision c85dca66e68c9fa6ffa8471c64113b12d8d94fb1
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"
32c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h"
33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h"
34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h"
35362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/SmallString.h"
36362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/StringExtras.h"
378048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner#include "llvm/ADT/Triple.h"
38362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm;
39293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf;
40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
41362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  ELF
43362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                             const TargetMachine &TM) {
47362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
48362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
49362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  BSSSection =
50c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".bss", ELF::SHT_NOBITS,
51287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC,
52287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getBSS());
53362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
54362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection =
55c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".text", ELF::SHT_PROGBITS,
56287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_EXECINSTR |
57287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC,
58287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getText());
59362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
60362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection =
61c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".data", ELF::SHT_PROGBITS,
62287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE |MCSectionELF::SHF_ALLOC,
63287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
64362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
65362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ReadOnlySection =
66c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".rodata", ELF::SHT_PROGBITS,
67287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC,
68287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnly());
69362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
70362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TLSDataSection =
71c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".tdata", ELF::SHT_PROGBITS,
72287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
73287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE,
74287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getThreadData());
75362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
76362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TLSBSSSection =
77c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".tbss", ELF::SHT_NOBITS,
78287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
79287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_WRITE,
80287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getThreadBSS());
81362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
82362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelSection =
83c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS,
84287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
85287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
86362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
87362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelLocalSection =
88c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
89287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
90287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRelLocal());
91362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
92362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelROSection =
93c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
94287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
95287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnlyWithRel());
96362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
97362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelROLocalSection =
98c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
99287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
100287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnlyWithRelLocal());
101362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
102362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst4Section =
103c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
104287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
105287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMergeableConst4());
106362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
107362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst8Section =
108c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
109287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
110287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMergeableConst8());
111362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
112362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst16Section =
113c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
114287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_MERGE,
115287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMergeableConst16());
116362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
117362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticCtorSection =
118c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".ctors", ELF::SHT_PROGBITS,
119287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
120287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
121362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
122362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticDtorSection =
123c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".dtors", ELF::SHT_PROGBITS,
124287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC |MCSectionELF::SHF_WRITE,
125287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Exception Handling Sections.
128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // it contains relocatable pointers.  In PIC mode, this is probably a big
131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
132362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // adjusted or this should be a data section.
133362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection =
134c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
135287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               MCSectionELF::SHF_ALLOC,
136287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getReadOnly());
137362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
138c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS,
13989b9372605db2ce3b0085c84089e389f7bc1fbddRafael Espindola                               MCSectionELF::SHF_ALLOC,
140287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getDataRel());
141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
142362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug Info Sections.
143362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
144c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
145287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
146362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
147c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
148287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
149362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
150c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
151287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
152362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
153c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
154287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
155362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
156c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
157287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
158362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
159c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
160287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
161362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
162c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
163287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
164362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
165c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
166287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
167362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
168c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
169287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
170362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
171c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
172287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
173362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
174c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
175287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                               SectionKind::getMetadata());
176362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
178362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
179362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind
180362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) {
181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name.empty() || Name[0] != '.') return K;
182362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Some lame default implementation based on some magic section names.
184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".bss" ||
185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".bss.") ||
186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.b.") ||
187362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.b.") ||
188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name == ".sbss" ||
189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".sbss.") ||
190362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.sb.") ||
191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.sb."))
192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getBSS();
193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tdata" ||
195362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tdata.") ||
196362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.td.") ||
197362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.td."))
198362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadData();
199362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
200362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tbss" ||
201362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tbss.") ||
202362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.tb.") ||
203362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.tb."))
204362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadBSS();
205362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
206362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return K;
207362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
208362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
209362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".init_array")
213c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_INIT_ARRAY;
214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
215362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".fini_array")
216c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_FINI_ARRAY;
217362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
218362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".preinit_array")
219c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_PREINIT_ARRAY;
220362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
221362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isBSS() || K.isThreadBSS())
222c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return ELF::SHT_NOBITS;
223362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
224c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  return ELF::SHT_PROGBITS;
225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
226362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
227362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
228362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned
229362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) {
230362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned Flags = 0;
231362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
232362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!K.isMetadata())
233362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_ALLOC;
234362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
235362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isText())
236362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_EXECINSTR;
237362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
238362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isWriteable())
239362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_WRITE;
240362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
241362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isThreadLocal())
242362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_TLS;
243362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
244362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // K.isMergeableConst() is left out to honour PR4650
245362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString() || K.isMergeableConst4() ||
246362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      K.isMergeableConst8() || K.isMergeableConst16())
247362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_MERGE;
248362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
249362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString())
250362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_STRINGS;
251362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
252362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Flags;
253362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
254362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
255362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
257362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
258362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
259362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef SectionName = GV->getSection();
260362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
261362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Infer section flags from the section name if we can.
262362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Kind = getELFKindForNamedSection(SectionName, Kind);
263362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
264287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner  return getContext().getELFSection(SectionName,
265287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                    getELFSectionType(SectionName, Kind),
26634be396a12b00a95a1353c356d64868798ea3098Rafael Espindola                                    getELFSectionFlags(Kind), Kind);
267362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
268362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
269362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
270362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())                 return ".gnu.linkonce.t.";
271362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
272362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
273362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
274362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
275362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
276362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
277362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ".gnu.linkonce.d.rel.ro.";
283362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
284362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
28543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// getSectionPrefixForGlobal - Return the section prefix name used by options
28643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner/// FunctionsSections and DataSections.
28743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattnerstatic const char *getSectionPrefixForGlobal(SectionKind Kind) {
28843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isText())                 return ".text.";
28943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isReadOnly())             return ".rodata.";
29043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
29143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isThreadData())           return ".tdata.";
29243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isThreadBSS())            return ".tbss.";
29343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
29443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataNoRel())            return ".data.";
29543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataRelLocal())         return ".data.rel.local.";
29643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isDataRel())              return ".data.rel.";
29743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
29843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
29943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
30043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  return ".data.rel.ro.";
30143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner}
30243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
30343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
304362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
305362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
306362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
30743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  // If we have -ffunction-section or -fdata-section then we should emit the
30843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  // global value to a uniqued section specifically for it.
30943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  bool EmitUniquedSection;
31043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if (Kind.isText())
31143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    EmitUniquedSection = TM.getFunctionSections();
312579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer  else
31343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    EmitUniquedSection = TM.getDataSections();
314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
315362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
316362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
31743ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner  if ((GV->isWeakForLinker() || EmitUniquedSection) &&
31843ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      !Kind.isCommon() && !Kind.isBSS()) {
31943ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    const char *Prefix;
32043ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    if (GV->isWeakForLinker())
32143ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      Prefix = getSectionPrefixForUniqueGlobal(Kind);
32243ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    else {
32343ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      assert(EmitUniquedSection);
32443ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner      Prefix = getSectionPrefixForGlobal(Kind);
32543ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner    }
32643ac721e3b35341e7cf59d5982ad702ca8d27433Chris Lattner
3274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
3284c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MCSymbol *Sym = Mang->getSymbol(GV);
3294c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    Name.append(Sym->getName().begin(), Sym->getName().end());
330287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner    return getContext().getELFSection(Name.str(),
331287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      getELFSectionType(Name.str(), Kind),
332287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      getELFSectionFlags(Kind), Kind);
333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText()) return TextSection;
336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeable1ByteCString() ||
338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable2ByteCString() ||
339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable4ByteCString()) {
340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // We also need alignment here.
342362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: this is getting the alignment of the character, not the
343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // alignment of the global!
344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    unsigned Align =
345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *SizeSpec = ".rodata.str1.";
348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeable2ByteCString())
349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str2.";
350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else if (Kind.isMergeable4ByteCString())
351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str4.";
352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else
353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      assert(Kind.isMergeable1ByteCString() && "unknown string width");
354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
355362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
356362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    std::string Name = SizeSpec + utostr(Align);
357c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola    return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
358287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      MCSectionELF::SHF_ALLOC |
359287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      MCSectionELF::SHF_MERGE |
360287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      MCSectionELF::SHF_STRINGS,
361287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner                                      Kind);
362362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
363362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
364362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
365362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4() && MergeableConst4Section)
366362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst4Section;
367362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8() && MergeableConst8Section)
368362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst8Section;
369362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && MergeableConst16Section)
370362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst16Section;
371362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;  // .const
372362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
373362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
374362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ReadOnlySection;
375362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
376362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return TLSDataSection;
377362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return TLSBSSSection;
378362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
379362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Note: we claim that common symbols are put in BSSSection, but they are
380362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // really emitted with the magic .comm directive, which creates a symbol table
381362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // entry but not a section.
382362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
383362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
384362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return DataSection;
385362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return DataRelLocalSection;
386362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return DataRelSection;
387362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
388362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
389362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
390362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
391362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
392362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
393362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the
394362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it
395362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in.
396362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
397362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const {
398362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4() && MergeableConst4Section)
399362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst4Section;
400362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8() && MergeableConst8Section)
401362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst8Section;
402362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && MergeableConst16Section)
403362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst16Section;
404362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
405362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
406362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
407362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
408362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
409362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
410362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
411362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
412362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF::
4133192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
4143192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MachineModuleInfo *MMI,
4153192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               unsigned Encoding, MCStreamer &Streamer) const {
416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Encoding & dwarf::DW_EH_PE_indirect) {
418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
419362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
420362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
421362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
422362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name += ".DW.stub";
423362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
424362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // Add information about the stub reference to ELFMMI so that the stub
425362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // gets emitted by the asmprinter.
4269b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
4274c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
428cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling    if (StubSym.getPointer() == 0) {
4294c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      MCSymbol *Sym = Mang->getSymbol(GV);
4304c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
431362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    }
432362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
433362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
4344c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      getExprForDwarfReference(SSym, Mang, MMI,
4353192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
436362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
437362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
438362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return TargetLoweringObjectFile::
4393192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
440362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
441362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
442362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
443362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                 MachO
444362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
445362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
446362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
447362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                               const TargetMachine &TM) {
4482ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling  // _foo.eh symbols are currently always exported so that the linker knows
4492ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling  // about them.  This is not necessary on 10.6 and later, but it
4502ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling  // doesn't hurt anything.
4512ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling  // FIXME: I need to get this from Triple.
45209d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  IsFunctionEHSymbolGlobal = true;
45309d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  IsFunctionEHFrameSymbolPrivate = false;
45409d53fecfcc93377627b6ee7b4d92f8a6ff152e9Chris Lattner  SupportsWeakOmittedEHFrame = false;
4558048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner
4568048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner  Triple T(((LLVMTargetMachine&)TM).getTargetTriple());
4578048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner  if (T.getOS() == Triple::Darwin) {
4582ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling    switch (T.getDarwinMajorNumber()) {
4592ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling    case 7:  // 10.3 Panther.
4602ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling    case 8:  // 10.4 Tiger.
4618048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner      CommDirectiveSupportsAlignment = false;
4622ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling      break;
4632ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling    case 9:   // 10.5 Leopard.
4642ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling    case 10:  // 10.6 SnowLeopard.
4652ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling      break;
4662ff6e1e62cf73c83379e660baa570c786ba92f12Bill Wendling    }
4678048ebe91d76f5ee58f5c2c7535151d782af4b29Chris Lattner  }
468579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
469362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
470362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
471362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection // .text
47222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__text",
47322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
47422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getText());
475362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection // .data
47622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__data", 0,
47722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getDataRel());
478362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
479423c9e3e589a79be757842d421600590c68d5b43Eric Christopher  TLSDataSection // .tdata
480423c9e3e589a79be757842d421600590c68d5b43Eric Christopher    = getContext().getMachOSection("__DATA", "__thread_data",
481423c9e3e589a79be757842d421600590c68d5b43Eric Christopher                                   MCSectionMachO::S_THREAD_LOCAL_REGULAR,
482423c9e3e589a79be757842d421600590c68d5b43Eric Christopher                                   SectionKind::getDataRel());
483423c9e3e589a79be757842d421600590c68d5b43Eric Christopher  TLSBSSSection // .tbss
484423c9e3e589a79be757842d421600590c68d5b43Eric Christopher    = getContext().getMachOSection("__DATA", "__thread_bss",
485423c9e3e589a79be757842d421600590c68d5b43Eric Christopher                                   MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
486423c9e3e589a79be757842d421600590c68d5b43Eric Christopher                                   SectionKind::getThreadBSS());
487579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
488423c9e3e589a79be757842d421600590c68d5b43Eric Christopher  // TODO: Verify datarel below.
489423c9e3e589a79be757842d421600590c68d5b43Eric Christopher  TLSTLVSection // .tlv
490423c9e3e589a79be757842d421600590c68d5b43Eric Christopher    = getContext().getMachOSection("__DATA", "__thread_vars",
491423c9e3e589a79be757842d421600590c68d5b43Eric Christopher                                   MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
492423c9e3e589a79be757842d421600590c68d5b43Eric Christopher                                   SectionKind::getDataRel());
493579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
494c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher  TLSThreadInitSection
495c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher    = getContext().getMachOSection("__DATA", "__thread_init",
496c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher                          MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
497c6177a4531a5d7e2207a3184cc8a4f1792073a7dEric Christopher                          SectionKind::getDataRel());
498579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
499362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  CStringSection // .cstring
500579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer    = getContext().getMachOSection("__TEXT", "__cstring",
50122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_CSTRING_LITERALS,
50222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeable1ByteCString());
503362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  UStringSection
50422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT","__ustring", 0,
50522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeable2ByteCString());
506362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  FourByteConstantSection // .literal4
50722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__literal4",
50822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_4BYTE_LITERALS,
50922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeableConst4());
510362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EightByteConstantSection // .literal8
511579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer    = getContext().getMachOSection("__TEXT", "__literal8",
51222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_8BYTE_LITERALS,
51322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeableConst8());
514362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
515362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
516362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to using it in -static mode.
517362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  SixteenByteConstantSection = 0;
518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (TM.getRelocationModel() != Reloc::Static &&
519362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      TM.getTargetData()->getPointerSize() == 32)
520362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SixteenByteConstantSection =   // .literal16
52122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      getContext().getMachOSection("__TEXT", "__literal16",
52222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_16BYTE_LITERALS,
52322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMergeableConst16());
524362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
525362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ReadOnlySection  // .const
52622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__const", 0,
52722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getReadOnly());
528362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
529362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextCoalSection
53022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__TEXT", "__textcoal_nt",
53122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED |
53222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
53322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getText());
534362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstTextCoalSection
535579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer    = getContext().getMachOSection("__TEXT", "__const_coal",
53622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED,
5376a624a65f47c850bbcbfc7eff4fd057be824027cChris Lattner                                   SectionKind::getReadOnly());
538362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstDataSection  // .const_data
53922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__const", 0,
54022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getReadOnlyWithRel());
541362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataCoalSection
542579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer    = getContext().getMachOSection("__DATA","__datacoal_nt",
54322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_COALESCED,
54422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getDataRel());
545362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataCommonSection
54622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA","__common",
54722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_ZEROFILL,
54822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getBSS());
549362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataBSSSection
55022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
55122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getBSS());
552579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
554362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LazySymbolPointerSection
55522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__la_symbol_ptr",
55622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
55722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMetadata());
558362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  NonLazySymbolPointerSection
55922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    = getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
56022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
56122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                   SectionKind::getMetadata());
562362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
563362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (TM.getRelocationModel() == Reloc::Static) {
564362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticCtorSection
56522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__TEXT", "__constructor", 0,
56622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
567362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticDtorSection
56822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__TEXT", "__destructor", 0,
56922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
570362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  } else {
571362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticCtorSection
57222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__DATA", "__mod_init_func",
57322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
57422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
575362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticDtorSection
57622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner      = getContext().getMachOSection("__DATA", "__mod_term_func",
57722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
57822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                     SectionKind::getDataRel());
579362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
580362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
581362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Exception Handling.
58222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner  LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
58322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                             SectionKind::getReadOnlyWithRel());
584362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
58522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__TEXT", "__eh_frame",
58622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_COALESCED |
58722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_NO_TOC |
58822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
58922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_LIVE_SUPPORT,
59022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getReadOnly());
591362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
592362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug Information.
593362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
594579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer    getContext().getMachOSection("__DWARF", "__debug_abbrev",
59522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
59622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
597362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
59822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_info",
59922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
60022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
601362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
60222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_line",
60322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
60422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
605362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
60622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_frame",
60722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
60822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
609362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
61022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_pubnames",
61122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
61222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
613362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
61422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_pubtypes",
61522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
61622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
617362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
61822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_str",
61922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
62022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
621362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
62222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_loc",
62322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
62422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
62622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_aranges",
62722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
62822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
63022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_ranges",
63122772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
63222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
63422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_macinfo",
63522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
63622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfDebugInlineSection =
63822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection("__DWARF", "__debug_inlined",
63922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 MCSectionMachO::S_ATTR_DEBUG,
64022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner                                 SectionKind::getMetadata());
641579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
6428116ca5134b355b897450f9a537c9c77e1f08723Eric Christopher  TLSExtraDataSection = TLSTLVSection;
643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
646362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
648362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Parse the section specifier and create it if valid.
649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef Segment, Section;
650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned TAA, StubSize;
651362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  std::string ErrorCode =
652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                          TAA, StubSize);
654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!ErrorCode.empty()) {
65575361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    // If invalid, report the error with report_fatal_error.
65675361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("Global variable '" + GV->getNameStr() +
657362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "' has an invalid section specifier '" + GV->getSection()+
658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "': " + ErrorCode + ".");
659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // Fall back to dropping it into the data section.
660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataSection;
661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Get the section.
664362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionMachO *S =
66522772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner    getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
666362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
667362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Okay, now that we got the section, verify that the TAA & StubSize agree.
668362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If the user declared multiple globals with different section flags, we need
669362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to reject it here.
670362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
67175361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    // If invalid, report the error with report_fatal_error.
67275361b69f3f327842b9dad69fa7f28ae3b688412Chris Lattner    report_fatal_error("Global variable '" + GV->getNameStr() +
673362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "' section type or attributes does not match previous"
674362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      " section specifier");
675362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return S;
678362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
679362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
680362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
681362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
6828116ca5134b355b897450f9a537c9c77e1f08723Eric Christopher                       Mangler *Mang, const TargetMachine &TM) const {
683579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
68402b46bc9426925b90137d264216a54aa413335fdEric Christopher  // Handle thread local data.
6858116ca5134b355b897450f9a537c9c77e1f08723Eric Christopher  if (Kind.isThreadBSS()) return TLSBSSSection;
68602b46bc9426925b90137d264216a54aa413335fdEric Christopher  if (Kind.isThreadData()) return TLSDataSection;
687362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
688362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
689362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
690362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
691362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is weak/linkonce, put this in a coalescable section, either in text
692362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // or data depending on if it is writable.
693362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isReadOnly())
695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return ConstTextCoalSection;
696362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCoalSection;
697362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
699362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: Alignment check should be handled by section classifier.
70098f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  if (Kind.isMergeable1ByteCString() &&
70198f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
70298f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner    return CStringSection;
703579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
70498f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // Do not put 16-bit arrays in the UString section if they have an
70598f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // externally visible label, this runs into issues with certain linker
70698f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  // versions.
70798f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner  if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
70898f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
70998f15d27cda62ca2f973da0244b6b5e15f18acb7Chris Lattner    return UStringSection;
710362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
711362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
712362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4())
713362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return FourByteConstantSection;
714362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8())
715362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return EightByteConstantSection;
716362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
717362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return SixteenByteConstantSection;
718362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
719362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
720362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, if it is readonly, but not something we can specially optimize,
721362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // just drop it in .const.
722362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
723362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is marked const, put it into a const section.  But if the dynamic
726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // linker needs to write to it, put it in the data segment.
727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRel())
728362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
729362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
730362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with strong external linkage in the
731362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // DATA, __common section with the .zerofill directive.
732362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSExtern())
733362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCommonSection;
734362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
735362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with local linkage in __DATA,__bss directive
736362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // with the .zerofill directive (aka .lcomm).
737362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSLocal())
738362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataBSSSection;
739579d7a3dccaf3c2e91ee81c026c47a0850803820Michael J. Spencer
740362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, just drop the variable in the normal data section.
741362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataSection;
742362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
743362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
744362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *
745362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
746362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this constant requires a relocation, we have to put it in the data
747362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // segment, not in the text segment.
748362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
749362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
750362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
751362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4())
752362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return FourByteConstantSection;
753362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8())
754362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return EightByteConstantSection;
755362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
756362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SixteenByteConstantSection;
757362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ReadOnlySection;  // .const
758362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
759362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
760362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
761362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// not to emit the UsedDirective for some symbols in llvm.used.
762362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// FIXME: REMOVE this (rdar://7071300)
763362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovbool TargetLoweringObjectFileMachO::
764362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
765362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  /// On Darwin, internally linked data beginning with "L" or "l" does not have
766362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  /// the directive emitted (this occurs in ObjC metadata).
767362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!GV) return false;
768362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
76907d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
770362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
771362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: ObjC metadata is currently emitted as internal symbols that have
77207d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
77307d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling    // this horrible hack can go away.
7744c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MCSymbol *Sym = Mang->getSymbol(GV);
7754c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
776362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return false;
777362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
778362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
779362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return true;
780362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
781362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
782362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileMachO::
7833192d14076dbe5724ce85b9d48644bb3c081f0e5Chris LattnergetExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
7843192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MachineModuleInfo *MMI, unsigned Encoding,
7853192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner                               MCStreamer &Streamer) const {
786362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // The mach-o version of this method defaults to returning a stub reference.
787362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
788293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  if (Encoding & DW_EH_PE_indirect) {
789293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    MachineModuleInfoMachO &MachOMMI =
790293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      MMI->getObjFileInfo<MachineModuleInfoMachO>();
791293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
792362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
793362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
794362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name += "$non_lazy_ptr";
795293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
796293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // Add information about the stub reference to MachOMMI so that the stub
797293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // gets emitted by the asmprinter.
7989b97a73dedf736e14b04a3d1a153f10d25b2507bChris Lattner    MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
7994c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
800cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling    if (StubSym.getPointer() == 0) {
8014c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      MCSymbol *Sym = Mang->getSymbol(GV);
8024c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
803293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    }
804362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
805362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
8064c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner      getExprForDwarfReference(SSym, Mang, MMI,
80742263e2e407ab7d1d805e7b41cffd7217134d3b6Chris Lattner                               Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
808362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
809362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
810362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return TargetLoweringObjectFile::
8113192d14076dbe5724ce85b9d48644bb3c081f0e5Chris Lattner    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
812362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
813362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
814293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
815293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
816293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
817293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
818293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
819293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_pcrel;
820293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
821293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
822293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getFDEEncoding() const {
823293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_pcrel;
824293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
825293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
826293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
827505ad8bed3321bc4b99af8fba4844efe2fe9e67aBill Wendling  return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
828293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
829362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
830362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
831362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  COFF
832362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
833362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
834362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                              const TargetMachine &TM) {
836362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
837eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  TextSection =
838eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".text",
83994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_CODE |
84094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_EXECUTE |
84194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
842eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getText());
843eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  DataSection =
844eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".data",
84594610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
84694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ |
84794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_WRITE,
848eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
849eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  ReadOnlySection =
850eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".rdata",
85194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
85294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
853eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getReadOnly());
854362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticCtorSection =
855eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".ctors",
85694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
85794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ |
85894610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_WRITE,
859eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
860362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticDtorSection =
861eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".dtors",
86294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
86394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ |
86494610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_WRITE,
865eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
866362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
867362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
868362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // though it contains relocatable pointers.  In PIC mode, this is probably a
869362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
870362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // adjusted or this should be a data section.
871362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection =
872eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".gcc_except_table",
87394610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
87494610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
875eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getReadOnly());
876362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
877eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".eh_frame",
87894610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
87994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ |
88094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_WRITE,
881eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getDataRel());
882362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
883362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug info.
884362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
885eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_abbrev",
88694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
88794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
888eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
889362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
890eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_info",
89194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
89294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
893eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
894362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
895eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_line",
89694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
89794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
898eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
899362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
900eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_frame",
90194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
90294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
903eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
904362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
905eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_pubnames",
90694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
90794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
908eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
909362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
910eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_pubtypes",
91194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
91294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
913eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
914362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
915eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_str",
91694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
91794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
918eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
919362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
920eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_loc",
92194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
92294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
923eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
924362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
925eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_aranges",
92694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
92794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
928eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
929362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
930eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_ranges",
93194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
93294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
933eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
934362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
935eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".debug_macinfo",
93694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_DISCARDABLE |
93794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_MEM_READ,
938eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
939eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
940eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  DrectveSection =
941eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    getContext().getCOFFSection(".drectve",
94294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar                                COFF::IMAGE_SCN_LNK_INFO,
943eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                SectionKind::getMetadata());
944eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner}
945eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
946eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattnerstatic unsigned
947eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris LattnergetCOFFSectionFlags(SectionKind K) {
948eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  unsigned Flags = 0;
949eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
95036335be3b95f856b7eb7e0766e01ba423315e1abAnton Korobeynikov  if (K.isMetadata())
9516e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    Flags |=
95294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_DISCARDABLE;
953eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isText())
954eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
95594610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_EXECUTE |
9563931b54a5f274183f850b912e0003f9aa1600584Michael J. Spencer      COFF::IMAGE_SCN_MEM_READ |
95794610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_CODE;
9586e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner  else if (K.isBSS ())
9596e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    Flags |=
96094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
96194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_READ |
96294610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_WRITE;
963eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isReadOnly())
964eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
96594610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
96694610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_READ;
967eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  else if (K.isWriteable())
968eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner    Flags |=
96994610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
97094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_READ |
97194610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar      COFF::IMAGE_SCN_MEM_WRITE;
972eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner
973eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  return Flags;
974362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
975362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
976362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
977362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
978362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
979eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner  return getContext().getCOFFSection(GV->getSection(),
980eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                     getCOFFSectionFlags(Kind),
981eb40a0fd98c44ecc6360e7fab33cf9e9911bed4fChris Lattner                                     Kind);
982362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
983362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
984362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
985362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
9863b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi    return ".text$";
9876e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner  if (Kind.isBSS ())
9883b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi    return ".bss$";
989362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isWriteable())
9903b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi    return ".data$";
9913b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi  return ".rdata$";
992362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
993362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
994362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
995362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
996362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
997362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
998362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
999362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
1000362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
1001362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
1002362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
1003362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
1004362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
10054c6741f7078f3a9f655e67bf56bd4d5d427fc6bcChris Lattner    MCSymbol *Sym = Mang->getSymbol(GV);
10063b3b0ebd2ec9cd1de709007f31f40790c9243511NAKAMURA Takumi    Name.append(Sym->getName().begin() + 1, Sym->getName().end());
10076e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner
10086e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    unsigned Characteristics = getCOFFSectionFlags(Kind);
10096e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner
101094610588af55ae7d16ba7d72d1e68324631ec249Daniel Dunbar    Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
10116e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner
10126e5ce287b0e53c264af0ba37169ad964e19b5bb7Chris Lattner    return getContext().getCOFFSection(Name.str(), Characteristics,
1013657985eb8b8cbbde2391befafccfafbddf04242aAnton Korobeynikov                          COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
1014362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
1015362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
1016362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
1017362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return getTextSection();
1018362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
1019362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return getDataSection();
1020362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
1021362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
1022