blob: 0f9070bc7dd5971bdaf3e3080cde1a51efd124fb [file] [log] [blame]
Sean Eveson661e4fb2017-11-30 12:43:25 +00001//===-- MCObjectFileInfo.cpp - Object File Information --------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/MC/MCObjectFileInfo.h"
11#include "llvm/ADT/StringExtras.h"
12#include "llvm/ADT/Triple.h"
13#include "llvm/BinaryFormat/COFF.h"
14#include "llvm/BinaryFormat/ELF.h"
15#include "llvm/MC/MCAsmInfo.h"
16#include "llvm/MC/MCContext.h"
17#include "llvm/MC/MCSection.h"
18#include "llvm/MC/MCSectionCOFF.h"
19#include "llvm/MC/MCSectionELF.h"
20#include "llvm/MC/MCSectionMachO.h"
21#include "llvm/MC/MCSectionWasm.h"
22
23using namespace llvm;
24
25static bool useCompactUnwind(const Triple &T) {
26 // Only on darwin.
27 if (!T.isOSDarwin())
28 return false;
29
30 // aarch64 always has it.
31 if (T.getArch() == Triple::aarch64)
32 return true;
33
34 // armv7k always has it.
35 if (T.isWatchABI())
36 return true;
37
38 // Use it on newer version of OS X.
39 if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6))
40 return true;
41
42 // And the iOS simulator.
43 if (T.isiOS() &&
44 (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86))
45 return true;
46
47 return false;
48}
49
50void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
51 // MachO
52 SupportsWeakOmittedEHFrame = false;
53
54 EHFrameSection = Ctx->getMachOSection(
55 "__TEXT", "__eh_frame",
56 MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
57 MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT,
58 SectionKind::getReadOnly());
59
60 if (T.isOSDarwin() && T.getArch() == Triple::aarch64)
61 SupportsCompactUnwindWithoutEHFrame = true;
62
63 if (T.isWatchABI())
64 OmitDwarfIfHaveCompactUnwind = true;
65
Reid Klecknerfce7f732018-08-09 22:24:04 +000066 FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
Sean Eveson661e4fb2017-11-30 12:43:25 +000067
68 // .comm doesn't support alignment before Leopard.
69 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
70 CommDirectiveSupportsAlignment = false;
71
72 TextSection // .text
73 = Ctx->getMachOSection("__TEXT", "__text",
74 MachO::S_ATTR_PURE_INSTRUCTIONS,
75 SectionKind::getText());
76 DataSection // .data
77 = Ctx->getMachOSection("__DATA", "__data", 0, SectionKind::getData());
78
79 // BSSSection might not be expected initialized on msvc.
80 BSSSection = nullptr;
81
82 TLSDataSection // .tdata
83 = Ctx->getMachOSection("__DATA", "__thread_data",
84 MachO::S_THREAD_LOCAL_REGULAR,
85 SectionKind::getData());
86 TLSBSSSection // .tbss
87 = Ctx->getMachOSection("__DATA", "__thread_bss",
88 MachO::S_THREAD_LOCAL_ZEROFILL,
89 SectionKind::getThreadBSS());
90
91 // TODO: Verify datarel below.
92 TLSTLVSection // .tlv
93 = Ctx->getMachOSection("__DATA", "__thread_vars",
94 MachO::S_THREAD_LOCAL_VARIABLES,
95 SectionKind::getData());
96
97 TLSThreadInitSection = Ctx->getMachOSection(
98 "__DATA", "__thread_init", MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
99 SectionKind::getData());
100
101 CStringSection // .cstring
102 = Ctx->getMachOSection("__TEXT", "__cstring",
103 MachO::S_CSTRING_LITERALS,
104 SectionKind::getMergeable1ByteCString());
105 UStringSection
106 = Ctx->getMachOSection("__TEXT","__ustring", 0,
107 SectionKind::getMergeable2ByteCString());
108 FourByteConstantSection // .literal4
109 = Ctx->getMachOSection("__TEXT", "__literal4",
110 MachO::S_4BYTE_LITERALS,
111 SectionKind::getMergeableConst4());
112 EightByteConstantSection // .literal8
113 = Ctx->getMachOSection("__TEXT", "__literal8",
114 MachO::S_8BYTE_LITERALS,
115 SectionKind::getMergeableConst8());
116
117 SixteenByteConstantSection // .literal16
118 = Ctx->getMachOSection("__TEXT", "__literal16",
119 MachO::S_16BYTE_LITERALS,
120 SectionKind::getMergeableConst16());
121
122 ReadOnlySection // .const
123 = Ctx->getMachOSection("__TEXT", "__const", 0,
124 SectionKind::getReadOnly());
125
126 // If the target is not powerpc, map the coal sections to the non-coal
127 // sections.
128 //
129 // "__TEXT/__textcoal_nt" => section "__TEXT/__text"
130 // "__TEXT/__const_coal" => section "__TEXT/__const"
131 // "__DATA/__datacoal_nt" => section "__DATA/__data"
132 Triple::ArchType ArchTy = T.getArch();
133
Steven Wud0804aa2018-04-10 20:16:35 +0000134 ConstDataSection // .const_data
135 = Ctx->getMachOSection("__DATA", "__const", 0,
136 SectionKind::getReadOnlyWithRel());
137
Sean Eveson661e4fb2017-11-30 12:43:25 +0000138 if (ArchTy == Triple::ppc || ArchTy == Triple::ppc64) {
139 TextCoalSection
140 = Ctx->getMachOSection("__TEXT", "__textcoal_nt",
141 MachO::S_COALESCED |
142 MachO::S_ATTR_PURE_INSTRUCTIONS,
143 SectionKind::getText());
144 ConstTextCoalSection
145 = Ctx->getMachOSection("__TEXT", "__const_coal",
146 MachO::S_COALESCED,
147 SectionKind::getReadOnly());
148 DataCoalSection = Ctx->getMachOSection(
149 "__DATA", "__datacoal_nt", MachO::S_COALESCED, SectionKind::getData());
Steven Wud0804aa2018-04-10 20:16:35 +0000150 ConstDataCoalSection = DataCoalSection;
Sean Eveson661e4fb2017-11-30 12:43:25 +0000151 } else {
152 TextCoalSection = TextSection;
153 ConstTextCoalSection = ReadOnlySection;
154 DataCoalSection = DataSection;
Steven Wud0804aa2018-04-10 20:16:35 +0000155 ConstDataCoalSection = ConstDataSection;
Sean Eveson661e4fb2017-11-30 12:43:25 +0000156 }
157
Sean Eveson661e4fb2017-11-30 12:43:25 +0000158 DataCommonSection
159 = Ctx->getMachOSection("__DATA","__common",
160 MachO::S_ZEROFILL,
161 SectionKind::getBSS());
162 DataBSSSection
163 = Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL,
164 SectionKind::getBSS());
165
166
167 LazySymbolPointerSection
168 = Ctx->getMachOSection("__DATA", "__la_symbol_ptr",
169 MachO::S_LAZY_SYMBOL_POINTERS,
170 SectionKind::getMetadata());
171 NonLazySymbolPointerSection
172 = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr",
173 MachO::S_NON_LAZY_SYMBOL_POINTERS,
174 SectionKind::getMetadata());
175
176 ThreadLocalPointerSection
177 = Ctx->getMachOSection("__DATA", "__thread_ptr",
178 MachO::S_THREAD_LOCAL_VARIABLE_POINTERS,
179 SectionKind::getMetadata());
180
181 // Exception Handling.
182 LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
183 SectionKind::getReadOnlyWithRel());
184
185 COFFDebugSymbolsSection = nullptr;
186 COFFDebugTypesSection = nullptr;
Zachary Turner048f8f92017-12-13 22:33:58 +0000187 COFFGlobalTypeHashesSection = nullptr;
Sean Eveson661e4fb2017-11-30 12:43:25 +0000188
189 if (useCompactUnwind(T)) {
190 CompactUnwindSection =
191 Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
192 SectionKind::getReadOnly());
193
194 if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)
195 CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_X86_64_MODE_DWARF
196 else if (T.getArch() == Triple::aarch64)
197 CompactUnwindDwarfEHFrameOnly = 0x03000000; // UNWIND_ARM64_MODE_DWARF
198 else if (T.getArch() == Triple::arm || T.getArch() == Triple::thumb)
199 CompactUnwindDwarfEHFrameOnly = 0x04000000; // UNWIND_ARM_MODE_DWARF
200 }
201
202 // Debug Information.
Pavel Labath6088c232018-04-04 14:42:14 +0000203 DwarfDebugNamesSection =
204 Ctx->getMachOSection("__DWARF", "__debug_names", MachO::S_ATTR_DEBUG,
205 SectionKind::getMetadata(), "debug_names_begin");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000206 DwarfAccelNamesSection =
207 Ctx->getMachOSection("__DWARF", "__apple_names", MachO::S_ATTR_DEBUG,
208 SectionKind::getMetadata(), "names_begin");
209 DwarfAccelObjCSection =
210 Ctx->getMachOSection("__DWARF", "__apple_objc", MachO::S_ATTR_DEBUG,
211 SectionKind::getMetadata(), "objc_begin");
212 // 16 character section limit...
213 DwarfAccelNamespaceSection =
214 Ctx->getMachOSection("__DWARF", "__apple_namespac", MachO::S_ATTR_DEBUG,
215 SectionKind::getMetadata(), "namespac_begin");
216 DwarfAccelTypesSection =
217 Ctx->getMachOSection("__DWARF", "__apple_types", MachO::S_ATTR_DEBUG,
218 SectionKind::getMetadata(), "types_begin");
219
220 DwarfSwiftASTSection =
221 Ctx->getMachOSection("__DWARF", "__swift_ast", MachO::S_ATTR_DEBUG,
222 SectionKind::getMetadata());
223
224 DwarfAbbrevSection =
225 Ctx->getMachOSection("__DWARF", "__debug_abbrev", MachO::S_ATTR_DEBUG,
226 SectionKind::getMetadata(), "section_abbrev");
227 DwarfInfoSection =
228 Ctx->getMachOSection("__DWARF", "__debug_info", MachO::S_ATTR_DEBUG,
229 SectionKind::getMetadata(), "section_info");
230 DwarfLineSection =
231 Ctx->getMachOSection("__DWARF", "__debug_line", MachO::S_ATTR_DEBUG,
232 SectionKind::getMetadata(), "section_line");
Paul Robinson1f900292018-02-06 20:29:21 +0000233 DwarfLineStrSection =
234 Ctx->getMachOSection("__DWARF", "__debug_line_str", MachO::S_ATTR_DEBUG,
235 SectionKind::getMetadata(), "section_line_str");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000236 DwarfFrameSection =
237 Ctx->getMachOSection("__DWARF", "__debug_frame", MachO::S_ATTR_DEBUG,
238 SectionKind::getMetadata());
239 DwarfPubNamesSection =
240 Ctx->getMachOSection("__DWARF", "__debug_pubnames", MachO::S_ATTR_DEBUG,
241 SectionKind::getMetadata());
242 DwarfPubTypesSection =
243 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", MachO::S_ATTR_DEBUG,
244 SectionKind::getMetadata());
245 DwarfGnuPubNamesSection =
246 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", MachO::S_ATTR_DEBUG,
247 SectionKind::getMetadata());
248 DwarfGnuPubTypesSection =
249 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", MachO::S_ATTR_DEBUG,
250 SectionKind::getMetadata());
251 DwarfStrSection =
252 Ctx->getMachOSection("__DWARF", "__debug_str", MachO::S_ATTR_DEBUG,
253 SectionKind::getMetadata(), "info_string");
254 DwarfStrOffSection =
255 Ctx->getMachOSection("__DWARF", "__debug_str_offs", MachO::S_ATTR_DEBUG,
256 SectionKind::getMetadata(), "section_str_off");
257 DwarfLocSection =
258 Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
259 SectionKind::getMetadata(), "section_debug_loc");
260 DwarfARangesSection =
261 Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
262 SectionKind::getMetadata());
263 DwarfRangesSection =
264 Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
265 SectionKind::getMetadata(), "debug_range");
Wolfgang Piebfcf38102018-07-12 18:18:21 +0000266 DwarfRnglistsSection =
267 Ctx->getMachOSection("__DWARF", "__debug_rnglists", MachO::S_ATTR_DEBUG,
268 SectionKind::getMetadata(), "debug_range");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000269 DwarfMacinfoSection =
270 Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,
271 SectionKind::getMetadata(), "debug_macinfo");
272 DwarfDebugInlineSection =
273 Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
274 SectionKind::getMetadata());
275 DwarfCUIndexSection =
276 Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
277 SectionKind::getMetadata());
278 DwarfTUIndexSection =
279 Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
280 SectionKind::getMetadata());
281 StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
282 0, SectionKind::getMetadata());
283
284 FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
285 0, SectionKind::getMetadata());
286
287 TLSExtraDataSection = TLSTLVSection;
288}
289
290void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
291 switch (T.getArch()) {
292 case Triple::mips:
293 case Triple::mipsel:
294 FDECFIEncoding = dwarf::DW_EH_PE_sdata4;
295 break;
296 case Triple::mips64:
297 case Triple::mips64el:
298 FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
299 break;
Eric Christopherfe6e6d92018-03-24 00:07:38 +0000300 case Triple::ppc64:
301 case Triple::ppc64le:
Sean Eveson661e4fb2017-11-30 12:43:25 +0000302 case Triple::x86_64:
303 FDECFIEncoding = dwarf::DW_EH_PE_pcrel |
304 (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
305 break;
306 case Triple::bpfel:
307 case Triple::bpfeb:
308 FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
309 break;
Reid Klecknerfce7f732018-08-09 22:24:04 +0000310 case Triple::hexagon:
311 FDECFIEncoding =
312 PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
Simon Pilgrim3640d852018-08-10 11:02:44 +0000313 break;
Sean Eveson661e4fb2017-11-30 12:43:25 +0000314 default:
315 FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
316 break;
317 }
318
Sean Eveson661e4fb2017-11-30 12:43:25 +0000319 unsigned EHSectionType = T.getArch() == Triple::x86_64
320 ? ELF::SHT_X86_64_UNWIND
321 : ELF::SHT_PROGBITS;
322
323 // Solaris requires different flags for .eh_frame to seemingly every other
324 // platform.
325 unsigned EHSectionFlags = ELF::SHF_ALLOC;
326 if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
327 EHSectionFlags |= ELF::SHF_WRITE;
328
329 // ELF
330 BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
331 ELF::SHF_WRITE | ELF::SHF_ALLOC);
332
333 TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
334 ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
335
336 DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
337 ELF::SHF_WRITE | ELF::SHF_ALLOC);
338
339 ReadOnlySection =
340 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
341
342 TLSDataSection =
343 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
344 ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
345
346 TLSBSSSection = Ctx->getELFSection(
347 ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
348
349 DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
350 ELF::SHF_ALLOC | ELF::SHF_WRITE);
351
352 MergeableConst4Section =
353 Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
354 ELF::SHF_ALLOC | ELF::SHF_MERGE, 4, "");
355
356 MergeableConst8Section =
357 Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
358 ELF::SHF_ALLOC | ELF::SHF_MERGE, 8, "");
359
360 MergeableConst16Section =
361 Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
362 ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, "");
363
364 MergeableConst32Section =
365 Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
366 ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, "");
367
368 // Exception Handling Sections.
369
370 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
371 // it contains relocatable pointers. In PIC mode, this is probably a big
372 // runtime hit for C++ apps. Either the contents of the LSDA need to be
373 // adjusted or this should be a data section.
374 LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
375 ELF::SHF_ALLOC);
376
377 COFFDebugSymbolsSection = nullptr;
378 COFFDebugTypesSection = nullptr;
379
380 unsigned DebugSecType = ELF::SHT_PROGBITS;
381
382 // MIPS .debug_* sections should have SHT_MIPS_DWARF section type
383 // to distinguish among sections contain DWARF and ECOFF debug formats.
384 // Sections with ECOFF debug format are obsoleted and marked by SHT_PROGBITS.
Alexander Richardson85e200e2018-06-25 16:49:20 +0000385 if (T.isMIPS())
Sean Eveson661e4fb2017-11-30 12:43:25 +0000386 DebugSecType = ELF::SHT_MIPS_DWARF;
387
388 // Debug Info Sections.
389 DwarfAbbrevSection =
390 Ctx->getELFSection(".debug_abbrev", DebugSecType, 0);
391 DwarfInfoSection = Ctx->getELFSection(".debug_info", DebugSecType, 0);
392 DwarfLineSection = Ctx->getELFSection(".debug_line", DebugSecType, 0);
Paul Robinson1f900292018-02-06 20:29:21 +0000393 DwarfLineStrSection =
394 Ctx->getELFSection(".debug_line_str", DebugSecType,
395 ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000396 DwarfFrameSection = Ctx->getELFSection(".debug_frame", DebugSecType, 0);
397 DwarfPubNamesSection =
398 Ctx->getELFSection(".debug_pubnames", DebugSecType, 0);
399 DwarfPubTypesSection =
400 Ctx->getELFSection(".debug_pubtypes", DebugSecType, 0);
401 DwarfGnuPubNamesSection =
402 Ctx->getELFSection(".debug_gnu_pubnames", DebugSecType, 0);
403 DwarfGnuPubTypesSection =
404 Ctx->getELFSection(".debug_gnu_pubtypes", DebugSecType, 0);
405 DwarfStrSection =
406 Ctx->getELFSection(".debug_str", DebugSecType,
407 ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
408 DwarfLocSection = Ctx->getELFSection(".debug_loc", DebugSecType, 0);
409 DwarfARangesSection =
410 Ctx->getELFSection(".debug_aranges", DebugSecType, 0);
411 DwarfRangesSection =
412 Ctx->getELFSection(".debug_ranges", DebugSecType, 0);
413 DwarfMacinfoSection =
414 Ctx->getELFSection(".debug_macinfo", DebugSecType, 0);
415
416 // DWARF5 Experimental Debug Info
417
418 // Accelerator Tables
Pavel Labath6088c232018-04-04 14:42:14 +0000419 DwarfDebugNamesSection =
420 Ctx->getELFSection(".debug_names", ELF::SHT_PROGBITS, 0);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000421 DwarfAccelNamesSection =
422 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);
423 DwarfAccelObjCSection =
424 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
425 DwarfAccelNamespaceSection =
426 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
427 DwarfAccelTypesSection =
428 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
429
430 // String Offset and Address Sections
431 DwarfStrOffSection =
432 Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);
433 DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0);
Wolfgang Piebfcf38102018-07-12 18:18:21 +0000434 DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000435
436 // Fission Sections
437 DwarfInfoDWOSection =
George Rimarce95ac62018-09-22 07:36:20 +0000438 Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000439 DwarfTypesDWOSection =
George Rimarce95ac62018-09-22 07:36:20 +0000440 Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000441 DwarfAbbrevDWOSection =
George Rimarce95ac62018-09-22 07:36:20 +0000442 Ctx->getELFSection(".debug_abbrev.dwo", DebugSecType, ELF::SHF_EXCLUDE);
443 DwarfStrDWOSection = Ctx->getELFSection(
444 ".debug_str.dwo", DebugSecType,
445 ELF::SHF_MERGE | ELF::SHF_STRINGS | ELF::SHF_EXCLUDE, 1, "");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000446 DwarfLineDWOSection =
George Rimarce95ac62018-09-22 07:36:20 +0000447 Ctx->getELFSection(".debug_line.dwo", DebugSecType, ELF::SHF_EXCLUDE);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000448 DwarfLocDWOSection =
George Rimarce95ac62018-09-22 07:36:20 +0000449 Ctx->getELFSection(".debug_loc.dwo", DebugSecType, ELF::SHF_EXCLUDE);
450 DwarfStrOffDWOSection = Ctx->getELFSection(".debug_str_offsets.dwo",
451 DebugSecType, ELF::SHF_EXCLUDE);
Wolfgang Piebfcf38102018-07-12 18:18:21 +0000452 DwarfRnglistsDWOSection =
George Rimarce95ac62018-09-22 07:36:20 +0000453 Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000454
455 // DWP Sections
456 DwarfCUIndexSection =
457 Ctx->getELFSection(".debug_cu_index", DebugSecType, 0);
458 DwarfTUIndexSection =
459 Ctx->getELFSection(".debug_tu_index", DebugSecType, 0);
460
461 StackMapSection =
462 Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
463
464 FaultMapSection =
465 Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
466
467 EHFrameSection =
468 Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
Sean Evesona6bcd532017-11-30 13:05:14 +0000469
470 StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
Sean Eveson661e4fb2017-11-30 12:43:25 +0000471}
472
473void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
474 EHFrameSection = Ctx->getCOFFSection(
475 ".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
476 COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
477 SectionKind::getData());
478
479 // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode. This is
480 // used to indicate to the linker that the text segment contains thumb instructions
481 // and to set the ISA selection bit for calls accordingly.
482 const bool IsThumb = T.getArch() == Triple::thumb;
483
484 CommDirectiveSupportsAlignment = true;
485
486 // COFF
487 BSSSection = Ctx->getCOFFSection(
488 ".bss", COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
489 COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
490 SectionKind::getBSS());
491 TextSection = Ctx->getCOFFSection(
492 ".text",
493 (IsThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0) |
494 COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
495 COFF::IMAGE_SCN_MEM_READ,
496 SectionKind::getText());
497 DataSection = Ctx->getCOFFSection(
498 ".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
499 COFF::IMAGE_SCN_MEM_WRITE,
500 SectionKind::getData());
501 ReadOnlySection = Ctx->getCOFFSection(
502 ".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
503 SectionKind::getReadOnly());
504
505 // FIXME: We're emitting LSDA info into a readonly section on COFF, even
506 // though it contains relocatable pointers. In PIC mode, this is probably a
507 // big runtime hit for C++ apps. Either the contents of the LSDA need to be
508 // adjusted or this should be a data section.
509 if (T.getArch() == Triple::x86_64) {
510 // On Windows 64 with SEH, the LSDA is emitted into the .xdata section
511 LSDASection = nullptr;
512 } else {
513 LSDASection = Ctx->getCOFFSection(".gcc_except_table",
514 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
515 COFF::IMAGE_SCN_MEM_READ,
516 SectionKind::getReadOnly());
517 }
518
519 // Debug info.
520 COFFDebugSymbolsSection =
521 Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
522 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
523 COFF::IMAGE_SCN_MEM_READ),
524 SectionKind::getMetadata());
525 COFFDebugTypesSection =
526 Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
527 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
528 COFF::IMAGE_SCN_MEM_READ),
529 SectionKind::getMetadata());
Zachary Turner048f8f92017-12-13 22:33:58 +0000530 COFFGlobalTypeHashesSection = Ctx->getCOFFSection(
531 ".debug$H",
532 (COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
533 COFF::IMAGE_SCN_MEM_READ),
534 SectionKind::getMetadata());
Sean Eveson661e4fb2017-11-30 12:43:25 +0000535
536 DwarfAbbrevSection = Ctx->getCOFFSection(
537 ".debug_abbrev",
538 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
539 COFF::IMAGE_SCN_MEM_READ,
540 SectionKind::getMetadata(), "section_abbrev");
541 DwarfInfoSection = Ctx->getCOFFSection(
542 ".debug_info",
543 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
544 COFF::IMAGE_SCN_MEM_READ,
545 SectionKind::getMetadata(), "section_info");
546 DwarfLineSection = Ctx->getCOFFSection(
547 ".debug_line",
548 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
549 COFF::IMAGE_SCN_MEM_READ,
550 SectionKind::getMetadata(), "section_line");
Paul Robinson1f900292018-02-06 20:29:21 +0000551 DwarfLineStrSection = Ctx->getCOFFSection(
552 ".debug_line_str",
553 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
554 COFF::IMAGE_SCN_MEM_READ,
555 SectionKind::getMetadata(), "section_line_str");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000556 DwarfFrameSection = Ctx->getCOFFSection(
557 ".debug_frame",
558 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
559 COFF::IMAGE_SCN_MEM_READ,
560 SectionKind::getMetadata());
561 DwarfPubNamesSection = Ctx->getCOFFSection(
562 ".debug_pubnames",
563 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
564 COFF::IMAGE_SCN_MEM_READ,
565 SectionKind::getMetadata());
566 DwarfPubTypesSection = Ctx->getCOFFSection(
567 ".debug_pubtypes",
568 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
569 COFF::IMAGE_SCN_MEM_READ,
570 SectionKind::getMetadata());
571 DwarfGnuPubNamesSection = Ctx->getCOFFSection(
572 ".debug_gnu_pubnames",
573 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
574 COFF::IMAGE_SCN_MEM_READ,
575 SectionKind::getMetadata());
576 DwarfGnuPubTypesSection = Ctx->getCOFFSection(
577 ".debug_gnu_pubtypes",
578 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
579 COFF::IMAGE_SCN_MEM_READ,
580 SectionKind::getMetadata());
581 DwarfStrSection = Ctx->getCOFFSection(
582 ".debug_str",
583 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
584 COFF::IMAGE_SCN_MEM_READ,
585 SectionKind::getMetadata(), "info_string");
586 DwarfStrOffSection = Ctx->getCOFFSection(
587 ".debug_str_offsets",
588 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
589 COFF::IMAGE_SCN_MEM_READ,
590 SectionKind::getMetadata(), "section_str_off");
591 DwarfLocSection = Ctx->getCOFFSection(
592 ".debug_loc",
593 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
594 COFF::IMAGE_SCN_MEM_READ,
595 SectionKind::getMetadata(), "section_debug_loc");
596 DwarfARangesSection = Ctx->getCOFFSection(
597 ".debug_aranges",
598 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
599 COFF::IMAGE_SCN_MEM_READ,
600 SectionKind::getMetadata());
601 DwarfRangesSection = Ctx->getCOFFSection(
602 ".debug_ranges",
603 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
604 COFF::IMAGE_SCN_MEM_READ,
605 SectionKind::getMetadata(), "debug_range");
606 DwarfMacinfoSection = Ctx->getCOFFSection(
607 ".debug_macinfo",
608 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
609 COFF::IMAGE_SCN_MEM_READ,
610 SectionKind::getMetadata(), "debug_macinfo");
611 DwarfInfoDWOSection = Ctx->getCOFFSection(
612 ".debug_info.dwo",
613 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
614 COFF::IMAGE_SCN_MEM_READ,
615 SectionKind::getMetadata(), "section_info_dwo");
616 DwarfTypesDWOSection = Ctx->getCOFFSection(
617 ".debug_types.dwo",
618 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
619 COFF::IMAGE_SCN_MEM_READ,
620 SectionKind::getMetadata(), "section_types_dwo");
621 DwarfAbbrevDWOSection = Ctx->getCOFFSection(
622 ".debug_abbrev.dwo",
623 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
624 COFF::IMAGE_SCN_MEM_READ,
625 SectionKind::getMetadata(), "section_abbrev_dwo");
626 DwarfStrDWOSection = Ctx->getCOFFSection(
627 ".debug_str.dwo",
628 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
629 COFF::IMAGE_SCN_MEM_READ,
630 SectionKind::getMetadata(), "skel_string");
631 DwarfLineDWOSection = Ctx->getCOFFSection(
632 ".debug_line.dwo",
633 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
634 COFF::IMAGE_SCN_MEM_READ,
635 SectionKind::getMetadata());
636 DwarfLocDWOSection = Ctx->getCOFFSection(
637 ".debug_loc.dwo",
638 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
639 COFF::IMAGE_SCN_MEM_READ,
640 SectionKind::getMetadata(), "skel_loc");
641 DwarfStrOffDWOSection = Ctx->getCOFFSection(
642 ".debug_str_offsets.dwo",
643 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
644 COFF::IMAGE_SCN_MEM_READ,
645 SectionKind::getMetadata(), "section_str_off_dwo");
646 DwarfAddrSection = Ctx->getCOFFSection(
647 ".debug_addr",
648 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
649 COFF::IMAGE_SCN_MEM_READ,
650 SectionKind::getMetadata(), "addr_sec");
651 DwarfCUIndexSection = Ctx->getCOFFSection(
652 ".debug_cu_index",
653 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
654 COFF::IMAGE_SCN_MEM_READ,
655 SectionKind::getMetadata());
656 DwarfTUIndexSection = Ctx->getCOFFSection(
657 ".debug_tu_index",
658 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
659 COFF::IMAGE_SCN_MEM_READ,
660 SectionKind::getMetadata());
Pavel Labath6088c232018-04-04 14:42:14 +0000661 DwarfDebugNamesSection = Ctx->getCOFFSection(
662 ".debug_names",
663 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
664 COFF::IMAGE_SCN_MEM_READ,
665 SectionKind::getMetadata(), "debug_names_begin");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000666 DwarfAccelNamesSection = Ctx->getCOFFSection(
667 ".apple_names",
668 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
669 COFF::IMAGE_SCN_MEM_READ,
670 SectionKind::getMetadata(), "names_begin");
671 DwarfAccelNamespaceSection = Ctx->getCOFFSection(
672 ".apple_namespaces",
673 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
674 COFF::IMAGE_SCN_MEM_READ,
675 SectionKind::getMetadata(), "namespac_begin");
676 DwarfAccelTypesSection = Ctx->getCOFFSection(
677 ".apple_types",
678 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
679 COFF::IMAGE_SCN_MEM_READ,
680 SectionKind::getMetadata(), "types_begin");
681 DwarfAccelObjCSection = Ctx->getCOFFSection(
682 ".apple_objc",
683 COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
684 COFF::IMAGE_SCN_MEM_READ,
685 SectionKind::getMetadata(), "objc_begin");
686
687 DrectveSection = Ctx->getCOFFSection(
688 ".drectve", COFF::IMAGE_SCN_LNK_INFO | COFF::IMAGE_SCN_LNK_REMOVE,
689 SectionKind::getMetadata());
690
691 PDataSection = Ctx->getCOFFSection(
692 ".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
693 SectionKind::getData());
694
695 XDataSection = Ctx->getCOFFSection(
696 ".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
697 SectionKind::getData());
698
699 SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,
700 SectionKind::getMetadata());
701
Adrian McCarthydb2736d2018-01-09 23:49:30 +0000702 GFIDsSection = Ctx->getCOFFSection(".gfids$y",
703 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
704 COFF::IMAGE_SCN_MEM_READ,
705 SectionKind::getMetadata());
706
Sean Eveson661e4fb2017-11-30 12:43:25 +0000707 TLSDataSection = Ctx->getCOFFSection(
708 ".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
709 COFF::IMAGE_SCN_MEM_WRITE,
710 SectionKind::getData());
711
712 StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
713 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
714 COFF::IMAGE_SCN_MEM_READ,
715 SectionKind::getReadOnly());
716}
717
718void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) {
Sean Eveson661e4fb2017-11-30 12:43:25 +0000719 TextSection = Ctx->getWasmSection(".text", SectionKind::getText());
720 DataSection = Ctx->getWasmSection(".data", SectionKind::getData());
721
Sam Cleggb210c642018-05-10 17:38:35 +0000722 DwarfLineSection =
723 Ctx->getWasmSection(".debug_line", SectionKind::getMetadata());
Paul Robinson1f900292018-02-06 20:29:21 +0000724 DwarfLineStrSection =
725 Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata());
Sam Cleggb210c642018-05-10 17:38:35 +0000726 DwarfStrSection =
727 Ctx->getWasmSection(".debug_str", SectionKind::getMetadata());
728 DwarfLocSection =
729 Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata());
730 DwarfAbbrevSection =
731 Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata());
Sean Eveson661e4fb2017-11-30 12:43:25 +0000732 DwarfARangesSection = Ctx->getWasmSection(".debug_aranges", SectionKind::getMetadata());
Sam Cleggb210c642018-05-10 17:38:35 +0000733 DwarfRangesSection =
734 Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata());
735 DwarfMacinfoSection =
736 Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());
Sean Eveson661e4fb2017-11-30 12:43:25 +0000737 DwarfAddrSection = Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());
738 DwarfCUIndexSection = Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
739 DwarfTUIndexSection = Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
Sam Cleggb210c642018-05-10 17:38:35 +0000740 DwarfInfoSection =
741 Ctx->getWasmSection(".debug_info", SectionKind::getMetadata());
Sean Eveson661e4fb2017-11-30 12:43:25 +0000742 DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());
743 DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());
744 DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata());
745
746 // TODO: Define more sections.
747}
748
749void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
750 MCContext &ctx,
751 bool LargeCodeModel) {
752 PositionIndependent = PIC;
753 Ctx = &ctx;
754
755 // Common.
756 CommDirectiveSupportsAlignment = true;
757 SupportsWeakOmittedEHFrame = true;
758 SupportsCompactUnwindWithoutEHFrame = false;
759 OmitDwarfIfHaveCompactUnwind = false;
760
Reid Klecknerfce7f732018-08-09 22:24:04 +0000761 FDECFIEncoding = dwarf::DW_EH_PE_absptr;
Sean Eveson661e4fb2017-11-30 12:43:25 +0000762
763 CompactUnwindDwarfEHFrameOnly = 0;
764
765 EHFrameSection = nullptr; // Created on demand.
766 CompactUnwindSection = nullptr; // Used only by selected targets.
767 DwarfAccelNamesSection = nullptr; // Used only by selected targets.
768 DwarfAccelObjCSection = nullptr; // Used only by selected targets.
769 DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
770 DwarfAccelTypesSection = nullptr; // Used only by selected targets.
771
772 TT = TheTriple;
773
774 switch (TT.getObjectFormat()) {
775 case Triple::MachO:
776 Env = IsMachO;
777 initMachOMCObjectFileInfo(TT);
778 break;
779 case Triple::COFF:
780 if (!TT.isOSWindows())
781 report_fatal_error(
782 "Cannot initialize MC for non-Windows COFF object files.");
783
784 Env = IsCOFF;
785 initCOFFMCObjectFileInfo(TT);
786 break;
787 case Triple::ELF:
788 Env = IsELF;
789 initELFMCObjectFileInfo(TT, LargeCodeModel);
790 break;
791 case Triple::Wasm:
792 Env = IsWasm;
793 initWasmMCObjectFileInfo(TT);
794 break;
795 case Triple::UnknownObjectFormat:
796 report_fatal_error("Cannot initialize MC for unknown object file format.");
797 break;
798 }
799}
800
801MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const {
Jonas Devlieghere8acb74e2018-08-01 12:53:06 +0000802 switch (TT.getObjectFormat()) {
803 case Triple::ELF:
804 return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,
805 0, utostr(Hash));
806 case Triple::MachO:
807 case Triple::COFF:
808 case Triple::Wasm:
809 case Triple::UnknownObjectFormat:
810 report_fatal_error("Cannot get DWARF types section for this object file "
811 "format: not implemented.");
812 break;
813 }
Simon Pilgrim25b15f12018-08-01 13:00:11 +0000814 llvm_unreachable("Unknown ObjectFormatType");
Sean Eveson661e4fb2017-11-30 12:43:25 +0000815}
George Rimardcf59c52018-06-22 10:53:47 +0000816
817MCSection *
818MCObjectFileInfo::getStackSizesSection(const MCSection &TextSec) const {
819 if (Env != IsELF)
820 return StackSizesSection;
821
822 const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
823 unsigned Flags = ELF::SHF_LINK_ORDER;
824 StringRef GroupName;
825 if (const MCSymbol *Group = ElfSec.getGroup()) {
826 GroupName = Group->getName();
827 Flags |= ELF::SHF_GROUP;
828 }
829
830 const MCSymbol *Link = TextSec.getBeginSymbol();
831 auto It = StackSizesUniquing.insert({Link, StackSizesUniquing.size()});
832 unsigned UniqueID = It.first->second;
833
834 return Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, Flags, 0,
835 GroupName, UniqueID, cast<MCSymbolELF>(Link));
836}