TargetLoweringObjectFileImpl.cpp revision 293d592bf9cff6c3679998dde32f3cfd3cd53bc4
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"
25362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/MC/MCSymbol.h"
26362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/Mangler.h"
27362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetData.h"
28362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetMachine.h"
29362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Target/TargetOptions.h"
30362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/Dwarf.h"
31362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/ErrorHandling.h"
32362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/Support/raw_ostream.h"
33362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/SmallString.h"
34362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov#include "llvm/ADT/StringExtras.h"
35362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovusing namespace llvm;
36293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovusing namespace dwarf;
37362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
38362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
39362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  ELF
40362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
41362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovtypedef StringMap<const MCSectionELF*> ELFUniqueMapTy;
42362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
43362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileELF::~TargetLoweringObjectFileELF() {
44362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If we have the section uniquing map, free it.
45362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  delete (ELFUniqueMapTy*)UniquingMap;
46362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
47362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
48362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
49362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSection(StringRef Section, unsigned Type, unsigned Flags,
50362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov              SectionKind Kind, bool IsExplicit) const {
51362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (UniquingMap == 0)
52362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    UniquingMap = new ELFUniqueMapTy();
53362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ELFUniqueMapTy &Map = *(ELFUniqueMapTy*)UniquingMap;
54362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
55362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Do the lookup, if we have a hit, return it.
56362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionELF *&Entry = Map[Section];
57362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Entry) return Entry;
58362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
59362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Entry = MCSectionELF::Create(Section, Type, Flags, Kind, IsExplicit,
60362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                      getContext());
61362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
62362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
63362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
64362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                             const TargetMachine &TM) {
65362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (UniquingMap != 0)
66362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    ((ELFUniqueMapTy*)UniquingMap)->clear();
67362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
68362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
69362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  BSSSection =
70362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".bss", MCSectionELF::SHT_NOBITS,
71362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
72362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getBSS());
73362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
74362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection =
75362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".text", MCSectionELF::SHT_PROGBITS,
76362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_EXECINSTR | MCSectionELF::SHF_ALLOC,
77362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getText());
78362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
79362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection =
80362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".data", MCSectionELF::SHT_PROGBITS,
81362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_WRITE | MCSectionELF::SHF_ALLOC,
82362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getDataRel());
83362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
84362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ReadOnlySection =
85362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".rodata", MCSectionELF::SHT_PROGBITS,
86362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC,
87362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getReadOnly());
88362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
89362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TLSDataSection =
90362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".tdata", MCSectionELF::SHT_PROGBITS,
91362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
92362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_WRITE, SectionKind::getThreadData());
93362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
94362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TLSBSSSection =
95362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".tbss", MCSectionELF::SHT_NOBITS,
96362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_TLS |
97362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_WRITE, SectionKind::getThreadBSS());
98362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
99362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelSection =
100362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".data.rel", MCSectionELF::SHT_PROGBITS,
101362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
102362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getDataRel());
103362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
104362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelLocalSection =
105362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".data.rel.local", MCSectionELF::SHT_PROGBITS,
106362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
107362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getDataRelLocal());
108362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
109362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelROSection =
110362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".data.rel.ro", MCSectionELF::SHT_PROGBITS,
111362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
112362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getReadOnlyWithRel());
113362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
114362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataRelROLocalSection =
115362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".data.rel.ro.local", MCSectionELF::SHT_PROGBITS,
116362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
117362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getReadOnlyWithRelLocal());
118362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
119362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst4Section =
120362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".rodata.cst4", MCSectionELF::SHT_PROGBITS,
121362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
122362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMergeableConst4());
123362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
124362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst8Section =
125362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".rodata.cst8", MCSectionELF::SHT_PROGBITS,
126362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
127362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMergeableConst8());
128362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
129362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MergeableConst16Section =
130362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".rodata.cst16", MCSectionELF::SHT_PROGBITS,
131362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_MERGE,
132362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMergeableConst16());
133362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
134362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticCtorSection =
135362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".ctors", MCSectionELF::SHT_PROGBITS,
136362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
137362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getDataRel());
138362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
139362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticDtorSection =
140362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".dtors", MCSectionELF::SHT_PROGBITS,
141362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
142362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getDataRel());
143362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
144362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Exception Handling Sections.
145362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
146362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
147362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // it contains relocatable pointers.  In PIC mode, this is probably a big
148362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
149362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // adjusted or this should be a data section.
150362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection =
151362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".gcc_except_table", MCSectionELF::SHT_PROGBITS,
152362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC, SectionKind::getReadOnly());
153362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
154362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".eh_frame", MCSectionELF::SHT_PROGBITS,
155362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  MCSectionELF::SHF_ALLOC | MCSectionELF::SHF_WRITE,
156362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getDataRel());
157362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
158362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug Info Sections.
159362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
160362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_abbrev", MCSectionELF::SHT_PROGBITS, 0,
161362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
162362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
163362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_info", MCSectionELF::SHT_PROGBITS, 0,
164362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
165362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
166362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_line", MCSectionELF::SHT_PROGBITS, 0,
167362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
168362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
169362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_frame", MCSectionELF::SHT_PROGBITS, 0,
170362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
171362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
172362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_pubnames", MCSectionELF::SHT_PROGBITS, 0,
173362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
174362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
175362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_pubtypes", MCSectionELF::SHT_PROGBITS, 0,
176362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
177362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
178362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_str", MCSectionELF::SHT_PROGBITS, 0,
179362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
180362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
181362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_loc", MCSectionELF::SHT_PROGBITS, 0,
182362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
183362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
184362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_aranges", MCSectionELF::SHT_PROGBITS, 0,
185362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
186362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
187362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_ranges", MCSectionELF::SHT_PROGBITS, 0,
188362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
189362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
190362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getELFSection(".debug_macinfo", MCSectionELF::SHT_PROGBITS, 0,
191362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                  SectionKind::getMetadata());
192362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
193362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
194362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
195362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic SectionKind
196362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFKindForNamedSection(StringRef Name, SectionKind K) {
197362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name.empty() || Name[0] != '.') return K;
198362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
199362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Some lame default implementation based on some magic section names.
200362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".bss" ||
201362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".bss.") ||
202362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.b.") ||
203362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.b.") ||
204362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name == ".sbss" ||
205362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".sbss.") ||
206362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.sb.") ||
207362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.sb."))
208362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getBSS();
209362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
210362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tdata" ||
211362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tdata.") ||
212362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.td.") ||
213362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.td."))
214362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadData();
215362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
216362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".tbss" ||
217362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".tbss.") ||
218362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".gnu.linkonce.tb.") ||
219362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.startswith(".llvm.linkonce.tb."))
220362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SectionKind::getThreadBSS();
221362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
222362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return K;
223362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
224362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
225362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
226362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned getELFSectionType(StringRef Name, SectionKind K) {
227362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
228362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".init_array")
229362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_INIT_ARRAY;
230362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
231362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".fini_array")
232362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_FINI_ARRAY;
233362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
234362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Name == ".preinit_array")
235362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_PREINIT_ARRAY;
236362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
237362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isBSS() || K.isThreadBSS())
238362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MCSectionELF::SHT_NOBITS;
239362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
240362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return MCSectionELF::SHT_PROGBITS;
241362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
242362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
243362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
244362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic unsigned
245362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetELFSectionFlags(SectionKind K) {
246362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned Flags = 0;
247362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
248362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!K.isMetadata())
249362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_ALLOC;
250362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
251362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isText())
252362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_EXECINSTR;
253362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
254362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isWriteable())
255362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_WRITE;
256362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
257362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isThreadLocal())
258362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_TLS;
259362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
260362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // K.isMergeableConst() is left out to honour PR4650
261362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString() || K.isMergeableConst4() ||
262362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      K.isMergeableConst8() || K.isMergeableConst16())
263362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_MERGE;
264362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
265362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (K.isMergeableCString())
266362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Flags |= MCSectionELF::SHF_STRINGS;
267362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
268362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Flags;
269362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
270362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
271362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
272362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
273362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
274362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
275362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef SectionName = GV->getSection();
276362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
277362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Infer section flags from the section name if we can.
278362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Kind = getELFKindForNamedSection(SectionName, Kind);
279362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
280362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return getELFSection(SectionName,
281362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       getELFSectionType(SectionName, Kind),
282362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       getELFSectionFlags(Kind), Kind, true);
283362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
284362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
285362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
286362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())                 return ".gnu.linkonce.t.";
287362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
288362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
289362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
290362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
291362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
292362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
293362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
294362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
295362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
296362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
297362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
298362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ".gnu.linkonce.d.rel.ro.";
299362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
300362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
301362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
302362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
303362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
304362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
305362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
306362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
307362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker() && !Kind.isCommon() && !Kind.isBSS()) {
308362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
309362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
310362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name.append(Prefix, Prefix+strlen(Prefix));
311362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, false);
312362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return getELFSection(Name.str(), getELFSectionType(Name.str(), Kind),
313362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         getELFSectionFlags(Kind), Kind);
314362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
315362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
316362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText()) return TextSection;
317362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
318362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeable1ByteCString() ||
319362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable2ByteCString() ||
320362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable4ByteCString()) {
321362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
322362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // We also need alignment here.
323362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: this is getting the alignment of the character, not the
324362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // alignment of the global!
325362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    unsigned Align =
326362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
327362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
328362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *SizeSpec = ".rodata.str1.";
329362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeable2ByteCString())
330362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str2.";
331362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else if (Kind.isMergeable4ByteCString())
332362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      SizeSpec = ".rodata.str4.";
333362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    else
334362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      assert(Kind.isMergeable1ByteCString() && "unknown string width");
335362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
336362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
337362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    std::string Name = SizeSpec + utostr(Align);
338362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return getELFSection(Name, MCSectionELF::SHT_PROGBITS,
339362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         MCSectionELF::SHF_ALLOC |
340362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         MCSectionELF::SHF_MERGE |
341362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         MCSectionELF::SHF_STRINGS,
342362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Kind);
343362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
344362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
345362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
346362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4() && MergeableConst4Section)
347362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst4Section;
348362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8() && MergeableConst8Section)
349362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst8Section;
350362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && MergeableConst16Section)
351362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return MergeableConst16Section;
352362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;  // .const
353362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
354362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
355362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())             return ReadOnlySection;
356362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
357362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadData())           return TLSDataSection;
358362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isThreadBSS())            return TLSBSSSection;
359362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
360362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Note: we claim that common symbols are put in BSSSection, but they are
361362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // really emitted with the magic .comm directive, which creates a symbol table
362362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // entry but not a section.
363362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
364362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
365362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataNoRel())            return DataSection;
366362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRelLocal())         return DataRelLocalSection;
367362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel())              return DataRelSection;
368362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
369362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
370362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
371362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
372362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
373362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
374362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// getSectionForConstant - Given a mergeable constant with the
375362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// specified size and relocation information, return a section that it
376362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// should be placed in.
377362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileELF::
378362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSectionForConstant(SectionKind Kind) const {
379362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4() && MergeableConst4Section)
380362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst4Section;
381362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8() && MergeableConst8Section)
382362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst8Section;
383362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && MergeableConst16Section)
384362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return MergeableConst16Section;
385362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
386362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
387362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
388362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
389362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
390362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataRelROSection;
391362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
392362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
393362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileELF::
394362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
395362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                             MachineModuleInfo *MMI, unsigned Encoding) const {
396362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
397362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Encoding & dwarf::DW_EH_PE_indirect) {
398362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
399362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
400362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
401362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
402362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name += ".DW.stub";
403362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
404362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // Add information about the stub reference to ELFMMI so that the stub
405362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // gets emitted by the asmprinter.
406362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
407362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSymbol *&StubSym = ELFMMI.getGVStubEntry(Sym);
408362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (StubSym == 0) {
409362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Name.clear();
410362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Mang->getNameWithPrefix(Name, GV, false);
411362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      StubSym = getContext().GetOrCreateSymbol(Name.str());
412362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    }
413362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
414362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
415362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      getSymbolForDwarfReference(Sym, MMI,
416362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                 Encoding & ~dwarf::DW_EH_PE_indirect);
417362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
418362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
419362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return TargetLoweringObjectFile::
420362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
421362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
422362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
423362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
424362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                 MachO
425362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
426362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
427362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovtypedef StringMap<const MCSectionMachO*> MachOUniqueMapTy;
428362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
429362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::~TargetLoweringObjectFileMachO() {
430362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If we have the MachO uniquing map, free it.
431362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  delete (MachOUniqueMapTy*)UniquingMap;
432362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
433362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
434362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
435362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSectionMachO *TargetLoweringObjectFileMachO::
436362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetMachOSection(StringRef Segment, StringRef Section,
437362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                unsigned TypeAndAttributes,
438362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                unsigned Reserved2, SectionKind Kind) const {
439362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // We unique sections by their segment/section pair.  The returned section
440362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // may not have the same flags as the requested section, if so this should be
441362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // diagnosed by the client as an error.
442362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
443362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Create the map if it doesn't already exist.
444362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (UniquingMap == 0)
445362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    UniquingMap = new MachOUniqueMapTy();
446362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  MachOUniqueMapTy &Map = *(MachOUniqueMapTy*)UniquingMap;
447362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
448362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Form the name to look up.
449362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  SmallString<64> Name;
450362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Name += Segment;
451362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Name.push_back(',');
452362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  Name += Section;
453362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
454362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Do the lookup, if we have a hit, return it.
455362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionMachO *&Entry = Map[Name.str()];
456362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Entry) return Entry;
457362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
458362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, return a new section.
459362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Entry = MCSectionMachO::Create(Segment, Section, TypeAndAttributes,
460362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                        Reserved2, Kind, getContext());
461362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
462362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
463362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
464362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
465362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                               const TargetMachine &TM) {
466362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (UniquingMap != 0)
467362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    ((MachOUniqueMapTy*)UniquingMap)->clear();
468362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
469362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
470362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection // .text
471362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__text",
472362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
473362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getText());
474362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection // .data
475362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA", "__data", 0, SectionKind::getDataRel());
476362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
477362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  CStringSection // .cstring
478362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__cstring", MCSectionMachO::S_CSTRING_LITERALS,
479362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMergeable1ByteCString());
480362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  UStringSection
481362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT","__ustring", 0,
482362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMergeable2ByteCString());
483362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  FourByteConstantSection // .literal4
484362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__literal4", MCSectionMachO::S_4BYTE_LITERALS,
485362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMergeableConst4());
486362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EightByteConstantSection // .literal8
487362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__literal8", MCSectionMachO::S_8BYTE_LITERALS,
488362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMergeableConst8());
489362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
490362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
491362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to using it in -static mode.
492362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  SixteenByteConstantSection = 0;
493362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (TM.getRelocationModel() != Reloc::Static &&
494362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      TM.getTargetData()->getPointerSize() == 32)
495362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SixteenByteConstantSection =   // .literal16
496362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      getMachOSection("__TEXT", "__literal16",MCSectionMachO::S_16BYTE_LITERALS,
497362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMergeableConst16());
498362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
499362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ReadOnlySection  // .const
500362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__const", 0, SectionKind::getReadOnly());
501362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
502362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextCoalSection
503362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__textcoal_nt",
504362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      MCSectionMachO::S_COALESCED |
505362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
506362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getText());
507362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstTextCoalSection
508362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__TEXT", "__const_coal", MCSectionMachO::S_COALESCED,
509362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getText());
510362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstDataCoalSection
511362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA","__const_coal", MCSectionMachO::S_COALESCED,
512362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getText());
513362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  ConstDataSection  // .const_data
514362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA", "__const", 0,
515362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getReadOnlyWithRel());
516362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataCoalSection
517362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
518362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getDataRel());
519362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataCommonSection
520362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA","__common", MCSectionMachO::S_ZEROFILL,
521362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getBSS());
522362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataBSSSection
523362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
524362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getBSS());
525362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
526362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
527362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LazySymbolPointerSection
528362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA", "__la_symbol_ptr",
529362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
530362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMetadata());
531362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  NonLazySymbolPointerSection
532362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    = getMachOSection("__DATA", "__nl_symbol_ptr",
533362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
534362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      SectionKind::getMetadata());
535362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
536362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (TM.getRelocationModel() == Reloc::Static) {
537362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticCtorSection
538362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
539362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticDtorSection
540362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      = getMachOSection("__TEXT", "__destructor", 0, SectionKind::getDataRel());
541362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  } else {
542362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticCtorSection
543362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      = getMachOSection("__DATA", "__mod_init_func",
544362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                        MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
545362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                        SectionKind::getDataRel());
546362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    StaticDtorSection
547362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      = getMachOSection("__DATA", "__mod_term_func",
548362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                        MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
549362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                        SectionKind::getDataRel());
550362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
551362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
552362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Exception Handling.
553362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection = getMachOSection("__DATA", "__gcc_except_tab", 0,
554362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                SectionKind::getDataRel());
555362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
556362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__TEXT", "__eh_frame",
557362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    MCSectionMachO::S_COALESCED |
558362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    MCSectionMachO::S_ATTR_NO_TOC |
559362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
560362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    MCSectionMachO::S_ATTR_LIVE_SUPPORT,
561362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getReadOnly());
562362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
563362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug Information.
564362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
565362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_abbrev", MCSectionMachO::S_ATTR_DEBUG,
566362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
567362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
568362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_info", MCSectionMachO::S_ATTR_DEBUG,
569362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
570362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
571362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_line", MCSectionMachO::S_ATTR_DEBUG,
572362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
573362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
574362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_frame", MCSectionMachO::S_ATTR_DEBUG,
575362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
576362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
577362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_pubnames", MCSectionMachO::S_ATTR_DEBUG,
578362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
579362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
580362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_pubtypes", MCSectionMachO::S_ATTR_DEBUG,
581362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
582362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
583362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_str", MCSectionMachO::S_ATTR_DEBUG,
584362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
585362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
586362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_loc", MCSectionMachO::S_ATTR_DEBUG,
587362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
588362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
589362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_aranges", MCSectionMachO::S_ATTR_DEBUG,
590362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
591362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
592362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_ranges", MCSectionMachO::S_ATTR_DEBUG,
593362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
594362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
595362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_macinfo", MCSectionMachO::S_ATTR_DEBUG,
596362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
597362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfDebugInlineSection =
598362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection("__DWARF", "__debug_inlined", MCSectionMachO::S_ATTR_DEBUG,
599362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                    SectionKind::getMetadata());
600362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
601362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
602362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
603362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
604362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
605362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Parse the section specifier and create it if valid.
606362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StringRef Segment, Section;
607362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  unsigned TAA, StubSize;
608362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  std::string ErrorCode =
609362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
610362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                          TAA, StubSize);
611362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!ErrorCode.empty()) {
612362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // If invalid, report the error with llvm_report_error.
613362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    llvm_report_error("Global variable '" + GV->getNameStr() +
614362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "' has an invalid section specifier '" + GV->getSection()+
615362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "': " + ErrorCode + ".");
616362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // Fall back to dropping it into the data section.
617362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataSection;
618362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
619362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
620362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Get the section.
621362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionMachO *S =
622362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getMachOSection(Segment, Section, TAA, StubSize, Kind);
623362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
624362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Okay, now that we got the section, verify that the TAA & StubSize agree.
625362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If the user declared multiple globals with different section flags, we need
626362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // to reject it here.
627362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
628362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // If invalid, report the error with llvm_report_error.
629362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    llvm_report_error("Global variable '" + GV->getNameStr() +
630362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      "' section type or attributes does not match previous"
631362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                      " section specifier");
632362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
633362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
634362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return S;
635362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
636362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
637362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileMachO::
638362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
639362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
640362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
641362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
642362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
643362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
644362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
645362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is weak/linkonce, put this in a coalescable section, either in text
646362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // or data depending on if it is writable.
647362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
648362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isReadOnly())
649362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return ConstTextCoalSection;
650362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCoalSection;
651362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
652362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
653362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: Alignment check should be handled by section classifier.
654362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeable1ByteCString() ||
655362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      Kind.isMergeable2ByteCString()) {
656362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (TM.getTargetData()->getPreferredAlignment(
657362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                              cast<GlobalVariable>(GV)) < 32) {
658362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      if (Kind.isMergeable1ByteCString())
659362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov        return CStringSection;
660362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      assert(Kind.isMergeable2ByteCString());
661362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return UStringSection;
662362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    }
663362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
664362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
665362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst()) {
666362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst4())
667362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return FourByteConstantSection;
668362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst8())
669362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return EightByteConstantSection;
670362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
671362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return SixteenByteConstantSection;
672362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
673362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
674362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, if it is readonly, but not something we can specially optimize,
675362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // just drop it in .const.
676362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnly())
677362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ReadOnlySection;
678362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
679362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this is marked const, put it into a const section.  But if the dynamic
680362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // linker needs to write to it, put it in the data segment.
681362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isReadOnlyWithRel())
682362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
683362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
684362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with strong external linkage in the
685362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // DATA, __common section with the .zerofill directive.
686362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSExtern())
687362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataCommonSection;
688362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
689362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Put zero initialized globals with local linkage in __DATA,__bss directive
690362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // with the .zerofill directive (aka .lcomm).
691362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isBSSLocal())
692362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return DataBSSSection;
693362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
694362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Otherwise, just drop the variable in the normal data section.
695362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return DataSection;
696362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
697362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
698362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *
699362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
700362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this constant requires a relocation, we have to put it in the data
701362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // segment, not in the text segment.
702362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
703362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ConstDataSection;
704362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
705362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst4())
706362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return FourByteConstantSection;
707362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst8())
708362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return EightByteConstantSection;
709362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
710362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return SixteenByteConstantSection;
711362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ReadOnlySection;  // .const
712362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
713362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
714362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
715362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov/// not to emit the UsedDirective for some symbols in llvm.used.
716362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov// FIXME: REMOVE this (rdar://7071300)
717362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovbool TargetLoweringObjectFileMachO::
718362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovshouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
719362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  /// On Darwin, internally linked data beginning with "L" or "l" does not have
720362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  /// the directive emitted (this occurs in ObjC metadata).
721362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (!GV) return false;
722362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
723362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
724362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
725362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // FIXME: ObjC metadata is currently emitted as internal symbols that have
726362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
727362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    // this horrible hack can go away.
728362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<64> Name;
729362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, false);
730362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    if (Name[0] == 'L' || Name[0] == 'l')
731362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      return false;
732362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
733362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
734362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return true;
735362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
736362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
737362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCExpr *TargetLoweringObjectFileMachO::
738362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetSymbolForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
739362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                             MachineModuleInfo *MMI, unsigned Encoding) const {
740362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // The mach-o version of this method defaults to returning a stub reference.
741362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
742293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  if (Encoding & DW_EH_PE_indirect) {
743293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    MachineModuleInfoMachO &MachOMMI =
744293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      MMI->getObjFileInfo<MachineModuleInfoMachO>();
745293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
746362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name;
747362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, true);
748362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Name += "$non_lazy_ptr";
749293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
750293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // Add information about the stub reference to MachOMMI so that the stub
751293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    // gets emitted by the asmprinter.
752362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    MCSymbol *Sym = getContext().GetOrCreateSymbol(Name.str());
753293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    MCSymbol *&StubSym = MachOMMI.getGVStubEntry(Sym);
754293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    if (StubSym == 0) {
755293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      Name.clear();
756293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      Mang->getNameWithPrefix(Name, GV, false);
757293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov      StubSym = getContext().GetOrCreateSymbol(Name.str());
758293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov    }
759362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
760362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return TargetLoweringObjectFile::
761362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov      getSymbolForDwarfReference(Sym, MMI,
762362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                 Encoding & ~dwarf::DW_EH_PE_indirect);
763362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
764362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
765362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return TargetLoweringObjectFile::
766362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getSymbolForDwarfGlobalReference(GV, Mang, MMI, Encoding);
767362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
768362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
769293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
770293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
771293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
772293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
773293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
774293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_pcrel;
775293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
776293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
777293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getFDEEncoding() const {
778293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_pcrel;
779293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
780293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov
781293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikovunsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
782293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov  return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
783293d592bf9cff6c3679998dde32f3cfd3cd53bc4Anton Korobeynikov}
784362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
785362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
786362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//                                  COFF
787362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov//===----------------------------------------------------------------------===//
788362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
789362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovtypedef StringMap<const MCSectionCOFF*> COFFUniqueMapTy;
790362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
791362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovTargetLoweringObjectFileCOFF::~TargetLoweringObjectFileCOFF() {
792362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  delete (COFFUniqueMapTy*)UniquingMap;
793362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
794362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
795362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
796362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
797362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetCOFFSection(StringRef Name, bool isDirective, SectionKind Kind) const {
798362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Create the map if it doesn't already exist.
799362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (UniquingMap == 0)
800362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    UniquingMap = new MachOUniqueMapTy();
801362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  COFFUniqueMapTy &Map = *(COFFUniqueMapTy*)UniquingMap;
802362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
803362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Do the lookup, if we have a hit, return it.
804362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  const MCSectionCOFF *&Entry = Map[Name];
805362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Entry) return Entry;
806362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
807362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return Entry = MCSectionCOFF::Create(Name, isDirective, Kind, getContext());
808362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
809362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
810362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovvoid TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
811362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                                              const TargetMachine &TM) {
812362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (UniquingMap != 0)
813362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    ((COFFUniqueMapTy*)UniquingMap)->clear();
814362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TargetLoweringObjectFile::Initialize(Ctx, TM);
815362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  TextSection = getCOFFSection("\t.text", true, SectionKind::getText());
816362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DataSection = getCOFFSection("\t.data", true, SectionKind::getDataRel());
817362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticCtorSection =
818362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection(".ctors", false, SectionKind::getDataRel());
819362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  StaticDtorSection =
820362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection(".dtors", false, SectionKind::getDataRel());
821362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
822362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: We're emitting LSDA info into a readonly section on COFF, even
823362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // though it contains relocatable pointers.  In PIC mode, this is probably a
824362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
825362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // adjusted or this should be a data section.
826362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  LSDASection =
827362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection(".gcc_except_table", false, SectionKind::getReadOnly());
828362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  EHFrameSection =
829362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection(".eh_frame", false, SectionKind::getDataRel());
830362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
831362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // Debug info.
832362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // FIXME: Don't use 'directive' mode here.
833362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfAbbrevSection =
834362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_abbrev,\"dr\"",
835362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
836362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfInfoSection =
837362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_info,\"dr\"",
838362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
839362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLineSection =
840362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_line,\"dr\"",
841362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
842362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfFrameSection =
843362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_frame,\"dr\"",
844362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
845362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubNamesSection =
846362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_pubnames,\"dr\"",
847362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
848362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfPubTypesSection =
849362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_pubtypes,\"dr\"",
850362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
851362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfStrSection =
852362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_str,\"dr\"",
853362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
854362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfLocSection =
855362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_loc,\"dr\"",
856362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
857362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfARangesSection =
858362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_aranges,\"dr\"",
859362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
860362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfRangesSection =
861362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_ranges,\"dr\"",
862362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
863362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  DwarfMacroInfoSection =
864362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    getCOFFSection("\t.section\t.debug_macinfo,\"dr\"",
865362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                   true, SectionKind::getMetadata());
866362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
867362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
868362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
869362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovgetExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
870362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                         Mangler *Mang, const TargetMachine &TM) const {
871362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return getCOFFSection(GV->getSection(), false, Kind);
872362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
873362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
874362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovstatic const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
875362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
876362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ".text$linkonce";
877362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isWriteable())
878362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return ".data$linkonce";
879362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return ".rdata$linkonce";
880362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
881362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
882362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
883362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikovconst MCSection *TargetLoweringObjectFileCOFF::
884362dd0bef5437f85586c046bc53287b6fbe9c099Anton KorobeynikovSelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
885362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov                       Mangler *Mang, const TargetMachine &TM) const {
886362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
887362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
888362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // If this global is linkonce/weak and the target handles this by emitting it
889362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  // into a 'uniqued' section name, create and return the section now.
890362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (GV->isWeakForLinker()) {
891362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
892362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
893362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    Mang->getNameWithPrefix(Name, GV, false);
894362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return getCOFFSection(Name.str(), false, Kind);
895362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  }
896362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
897362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  if (Kind.isText())
898362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov    return getTextSection();
899362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
900362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov  return getDataSection();
901362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov}
902362dd0bef5437f85586c046bc53287b6fbe9c099Anton Korobeynikov
903