xref: /aosp_15_r20/external/llvm/lib/MC/MCObjectFileInfo.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- MCObjectFileInfo.cpp - Object File Information --------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCObjectFileInfo.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCAsmInfo.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCContext.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSection.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionCOFF.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionELF.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSectionMachO.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/COFF.h"
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker using namespace llvm;
22*9880d681SAndroid Build Coastguard Worker 
useCompactUnwind(const Triple & T)23*9880d681SAndroid Build Coastguard Worker static bool useCompactUnwind(const Triple &T) {
24*9880d681SAndroid Build Coastguard Worker   // Only on darwin.
25*9880d681SAndroid Build Coastguard Worker   if (!T.isOSDarwin())
26*9880d681SAndroid Build Coastguard Worker     return false;
27*9880d681SAndroid Build Coastguard Worker 
28*9880d681SAndroid Build Coastguard Worker   // aarch64 always has it.
29*9880d681SAndroid Build Coastguard Worker   if (T.getArch() == Triple::aarch64)
30*9880d681SAndroid Build Coastguard Worker     return true;
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker   // armv7k always has it.
33*9880d681SAndroid Build Coastguard Worker   if (T.isWatchABI())
34*9880d681SAndroid Build Coastguard Worker     return true;
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker   // Use it on newer version of OS X.
37*9880d681SAndroid Build Coastguard Worker   if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
38*9880d681SAndroid Build Coastguard Worker     return true;
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker   // And the iOS simulator.
41*9880d681SAndroid Build Coastguard Worker   if (T.isiOS() &&
42*9880d681SAndroid Build Coastguard Worker       (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86))
43*9880d681SAndroid Build Coastguard Worker     return true;
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker   return false;
46*9880d681SAndroid Build Coastguard Worker }
47*9880d681SAndroid Build Coastguard Worker 
initMachOMCObjectFileInfo(const Triple & T)48*9880d681SAndroid Build Coastguard Worker void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
49*9880d681SAndroid Build Coastguard Worker   // MachO
50*9880d681SAndroid Build Coastguard Worker   SupportsWeakOmittedEHFrame = false;
51*9880d681SAndroid Build Coastguard Worker 
52*9880d681SAndroid Build Coastguard Worker   EHFrameSection = Ctx->getMachOSection(
53*9880d681SAndroid Build Coastguard Worker       "__TEXT", "__eh_frame",
54*9880d681SAndroid Build Coastguard Worker       MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
55*9880d681SAndroid Build Coastguard Worker           MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT,
56*9880d681SAndroid Build Coastguard Worker       SectionKind::getReadOnly());
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   if (T.isOSDarwin() && T.getArch() == Triple::aarch64)
59*9880d681SAndroid Build Coastguard Worker     SupportsCompactUnwindWithoutEHFrame = true;
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker   if (T.isWatchABI())
62*9880d681SAndroid Build Coastguard Worker     OmitDwarfIfHaveCompactUnwind = true;
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker   PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
65*9880d681SAndroid Build Coastguard Worker     | dwarf::DW_EH_PE_sdata4;
66*9880d681SAndroid Build Coastguard Worker   LSDAEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
67*9880d681SAndroid Build Coastguard Worker   TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
68*9880d681SAndroid Build Coastguard Worker     dwarf::DW_EH_PE_sdata4;
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker   // .comm doesn't support alignment before Leopard.
71*9880d681SAndroid Build Coastguard Worker   if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
72*9880d681SAndroid Build Coastguard Worker     CommDirectiveSupportsAlignment = false;
73*9880d681SAndroid Build Coastguard Worker 
74*9880d681SAndroid Build Coastguard Worker   TextSection // .text
75*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__TEXT", "__text",
76*9880d681SAndroid Build Coastguard Worker                            MachO::S_ATTR_PURE_INSTRUCTIONS,
77*9880d681SAndroid Build Coastguard Worker                            SectionKind::getText());
78*9880d681SAndroid Build Coastguard Worker   DataSection // .data
79*9880d681SAndroid Build Coastguard Worker       = Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker   // BSSSection might not be expected initialized on msvc.
82*9880d681SAndroid Build Coastguard Worker   BSSSection = nullptr;
83*9880d681SAndroid Build Coastguard Worker 
84*9880d681SAndroid Build Coastguard Worker   TLSDataSection // .tdata
85*9880d681SAndroid Build Coastguard Worker       = Ctx->getMachOSection("__DATA", "__thread_data",
86*9880d681SAndroid Build Coastguard Worker                              MachO::S_THREAD_LOCAL_REGULAR,
87*9880d681SAndroid Build Coastguard Worker                              SectionKind::getData());
88*9880d681SAndroid Build Coastguard Worker   TLSBSSSection // .tbss
89*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA", "__thread_bss",
90*9880d681SAndroid Build Coastguard Worker                            MachO::S_THREAD_LOCAL_ZEROFILL,
91*9880d681SAndroid Build Coastguard Worker                            SectionKind::getThreadBSS());
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker   // TODO: Verify datarel below.
94*9880d681SAndroid Build Coastguard Worker   TLSTLVSection // .tlv
95*9880d681SAndroid Build Coastguard Worker       = Ctx->getMachOSection("__DATA", "__thread_vars",
96*9880d681SAndroid Build Coastguard Worker                              MachO::S_THREAD_LOCAL_VARIABLES,
97*9880d681SAndroid Build Coastguard Worker                              SectionKind::getData());
98*9880d681SAndroid Build Coastguard Worker 
99*9880d681SAndroid Build Coastguard Worker   TLSThreadInitSection = Ctx->getMachOSection(
100*9880d681SAndroid Build Coastguard Worker       "__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
101*9880d681SAndroid Build Coastguard Worker       SectionKind::getData());
102*9880d681SAndroid Build Coastguard Worker 
103*9880d681SAndroid Build Coastguard Worker   CStringSection // .cstring
104*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__TEXT", "__cstring",
105*9880d681SAndroid Build Coastguard Worker                            MachO::S_CSTRING_LITERALS,
106*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMergeable1ByteCString());
107*9880d681SAndroid Build Coastguard Worker   UStringSection
108*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__TEXT","__ustring", 0,
109*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMergeable2ByteCString());
110*9880d681SAndroid Build Coastguard Worker   FourByteConstantSection // .literal4
111*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__TEXT", "__literal4",
112*9880d681SAndroid Build Coastguard Worker                            MachO::S_4BYTE_LITERALS,
113*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMergeableConst4());
114*9880d681SAndroid Build Coastguard Worker   EightByteConstantSection // .literal8
115*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__TEXT", "__literal8",
116*9880d681SAndroid Build Coastguard Worker                            MachO::S_8BYTE_LITERALS,
117*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMergeableConst8());
118*9880d681SAndroid Build Coastguard Worker 
119*9880d681SAndroid Build Coastguard Worker   SixteenByteConstantSection // .literal16
120*9880d681SAndroid Build Coastguard Worker       = Ctx->getMachOSection("__TEXT", "__literal16",
121*9880d681SAndroid Build Coastguard Worker                              MachO::S_16BYTE_LITERALS,
122*9880d681SAndroid Build Coastguard Worker                              SectionKind::getMergeableConst16());
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker   ReadOnlySection  // .const
125*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__TEXT", "__const", 0,
126*9880d681SAndroid Build Coastguard Worker                            SectionKind::getReadOnly());
127*9880d681SAndroid Build Coastguard Worker 
128*9880d681SAndroid Build Coastguard Worker   // If the target is not powerpc, map the coal sections to the non-coal
129*9880d681SAndroid Build Coastguard Worker   // sections.
130*9880d681SAndroid Build Coastguard Worker   //
131*9880d681SAndroid Build Coastguard Worker   // "__TEXT/__textcoal_nt" => section "__TEXT/__text"
132*9880d681SAndroid Build Coastguard Worker   // "__TEXT/__const_coal"  => section "__TEXT/__const"
133*9880d681SAndroid Build Coastguard Worker   // "__DATA/__datacoal_nt" => section "__DATA/__data"
134*9880d681SAndroid Build Coastguard Worker   Triple::ArchType ArchTy = T.getArch();
135*9880d681SAndroid Build Coastguard Worker 
136*9880d681SAndroid Build Coastguard Worker   if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) {
137*9880d681SAndroid Build Coastguard Worker     TextCoalSection
138*9880d681SAndroid Build Coastguard Worker       = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
139*9880d681SAndroid Build Coastguard Worker                              MachO::S_COALESCED |
140*9880d681SAndroid Build Coastguard Worker                              MachO::S_ATTR_PURE_INSTRUCTIONS,
141*9880d681SAndroid Build Coastguard Worker                              SectionKind::getText());
142*9880d681SAndroid Build Coastguard Worker     ConstTextCoalSection
143*9880d681SAndroid Build Coastguard Worker       = Ctx->getMachOSection("__TEXT", "__const_coal",
144*9880d681SAndroid Build Coastguard Worker                              MachO::S_COALESCED,
145*9880d681SAndroid Build Coastguard Worker                              SectionKind::getReadOnly());
146*9880d681SAndroid Build Coastguard Worker     DataCoalSection = Ctx->getMachOSection(
147*9880d681SAndroid Build Coastguard Worker         "__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
148*9880d681SAndroid Build Coastguard Worker   } else {
149*9880d681SAndroid Build Coastguard Worker     TextCoalSection = TextSection;
150*9880d681SAndroid Build Coastguard Worker     ConstTextCoalSection = ReadOnlySection;
151*9880d681SAndroid Build Coastguard Worker     DataCoalSection = DataSection;
152*9880d681SAndroid Build Coastguard Worker   }
153*9880d681SAndroid Build Coastguard Worker 
154*9880d681SAndroid Build Coastguard Worker   ConstDataSection  // .const_data
155*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA", "__const", 0,
156*9880d681SAndroid Build Coastguard Worker                            SectionKind::getReadOnlyWithRel());
157*9880d681SAndroid Build Coastguard Worker   DataCommonSection
158*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA","__common",
159*9880d681SAndroid Build Coastguard Worker                            MachO::S_ZEROFILL,
160*9880d681SAndroid Build Coastguard Worker                            SectionKind::getBSS());
161*9880d681SAndroid Build Coastguard Worker   DataBSSSection
162*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL,
163*9880d681SAndroid Build Coastguard Worker                            SectionKind::getBSS());
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker 
166*9880d681SAndroid Build Coastguard Worker   LazySymbolPointerSection
167*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
168*9880d681SAndroid Build Coastguard Worker                            MachO::S_LAZY_SYMBOL_POINTERS,
169*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
170*9880d681SAndroid Build Coastguard Worker   NonLazySymbolPointerSection
171*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
172*9880d681SAndroid Build Coastguard Worker                            MachO::S_NON_LAZY_SYMBOL_POINTERS,
173*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
174*9880d681SAndroid Build Coastguard Worker 
175*9880d681SAndroid Build Coastguard Worker   ThreadLocalPointerSection
176*9880d681SAndroid Build Coastguard Worker     = Ctx->getMachOSection("__DATA", "__thread_ptr",
177*9880d681SAndroid Build Coastguard Worker                            MachO::S_THREAD_LOCAL_VARIABLE_POINTERS,
178*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
179*9880d681SAndroid Build Coastguard Worker 
180*9880d681SAndroid Build Coastguard Worker   if (!PositionIndependent) {
181*9880d681SAndroid Build Coastguard Worker     StaticCtorSection = Ctx->getMachOSection("__TEXT", "__constructor", 0,
182*9880d681SAndroid Build Coastguard Worker                                              SectionKind::getData());
183*9880d681SAndroid Build Coastguard Worker     StaticDtorSection = Ctx->getMachOSection("__TEXT", "__destructor", 0,
184*9880d681SAndroid Build Coastguard Worker                                              SectionKind::getData());
185*9880d681SAndroid Build Coastguard Worker   } else {
186*9880d681SAndroid Build Coastguard Worker     StaticCtorSection = Ctx->getMachOSection("__DATA", "__mod_init_func",
187*9880d681SAndroid Build Coastguard Worker                                              MachO::S_MOD_INIT_FUNC_POINTERS,
188*9880d681SAndroid Build Coastguard Worker                                              SectionKind::getData());
189*9880d681SAndroid Build Coastguard Worker     StaticDtorSection = Ctx->getMachOSection("__DATA", "__mod_term_func",
190*9880d681SAndroid Build Coastguard Worker                                              MachO::S_MOD_TERM_FUNC_POINTERS,
191*9880d681SAndroid Build Coastguard Worker                                              SectionKind::getData());
192*9880d681SAndroid Build Coastguard Worker   }
193*9880d681SAndroid Build Coastguard Worker 
194*9880d681SAndroid Build Coastguard Worker   // Exception Handling.
195*9880d681SAndroid Build Coastguard Worker   LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
196*9880d681SAndroid Build Coastguard Worker                                      SectionKind::getReadOnlyWithRel());
197*9880d681SAndroid Build Coastguard Worker 
198*9880d681SAndroid Build Coastguard Worker   COFFDebugSymbolsSection = nullptr;
199*9880d681SAndroid Build Coastguard Worker   COFFDebugTypesSection = nullptr;
200*9880d681SAndroid Build Coastguard Worker 
201*9880d681SAndroid Build Coastguard Worker   if (useCompactUnwind(T)) {
202*9880d681SAndroid Build Coastguard Worker     CompactUnwindSection =
203*9880d681SAndroid Build Coastguard Worker         Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
204*9880d681SAndroid Build Coastguard Worker                              SectionKind::getReadOnly());
205*9880d681SAndroid Build Coastguard Worker 
206*9880d681SAndroid Build Coastguard Worker     if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
207*9880d681SAndroid Build Coastguard Worker       CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_X86_64_MODE_DWARF
208*9880d681SAndroid Build Coastguard Worker     else if (T.getArch() == Triple::aarch64)
209*9880d681SAndroid Build Coastguard Worker       CompactUnwindDwarfEHFrameOnly = 0x03000000;  // UNWIND_ARM64_MODE_DWARF
210*9880d681SAndroid Build Coastguard Worker     else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
211*9880d681SAndroid Build Coastguard Worker       CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_ARM_MODE_DWARF
212*9880d681SAndroid Build Coastguard Worker   }
213*9880d681SAndroid Build Coastguard Worker 
214*9880d681SAndroid Build Coastguard Worker   // Debug Information.
215*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamesSection =
216*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,
217*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "names_begin");
218*9880d681SAndroid Build Coastguard Worker   DwarfAccelObjCSection =
219*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
220*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "objc_begin");
221*9880d681SAndroid Build Coastguard Worker   // 16 character section limit...
222*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamespaceSection =
223*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
224*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "namespac_begin");
225*9880d681SAndroid Build Coastguard Worker   DwarfAccelTypesSection =
226*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
227*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "types_begin");
228*9880d681SAndroid Build Coastguard Worker 
229*9880d681SAndroid Build Coastguard Worker   DwarfAbbrevSection =
230*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
231*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "section_abbrev");
232*9880d681SAndroid Build Coastguard Worker   DwarfInfoSection =
233*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
234*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "section_info");
235*9880d681SAndroid Build Coastguard Worker   DwarfLineSection =
236*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,
237*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "section_line");
238*9880d681SAndroid Build Coastguard Worker   DwarfFrameSection =
239*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,
240*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
241*9880d681SAndroid Build Coastguard Worker   DwarfPubNamesSection =
242*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
243*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
244*9880d681SAndroid Build Coastguard Worker   DwarfPubTypesSection =
245*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
246*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
247*9880d681SAndroid Build Coastguard Worker   DwarfGnuPubNamesSection =
248*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
249*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
250*9880d681SAndroid Build Coastguard Worker   DwarfGnuPubTypesSection =
251*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
252*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
253*9880d681SAndroid Build Coastguard Worker   DwarfStrSection =
254*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
255*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "info_string");
256*9880d681SAndroid Build Coastguard Worker   DwarfLocSection =
257*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
258*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "section_debug_loc");
259*9880d681SAndroid Build Coastguard Worker   DwarfARangesSection =
260*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
261*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
262*9880d681SAndroid Build Coastguard Worker   DwarfRangesSection =
263*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
264*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "debug_range");
265*9880d681SAndroid Build Coastguard Worker   DwarfMacinfoSection =
266*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,
267*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata(), "debug_macinfo");
268*9880d681SAndroid Build Coastguard Worker   DwarfDebugInlineSection =
269*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
270*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
271*9880d681SAndroid Build Coastguard Worker   DwarfCUIndexSection =
272*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
273*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
274*9880d681SAndroid Build Coastguard Worker   DwarfTUIndexSection =
275*9880d681SAndroid Build Coastguard Worker       Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
276*9880d681SAndroid Build Coastguard Worker                            SectionKind::getMetadata());
277*9880d681SAndroid Build Coastguard Worker   StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
278*9880d681SAndroid Build Coastguard Worker                                          0, SectionKind::getMetadata());
279*9880d681SAndroid Build Coastguard Worker 
280*9880d681SAndroid Build Coastguard Worker   FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
281*9880d681SAndroid Build Coastguard Worker                                          0, SectionKind::getMetadata());
282*9880d681SAndroid Build Coastguard Worker 
283*9880d681SAndroid Build Coastguard Worker   TLSExtraDataSection = TLSTLVSection;
284*9880d681SAndroid Build Coastguard Worker }
285*9880d681SAndroid Build Coastguard Worker 
initELFMCObjectFileInfo(const Triple & T)286*9880d681SAndroid Build Coastguard Worker void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T) {
287*9880d681SAndroid Build Coastguard Worker   switch (T.getArch()) {
288*9880d681SAndroid Build Coastguard Worker   case Triple::mips:
289*9880d681SAndroid Build Coastguard Worker   case Triple::mipsel:
290*9880d681SAndroid Build Coastguard Worker     FDECFIEncoding = dwarf::DW_EH_PE_sdata4;
291*9880d681SAndroid Build Coastguard Worker     break;
292*9880d681SAndroid Build Coastguard Worker   case Triple::mips64:
293*9880d681SAndroid Build Coastguard Worker   case Triple::mips64el:
294*9880d681SAndroid Build Coastguard Worker     FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
295*9880d681SAndroid Build Coastguard Worker     break;
296*9880d681SAndroid Build Coastguard Worker   case Triple::x86_64:
297*9880d681SAndroid Build Coastguard Worker     FDECFIEncoding = dwarf::DW_EH_PE_pcrel |
298*9880d681SAndroid Build Coastguard Worker                      ((CMModel == CodeModel::Large) ? dwarf::DW_EH_PE_sdata8
299*9880d681SAndroid Build Coastguard Worker                                                     : dwarf::DW_EH_PE_sdata4);
300*9880d681SAndroid Build Coastguard Worker     break;
301*9880d681SAndroid Build Coastguard Worker   default:
302*9880d681SAndroid Build Coastguard Worker     FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
303*9880d681SAndroid Build Coastguard Worker     break;
304*9880d681SAndroid Build Coastguard Worker   }
305*9880d681SAndroid Build Coastguard Worker 
306*9880d681SAndroid Build Coastguard Worker   switch (T.getArch()) {
307*9880d681SAndroid Build Coastguard Worker   case Triple::arm:
308*9880d681SAndroid Build Coastguard Worker   case Triple::armeb:
309*9880d681SAndroid Build Coastguard Worker   case Triple::thumb:
310*9880d681SAndroid Build Coastguard Worker   case Triple::thumbeb:
311*9880d681SAndroid Build Coastguard Worker     if (Ctx->getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
312*9880d681SAndroid Build Coastguard Worker       break;
313*9880d681SAndroid Build Coastguard Worker     // Fallthrough if not using EHABI
314*9880d681SAndroid Build Coastguard Worker   case Triple::ppc:
315*9880d681SAndroid Build Coastguard Worker   case Triple::x86:
316*9880d681SAndroid Build Coastguard Worker     PersonalityEncoding = PositionIndependent
317*9880d681SAndroid Build Coastguard Worker                               ? dwarf::DW_EH_PE_indirect |
318*9880d681SAndroid Build Coastguard Worker                                     dwarf::DW_EH_PE_pcrel |
319*9880d681SAndroid Build Coastguard Worker                                     dwarf::DW_EH_PE_sdata4
320*9880d681SAndroid Build Coastguard Worker                               : dwarf::DW_EH_PE_absptr;
321*9880d681SAndroid Build Coastguard Worker     LSDAEncoding = PositionIndependent
322*9880d681SAndroid Build Coastguard Worker                        ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
323*9880d681SAndroid Build Coastguard Worker                        : dwarf::DW_EH_PE_absptr;
324*9880d681SAndroid Build Coastguard Worker     TTypeEncoding = PositionIndependent
325*9880d681SAndroid Build Coastguard Worker                         ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
326*9880d681SAndroid Build Coastguard Worker                               dwarf::DW_EH_PE_sdata4
327*9880d681SAndroid Build Coastguard Worker                         : dwarf::DW_EH_PE_absptr;
328*9880d681SAndroid Build Coastguard Worker     break;
329*9880d681SAndroid Build Coastguard Worker   case Triple::x86_64:
330*9880d681SAndroid Build Coastguard Worker     if (PositionIndependent) {
331*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
332*9880d681SAndroid Build Coastguard Worker         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
333*9880d681SAndroid Build Coastguard Worker          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
334*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_pcrel |
335*9880d681SAndroid Build Coastguard Worker         (CMModel == CodeModel::Small
336*9880d681SAndroid Build Coastguard Worker          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
337*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
338*9880d681SAndroid Build Coastguard Worker         ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
339*9880d681SAndroid Build Coastguard Worker          ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8);
340*9880d681SAndroid Build Coastguard Worker     } else {
341*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding =
342*9880d681SAndroid Build Coastguard Worker         (CMModel == CodeModel::Small || CMModel == CodeModel::Medium)
343*9880d681SAndroid Build Coastguard Worker         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
344*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = (CMModel == CodeModel::Small)
345*9880d681SAndroid Build Coastguard Worker         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
346*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = (CMModel == CodeModel::Small)
347*9880d681SAndroid Build Coastguard Worker         ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr;
348*9880d681SAndroid Build Coastguard Worker     }
349*9880d681SAndroid Build Coastguard Worker     break;
350*9880d681SAndroid Build Coastguard Worker   case Triple::hexagon:
351*9880d681SAndroid Build Coastguard Worker     PersonalityEncoding = dwarf::DW_EH_PE_absptr;
352*9880d681SAndroid Build Coastguard Worker     LSDAEncoding = dwarf::DW_EH_PE_absptr;
353*9880d681SAndroid Build Coastguard Worker     FDECFIEncoding = dwarf::DW_EH_PE_absptr;
354*9880d681SAndroid Build Coastguard Worker     TTypeEncoding = dwarf::DW_EH_PE_absptr;
355*9880d681SAndroid Build Coastguard Worker     if (PositionIndependent) {
356*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
357*9880d681SAndroid Build Coastguard Worker       LSDAEncoding |= dwarf::DW_EH_PE_pcrel;
358*9880d681SAndroid Build Coastguard Worker       FDECFIEncoding |= dwarf::DW_EH_PE_pcrel;
359*9880d681SAndroid Build Coastguard Worker       TTypeEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
360*9880d681SAndroid Build Coastguard Worker     }
361*9880d681SAndroid Build Coastguard Worker     break;
362*9880d681SAndroid Build Coastguard Worker   case Triple::aarch64:
363*9880d681SAndroid Build Coastguard Worker   case Triple::aarch64_be:
364*9880d681SAndroid Build Coastguard Worker     // The small model guarantees static code/data size < 4GB, but not where it
365*9880d681SAndroid Build Coastguard Worker     // will be in memory. Most of these could end up >2GB away so even a signed
366*9880d681SAndroid Build Coastguard Worker     // pc-relative 32-bit address is insufficient, theoretically.
367*9880d681SAndroid Build Coastguard Worker     if (PositionIndependent) {
368*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
369*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata8;
370*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
371*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
372*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata8;
373*9880d681SAndroid Build Coastguard Worker     } else {
374*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
375*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_absptr;
376*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_absptr;
377*9880d681SAndroid Build Coastguard Worker     }
378*9880d681SAndroid Build Coastguard Worker     break;
379*9880d681SAndroid Build Coastguard Worker   case Triple::lanai:
380*9880d681SAndroid Build Coastguard Worker     LSDAEncoding = dwarf::DW_EH_PE_absptr;
381*9880d681SAndroid Build Coastguard Worker     PersonalityEncoding = dwarf::DW_EH_PE_absptr;
382*9880d681SAndroid Build Coastguard Worker     TTypeEncoding = dwarf::DW_EH_PE_absptr;
383*9880d681SAndroid Build Coastguard Worker     break;
384*9880d681SAndroid Build Coastguard Worker   case Triple::mips:
385*9880d681SAndroid Build Coastguard Worker   case Triple::mipsel:
386*9880d681SAndroid Build Coastguard Worker   case Triple::mips64:
387*9880d681SAndroid Build Coastguard Worker   case Triple::mips64el:
388*9880d681SAndroid Build Coastguard Worker     // MIPS uses indirect pointer to refer personality functions and types, so
389*9880d681SAndroid Build Coastguard Worker     // that the eh_frame section can be read-only. DW.ref.personality will be
390*9880d681SAndroid Build Coastguard Worker     // generated for relocation.
391*9880d681SAndroid Build Coastguard Worker     PersonalityEncoding = dwarf::DW_EH_PE_indirect;
392*9880d681SAndroid Build Coastguard Worker     // FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
393*9880d681SAndroid Build Coastguard Worker     //        identify N64 from just a triple.
394*9880d681SAndroid Build Coastguard Worker     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
395*9880d681SAndroid Build Coastguard Worker                     dwarf::DW_EH_PE_sdata4;
396*9880d681SAndroid Build Coastguard Worker     // We don't support PC-relative LSDA references in GAS so we use the default
397*9880d681SAndroid Build Coastguard Worker     // DW_EH_PE_absptr for those.
398*9880d681SAndroid Build Coastguard Worker     break;
399*9880d681SAndroid Build Coastguard Worker   case Triple::ppc64:
400*9880d681SAndroid Build Coastguard Worker   case Triple::ppc64le:
401*9880d681SAndroid Build Coastguard Worker     PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
402*9880d681SAndroid Build Coastguard Worker       dwarf::DW_EH_PE_udata8;
403*9880d681SAndroid Build Coastguard Worker     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
404*9880d681SAndroid Build Coastguard Worker     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
405*9880d681SAndroid Build Coastguard Worker       dwarf::DW_EH_PE_udata8;
406*9880d681SAndroid Build Coastguard Worker     break;
407*9880d681SAndroid Build Coastguard Worker   case Triple::sparcel:
408*9880d681SAndroid Build Coastguard Worker   case Triple::sparc:
409*9880d681SAndroid Build Coastguard Worker     if (PositionIndependent) {
410*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
411*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
412*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata4;
413*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
414*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata4;
415*9880d681SAndroid Build Coastguard Worker     } else {
416*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_absptr;
417*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
418*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_absptr;
419*9880d681SAndroid Build Coastguard Worker     }
420*9880d681SAndroid Build Coastguard Worker     break;
421*9880d681SAndroid Build Coastguard Worker   case Triple::sparcv9:
422*9880d681SAndroid Build Coastguard Worker     LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
423*9880d681SAndroid Build Coastguard Worker     if (PositionIndependent) {
424*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
425*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata4;
426*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
427*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata4;
428*9880d681SAndroid Build Coastguard Worker     } else {
429*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
430*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_absptr;
431*9880d681SAndroid Build Coastguard Worker     }
432*9880d681SAndroid Build Coastguard Worker     break;
433*9880d681SAndroid Build Coastguard Worker   case Triple::systemz:
434*9880d681SAndroid Build Coastguard Worker     // All currently-defined code models guarantee that 4-byte PC-relative
435*9880d681SAndroid Build Coastguard Worker     // values will be in range.
436*9880d681SAndroid Build Coastguard Worker     if (PositionIndependent) {
437*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
438*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata4;
439*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
440*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
441*9880d681SAndroid Build Coastguard Worker         dwarf::DW_EH_PE_sdata4;
442*9880d681SAndroid Build Coastguard Worker     } else {
443*9880d681SAndroid Build Coastguard Worker       PersonalityEncoding = dwarf::DW_EH_PE_absptr;
444*9880d681SAndroid Build Coastguard Worker       LSDAEncoding = dwarf::DW_EH_PE_absptr;
445*9880d681SAndroid Build Coastguard Worker       TTypeEncoding = dwarf::DW_EH_PE_absptr;
446*9880d681SAndroid Build Coastguard Worker     }
447*9880d681SAndroid Build Coastguard Worker     break;
448*9880d681SAndroid Build Coastguard Worker   default:
449*9880d681SAndroid Build Coastguard Worker     break;
450*9880d681SAndroid Build Coastguard Worker   }
451*9880d681SAndroid Build Coastguard Worker 
452*9880d681SAndroid Build Coastguard Worker   unsigned EHSectionType = T.getArch() == Triple::x86_64
453*9880d681SAndroid Build Coastguard Worker                                ? ELF::SHT_X86_64_UNWIND
454*9880d681SAndroid Build Coastguard Worker                                : ELF::SHT_PROGBITS;
455*9880d681SAndroid Build Coastguard Worker 
456*9880d681SAndroid Build Coastguard Worker   // Solaris requires different flags for .eh_frame to seemingly every other
457*9880d681SAndroid Build Coastguard Worker   // platform.
458*9880d681SAndroid Build Coastguard Worker   unsigned EHSectionFlags = ELF::SHF_ALLOC;
459*9880d681SAndroid Build Coastguard Worker   if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
460*9880d681SAndroid Build Coastguard Worker     EHSectionFlags |= ELF::SHF_WRITE;
461*9880d681SAndroid Build Coastguard Worker 
462*9880d681SAndroid Build Coastguard Worker   // ELF
463*9880d681SAndroid Build Coastguard Worker   BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
464*9880d681SAndroid Build Coastguard Worker                                   ELF::SHF_WRITE | ELF::SHF_ALLOC);
465*9880d681SAndroid Build Coastguard Worker 
466*9880d681SAndroid Build Coastguard Worker   TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
467*9880d681SAndroid Build Coastguard Worker                                    ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
468*9880d681SAndroid Build Coastguard Worker 
469*9880d681SAndroid Build Coastguard Worker   DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
470*9880d681SAndroid Build Coastguard Worker                                    ELF::SHF_WRITE | ELF::SHF_ALLOC);
471*9880d681SAndroid Build Coastguard Worker 
472*9880d681SAndroid Build Coastguard Worker   ReadOnlySection =
473*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
474*9880d681SAndroid Build Coastguard Worker 
475*9880d681SAndroid Build Coastguard Worker   TLSDataSection =
476*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
477*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
478*9880d681SAndroid Build Coastguard Worker 
479*9880d681SAndroid Build Coastguard Worker   TLSBSSSection = Ctx->getELFSection(
480*9880d681SAndroid Build Coastguard Worker       ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
481*9880d681SAndroid Build Coastguard Worker 
482*9880d681SAndroid Build Coastguard Worker   DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
483*9880d681SAndroid Build Coastguard Worker                                         ELF::SHF_ALLOC | ELF::SHF_WRITE);
484*9880d681SAndroid Build Coastguard Worker 
485*9880d681SAndroid Build Coastguard Worker   MergeableConst4Section =
486*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
487*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 4, "");
488*9880d681SAndroid Build Coastguard Worker 
489*9880d681SAndroid Build Coastguard Worker   MergeableConst8Section =
490*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
491*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 8, "");
492*9880d681SAndroid Build Coastguard Worker 
493*9880d681SAndroid Build Coastguard Worker   MergeableConst16Section =
494*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
495*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, "");
496*9880d681SAndroid Build Coastguard Worker 
497*9880d681SAndroid Build Coastguard Worker   MergeableConst32Section =
498*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
499*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, "");
500*9880d681SAndroid Build Coastguard Worker 
501*9880d681SAndroid Build Coastguard Worker   StaticCtorSection = Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS,
502*9880d681SAndroid Build Coastguard Worker                                          ELF::SHF_ALLOC | ELF::SHF_WRITE);
503*9880d681SAndroid Build Coastguard Worker 
504*9880d681SAndroid Build Coastguard Worker   StaticDtorSection = Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS,
505*9880d681SAndroid Build Coastguard Worker                                          ELF::SHF_ALLOC | ELF::SHF_WRITE);
506*9880d681SAndroid Build Coastguard Worker 
507*9880d681SAndroid Build Coastguard Worker   // Exception Handling Sections.
508*9880d681SAndroid Build Coastguard Worker 
509*9880d681SAndroid Build Coastguard Worker   // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
510*9880d681SAndroid Build Coastguard Worker   // it contains relocatable pointers.  In PIC mode, this is probably a big
511*9880d681SAndroid Build Coastguard Worker   // runtime hit for C++ apps.  Either the contents of the LSDA need to be
512*9880d681SAndroid Build Coastguard Worker   // adjusted or this should be a data section.
513*9880d681SAndroid Build Coastguard Worker   LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
514*9880d681SAndroid Build Coastguard Worker                                    ELF::SHF_ALLOC);
515*9880d681SAndroid Build Coastguard Worker 
516*9880d681SAndroid Build Coastguard Worker   COFFDebugSymbolsSection = nullptr;
517*9880d681SAndroid Build Coastguard Worker   COFFDebugTypesSection = nullptr;
518*9880d681SAndroid Build Coastguard Worker 
519*9880d681SAndroid Build Coastguard Worker   // Debug Info Sections.
520*9880d681SAndroid Build Coastguard Worker   DwarfAbbrevSection = Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
521*9880d681SAndroid Build Coastguard Worker                                           "section_abbrev");
522*9880d681SAndroid Build Coastguard Worker   DwarfInfoSection =
523*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, "section_info");
524*9880d681SAndroid Build Coastguard Worker   DwarfLineSection = Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0);
525*9880d681SAndroid Build Coastguard Worker   DwarfFrameSection = Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0);
526*9880d681SAndroid Build Coastguard Worker   DwarfPubNamesSection =
527*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0);
528*9880d681SAndroid Build Coastguard Worker   DwarfPubTypesSection =
529*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0);
530*9880d681SAndroid Build Coastguard Worker   DwarfGnuPubNamesSection =
531*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_gnu_pubnames", ELF::SHT_PROGBITS, 0);
532*9880d681SAndroid Build Coastguard Worker   DwarfGnuPubTypesSection =
533*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_gnu_pubtypes", ELF::SHT_PROGBITS, 0);
534*9880d681SAndroid Build Coastguard Worker   DwarfStrSection =
535*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS,
536*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
537*9880d681SAndroid Build Coastguard Worker   DwarfLocSection = Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0);
538*9880d681SAndroid Build Coastguard Worker   DwarfARangesSection =
539*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0);
540*9880d681SAndroid Build Coastguard Worker   DwarfRangesSection =
541*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, "debug_range");
542*9880d681SAndroid Build Coastguard Worker   DwarfMacinfoSection = Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS,
543*9880d681SAndroid Build Coastguard Worker                                            0, "debug_macinfo");
544*9880d681SAndroid Build Coastguard Worker 
545*9880d681SAndroid Build Coastguard Worker   // DWARF5 Experimental Debug Info
546*9880d681SAndroid Build Coastguard Worker 
547*9880d681SAndroid Build Coastguard Worker   // Accelerator Tables
548*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamesSection =
549*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0, "names_begin");
550*9880d681SAndroid Build Coastguard Worker   DwarfAccelObjCSection =
551*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0, "objc_begin");
552*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamespaceSection = Ctx->getELFSection(
553*9880d681SAndroid Build Coastguard Worker       ".apple_namespaces", ELF::SHT_PROGBITS, 0, "namespac_begin");
554*9880d681SAndroid Build Coastguard Worker   DwarfAccelTypesSection =
555*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0, "types_begin");
556*9880d681SAndroid Build Coastguard Worker 
557*9880d681SAndroid Build Coastguard Worker   // Fission Sections
558*9880d681SAndroid Build Coastguard Worker   DwarfInfoDWOSection =
559*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0);
560*9880d681SAndroid Build Coastguard Worker   DwarfTypesDWOSection =
561*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_types.dwo", ELF::SHT_PROGBITS, 0);
562*9880d681SAndroid Build Coastguard Worker   DwarfAbbrevDWOSection =
563*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0);
564*9880d681SAndroid Build Coastguard Worker   DwarfStrDWOSection =
565*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS,
566*9880d681SAndroid Build Coastguard Worker                          ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
567*9880d681SAndroid Build Coastguard Worker   DwarfLineDWOSection =
568*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0);
569*9880d681SAndroid Build Coastguard Worker   DwarfLocDWOSection =
570*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0, "skel_loc");
571*9880d681SAndroid Build Coastguard Worker   DwarfStrOffDWOSection =
572*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0);
573*9880d681SAndroid Build Coastguard Worker   DwarfAddrSection =
574*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0, "addr_sec");
575*9880d681SAndroid Build Coastguard Worker 
576*9880d681SAndroid Build Coastguard Worker   // DWP Sections
577*9880d681SAndroid Build Coastguard Worker   DwarfCUIndexSection =
578*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_cu_index", ELF::SHT_PROGBITS, 0);
579*9880d681SAndroid Build Coastguard Worker   DwarfTUIndexSection =
580*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".debug_tu_index", ELF::SHT_PROGBITS, 0);
581*9880d681SAndroid Build Coastguard Worker 
582*9880d681SAndroid Build Coastguard Worker   StackMapSection =
583*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
584*9880d681SAndroid Build Coastguard Worker 
585*9880d681SAndroid Build Coastguard Worker   FaultMapSection =
586*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
587*9880d681SAndroid Build Coastguard Worker 
588*9880d681SAndroid Build Coastguard Worker   EHFrameSection =
589*9880d681SAndroid Build Coastguard Worker       Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
590*9880d681SAndroid Build Coastguard Worker }
591*9880d681SAndroid Build Coastguard Worker 
initCOFFMCObjectFileInfo(const Triple & T)592*9880d681SAndroid Build Coastguard Worker void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
593*9880d681SAndroid Build Coastguard Worker   EHFrameSection = Ctx->getCOFFSection(
594*9880d681SAndroid Build Coastguard Worker       ".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
595*9880d681SAndroid Build Coastguard Worker                        COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
596*9880d681SAndroid Build Coastguard Worker       SectionKind::getData());
597*9880d681SAndroid Build Coastguard Worker 
598*9880d681SAndroid Build Coastguard Worker   // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode.  This is
599*9880d681SAndroid Build Coastguard Worker   // used to indicate to the linker that the text segment contains thumb instructions
600*9880d681SAndroid Build Coastguard Worker   // and to set the ISA selection bit for calls accordingly.
601*9880d681SAndroid Build Coastguard Worker   const bool IsThumb = T.getArch() == Triple::thumb;
602*9880d681SAndroid Build Coastguard Worker 
603*9880d681SAndroid Build Coastguard Worker   CommDirectiveSupportsAlignment = true;
604*9880d681SAndroid Build Coastguard Worker 
605*9880d681SAndroid Build Coastguard Worker   // COFF
606*9880d681SAndroid Build Coastguard Worker   BSSSection = Ctx->getCOFFSection(
607*9880d681SAndroid Build Coastguard Worker       ".bss", COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
608*9880d681SAndroid Build Coastguard Worker                   COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
609*9880d681SAndroid Build Coastguard Worker       SectionKind::getBSS());
610*9880d681SAndroid Build Coastguard Worker   TextSection = Ctx->getCOFFSection(
611*9880d681SAndroid Build Coastguard Worker       ".text",
612*9880d681SAndroid Build Coastguard Worker       (IsThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0) |
613*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
614*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
615*9880d681SAndroid Build Coastguard Worker       SectionKind::getText());
616*9880d681SAndroid Build Coastguard Worker   DataSection = Ctx->getCOFFSection(
617*9880d681SAndroid Build Coastguard Worker       ".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
618*9880d681SAndroid Build Coastguard Worker                    COFF::IMAGE_SCN_MEM_WRITE,
619*9880d681SAndroid Build Coastguard Worker       SectionKind::getData());
620*9880d681SAndroid Build Coastguard Worker   ReadOnlySection = Ctx->getCOFFSection(
621*9880d681SAndroid Build Coastguard Worker       ".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
622*9880d681SAndroid Build Coastguard Worker       SectionKind::getReadOnly());
623*9880d681SAndroid Build Coastguard Worker 
624*9880d681SAndroid Build Coastguard Worker   if (T.isKnownWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
625*9880d681SAndroid Build Coastguard Worker     StaticCtorSection =
626*9880d681SAndroid Build Coastguard Worker         Ctx->getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
627*9880d681SAndroid Build Coastguard Worker                                             COFF::IMAGE_SCN_MEM_READ,
628*9880d681SAndroid Build Coastguard Worker                             SectionKind::getReadOnly());
629*9880d681SAndroid Build Coastguard Worker     StaticDtorSection =
630*9880d681SAndroid Build Coastguard Worker         Ctx->getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
631*9880d681SAndroid Build Coastguard Worker                                             COFF::IMAGE_SCN_MEM_READ,
632*9880d681SAndroid Build Coastguard Worker                             SectionKind::getReadOnly());
633*9880d681SAndroid Build Coastguard Worker   } else {
634*9880d681SAndroid Build Coastguard Worker     StaticCtorSection = Ctx->getCOFFSection(
635*9880d681SAndroid Build Coastguard Worker         ".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
636*9880d681SAndroid Build Coastguard Worker                       COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
637*9880d681SAndroid Build Coastguard Worker         SectionKind::getData());
638*9880d681SAndroid Build Coastguard Worker     StaticDtorSection = Ctx->getCOFFSection(
639*9880d681SAndroid Build Coastguard Worker         ".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
640*9880d681SAndroid Build Coastguard Worker                       COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
641*9880d681SAndroid Build Coastguard Worker         SectionKind::getData());
642*9880d681SAndroid Build Coastguard Worker   }
643*9880d681SAndroid Build Coastguard Worker 
644*9880d681SAndroid Build Coastguard Worker   // FIXME: We're emitting LSDA info into a readonly section on COFF, even
645*9880d681SAndroid Build Coastguard Worker   // though it contains relocatable pointers.  In PIC mode, this is probably a
646*9880d681SAndroid Build Coastguard Worker   // big runtime hit for C++ apps.  Either the contents of the LSDA need to be
647*9880d681SAndroid Build Coastguard Worker   // adjusted or this should be a data section.
648*9880d681SAndroid Build Coastguard Worker   if (T.getArch() == Triple::x86_64) {
649*9880d681SAndroid Build Coastguard Worker     // On Windows 64 with SEH, the LSDA is emitted into the .xdata section
650*9880d681SAndroid Build Coastguard Worker     LSDASection = nullptr;
651*9880d681SAndroid Build Coastguard Worker   } else {
652*9880d681SAndroid Build Coastguard Worker     LSDASection = Ctx->getCOFFSection(".gcc_except_table",
653*9880d681SAndroid Build Coastguard Worker                                       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
654*9880d681SAndroid Build Coastguard Worker                                           COFF::IMAGE_SCN_MEM_READ,
655*9880d681SAndroid Build Coastguard Worker                                       SectionKind::getReadOnly());
656*9880d681SAndroid Build Coastguard Worker   }
657*9880d681SAndroid Build Coastguard Worker 
658*9880d681SAndroid Build Coastguard Worker   // Debug info.
659*9880d681SAndroid Build Coastguard Worker   COFFDebugSymbolsSection =
660*9880d681SAndroid Build Coastguard Worker       Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
661*9880d681SAndroid Build Coastguard Worker                                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
662*9880d681SAndroid Build Coastguard Worker                                        COFF::IMAGE_SCN_MEM_READ),
663*9880d681SAndroid Build Coastguard Worker                           SectionKind::getMetadata());
664*9880d681SAndroid Build Coastguard Worker   COFFDebugTypesSection =
665*9880d681SAndroid Build Coastguard Worker       Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
666*9880d681SAndroid Build Coastguard Worker                                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
667*9880d681SAndroid Build Coastguard Worker                                        COFF::IMAGE_SCN_MEM_READ),
668*9880d681SAndroid Build Coastguard Worker                           SectionKind::getMetadata());
669*9880d681SAndroid Build Coastguard Worker 
670*9880d681SAndroid Build Coastguard Worker   DwarfAbbrevSection = Ctx->getCOFFSection(
671*9880d681SAndroid Build Coastguard Worker       ".debug_abbrev",
672*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
673*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
674*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_abbrev");
675*9880d681SAndroid Build Coastguard Worker   DwarfInfoSection = Ctx->getCOFFSection(
676*9880d681SAndroid Build Coastguard Worker       ".debug_info",
677*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
678*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
679*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_info");
680*9880d681SAndroid Build Coastguard Worker   DwarfLineSection = Ctx->getCOFFSection(
681*9880d681SAndroid Build Coastguard Worker       ".debug_line",
682*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
683*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
684*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_line");
685*9880d681SAndroid Build Coastguard Worker 
686*9880d681SAndroid Build Coastguard Worker   DwarfFrameSection = Ctx->getCOFFSection(
687*9880d681SAndroid Build Coastguard Worker       ".debug_frame",
688*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
689*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
690*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
691*9880d681SAndroid Build Coastguard Worker   DwarfPubNamesSection = Ctx->getCOFFSection(
692*9880d681SAndroid Build Coastguard Worker       ".debug_pubnames",
693*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
694*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
695*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
696*9880d681SAndroid Build Coastguard Worker   DwarfPubTypesSection = Ctx->getCOFFSection(
697*9880d681SAndroid Build Coastguard Worker       ".debug_pubtypes",
698*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
699*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
700*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
701*9880d681SAndroid Build Coastguard Worker   DwarfGnuPubNamesSection = Ctx->getCOFFSection(
702*9880d681SAndroid Build Coastguard Worker       ".debug_gnu_pubnames",
703*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
704*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
705*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
706*9880d681SAndroid Build Coastguard Worker   DwarfGnuPubTypesSection = Ctx->getCOFFSection(
707*9880d681SAndroid Build Coastguard Worker       ".debug_gnu_pubtypes",
708*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
709*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
710*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
711*9880d681SAndroid Build Coastguard Worker   DwarfStrSection = Ctx->getCOFFSection(
712*9880d681SAndroid Build Coastguard Worker       ".debug_str",
713*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
714*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
715*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "info_string");
716*9880d681SAndroid Build Coastguard Worker   DwarfLocSection = Ctx->getCOFFSection(
717*9880d681SAndroid Build Coastguard Worker       ".debug_loc",
718*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
719*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
720*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_debug_loc");
721*9880d681SAndroid Build Coastguard Worker   DwarfARangesSection = Ctx->getCOFFSection(
722*9880d681SAndroid Build Coastguard Worker       ".debug_aranges",
723*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
724*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
725*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
726*9880d681SAndroid Build Coastguard Worker   DwarfRangesSection = Ctx->getCOFFSection(
727*9880d681SAndroid Build Coastguard Worker       ".debug_ranges",
728*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
729*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
730*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "debug_range");
731*9880d681SAndroid Build Coastguard Worker   DwarfMacinfoSection = Ctx->getCOFFSection(
732*9880d681SAndroid Build Coastguard Worker       ".debug_macinfo",
733*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
734*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
735*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "debug_macinfo");
736*9880d681SAndroid Build Coastguard Worker   DwarfInfoDWOSection = Ctx->getCOFFSection(
737*9880d681SAndroid Build Coastguard Worker       ".debug_info.dwo",
738*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
739*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
740*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_info_dwo");
741*9880d681SAndroid Build Coastguard Worker   DwarfTypesDWOSection = Ctx->getCOFFSection(
742*9880d681SAndroid Build Coastguard Worker       ".debug_types.dwo",
743*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
744*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
745*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_types_dwo");
746*9880d681SAndroid Build Coastguard Worker   DwarfAbbrevDWOSection = Ctx->getCOFFSection(
747*9880d681SAndroid Build Coastguard Worker       ".debug_abbrev.dwo",
748*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
749*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
750*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "section_abbrev_dwo");
751*9880d681SAndroid Build Coastguard Worker   DwarfStrDWOSection = Ctx->getCOFFSection(
752*9880d681SAndroid Build Coastguard Worker       ".debug_str.dwo",
753*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
754*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
755*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "skel_string");
756*9880d681SAndroid Build Coastguard Worker   DwarfLineDWOSection = Ctx->getCOFFSection(
757*9880d681SAndroid Build Coastguard Worker       ".debug_line.dwo",
758*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
759*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
760*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
761*9880d681SAndroid Build Coastguard Worker   DwarfLocDWOSection = Ctx->getCOFFSection(
762*9880d681SAndroid Build Coastguard Worker       ".debug_loc.dwo",
763*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
764*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
765*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "skel_loc");
766*9880d681SAndroid Build Coastguard Worker   DwarfStrOffDWOSection = Ctx->getCOFFSection(
767*9880d681SAndroid Build Coastguard Worker       ".debug_str_offsets.dwo",
768*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
769*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
770*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
771*9880d681SAndroid Build Coastguard Worker   DwarfAddrSection = Ctx->getCOFFSection(
772*9880d681SAndroid Build Coastguard Worker       ".debug_addr",
773*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
774*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
775*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "addr_sec");
776*9880d681SAndroid Build Coastguard Worker   DwarfCUIndexSection = Ctx->getCOFFSection(
777*9880d681SAndroid Build Coastguard Worker       ".debug_cu_index",
778*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
779*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
780*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
781*9880d681SAndroid Build Coastguard Worker   DwarfTUIndexSection = Ctx->getCOFFSection(
782*9880d681SAndroid Build Coastguard Worker       ".debug_tu_index",
783*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
784*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
785*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
786*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamesSection = Ctx->getCOFFSection(
787*9880d681SAndroid Build Coastguard Worker       ".apple_names",
788*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
789*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
790*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "names_begin");
791*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamespaceSection = Ctx->getCOFFSection(
792*9880d681SAndroid Build Coastguard Worker       ".apple_namespaces",
793*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
794*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
795*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "namespac_begin");
796*9880d681SAndroid Build Coastguard Worker   DwarfAccelTypesSection = Ctx->getCOFFSection(
797*9880d681SAndroid Build Coastguard Worker       ".apple_types",
798*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
799*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
800*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "types_begin");
801*9880d681SAndroid Build Coastguard Worker   DwarfAccelObjCSection = Ctx->getCOFFSection(
802*9880d681SAndroid Build Coastguard Worker       ".apple_objc",
803*9880d681SAndroid Build Coastguard Worker       COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
804*9880d681SAndroid Build Coastguard Worker           COFF::IMAGE_SCN_MEM_READ,
805*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata(), "objc_begin");
806*9880d681SAndroid Build Coastguard Worker 
807*9880d681SAndroid Build Coastguard Worker   DrectveSection = Ctx->getCOFFSection(
808*9880d681SAndroid Build Coastguard Worker       ".drectve", COFF::IMAGE_SCN_LNK_INFO | COFF::IMAGE_SCN_LNK_REMOVE,
809*9880d681SAndroid Build Coastguard Worker       SectionKind::getMetadata());
810*9880d681SAndroid Build Coastguard Worker 
811*9880d681SAndroid Build Coastguard Worker   PDataSection = Ctx->getCOFFSection(
812*9880d681SAndroid Build Coastguard Worker       ".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
813*9880d681SAndroid Build Coastguard Worker       SectionKind::getData());
814*9880d681SAndroid Build Coastguard Worker 
815*9880d681SAndroid Build Coastguard Worker   XDataSection = Ctx->getCOFFSection(
816*9880d681SAndroid Build Coastguard Worker       ".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
817*9880d681SAndroid Build Coastguard Worker       SectionKind::getData());
818*9880d681SAndroid Build Coastguard Worker 
819*9880d681SAndroid Build Coastguard Worker   SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,
820*9880d681SAndroid Build Coastguard Worker                                       SectionKind::getMetadata());
821*9880d681SAndroid Build Coastguard Worker 
822*9880d681SAndroid Build Coastguard Worker   TLSDataSection = Ctx->getCOFFSection(
823*9880d681SAndroid Build Coastguard Worker       ".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
824*9880d681SAndroid Build Coastguard Worker                    COFF::IMAGE_SCN_MEM_WRITE,
825*9880d681SAndroid Build Coastguard Worker       SectionKind::getData());
826*9880d681SAndroid Build Coastguard Worker 
827*9880d681SAndroid Build Coastguard Worker   StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
828*9880d681SAndroid Build Coastguard Worker                                         COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
829*9880d681SAndroid Build Coastguard Worker                                             COFF::IMAGE_SCN_MEM_READ,
830*9880d681SAndroid Build Coastguard Worker                                         SectionKind::getReadOnly());
831*9880d681SAndroid Build Coastguard Worker }
832*9880d681SAndroid Build Coastguard Worker 
InitMCObjectFileInfo(const Triple & TheTriple,bool PIC,CodeModel::Model cm,MCContext & ctx)833*9880d681SAndroid Build Coastguard Worker void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
834*9880d681SAndroid Build Coastguard Worker                                             CodeModel::Model cm,
835*9880d681SAndroid Build Coastguard Worker                                             MCContext &ctx) {
836*9880d681SAndroid Build Coastguard Worker   PositionIndependent = PIC;
837*9880d681SAndroid Build Coastguard Worker   CMModel = cm;
838*9880d681SAndroid Build Coastguard Worker   Ctx = &ctx;
839*9880d681SAndroid Build Coastguard Worker 
840*9880d681SAndroid Build Coastguard Worker   // Common.
841*9880d681SAndroid Build Coastguard Worker   CommDirectiveSupportsAlignment = true;
842*9880d681SAndroid Build Coastguard Worker   SupportsWeakOmittedEHFrame = true;
843*9880d681SAndroid Build Coastguard Worker   SupportsCompactUnwindWithoutEHFrame = false;
844*9880d681SAndroid Build Coastguard Worker   OmitDwarfIfHaveCompactUnwind = false;
845*9880d681SAndroid Build Coastguard Worker 
846*9880d681SAndroid Build Coastguard Worker   PersonalityEncoding = LSDAEncoding = FDECFIEncoding = TTypeEncoding =
847*9880d681SAndroid Build Coastguard Worker       dwarf::DW_EH_PE_absptr;
848*9880d681SAndroid Build Coastguard Worker 
849*9880d681SAndroid Build Coastguard Worker   CompactUnwindDwarfEHFrameOnly = 0;
850*9880d681SAndroid Build Coastguard Worker 
851*9880d681SAndroid Build Coastguard Worker   EHFrameSection = nullptr;             // Created on demand.
852*9880d681SAndroid Build Coastguard Worker   CompactUnwindSection = nullptr;       // Used only by selected targets.
853*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamesSection = nullptr;     // Used only by selected targets.
854*9880d681SAndroid Build Coastguard Worker   DwarfAccelObjCSection = nullptr;      // Used only by selected targets.
855*9880d681SAndroid Build Coastguard Worker   DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
856*9880d681SAndroid Build Coastguard Worker   DwarfAccelTypesSection = nullptr;     // Used only by selected targets.
857*9880d681SAndroid Build Coastguard Worker 
858*9880d681SAndroid Build Coastguard Worker   TT = TheTriple;
859*9880d681SAndroid Build Coastguard Worker 
860*9880d681SAndroid Build Coastguard Worker   switch (TT.getObjectFormat()) {
861*9880d681SAndroid Build Coastguard Worker   case Triple::MachO:
862*9880d681SAndroid Build Coastguard Worker     Env = IsMachO;
863*9880d681SAndroid Build Coastguard Worker     initMachOMCObjectFileInfo(TT);
864*9880d681SAndroid Build Coastguard Worker     break;
865*9880d681SAndroid Build Coastguard Worker   case Triple::COFF:
866*9880d681SAndroid Build Coastguard Worker     if (!TT.isOSWindows())
867*9880d681SAndroid Build Coastguard Worker       report_fatal_error(
868*9880d681SAndroid Build Coastguard Worker           "Cannot initialize MC for non-Windows COFF object files.");
869*9880d681SAndroid Build Coastguard Worker 
870*9880d681SAndroid Build Coastguard Worker     Env = IsCOFF;
871*9880d681SAndroid Build Coastguard Worker     initCOFFMCObjectFileInfo(TT);
872*9880d681SAndroid Build Coastguard Worker     break;
873*9880d681SAndroid Build Coastguard Worker   case Triple::ELF:
874*9880d681SAndroid Build Coastguard Worker     Env = IsELF;
875*9880d681SAndroid Build Coastguard Worker     initELFMCObjectFileInfo(TT);
876*9880d681SAndroid Build Coastguard Worker     break;
877*9880d681SAndroid Build Coastguard Worker   case Triple::UnknownObjectFormat:
878*9880d681SAndroid Build Coastguard Worker     report_fatal_error("Cannot initialize MC for unknown object file format.");
879*9880d681SAndroid Build Coastguard Worker     break;
880*9880d681SAndroid Build Coastguard Worker   }
881*9880d681SAndroid Build Coastguard Worker }
882*9880d681SAndroid Build Coastguard Worker 
getDwarfTypesSection(uint64_t Hash) const883*9880d681SAndroid Build Coastguard Worker MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const {
884*9880d681SAndroid Build Coastguard Worker   return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,
885*9880d681SAndroid Build Coastguard Worker                             0, utostr(Hash));
886*9880d681SAndroid Build Coastguard Worker }
887