MCObjectFileInfo.cpp revision 363496
1//===-- MCObjectFileInfo.cpp - Object File Information --------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/MC/MCObjectFileInfo.h"
10#include "llvm/ADT/StringExtras.h"
11#include "llvm/ADT/Triple.h"
12#include "llvm/BinaryFormat/COFF.h"
13#include "llvm/BinaryFormat/ELF.h"
14#include "llvm/MC/MCAsmInfo.h"
15#include "llvm/MC/MCContext.h"
16#include "llvm/MC/MCSection.h"
17#include "llvm/MC/MCSectionCOFF.h"
18#include "llvm/MC/MCSectionELF.h"
19#include "llvm/MC/MCSectionMachO.h"
20#include "llvm/MC/MCSectionWasm.h"
21#include "llvm/MC/MCSectionXCOFF.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 || T.getArch() == Triple::aarch64_32)
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() && T.isX86())
44    return true;
45
46  return false;
47}
48
49void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
50  // MachO
51  SupportsWeakOmittedEHFrame = false;
52
53  EHFrameSection = Ctx->getMachOSection(
54      "__TEXT", "__eh_frame",
55      MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
56          MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT,
57      SectionKind::getReadOnly());
58
59  if (T.isOSDarwin() &&
60      (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32))
61    SupportsCompactUnwindWithoutEHFrame = true;
62
63  if (T.isWatchABI())
64    OmitDwarfIfHaveCompactUnwind = true;
65
66  FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
67
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
134  ConstDataSection  // .const_data
135    = Ctx->getMachOSection("__DATA", "__const", 0,
136                           SectionKind::getReadOnlyWithRel());
137
138  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());
150    ConstDataCoalSection = DataCoalSection;
151  } else {
152    TextCoalSection = TextSection;
153    ConstTextCoalSection = ReadOnlySection;
154    DataCoalSection = DataSection;
155    ConstDataCoalSection = ConstDataSection;
156  }
157
158  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;
187  COFFGlobalTypeHashesSection = nullptr;
188
189  if (useCompactUnwind(T)) {
190    CompactUnwindSection =
191        Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG,
192                             SectionKind::getReadOnly());
193
194    if (T.isX86())
195      CompactUnwindDwarfEHFrameOnly = 0x04000000;  // UNWIND_X86_64_MODE_DWARF
196    else if (T.getArch() == Triple::aarch64 || T.getArch() == Triple::aarch64_32)
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.
203  DwarfDebugNamesSection =
204      Ctx->getMachOSection("__DWARF", "__debug_names", MachO::S_ATTR_DEBUG,
205                           SectionKind::getMetadata(), "debug_names_begin");
206  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");
233  DwarfLineStrSection =
234      Ctx->getMachOSection("__DWARF", "__debug_line_str", MachO::S_ATTR_DEBUG,
235                           SectionKind::getMetadata(), "section_line_str");
236  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  DwarfAddrSection =
258      Ctx->getMachOSection("__DWARF", "__debug_addr", MachO::S_ATTR_DEBUG,
259                           SectionKind::getMetadata(), "section_info");
260  DwarfLocSection =
261      Ctx->getMachOSection("__DWARF", "__debug_loc", MachO::S_ATTR_DEBUG,
262                           SectionKind::getMetadata(), "section_debug_loc");
263  DwarfLoclistsSection =
264      Ctx->getMachOSection("__DWARF", "__debug_loclists", MachO::S_ATTR_DEBUG,
265                           SectionKind::getMetadata(), "section_debug_loc");
266
267  DwarfARangesSection =
268      Ctx->getMachOSection("__DWARF", "__debug_aranges", MachO::S_ATTR_DEBUG,
269                           SectionKind::getMetadata());
270  DwarfRangesSection =
271      Ctx->getMachOSection("__DWARF", "__debug_ranges", MachO::S_ATTR_DEBUG,
272                           SectionKind::getMetadata(), "debug_range");
273  DwarfRnglistsSection =
274      Ctx->getMachOSection("__DWARF", "__debug_rnglists", MachO::S_ATTR_DEBUG,
275                           SectionKind::getMetadata(), "debug_range");
276  DwarfMacinfoSection =
277      Ctx->getMachOSection("__DWARF", "__debug_macinfo", MachO::S_ATTR_DEBUG,
278                           SectionKind::getMetadata(), "debug_macinfo");
279  DwarfDebugInlineSection =
280      Ctx->getMachOSection("__DWARF", "__debug_inlined", MachO::S_ATTR_DEBUG,
281                           SectionKind::getMetadata());
282  DwarfCUIndexSection =
283      Ctx->getMachOSection("__DWARF", "__debug_cu_index", MachO::S_ATTR_DEBUG,
284                           SectionKind::getMetadata());
285  DwarfTUIndexSection =
286      Ctx->getMachOSection("__DWARF", "__debug_tu_index", MachO::S_ATTR_DEBUG,
287                           SectionKind::getMetadata());
288  StackMapSection = Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps",
289                                         0, SectionKind::getMetadata());
290
291  FaultMapSection = Ctx->getMachOSection("__LLVM_FAULTMAPS", "__llvm_faultmaps",
292                                         0, SectionKind::getMetadata());
293
294  RemarksSection = Ctx->getMachOSection(
295      "__LLVM", "__remarks", MachO::S_ATTR_DEBUG, SectionKind::getMetadata());
296
297  TLSExtraDataSection = TLSTLVSection;
298}
299
300void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
301  switch (T.getArch()) {
302  case Triple::mips:
303  case Triple::mipsel:
304  case Triple::mips64:
305  case Triple::mips64el:
306    // We cannot use DW_EH_PE_sdata8 for the large PositionIndependent case
307    // since there is no R_MIPS_PC64 relocation (only a 32-bit version).
308    if (PositionIndependent && !Large)
309      FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
310    else
311      FDECFIEncoding = Ctx->getAsmInfo()->getCodePointerSize() == 4
312                           ? dwarf::DW_EH_PE_sdata4
313                           : dwarf::DW_EH_PE_sdata8;
314    break;
315  case Triple::ppc64:
316  case Triple::ppc64le:
317  case Triple::x86_64:
318    FDECFIEncoding = dwarf::DW_EH_PE_pcrel |
319                     (Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
320    break;
321  case Triple::bpfel:
322  case Triple::bpfeb:
323    FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
324    break;
325  case Triple::hexagon:
326    FDECFIEncoding =
327        PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
328    break;
329  default:
330    FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
331    break;
332  }
333
334  unsigned EHSectionType = T.getArch() == Triple::x86_64
335                               ? ELF::SHT_X86_64_UNWIND
336                               : ELF::SHT_PROGBITS;
337
338  // Solaris requires different flags for .eh_frame to seemingly every other
339  // platform.
340  unsigned EHSectionFlags = ELF::SHF_ALLOC;
341  if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
342    EHSectionFlags |= ELF::SHF_WRITE;
343
344  // ELF
345  BSSSection = Ctx->getELFSection(".bss", ELF::SHT_NOBITS,
346                                  ELF::SHF_WRITE | ELF::SHF_ALLOC);
347
348  TextSection = Ctx->getELFSection(".text", ELF::SHT_PROGBITS,
349                                   ELF::SHF_EXECINSTR | ELF::SHF_ALLOC);
350
351  DataSection = Ctx->getELFSection(".data", ELF::SHT_PROGBITS,
352                                   ELF::SHF_WRITE | ELF::SHF_ALLOC);
353
354  ReadOnlySection =
355      Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
356
357  TLSDataSection =
358      Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS,
359                         ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
360
361  TLSBSSSection = Ctx->getELFSection(
362      ".tbss", ELF::SHT_NOBITS, ELF::SHF_ALLOC | ELF::SHF_TLS | ELF::SHF_WRITE);
363
364  DataRelROSection = Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
365                                        ELF::SHF_ALLOC | ELF::SHF_WRITE);
366
367  MergeableConst4Section =
368      Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
369                         ELF::SHF_ALLOC | ELF::SHF_MERGE, 4, "");
370
371  MergeableConst8Section =
372      Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
373                         ELF::SHF_ALLOC | ELF::SHF_MERGE, 8, "");
374
375  MergeableConst16Section =
376      Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
377                         ELF::SHF_ALLOC | ELF::SHF_MERGE, 16, "");
378
379  MergeableConst32Section =
380      Ctx->getELFSection(".rodata.cst32", ELF::SHT_PROGBITS,
381                         ELF::SHF_ALLOC | ELF::SHF_MERGE, 32, "");
382
383  // Exception Handling Sections.
384
385  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
386  // it contains relocatable pointers.  In PIC mode, this is probably a big
387  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
388  // adjusted or this should be a data section.
389  LSDASection = Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
390                                   ELF::SHF_ALLOC);
391
392  COFFDebugSymbolsSection = nullptr;
393  COFFDebugTypesSection = nullptr;
394
395  unsigned DebugSecType = ELF::SHT_PROGBITS;
396
397  // MIPS .debug_* sections should have SHT_MIPS_DWARF section type
398  // to distinguish among sections contain DWARF and ECOFF debug formats.
399  // Sections with ECOFF debug format are obsoleted and marked by SHT_PROGBITS.
400  if (T.isMIPS())
401    DebugSecType = ELF::SHT_MIPS_DWARF;
402
403  // Debug Info Sections.
404  DwarfAbbrevSection =
405      Ctx->getELFSection(".debug_abbrev", DebugSecType, 0);
406  DwarfInfoSection = Ctx->getELFSection(".debug_info", DebugSecType, 0);
407  DwarfLineSection = Ctx->getELFSection(".debug_line", DebugSecType, 0);
408  DwarfLineStrSection =
409      Ctx->getELFSection(".debug_line_str", DebugSecType,
410                         ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
411  DwarfFrameSection = Ctx->getELFSection(".debug_frame", DebugSecType, 0);
412  DwarfPubNamesSection =
413      Ctx->getELFSection(".debug_pubnames", DebugSecType, 0);
414  DwarfPubTypesSection =
415      Ctx->getELFSection(".debug_pubtypes", DebugSecType, 0);
416  DwarfGnuPubNamesSection =
417      Ctx->getELFSection(".debug_gnu_pubnames", DebugSecType, 0);
418  DwarfGnuPubTypesSection =
419      Ctx->getELFSection(".debug_gnu_pubtypes", DebugSecType, 0);
420  DwarfStrSection =
421      Ctx->getELFSection(".debug_str", DebugSecType,
422                         ELF::SHF_MERGE | ELF::SHF_STRINGS, 1, "");
423  DwarfLocSection = Ctx->getELFSection(".debug_loc", DebugSecType, 0);
424  DwarfARangesSection =
425      Ctx->getELFSection(".debug_aranges", DebugSecType, 0);
426  DwarfRangesSection =
427      Ctx->getELFSection(".debug_ranges", DebugSecType, 0);
428  DwarfMacinfoSection =
429      Ctx->getELFSection(".debug_macinfo", DebugSecType, 0);
430
431  // DWARF5 Experimental Debug Info
432
433  // Accelerator Tables
434  DwarfDebugNamesSection =
435      Ctx->getELFSection(".debug_names", ELF::SHT_PROGBITS, 0);
436  DwarfAccelNamesSection =
437      Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0);
438  DwarfAccelObjCSection =
439      Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0);
440  DwarfAccelNamespaceSection =
441      Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0);
442  DwarfAccelTypesSection =
443      Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0);
444
445  // String Offset and Address Sections
446  DwarfStrOffSection =
447      Ctx->getELFSection(".debug_str_offsets", DebugSecType, 0);
448  DwarfAddrSection = Ctx->getELFSection(".debug_addr", DebugSecType, 0);
449  DwarfRnglistsSection = Ctx->getELFSection(".debug_rnglists", DebugSecType, 0);
450  DwarfLoclistsSection = Ctx->getELFSection(".debug_loclists", DebugSecType, 0);
451
452  // Fission Sections
453  DwarfInfoDWOSection =
454      Ctx->getELFSection(".debug_info.dwo", DebugSecType, ELF::SHF_EXCLUDE);
455  DwarfTypesDWOSection =
456      Ctx->getELFSection(".debug_types.dwo", DebugSecType, ELF::SHF_EXCLUDE);
457  DwarfAbbrevDWOSection =
458      Ctx->getELFSection(".debug_abbrev.dwo", DebugSecType, ELF::SHF_EXCLUDE);
459  DwarfStrDWOSection = Ctx->getELFSection(
460      ".debug_str.dwo", DebugSecType,
461      ELF::SHF_MERGE | ELF::SHF_STRINGS | ELF::SHF_EXCLUDE, 1, "");
462  DwarfLineDWOSection =
463      Ctx->getELFSection(".debug_line.dwo", DebugSecType, ELF::SHF_EXCLUDE);
464  DwarfLocDWOSection =
465      Ctx->getELFSection(".debug_loc.dwo", DebugSecType, ELF::SHF_EXCLUDE);
466  DwarfStrOffDWOSection = Ctx->getELFSection(".debug_str_offsets.dwo",
467                                             DebugSecType, ELF::SHF_EXCLUDE);
468  DwarfRnglistsDWOSection =
469      Ctx->getELFSection(".debug_rnglists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
470  DwarfMacinfoDWOSection =
471      Ctx->getELFSection(".debug_macinfo.dwo", DebugSecType, ELF::SHF_EXCLUDE);
472
473  DwarfLoclistsDWOSection =
474      Ctx->getELFSection(".debug_loclists.dwo", DebugSecType, ELF::SHF_EXCLUDE);
475
476  // DWP Sections
477  DwarfCUIndexSection =
478      Ctx->getELFSection(".debug_cu_index", DebugSecType, 0);
479  DwarfTUIndexSection =
480      Ctx->getELFSection(".debug_tu_index", DebugSecType, 0);
481
482  StackMapSection =
483      Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
484
485  FaultMapSection =
486      Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
487
488  EHFrameSection =
489      Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
490
491  StackSizesSection = Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, 0);
492}
493
494void MCObjectFileInfo::initCOFFMCObjectFileInfo(const Triple &T) {
495  EHFrameSection =
496      Ctx->getCOFFSection(".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
497                                           COFF::IMAGE_SCN_MEM_READ,
498                          SectionKind::getData());
499
500  // Set the `IMAGE_SCN_MEM_16BIT` flag when compiling for thumb mode.  This is
501  // used to indicate to the linker that the text segment contains thumb instructions
502  // and to set the ISA selection bit for calls accordingly.
503  const bool IsThumb = T.getArch() == Triple::thumb;
504
505  CommDirectiveSupportsAlignment = true;
506
507  // COFF
508  BSSSection = Ctx->getCOFFSection(
509      ".bss", COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
510                  COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
511      SectionKind::getBSS());
512  TextSection = Ctx->getCOFFSection(
513      ".text",
514      (IsThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0) |
515          COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE |
516          COFF::IMAGE_SCN_MEM_READ,
517      SectionKind::getText());
518  DataSection = Ctx->getCOFFSection(
519      ".data", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
520                   COFF::IMAGE_SCN_MEM_WRITE,
521      SectionKind::getData());
522  ReadOnlySection = Ctx->getCOFFSection(
523      ".rdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
524      SectionKind::getReadOnly());
525
526  if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::aarch64) {
527    // On Windows 64 with SEH, the LSDA is emitted into the .xdata section
528    LSDASection = nullptr;
529  } else {
530    LSDASection = Ctx->getCOFFSection(".gcc_except_table",
531                                      COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
532                                          COFF::IMAGE_SCN_MEM_READ,
533                                      SectionKind::getReadOnly());
534  }
535
536  // Debug info.
537  COFFDebugSymbolsSection =
538      Ctx->getCOFFSection(".debug$S", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
539                                       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
540                                       COFF::IMAGE_SCN_MEM_READ),
541                          SectionKind::getMetadata());
542  COFFDebugTypesSection =
543      Ctx->getCOFFSection(".debug$T", (COFF::IMAGE_SCN_MEM_DISCARDABLE |
544                                       COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
545                                       COFF::IMAGE_SCN_MEM_READ),
546                          SectionKind::getMetadata());
547  COFFGlobalTypeHashesSection = Ctx->getCOFFSection(
548      ".debug$H",
549      (COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
550       COFF::IMAGE_SCN_MEM_READ),
551      SectionKind::getMetadata());
552
553  DwarfAbbrevSection = Ctx->getCOFFSection(
554      ".debug_abbrev",
555      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
556          COFF::IMAGE_SCN_MEM_READ,
557      SectionKind::getMetadata(), "section_abbrev");
558  DwarfInfoSection = Ctx->getCOFFSection(
559      ".debug_info",
560      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
561          COFF::IMAGE_SCN_MEM_READ,
562      SectionKind::getMetadata(), "section_info");
563  DwarfLineSection = Ctx->getCOFFSection(
564      ".debug_line",
565      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
566          COFF::IMAGE_SCN_MEM_READ,
567      SectionKind::getMetadata(), "section_line");
568  DwarfLineStrSection = Ctx->getCOFFSection(
569      ".debug_line_str",
570      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
571          COFF::IMAGE_SCN_MEM_READ,
572      SectionKind::getMetadata(), "section_line_str");
573  DwarfFrameSection = Ctx->getCOFFSection(
574      ".debug_frame",
575      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
576          COFF::IMAGE_SCN_MEM_READ,
577      SectionKind::getMetadata());
578  DwarfPubNamesSection = Ctx->getCOFFSection(
579      ".debug_pubnames",
580      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
581          COFF::IMAGE_SCN_MEM_READ,
582      SectionKind::getMetadata());
583  DwarfPubTypesSection = Ctx->getCOFFSection(
584      ".debug_pubtypes",
585      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
586          COFF::IMAGE_SCN_MEM_READ,
587      SectionKind::getMetadata());
588  DwarfGnuPubNamesSection = Ctx->getCOFFSection(
589      ".debug_gnu_pubnames",
590      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
591          COFF::IMAGE_SCN_MEM_READ,
592      SectionKind::getMetadata());
593  DwarfGnuPubTypesSection = Ctx->getCOFFSection(
594      ".debug_gnu_pubtypes",
595      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
596          COFF::IMAGE_SCN_MEM_READ,
597      SectionKind::getMetadata());
598  DwarfStrSection = Ctx->getCOFFSection(
599      ".debug_str",
600      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
601          COFF::IMAGE_SCN_MEM_READ,
602      SectionKind::getMetadata(), "info_string");
603  DwarfStrOffSection = Ctx->getCOFFSection(
604      ".debug_str_offsets",
605      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
606          COFF::IMAGE_SCN_MEM_READ,
607      SectionKind::getMetadata(), "section_str_off");
608  DwarfLocSection = Ctx->getCOFFSection(
609      ".debug_loc",
610      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
611          COFF::IMAGE_SCN_MEM_READ,
612      SectionKind::getMetadata(), "section_debug_loc");
613  DwarfARangesSection = Ctx->getCOFFSection(
614      ".debug_aranges",
615      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
616          COFF::IMAGE_SCN_MEM_READ,
617      SectionKind::getMetadata());
618  DwarfRangesSection = Ctx->getCOFFSection(
619      ".debug_ranges",
620      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
621          COFF::IMAGE_SCN_MEM_READ,
622      SectionKind::getMetadata(), "debug_range");
623  DwarfMacinfoSection = Ctx->getCOFFSection(
624      ".debug_macinfo",
625      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
626          COFF::IMAGE_SCN_MEM_READ,
627      SectionKind::getMetadata(), "debug_macinfo");
628  DwarfMacinfoDWOSection = Ctx->getCOFFSection(
629      ".debug_macinfo.dwo",
630      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
631          COFF::IMAGE_SCN_MEM_READ,
632      SectionKind::getMetadata(), "debug_macinfo.dwo");
633  DwarfInfoDWOSection = Ctx->getCOFFSection(
634      ".debug_info.dwo",
635      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
636          COFF::IMAGE_SCN_MEM_READ,
637      SectionKind::getMetadata(), "section_info_dwo");
638  DwarfTypesDWOSection = Ctx->getCOFFSection(
639      ".debug_types.dwo",
640      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
641          COFF::IMAGE_SCN_MEM_READ,
642      SectionKind::getMetadata(), "section_types_dwo");
643  DwarfAbbrevDWOSection = Ctx->getCOFFSection(
644      ".debug_abbrev.dwo",
645      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
646          COFF::IMAGE_SCN_MEM_READ,
647      SectionKind::getMetadata(), "section_abbrev_dwo");
648  DwarfStrDWOSection = Ctx->getCOFFSection(
649      ".debug_str.dwo",
650      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
651          COFF::IMAGE_SCN_MEM_READ,
652      SectionKind::getMetadata(), "skel_string");
653  DwarfLineDWOSection = Ctx->getCOFFSection(
654      ".debug_line.dwo",
655      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
656          COFF::IMAGE_SCN_MEM_READ,
657      SectionKind::getMetadata());
658  DwarfLocDWOSection = Ctx->getCOFFSection(
659      ".debug_loc.dwo",
660      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
661          COFF::IMAGE_SCN_MEM_READ,
662      SectionKind::getMetadata(), "skel_loc");
663  DwarfStrOffDWOSection = Ctx->getCOFFSection(
664      ".debug_str_offsets.dwo",
665      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
666          COFF::IMAGE_SCN_MEM_READ,
667      SectionKind::getMetadata(), "section_str_off_dwo");
668  DwarfAddrSection = Ctx->getCOFFSection(
669      ".debug_addr",
670      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
671          COFF::IMAGE_SCN_MEM_READ,
672      SectionKind::getMetadata(), "addr_sec");
673  DwarfCUIndexSection = Ctx->getCOFFSection(
674      ".debug_cu_index",
675      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
676          COFF::IMAGE_SCN_MEM_READ,
677      SectionKind::getMetadata());
678  DwarfTUIndexSection = Ctx->getCOFFSection(
679      ".debug_tu_index",
680      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
681          COFF::IMAGE_SCN_MEM_READ,
682      SectionKind::getMetadata());
683  DwarfDebugNamesSection = Ctx->getCOFFSection(
684      ".debug_names",
685      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
686          COFF::IMAGE_SCN_MEM_READ,
687      SectionKind::getMetadata(), "debug_names_begin");
688  DwarfAccelNamesSection = Ctx->getCOFFSection(
689      ".apple_names",
690      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
691          COFF::IMAGE_SCN_MEM_READ,
692      SectionKind::getMetadata(), "names_begin");
693  DwarfAccelNamespaceSection = Ctx->getCOFFSection(
694      ".apple_namespaces",
695      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
696          COFF::IMAGE_SCN_MEM_READ,
697      SectionKind::getMetadata(), "namespac_begin");
698  DwarfAccelTypesSection = Ctx->getCOFFSection(
699      ".apple_types",
700      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
701          COFF::IMAGE_SCN_MEM_READ,
702      SectionKind::getMetadata(), "types_begin");
703  DwarfAccelObjCSection = Ctx->getCOFFSection(
704      ".apple_objc",
705      COFF::IMAGE_SCN_MEM_DISCARDABLE | COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
706          COFF::IMAGE_SCN_MEM_READ,
707      SectionKind::getMetadata(), "objc_begin");
708
709  DrectveSection = Ctx->getCOFFSection(
710      ".drectve", COFF::IMAGE_SCN_LNK_INFO | COFF::IMAGE_SCN_LNK_REMOVE,
711      SectionKind::getMetadata());
712
713  PDataSection = Ctx->getCOFFSection(
714      ".pdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
715      SectionKind::getData());
716
717  XDataSection = Ctx->getCOFFSection(
718      ".xdata", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
719      SectionKind::getData());
720
721  SXDataSection = Ctx->getCOFFSection(".sxdata", COFF::IMAGE_SCN_LNK_INFO,
722                                      SectionKind::getMetadata());
723
724  GFIDsSection = Ctx->getCOFFSection(".gfids$y",
725                                     COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
726                                         COFF::IMAGE_SCN_MEM_READ,
727                                     SectionKind::getMetadata());
728
729  GLJMPSection = Ctx->getCOFFSection(".gljmp$y",
730                                     COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
731                                         COFF::IMAGE_SCN_MEM_READ,
732                                     SectionKind::getMetadata());
733
734  TLSDataSection = Ctx->getCOFFSection(
735      ".tls$", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
736                   COFF::IMAGE_SCN_MEM_WRITE,
737      SectionKind::getData());
738
739  StackMapSection = Ctx->getCOFFSection(".llvm_stackmaps",
740                                        COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
741                                            COFF::IMAGE_SCN_MEM_READ,
742                                        SectionKind::getReadOnly());
743}
744
745void MCObjectFileInfo::initWasmMCObjectFileInfo(const Triple &T) {
746  TextSection = Ctx->getWasmSection(".text", SectionKind::getText());
747  DataSection = Ctx->getWasmSection(".data", SectionKind::getData());
748
749  DwarfLineSection =
750      Ctx->getWasmSection(".debug_line", SectionKind::getMetadata());
751  DwarfLineStrSection =
752      Ctx->getWasmSection(".debug_line_str", SectionKind::getMetadata());
753  DwarfStrSection =
754      Ctx->getWasmSection(".debug_str", SectionKind::getMetadata());
755  DwarfLocSection =
756      Ctx->getWasmSection(".debug_loc", SectionKind::getMetadata());
757  DwarfAbbrevSection =
758      Ctx->getWasmSection(".debug_abbrev", SectionKind::getMetadata());
759  DwarfARangesSection = Ctx->getWasmSection(".debug_aranges", SectionKind::getMetadata());
760  DwarfRangesSection =
761      Ctx->getWasmSection(".debug_ranges", SectionKind::getMetadata());
762  DwarfMacinfoSection =
763      Ctx->getWasmSection(".debug_macinfo", SectionKind::getMetadata());
764  DwarfCUIndexSection = Ctx->getWasmSection(".debug_cu_index", SectionKind::getMetadata());
765  DwarfTUIndexSection = Ctx->getWasmSection(".debug_tu_index", SectionKind::getMetadata());
766  DwarfInfoSection =
767      Ctx->getWasmSection(".debug_info", SectionKind::getMetadata());
768  DwarfFrameSection = Ctx->getWasmSection(".debug_frame", SectionKind::getMetadata());
769  DwarfPubNamesSection = Ctx->getWasmSection(".debug_pubnames", SectionKind::getMetadata());
770  DwarfPubTypesSection = Ctx->getWasmSection(".debug_pubtypes", SectionKind::getMetadata());
771
772  DwarfDebugNamesSection =
773      Ctx->getWasmSection(".debug_names", SectionKind::getMetadata());
774  DwarfStrOffSection =
775      Ctx->getWasmSection(".debug_str_offsets", SectionKind::getMetadata());
776  DwarfAddrSection =
777      Ctx->getWasmSection(".debug_addr", SectionKind::getMetadata());
778  DwarfRnglistsSection =
779      Ctx->getWasmSection(".debug_rnglists", SectionKind::getMetadata());
780  DwarfLoclistsSection =
781      Ctx->getWasmSection(".debug_loclists", SectionKind::getMetadata());
782
783  // Wasm use data section for LSDA.
784  // TODO Consider putting each function's exception table in a separate
785  // section, as in -function-sections, to facilitate lld's --gc-section.
786  LSDASection = Ctx->getWasmSection(".rodata.gcc_except_table",
787                                    SectionKind::getReadOnlyWithRel());
788
789  // TODO: Define more sections.
790}
791
792void MCObjectFileInfo::initXCOFFMCObjectFileInfo(const Triple &T) {
793  // The default csect for program code. Functions without a specified section
794  // get placed into this csect. The choice of csect name is not a property of
795  // the ABI or object file format. For example, the XL compiler uses an unnamed
796  // csect for program code.
797  TextSection = Ctx->getXCOFFSection(
798      ".text", XCOFF::StorageMappingClass::XMC_PR, XCOFF::XTY_SD,
799      XCOFF::C_HIDEXT, SectionKind::getText());
800
801  DataSection = Ctx->getXCOFFSection(
802      ".data", XCOFF::StorageMappingClass::XMC_RW, XCOFF::XTY_SD,
803      XCOFF::C_HIDEXT, SectionKind::getData());
804
805  ReadOnlySection = Ctx->getXCOFFSection(
806      ".rodata", XCOFF::StorageMappingClass::XMC_RO, XCOFF::XTY_SD,
807      XCOFF::C_HIDEXT, SectionKind::getReadOnly());
808}
809
810void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
811                                            MCContext &ctx,
812                                            bool LargeCodeModel) {
813  PositionIndependent = PIC;
814  Ctx = &ctx;
815
816  // Common.
817  CommDirectiveSupportsAlignment = true;
818  SupportsWeakOmittedEHFrame = true;
819  SupportsCompactUnwindWithoutEHFrame = false;
820  OmitDwarfIfHaveCompactUnwind = false;
821
822  FDECFIEncoding = dwarf::DW_EH_PE_absptr;
823
824  CompactUnwindDwarfEHFrameOnly = 0;
825
826  EHFrameSection = nullptr;             // Created on demand.
827  CompactUnwindSection = nullptr;       // Used only by selected targets.
828  DwarfAccelNamesSection = nullptr;     // Used only by selected targets.
829  DwarfAccelObjCSection = nullptr;      // Used only by selected targets.
830  DwarfAccelNamespaceSection = nullptr; // Used only by selected targets.
831  DwarfAccelTypesSection = nullptr;     // Used only by selected targets.
832
833  TT = TheTriple;
834
835  switch (TT.getObjectFormat()) {
836  case Triple::MachO:
837    Env = IsMachO;
838    initMachOMCObjectFileInfo(TT);
839    break;
840  case Triple::COFF:
841    if (!TT.isOSWindows())
842      report_fatal_error(
843          "Cannot initialize MC for non-Windows COFF object files.");
844
845    Env = IsCOFF;
846    initCOFFMCObjectFileInfo(TT);
847    break;
848  case Triple::ELF:
849    Env = IsELF;
850    initELFMCObjectFileInfo(TT, LargeCodeModel);
851    break;
852  case Triple::Wasm:
853    Env = IsWasm;
854    initWasmMCObjectFileInfo(TT);
855    break;
856  case Triple::XCOFF:
857    Env = IsXCOFF;
858    initXCOFFMCObjectFileInfo(TT);
859    break;
860  case Triple::UnknownObjectFormat:
861    report_fatal_error("Cannot initialize MC for unknown object file format.");
862    break;
863  }
864}
865
866MCSection *MCObjectFileInfo::getDwarfComdatSection(const char *Name,
867                                                   uint64_t Hash) const {
868  switch (TT.getObjectFormat()) {
869  case Triple::ELF:
870    return Ctx->getELFSection(Name, ELF::SHT_PROGBITS, ELF::SHF_GROUP, 0,
871                              utostr(Hash));
872  case Triple::MachO:
873  case Triple::COFF:
874  case Triple::Wasm:
875  case Triple::XCOFF:
876  case Triple::UnknownObjectFormat:
877    report_fatal_error("Cannot get DWARF comdat section for this object file "
878                       "format: not implemented.");
879    break;
880  }
881  llvm_unreachable("Unknown ObjectFormatType");
882}
883
884MCSection *
885MCObjectFileInfo::getStackSizesSection(const MCSection &TextSec) const {
886  if (Env != IsELF)
887    return StackSizesSection;
888
889  const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
890  unsigned Flags = ELF::SHF_LINK_ORDER;
891  StringRef GroupName;
892  if (const MCSymbol *Group = ElfSec.getGroup()) {
893    GroupName = Group->getName();
894    Flags |= ELF::SHF_GROUP;
895  }
896
897  const MCSymbol *Link = TextSec.getBeginSymbol();
898  auto It = StackSizesUniquing.insert({Link, StackSizesUniquing.size()});
899  unsigned UniqueID = It.first->second;
900
901  return Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, Flags, 0,
902                            GroupName, UniqueID, cast<MCSymbolELF>(Link));
903}
904