1319780Sdim//===-- llvm/BinaryFormat/Dwarf.h ---Dwarf Constants-------------*- C++ -*-===//
2319780Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6319780Sdim//
7319780Sdim//===----------------------------------------------------------------------===//
8319780Sdim//
9327952Sdim/// \file
10327952Sdim/// This file contains constants used for implementing Dwarf
11327952Sdim/// debug support.
12327952Sdim///
13327952Sdim/// For details on the Dwarf specfication see the latest DWARF Debugging
14327952Sdim/// Information Format standard document on http://www.dwarfstd.org. This
15327952Sdim/// file often includes support for non-released standard features.
16319780Sdim//
17319780Sdim//===----------------------------------------------------------------------===//
18319780Sdim
19319780Sdim#ifndef LLVM_BINARYFORMAT_DWARF_H
20319780Sdim#define LLVM_BINARYFORMAT_DWARF_H
21319780Sdim
22341825Sdim#include "llvm/ADT/Optional.h"
23319780Sdim#include "llvm/Support/Compiler.h"
24319780Sdim#include "llvm/Support/DataTypes.h"
25341825Sdim#include "llvm/Support/ErrorHandling.h"
26341825Sdim#include "llvm/Support/Format.h"
27341825Sdim#include "llvm/Support/FormatVariadicDetails.h"
28344779Sdim#include "llvm/ADT/Triple.h"
29319780Sdim
30319780Sdimnamespace llvm {
31319780Sdimclass StringRef;
32319780Sdim
33319780Sdimnamespace dwarf {
34319780Sdim
35319780Sdim//===----------------------------------------------------------------------===//
36319780Sdim// DWARF constants as gleaned from the DWARF Debugging Information Format V.5
37319780Sdim// reference manual http://www.dwarfstd.org/.
38319780Sdim//
39319780Sdim
40319780Sdim// Do not mix the following two enumerations sets.  DW_TAG_invalid changes the
41319780Sdim// enumeration base type.
42319780Sdim
43319780Sdimenum LLVMConstants : uint32_t {
44319780Sdim  // LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
45319780Sdim  DW_TAG_invalid = ~0U,        // Tag for invalid results.
46319780Sdim  DW_VIRTUALITY_invalid = ~0U, // Virtuality for invalid results.
47319780Sdim  DW_MACINFO_invalid = ~0U,    // Macinfo type for invalid results.
48319780Sdim
49360784Sdim  // Special values for an initial length field.
50360784Sdim  DW_LENGTH_lo_reserved = 0xfffffff0, // Lower bound of the reserved range.
51360784Sdim  DW_LENGTH_DWARF64 = 0xffffffff,     // Indicator of 64-bit DWARF format.
52360784Sdim  DW_LENGTH_hi_reserved = 0xffffffff, // Upper bound of the reserved range.
53360784Sdim
54319780Sdim  // Other constants.
55319780Sdim  DWARF_VERSION = 4,       // Default dwarf version we output.
56319780Sdim  DW_PUBTYPES_VERSION = 2, // Section version number for .debug_pubtypes.
57319780Sdim  DW_PUBNAMES_VERSION = 2, // Section version number for .debug_pubnames.
58319780Sdim  DW_ARANGES_VERSION = 2,  // Section version number for .debug_aranges.
59319780Sdim  // Identifiers we use to distinguish vendor extensions.
60319780Sdim  DWARF_VENDOR_DWARF = 0, // Defined in v2 or later of the DWARF standard.
61319780Sdim  DWARF_VENDOR_APPLE = 1,
62319780Sdim  DWARF_VENDOR_BORLAND = 2,
63319780Sdim  DWARF_VENDOR_GNU = 3,
64319780Sdim  DWARF_VENDOR_GOOGLE = 4,
65319780Sdim  DWARF_VENDOR_LLVM = 5,
66360784Sdim  DWARF_VENDOR_MIPS = 6,
67360784Sdim  DWARF_VENDOR_WASM = 7
68319780Sdim};
69319780Sdim
70341825Sdim/// Constants that define the DWARF format as 32 or 64 bit.
71341825Sdimenum DwarfFormat : uint8_t { DWARF32, DWARF64 };
72341825Sdim
73327952Sdim/// Special ID values that distinguish a CIE from a FDE in DWARF CFI.
74327952Sdim/// Not inside an enum because a 64-bit value is needed.
75327952Sdim/// @{
76319780Sdimconst uint32_t DW_CIE_ID = UINT32_MAX;
77319780Sdimconst uint64_t DW64_CIE_ID = UINT64_MAX;
78327952Sdim/// @}
79319780Sdim
80327952Sdim/// Identifier of an invalid DIE offset in the .debug_info section.
81320572Sdimconst uint32_t DW_INVALID_OFFSET = UINT32_MAX;
82320572Sdim
83319780Sdimenum Tag : uint16_t {
84360784Sdim#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) DW_TAG_##NAME = ID,
85319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
86319780Sdim  DW_TAG_lo_user = 0x4080,
87319780Sdim  DW_TAG_hi_user = 0xffff,
88327952Sdim  DW_TAG_user_base = 0x1000 ///< Recommended base for user tags.
89319780Sdim};
90319780Sdim
91319780Sdiminline bool isType(Tag T) {
92319780Sdim  switch (T) {
93319780Sdim  default:
94319780Sdim    return false;
95360784Sdim#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND)                         \
96360784Sdim  case DW_TAG_##NAME:                                                          \
97360784Sdim    return (KIND == DW_KIND_TYPE);
98360784Sdim#include "llvm/BinaryFormat/Dwarf.def"
99319780Sdim  }
100319780Sdim}
101319780Sdim
102319780Sdim/// Attributes.
103319780Sdimenum Attribute : uint16_t {
104319780Sdim#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) DW_AT_##NAME = ID,
105319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
106319780Sdim  DW_AT_lo_user = 0x2000,
107319780Sdim  DW_AT_hi_user = 0x3fff,
108319780Sdim};
109319780Sdim
110319780Sdimenum Form : uint16_t {
111319780Sdim#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) DW_FORM_##NAME = ID,
112319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
113319780Sdim  DW_FORM_lo_user = 0x1f00, ///< Not specified by DWARF.
114319780Sdim};
115319780Sdim
116319780Sdimenum LocationAtom {
117319780Sdim#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) DW_OP_##NAME = ID,
118319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
119319780Sdim  DW_OP_lo_user = 0xe0,
120319780Sdim  DW_OP_hi_user = 0xff,
121360784Sdim  DW_OP_LLVM_fragment = 0x1000,    ///< Only used in LLVM metadata.
122360784Sdim  DW_OP_LLVM_convert = 0x1001,     ///< Only used in LLVM metadata.
123360784Sdim  DW_OP_LLVM_tag_offset = 0x1002,  ///< Only used in LLVM metadata.
124360784Sdim  DW_OP_LLVM_entry_value = 0x1003, ///< Only used in LLVM metadata.
125319780Sdim};
126319780Sdim
127341825Sdimenum TypeKind : uint8_t {
128319780Sdim#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) DW_ATE_##NAME = ID,
129319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
130319780Sdim  DW_ATE_lo_user = 0x80,
131319780Sdim  DW_ATE_hi_user = 0xff
132319780Sdim};
133319780Sdim
134319780Sdimenum DecimalSignEncoding {
135319780Sdim  // Decimal sign attribute values
136319780Sdim  DW_DS_unsigned = 0x01,
137319780Sdim  DW_DS_leading_overpunch = 0x02,
138319780Sdim  DW_DS_trailing_overpunch = 0x03,
139319780Sdim  DW_DS_leading_separate = 0x04,
140319780Sdim  DW_DS_trailing_separate = 0x05
141319780Sdim};
142319780Sdim
143319780Sdimenum EndianityEncoding {
144319780Sdim  // Endianity attribute values
145344779Sdim#define HANDLE_DW_END(ID, NAME) DW_END_##NAME = ID,
146344779Sdim#include "llvm/BinaryFormat/Dwarf.def"
147319780Sdim  DW_END_lo_user = 0x40,
148319780Sdim  DW_END_hi_user = 0xff
149319780Sdim};
150319780Sdim
151319780Sdimenum AccessAttribute {
152319780Sdim  // Accessibility codes
153319780Sdim  DW_ACCESS_public = 0x01,
154319780Sdim  DW_ACCESS_protected = 0x02,
155319780Sdim  DW_ACCESS_private = 0x03
156319780Sdim};
157319780Sdim
158319780Sdimenum VisibilityAttribute {
159319780Sdim  // Visibility codes
160319780Sdim  DW_VIS_local = 0x01,
161319780Sdim  DW_VIS_exported = 0x02,
162319780Sdim  DW_VIS_qualified = 0x03
163319780Sdim};
164319780Sdim
165319780Sdimenum VirtualityAttribute {
166319780Sdim#define HANDLE_DW_VIRTUALITY(ID, NAME) DW_VIRTUALITY_##NAME = ID,
167319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
168319780Sdim  DW_VIRTUALITY_max = 0x02
169319780Sdim};
170319780Sdim
171319780Sdimenum DefaultedMemberAttribute {
172319780Sdim#define HANDLE_DW_DEFAULTED(ID, NAME) DW_DEFAULTED_##NAME = ID,
173319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
174319780Sdim  DW_DEFAULTED_max = 0x02
175319780Sdim};
176319780Sdim
177319780Sdimenum SourceLanguage {
178344779Sdim#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR)                 \
179344779Sdim  DW_LANG_##NAME = ID,
180319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
181319780Sdim  DW_LANG_lo_user = 0x8000,
182319780Sdim  DW_LANG_hi_user = 0xffff
183319780Sdim};
184319780Sdim
185360784Sdiminline bool isCPlusPlus(SourceLanguage S) {
186360784Sdim  // Deliberately enumerate all the language options so we get a warning when
187360784Sdim  // new language options are added (-Wswitch) that'll hopefully help keep this
188360784Sdim  // switch up-to-date when new C++ versions are added.
189360784Sdim  switch (S) {
190360784Sdim  case DW_LANG_C_plus_plus:
191360784Sdim  case DW_LANG_C_plus_plus_03:
192360784Sdim  case DW_LANG_C_plus_plus_11:
193360784Sdim  case DW_LANG_C_plus_plus_14:
194360784Sdim    return true;
195360784Sdim  case DW_LANG_C89:
196360784Sdim  case DW_LANG_C:
197360784Sdim  case DW_LANG_Ada83:
198360784Sdim  case DW_LANG_Cobol74:
199360784Sdim  case DW_LANG_Cobol85:
200360784Sdim  case DW_LANG_Fortran77:
201360784Sdim  case DW_LANG_Fortran90:
202360784Sdim  case DW_LANG_Pascal83:
203360784Sdim  case DW_LANG_Modula2:
204360784Sdim  case DW_LANG_Java:
205360784Sdim  case DW_LANG_C99:
206360784Sdim  case DW_LANG_Ada95:
207360784Sdim  case DW_LANG_Fortran95:
208360784Sdim  case DW_LANG_PLI:
209360784Sdim  case DW_LANG_ObjC:
210360784Sdim  case DW_LANG_ObjC_plus_plus:
211360784Sdim  case DW_LANG_UPC:
212360784Sdim  case DW_LANG_D:
213360784Sdim  case DW_LANG_Python:
214360784Sdim  case DW_LANG_OpenCL:
215360784Sdim  case DW_LANG_Go:
216360784Sdim  case DW_LANG_Modula3:
217360784Sdim  case DW_LANG_Haskell:
218360784Sdim  case DW_LANG_OCaml:
219360784Sdim  case DW_LANG_Rust:
220360784Sdim  case DW_LANG_C11:
221360784Sdim  case DW_LANG_Swift:
222360784Sdim  case DW_LANG_Julia:
223360784Sdim  case DW_LANG_Dylan:
224360784Sdim  case DW_LANG_Fortran03:
225360784Sdim  case DW_LANG_Fortran08:
226360784Sdim  case DW_LANG_RenderScript:
227360784Sdim  case DW_LANG_BLISS:
228360784Sdim  case DW_LANG_Mips_Assembler:
229360784Sdim  case DW_LANG_GOOGLE_RenderScript:
230360784Sdim  case DW_LANG_BORLAND_Delphi:
231360784Sdim  case DW_LANG_lo_user:
232360784Sdim  case DW_LANG_hi_user:
233360784Sdim    return false;
234360784Sdim  }
235360784Sdim  llvm_unreachable("Invalid source language");
236360784Sdim}
237360784Sdim
238319780Sdimenum CaseSensitivity {
239319780Sdim  // Identifier case codes
240319780Sdim  DW_ID_case_sensitive = 0x00,
241319780Sdim  DW_ID_up_case = 0x01,
242319780Sdim  DW_ID_down_case = 0x02,
243319780Sdim  DW_ID_case_insensitive = 0x03
244319780Sdim};
245319780Sdim
246319780Sdimenum CallingConvention {
247319780Sdim// Calling convention codes
248319780Sdim#define HANDLE_DW_CC(ID, NAME) DW_CC_##NAME = ID,
249319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
250319780Sdim  DW_CC_lo_user = 0x40,
251319780Sdim  DW_CC_hi_user = 0xff
252319780Sdim};
253319780Sdim
254319780Sdimenum InlineAttribute {
255319780Sdim  // Inline codes
256319780Sdim  DW_INL_not_inlined = 0x00,
257319780Sdim  DW_INL_inlined = 0x01,
258319780Sdim  DW_INL_declared_not_inlined = 0x02,
259319780Sdim  DW_INL_declared_inlined = 0x03
260319780Sdim};
261319780Sdim
262319780Sdimenum ArrayDimensionOrdering {
263319780Sdim  // Array ordering
264319780Sdim  DW_ORD_row_major = 0x00,
265319780Sdim  DW_ORD_col_major = 0x01
266319780Sdim};
267319780Sdim
268319780Sdimenum DiscriminantList {
269319780Sdim  // Discriminant descriptor values
270319780Sdim  DW_DSC_label = 0x00,
271319780Sdim  DW_DSC_range = 0x01
272319780Sdim};
273319780Sdim
274319780Sdim/// Line Number Standard Opcode Encodings.
275319780Sdimenum LineNumberOps : uint8_t {
276319780Sdim#define HANDLE_DW_LNS(ID, NAME) DW_LNS_##NAME = ID,
277319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
278319780Sdim};
279319780Sdim
280319780Sdim/// Line Number Extended Opcode Encodings.
281319780Sdimenum LineNumberExtendedOps {
282319780Sdim#define HANDLE_DW_LNE(ID, NAME) DW_LNE_##NAME = ID,
283319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
284319780Sdim  DW_LNE_lo_user = 0x80,
285319780Sdim  DW_LNE_hi_user = 0xff
286319780Sdim};
287319780Sdim
288319780Sdimenum LineNumberEntryFormat {
289319780Sdim#define HANDLE_DW_LNCT(ID, NAME) DW_LNCT_##NAME = ID,
290319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
291319780Sdim  DW_LNCT_lo_user = 0x2000,
292319780Sdim  DW_LNCT_hi_user = 0x3fff,
293319780Sdim};
294319780Sdim
295319780Sdimenum MacinfoRecordType {
296319780Sdim  // Macinfo Type Encodings
297319780Sdim  DW_MACINFO_define = 0x01,
298319780Sdim  DW_MACINFO_undef = 0x02,
299319780Sdim  DW_MACINFO_start_file = 0x03,
300319780Sdim  DW_MACINFO_end_file = 0x04,
301319780Sdim  DW_MACINFO_vendor_ext = 0xff
302319780Sdim};
303319780Sdim
304319780Sdim/// DWARF v5 macro information entry type encodings.
305319780Sdimenum MacroEntryType {
306319780Sdim#define HANDLE_DW_MACRO(ID, NAME) DW_MACRO_##NAME = ID,
307319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
308319780Sdim  DW_MACRO_lo_user = 0xe0,
309319780Sdim  DW_MACRO_hi_user = 0xff
310319780Sdim};
311319780Sdim
312319780Sdim/// DWARF v5 range list entry encoding values.
313360784Sdimenum RnglistEntries {
314319780Sdim#define HANDLE_DW_RLE(ID, NAME) DW_RLE_##NAME = ID,
315319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
316319780Sdim};
317319780Sdim
318360784Sdim/// DWARF v5 loc list entry encoding values.
319360784Sdimenum LoclistEntries {
320360784Sdim#define HANDLE_DW_LLE(ID, NAME) DW_LLE_##NAME = ID,
321360784Sdim#include "llvm/BinaryFormat/Dwarf.def"
322360784Sdim};
323360784Sdim
324319780Sdim/// Call frame instruction encodings.
325319780Sdimenum CallFrameInfo {
326319780Sdim#define HANDLE_DW_CFA(ID, NAME) DW_CFA_##NAME = ID,
327344779Sdim#define HANDLE_DW_CFA_PRED(ID, NAME, ARCH) DW_CFA_##NAME = ID,
328319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
329319780Sdim  DW_CFA_extended = 0x00,
330319780Sdim
331319780Sdim  DW_CFA_lo_user = 0x1c,
332319780Sdim  DW_CFA_hi_user = 0x3f
333319780Sdim};
334319780Sdim
335319780Sdimenum Constants {
336319780Sdim  // Children flag
337319780Sdim  DW_CHILDREN_no = 0x00,
338319780Sdim  DW_CHILDREN_yes = 0x01,
339319780Sdim
340319780Sdim  DW_EH_PE_absptr = 0x00,
341319780Sdim  DW_EH_PE_omit = 0xff,
342319780Sdim  DW_EH_PE_uleb128 = 0x01,
343319780Sdim  DW_EH_PE_udata2 = 0x02,
344319780Sdim  DW_EH_PE_udata4 = 0x03,
345319780Sdim  DW_EH_PE_udata8 = 0x04,
346319780Sdim  DW_EH_PE_sleb128 = 0x09,
347319780Sdim  DW_EH_PE_sdata2 = 0x0A,
348319780Sdim  DW_EH_PE_sdata4 = 0x0B,
349319780Sdim  DW_EH_PE_sdata8 = 0x0C,
350319780Sdim  DW_EH_PE_signed = 0x08,
351319780Sdim  DW_EH_PE_pcrel = 0x10,
352319780Sdim  DW_EH_PE_textrel = 0x20,
353319780Sdim  DW_EH_PE_datarel = 0x30,
354319780Sdim  DW_EH_PE_funcrel = 0x40,
355319780Sdim  DW_EH_PE_aligned = 0x50,
356319780Sdim  DW_EH_PE_indirect = 0x80
357319780Sdim};
358319780Sdim
359319780Sdim/// Constants for the DW_APPLE_PROPERTY_attributes attribute.
360319780Sdim/// Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
361319780Sdimenum ApplePropertyAttributes {
362319780Sdim#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) DW_APPLE_PROPERTY_##NAME = ID,
363319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
364319780Sdim};
365319780Sdim
366319780Sdim/// Constants for unit types in DWARF v5.
367319780Sdimenum UnitType : unsigned char {
368319780Sdim#define HANDLE_DW_UT(ID, NAME) DW_UT_##NAME = ID,
369319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
370319780Sdim  DW_UT_lo_user = 0x80,
371319780Sdim  DW_UT_hi_user = 0xff
372319780Sdim};
373319780Sdim
374341825Sdimenum Index {
375341825Sdim#define HANDLE_DW_IDX(ID, NAME) DW_IDX_##NAME = ID,
376341825Sdim#include "llvm/BinaryFormat/Dwarf.def"
377341825Sdim  DW_IDX_lo_user = 0x2000,
378341825Sdim  DW_IDX_hi_user = 0x3fff
379341825Sdim};
380341825Sdim
381327952Sdiminline bool isUnitType(uint8_t UnitType) {
382327952Sdim  switch (UnitType) {
383327952Sdim  case DW_UT_compile:
384327952Sdim  case DW_UT_type:
385327952Sdim  case DW_UT_partial:
386327952Sdim  case DW_UT_skeleton:
387327952Sdim  case DW_UT_split_compile:
388327952Sdim  case DW_UT_split_type:
389327952Sdim    return true;
390327952Sdim  default:
391327952Sdim    return false;
392327952Sdim  }
393327952Sdim}
394327952Sdim
395327952Sdiminline bool isUnitType(dwarf::Tag T) {
396327952Sdim  switch (T) {
397327952Sdim  case DW_TAG_compile_unit:
398327952Sdim  case DW_TAG_type_unit:
399327952Sdim  case DW_TAG_partial_unit:
400327952Sdim  case DW_TAG_skeleton_unit:
401327952Sdim    return true;
402327952Sdim  default:
403327952Sdim    return false;
404327952Sdim  }
405327952Sdim}
406327952Sdim
407319780Sdim// Constants for the DWARF v5 Accelerator Table Proposal
408319780Sdimenum AcceleratorTable {
409319780Sdim  // Data layout descriptors.
410341825Sdim  DW_ATOM_null = 0u,       ///  Marker as the end of a list of atoms.
411319780Sdim  DW_ATOM_die_offset = 1u, // DIE offset in the debug_info section.
412319780Sdim  DW_ATOM_cu_offset = 2u, // Offset of the compile unit header that contains the
413319780Sdim                          // item in question.
414319780Sdim  DW_ATOM_die_tag = 3u,   // A tag entry.
415319780Sdim  DW_ATOM_type_flags = 4u, // Set of flags for a type.
416319780Sdim
417341825Sdim  DW_ATOM_type_type_flags = 5u, // Dsymutil type extension.
418341825Sdim  DW_ATOM_qual_name_hash = 6u,  // Dsymutil qualified hash extension.
419341825Sdim
420319780Sdim  // DW_ATOM_type_flags values.
421319780Sdim
422319780Sdim  // Always set for C++, only set for ObjC if this is the @implementation for a
423319780Sdim  // class.
424319780Sdim  DW_FLAG_type_implementation = 2u,
425319780Sdim
426319780Sdim  // Hash functions.
427319780Sdim
428319780Sdim  // Daniel J. Bernstein hash.
429319780Sdim  DW_hash_function_djb = 0u
430319780Sdim};
431319780Sdim
432319780Sdim// Constants for the GNU pubnames/pubtypes extensions supporting gdb index.
433319780Sdimenum GDBIndexEntryKind {
434319780Sdim  GIEK_NONE,
435319780Sdim  GIEK_TYPE,
436319780Sdim  GIEK_VARIABLE,
437319780Sdim  GIEK_FUNCTION,
438319780Sdim  GIEK_OTHER,
439319780Sdim  GIEK_UNUSED5,
440319780Sdim  GIEK_UNUSED6,
441319780Sdim  GIEK_UNUSED7
442319780Sdim};
443319780Sdim
444319780Sdimenum GDBIndexEntryLinkage { GIEL_EXTERNAL, GIEL_STATIC };
445319780Sdim
446319780Sdim/// \defgroup DwarfConstantsDumping Dwarf constants dumping functions
447319780Sdim///
448319780Sdim/// All these functions map their argument's value back to the
449341825Sdim/// corresponding enumerator name or return an empty StringRef if the value
450341825Sdim/// isn't known.
451319780Sdim///
452319780Sdim/// @{
453319780SdimStringRef TagString(unsigned Tag);
454319780SdimStringRef ChildrenString(unsigned Children);
455319780SdimStringRef AttributeString(unsigned Attribute);
456319780SdimStringRef FormEncodingString(unsigned Encoding);
457319780SdimStringRef OperationEncodingString(unsigned Encoding);
458319780SdimStringRef AttributeEncodingString(unsigned Encoding);
459319780SdimStringRef DecimalSignString(unsigned Sign);
460319780SdimStringRef EndianityString(unsigned Endian);
461319780SdimStringRef AccessibilityString(unsigned Access);
462360784SdimStringRef DefaultedMemberString(unsigned DefaultedEncodings);
463319780SdimStringRef VisibilityString(unsigned Visibility);
464319780SdimStringRef VirtualityString(unsigned Virtuality);
465319780SdimStringRef LanguageString(unsigned Language);
466319780SdimStringRef CaseString(unsigned Case);
467319780SdimStringRef ConventionString(unsigned Convention);
468319780SdimStringRef InlineCodeString(unsigned Code);
469319780SdimStringRef ArrayOrderString(unsigned Order);
470319780SdimStringRef LNStandardString(unsigned Standard);
471319780SdimStringRef LNExtendedString(unsigned Encoding);
472319780SdimStringRef MacinfoString(unsigned Encoding);
473341825SdimStringRef RangeListEncodingString(unsigned Encoding);
474360784SdimStringRef LocListEncodingString(unsigned Encoding);
475344779SdimStringRef CallFrameString(unsigned Encoding, Triple::ArchType Arch);
476319780SdimStringRef ApplePropertyString(unsigned);
477319780SdimStringRef UnitTypeString(unsigned);
478319780SdimStringRef AtomTypeString(unsigned Atom);
479319780SdimStringRef GDBIndexEntryKindString(GDBIndexEntryKind Kind);
480319780SdimStringRef GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage);
481341825SdimStringRef IndexString(unsigned Idx);
482319780Sdim/// @}
483319780Sdim
484319780Sdim/// \defgroup DwarfConstantsParsing Dwarf constants parsing functions
485319780Sdim///
486319780Sdim/// These functions map their strings back to the corresponding enumeration
487319780Sdim/// value or return 0 if there is none, except for these exceptions:
488319780Sdim///
489319780Sdim/// \li \a getTag() returns \a DW_TAG_invalid on invalid input.
490319780Sdim/// \li \a getVirtuality() returns \a DW_VIRTUALITY_invalid on invalid input.
491319780Sdim/// \li \a getMacinfo() returns \a DW_MACINFO_invalid on invalid input.
492319780Sdim///
493319780Sdim/// @{
494319780Sdimunsigned getTag(StringRef TagString);
495319780Sdimunsigned getOperationEncoding(StringRef OperationEncodingString);
496319780Sdimunsigned getVirtuality(StringRef VirtualityString);
497319780Sdimunsigned getLanguage(StringRef LanguageString);
498319780Sdimunsigned getCallingConvention(StringRef LanguageString);
499319780Sdimunsigned getAttributeEncoding(StringRef EncodingString);
500319780Sdimunsigned getMacinfo(StringRef MacinfoString);
501319780Sdim/// @}
502319780Sdim
503319780Sdim/// \defgroup DwarfConstantsVersioning Dwarf version for constants
504319780Sdim///
505319780Sdim/// For constants defined by DWARF, returns the DWARF version when the constant
506319780Sdim/// was first defined. For vendor extensions, if there is a version-related
507319780Sdim/// policy for when to emit it, returns a version number for that policy.
508319780Sdim/// Otherwise returns 0.
509319780Sdim///
510319780Sdim/// @{
511319780Sdimunsigned TagVersion(Tag T);
512319780Sdimunsigned AttributeVersion(Attribute A);
513319780Sdimunsigned FormVersion(Form F);
514319780Sdimunsigned OperationVersion(LocationAtom O);
515319780Sdimunsigned AttributeEncodingVersion(TypeKind E);
516319780Sdimunsigned LanguageVersion(SourceLanguage L);
517319780Sdim/// @}
518319780Sdim
519319780Sdim/// \defgroup DwarfConstantsVendor Dwarf "vendor" for constants
520319780Sdim///
521319780Sdim/// These functions return an identifier describing "who" defined the constant,
522319780Sdim/// either the DWARF standard itself or the vendor who defined the extension.
523319780Sdim///
524319780Sdim/// @{
525319780Sdimunsigned TagVendor(Tag T);
526319780Sdimunsigned AttributeVendor(Attribute A);
527319780Sdimunsigned FormVendor(Form F);
528319780Sdimunsigned OperationVendor(LocationAtom O);
529319780Sdimunsigned AttributeEncodingVendor(TypeKind E);
530319780Sdimunsigned LanguageVendor(SourceLanguage L);
531319780Sdim/// @}
532319780Sdim
533344779SdimOptional<unsigned> LanguageLowerBound(SourceLanguage L);
534344779Sdim
535341825Sdim/// A helper struct providing information about the byte size of DW_FORM
536341825Sdim/// values that vary in size depending on the DWARF version, address byte
537341825Sdim/// size, or DWARF32/DWARF64.
538341825Sdimstruct FormParams {
539341825Sdim  uint16_t Version;
540341825Sdim  uint8_t AddrSize;
541341825Sdim  DwarfFormat Format;
542341825Sdim
543341825Sdim  /// The definition of the size of form DW_FORM_ref_addr depends on the
544341825Sdim  /// version. In DWARF v2 it's the size of an address; after that, it's the
545341825Sdim  /// size of a reference.
546341825Sdim  uint8_t getRefAddrByteSize() const {
547341825Sdim    if (Version == 2)
548341825Sdim      return AddrSize;
549341825Sdim    return getDwarfOffsetByteSize();
550341825Sdim  }
551341825Sdim
552341825Sdim  /// The size of a reference is determined by the DWARF 32/64-bit format.
553341825Sdim  uint8_t getDwarfOffsetByteSize() const {
554341825Sdim    switch (Format) {
555341825Sdim    case DwarfFormat::DWARF32:
556341825Sdim      return 4;
557341825Sdim    case DwarfFormat::DWARF64:
558341825Sdim      return 8;
559341825Sdim    }
560341825Sdim    llvm_unreachable("Invalid Format value");
561341825Sdim  }
562341825Sdim
563341825Sdim  explicit operator bool() const { return Version && AddrSize; }
564341825Sdim};
565341825Sdim
566360784Sdim/// Get the byte size of the unit length field depending on the DWARF format.
567360784Sdiminline uint8_t getUnitLengthFieldByteSize(DwarfFormat Format) {
568360784Sdim  switch (Format) {
569360784Sdim  case DwarfFormat::DWARF32:
570360784Sdim    return 4;
571360784Sdim  case DwarfFormat::DWARF64:
572360784Sdim    return 12;
573360784Sdim  }
574360784Sdim  llvm_unreachable("Invalid Format value");
575360784Sdim}
576360784Sdim
577341825Sdim/// Get the fixed byte size for a given form.
578341825Sdim///
579341825Sdim/// If the form has a fixed byte size, then an Optional with a value will be
580341825Sdim/// returned. If the form is always encoded using a variable length storage
581341825Sdim/// format (ULEB or SLEB numbers or blocks) then None will be returned.
582341825Sdim///
583341825Sdim/// \param Form DWARF form to get the fixed byte size for.
584341825Sdim/// \param Params DWARF parameters to help interpret forms.
585341825Sdim/// \returns Optional<uint8_t> value with the fixed byte size or None if
586341825Sdim/// \p Form doesn't have a fixed byte size.
587341825SdimOptional<uint8_t> getFixedFormByteSize(dwarf::Form Form, FormParams Params);
588341825Sdim
589319780Sdim/// Tells whether the specified form is defined in the specified version,
590319780Sdim/// or is an extension if extensions are allowed.
591319780Sdimbool isValidFormForVersion(Form F, unsigned Version, bool ExtensionsOk = true);
592319780Sdim
593327952Sdim/// Returns the symbolic string representing Val when used as a value
594319780Sdim/// for attribute Attr.
595319780SdimStringRef AttributeValueString(uint16_t Attr, unsigned Val);
596319780Sdim
597341825Sdim/// Returns the symbolic string representing Val when used as a value
598341825Sdim/// for atom Atom.
599341825SdimStringRef AtomValueString(uint16_t Atom, unsigned Val);
600341825Sdim
601327952Sdim/// Describes an entry of the various gnu_pub* debug sections.
602319780Sdim///
603319780Sdim/// The gnu_pub* kind looks like:
604319780Sdim///
605319780Sdim/// 0-3  reserved
606319780Sdim/// 4-6  symbol kind
607319780Sdim/// 7    0 == global, 1 == static
608319780Sdim///
609319780Sdim/// A gdb_index descriptor includes the above kind, shifted 24 bits up with the
610319780Sdim/// offset of the cu within the debug_info section stored in those 24 bits.
611319780Sdimstruct PubIndexEntryDescriptor {
612319780Sdim  GDBIndexEntryKind Kind;
613319780Sdim  GDBIndexEntryLinkage Linkage;
614319780Sdim  PubIndexEntryDescriptor(GDBIndexEntryKind Kind, GDBIndexEntryLinkage Linkage)
615319780Sdim      : Kind(Kind), Linkage(Linkage) {}
616319780Sdim  /* implicit */ PubIndexEntryDescriptor(GDBIndexEntryKind Kind)
617319780Sdim      : Kind(Kind), Linkage(GIEL_EXTERNAL) {}
618319780Sdim  explicit PubIndexEntryDescriptor(uint8_t Value)
619319780Sdim      : Kind(
620319780Sdim            static_cast<GDBIndexEntryKind>((Value & KIND_MASK) >> KIND_OFFSET)),
621319780Sdim        Linkage(static_cast<GDBIndexEntryLinkage>((Value & LINKAGE_MASK) >>
622319780Sdim                                                  LINKAGE_OFFSET)) {}
623319780Sdim  uint8_t toBits() const {
624319780Sdim    return Kind << KIND_OFFSET | Linkage << LINKAGE_OFFSET;
625319780Sdim  }
626319780Sdim
627319780Sdimprivate:
628319780Sdim  enum {
629319780Sdim    KIND_OFFSET = 4,
630319780Sdim    KIND_MASK = 7 << KIND_OFFSET,
631319780Sdim    LINKAGE_OFFSET = 7,
632319780Sdim    LINKAGE_MASK = 1 << LINKAGE_OFFSET
633319780Sdim  };
634319780Sdim};
635319780Sdim
636341825Sdimtemplate <typename Enum> struct EnumTraits : public std::false_type {};
637319780Sdim
638341825Sdimtemplate <> struct EnumTraits<Attribute> : public std::true_type {
639341825Sdim  static constexpr char Type[3] = "AT";
640341825Sdim  static constexpr StringRef (*StringFn)(unsigned) = &AttributeString;
641341825Sdim};
642327952Sdim
643341825Sdimtemplate <> struct EnumTraits<Form> : public std::true_type {
644341825Sdim  static constexpr char Type[5] = "FORM";
645341825Sdim  static constexpr StringRef (*StringFn)(unsigned) = &FormEncodingString;
646341825Sdim};
647341825Sdim
648341825Sdimtemplate <> struct EnumTraits<Index> : public std::true_type {
649341825Sdim  static constexpr char Type[4] = "IDX";
650341825Sdim  static constexpr StringRef (*StringFn)(unsigned) = &IndexString;
651341825Sdim};
652341825Sdim
653341825Sdimtemplate <> struct EnumTraits<Tag> : public std::true_type {
654341825Sdim  static constexpr char Type[4] = "TAG";
655341825Sdim  static constexpr StringRef (*StringFn)(unsigned) = &TagString;
656341825Sdim};
657319780Sdim} // End of namespace dwarf
658319780Sdim
659341825Sdim/// Dwarf constants format_provider
660341825Sdim///
661341825Sdim/// Specialization of the format_provider template for dwarf enums. Unlike the
662341825Sdim/// dumping functions above, these format unknown enumerator values as
663341825Sdim/// DW_TYPE_unknown_1234 (e.g. DW_TAG_unknown_ffff).
664341825Sdimtemplate <typename Enum>
665341825Sdimstruct format_provider<
666341825Sdim    Enum, typename std::enable_if<dwarf::EnumTraits<Enum>::value>::type> {
667341825Sdim  static void format(const Enum &E, raw_ostream &OS, StringRef Style) {
668341825Sdim    StringRef Str = dwarf::EnumTraits<Enum>::StringFn(E);
669341825Sdim    if (Str.empty()) {
670341825Sdim      OS << "DW_" << dwarf::EnumTraits<Enum>::Type << "_unknown_"
671341825Sdim         << llvm::format("%x", E);
672341825Sdim    } else
673341825Sdim      OS << Str;
674341825Sdim  }
675341825Sdim};
676319780Sdim} // End of namespace llvm
677319780Sdim
678319780Sdim#endif
679