Dwarf.h revision 319780
1//===-- llvm/BinaryFormat/Dwarf.h ---Dwarf Constants-------------*- C++ -*-===//
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// \file
11// \brief This file contains constants used for implementing Dwarf
12// debug support.
13//
14// For details on the Dwarf specfication see the latest DWARF Debugging
15// Information Format standard document on http://www.dwarfstd.org. This
16// file often includes support for non-released standard features.
17//
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_BINARYFORMAT_DWARF_H
21#define LLVM_BINARYFORMAT_DWARF_H
22
23#include "llvm/Support/Compiler.h"
24#include "llvm/Support/DataTypes.h"
25
26namespace llvm {
27class StringRef;
28
29namespace dwarf {
30
31//===----------------------------------------------------------------------===//
32// DWARF constants as gleaned from the DWARF Debugging Information Format V.5
33// reference manual http://www.dwarfstd.org/.
34//
35
36// Do not mix the following two enumerations sets.  DW_TAG_invalid changes the
37// enumeration base type.
38
39enum LLVMConstants : uint32_t {
40  // LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
41  DW_TAG_invalid = ~0U,        // Tag for invalid results.
42  DW_VIRTUALITY_invalid = ~0U, // Virtuality for invalid results.
43  DW_MACINFO_invalid = ~0U,    // Macinfo type for invalid results.
44
45  // Other constants.
46  DWARF_VERSION = 4,       // Default dwarf version we output.
47  DW_PUBTYPES_VERSION = 2, // Section version number for .debug_pubtypes.
48  DW_PUBNAMES_VERSION = 2, // Section version number for .debug_pubnames.
49  DW_ARANGES_VERSION = 2,  // Section version number for .debug_aranges.
50  // Identifiers we use to distinguish vendor extensions.
51  DWARF_VENDOR_DWARF = 0, // Defined in v2 or later of the DWARF standard.
52  DWARF_VENDOR_APPLE = 1,
53  DWARF_VENDOR_BORLAND = 2,
54  DWARF_VENDOR_GNU = 3,
55  DWARF_VENDOR_GOOGLE = 4,
56  DWARF_VENDOR_LLVM = 5,
57  DWARF_VENDOR_MIPS = 6
58};
59
60// Special ID values that distinguish a CIE from a FDE in DWARF CFI.
61// Not inside an enum because a 64-bit value is needed.
62const uint32_t DW_CIE_ID = UINT32_MAX;
63const uint64_t DW64_CIE_ID = UINT64_MAX;
64
65enum Tag : uint16_t {
66#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) DW_TAG_##NAME = ID,
67#include "llvm/BinaryFormat/Dwarf.def"
68  DW_TAG_lo_user = 0x4080,
69  DW_TAG_hi_user = 0xffff,
70  DW_TAG_user_base = 0x1000 // Recommended base for user tags.
71};
72
73inline bool isType(Tag T) {
74  switch (T) {
75  case DW_TAG_array_type:
76  case DW_TAG_class_type:
77  case DW_TAG_interface_type:
78  case DW_TAG_enumeration_type:
79  case DW_TAG_pointer_type:
80  case DW_TAG_reference_type:
81  case DW_TAG_rvalue_reference_type:
82  case DW_TAG_string_type:
83  case DW_TAG_structure_type:
84  case DW_TAG_subroutine_type:
85  case DW_TAG_union_type:
86  case DW_TAG_ptr_to_member_type:
87  case DW_TAG_set_type:
88  case DW_TAG_subrange_type:
89  case DW_TAG_base_type:
90  case DW_TAG_const_type:
91  case DW_TAG_file_type:
92  case DW_TAG_packed_type:
93  case DW_TAG_volatile_type:
94  case DW_TAG_typedef:
95    return true;
96  default:
97    return false;
98  }
99}
100
101/// Attributes.
102enum Attribute : uint16_t {
103#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) DW_AT_##NAME = ID,
104#include "llvm/BinaryFormat/Dwarf.def"
105  DW_AT_lo_user = 0x2000,
106  DW_AT_hi_user = 0x3fff,
107};
108
109enum Form : uint16_t {
110#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) DW_FORM_##NAME = ID,
111#include "llvm/BinaryFormat/Dwarf.def"
112  DW_FORM_lo_user = 0x1f00, ///< Not specified by DWARF.
113};
114
115enum LocationAtom {
116#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) DW_OP_##NAME = ID,
117#include "llvm/BinaryFormat/Dwarf.def"
118  DW_OP_lo_user = 0xe0,
119  DW_OP_hi_user = 0xff,
120  DW_OP_LLVM_fragment = 0x1000 ///< Only used in LLVM metadata.
121};
122
123enum TypeKind {
124#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) DW_ATE_##NAME = ID,
125#include "llvm/BinaryFormat/Dwarf.def"
126  DW_ATE_lo_user = 0x80,
127  DW_ATE_hi_user = 0xff
128};
129
130enum DecimalSignEncoding {
131  // Decimal sign attribute values
132  DW_DS_unsigned = 0x01,
133  DW_DS_leading_overpunch = 0x02,
134  DW_DS_trailing_overpunch = 0x03,
135  DW_DS_leading_separate = 0x04,
136  DW_DS_trailing_separate = 0x05
137};
138
139enum EndianityEncoding {
140  // Endianity attribute values
141  DW_END_default = 0x00,
142  DW_END_big = 0x01,
143  DW_END_little = 0x02,
144  DW_END_lo_user = 0x40,
145  DW_END_hi_user = 0xff
146};
147
148enum AccessAttribute {
149  // Accessibility codes
150  DW_ACCESS_public = 0x01,
151  DW_ACCESS_protected = 0x02,
152  DW_ACCESS_private = 0x03
153};
154
155enum VisibilityAttribute {
156  // Visibility codes
157  DW_VIS_local = 0x01,
158  DW_VIS_exported = 0x02,
159  DW_VIS_qualified = 0x03
160};
161
162enum VirtualityAttribute {
163#define HANDLE_DW_VIRTUALITY(ID, NAME) DW_VIRTUALITY_##NAME = ID,
164#include "llvm/BinaryFormat/Dwarf.def"
165  DW_VIRTUALITY_max = 0x02
166};
167
168enum DefaultedMemberAttribute {
169#define HANDLE_DW_DEFAULTED(ID, NAME) DW_DEFAULTED_##NAME = ID,
170#include "llvm/BinaryFormat/Dwarf.def"
171  DW_DEFAULTED_max = 0x02
172};
173
174enum SourceLanguage {
175#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) DW_LANG_##NAME = ID,
176#include "llvm/BinaryFormat/Dwarf.def"
177  DW_LANG_lo_user = 0x8000,
178  DW_LANG_hi_user = 0xffff
179};
180
181enum CaseSensitivity {
182  // Identifier case codes
183  DW_ID_case_sensitive = 0x00,
184  DW_ID_up_case = 0x01,
185  DW_ID_down_case = 0x02,
186  DW_ID_case_insensitive = 0x03
187};
188
189enum CallingConvention {
190// Calling convention codes
191#define HANDLE_DW_CC(ID, NAME) DW_CC_##NAME = ID,
192#include "llvm/BinaryFormat/Dwarf.def"
193  DW_CC_lo_user = 0x40,
194  DW_CC_hi_user = 0xff
195};
196
197enum InlineAttribute {
198  // Inline codes
199  DW_INL_not_inlined = 0x00,
200  DW_INL_inlined = 0x01,
201  DW_INL_declared_not_inlined = 0x02,
202  DW_INL_declared_inlined = 0x03
203};
204
205enum ArrayDimensionOrdering {
206  // Array ordering
207  DW_ORD_row_major = 0x00,
208  DW_ORD_col_major = 0x01
209};
210
211enum DiscriminantList {
212  // Discriminant descriptor values
213  DW_DSC_label = 0x00,
214  DW_DSC_range = 0x01
215};
216
217/// Line Number Standard Opcode Encodings.
218enum LineNumberOps : uint8_t {
219#define HANDLE_DW_LNS(ID, NAME) DW_LNS_##NAME = ID,
220#include "llvm/BinaryFormat/Dwarf.def"
221};
222
223/// Line Number Extended Opcode Encodings.
224enum LineNumberExtendedOps {
225#define HANDLE_DW_LNE(ID, NAME) DW_LNE_##NAME = ID,
226#include "llvm/BinaryFormat/Dwarf.def"
227  DW_LNE_lo_user = 0x80,
228  DW_LNE_hi_user = 0xff
229};
230
231enum LineNumberEntryFormat {
232#define HANDLE_DW_LNCT(ID, NAME) DW_LNCT_##NAME = ID,
233#include "llvm/BinaryFormat/Dwarf.def"
234  DW_LNCT_lo_user = 0x2000,
235  DW_LNCT_hi_user = 0x3fff,
236};
237
238enum MacinfoRecordType {
239  // Macinfo Type Encodings
240  DW_MACINFO_define = 0x01,
241  DW_MACINFO_undef = 0x02,
242  DW_MACINFO_start_file = 0x03,
243  DW_MACINFO_end_file = 0x04,
244  DW_MACINFO_vendor_ext = 0xff
245};
246
247/// DWARF v5 macro information entry type encodings.
248enum MacroEntryType {
249#define HANDLE_DW_MACRO(ID, NAME) DW_MACRO_##NAME = ID,
250#include "llvm/BinaryFormat/Dwarf.def"
251  DW_MACRO_lo_user = 0xe0,
252  DW_MACRO_hi_user = 0xff
253};
254
255/// DWARF v5 range list entry encoding values.
256enum RangeListEntries {
257#define HANDLE_DW_RLE(ID, NAME) DW_RLE_##NAME = ID,
258#include "llvm/BinaryFormat/Dwarf.def"
259};
260
261/// Call frame instruction encodings.
262enum CallFrameInfo {
263#define HANDLE_DW_CFA(ID, NAME) DW_CFA_##NAME = ID,
264#include "llvm/BinaryFormat/Dwarf.def"
265  DW_CFA_extended = 0x00,
266
267  DW_CFA_lo_user = 0x1c,
268  DW_CFA_hi_user = 0x3f
269};
270
271enum Constants {
272  // Children flag
273  DW_CHILDREN_no = 0x00,
274  DW_CHILDREN_yes = 0x01,
275
276  DW_EH_PE_absptr = 0x00,
277  DW_EH_PE_omit = 0xff,
278  DW_EH_PE_uleb128 = 0x01,
279  DW_EH_PE_udata2 = 0x02,
280  DW_EH_PE_udata4 = 0x03,
281  DW_EH_PE_udata8 = 0x04,
282  DW_EH_PE_sleb128 = 0x09,
283  DW_EH_PE_sdata2 = 0x0A,
284  DW_EH_PE_sdata4 = 0x0B,
285  DW_EH_PE_sdata8 = 0x0C,
286  DW_EH_PE_signed = 0x08,
287  DW_EH_PE_pcrel = 0x10,
288  DW_EH_PE_textrel = 0x20,
289  DW_EH_PE_datarel = 0x30,
290  DW_EH_PE_funcrel = 0x40,
291  DW_EH_PE_aligned = 0x50,
292  DW_EH_PE_indirect = 0x80
293};
294
295/// Constants for location lists in DWARF v5.
296enum LocationListEntry : unsigned char {
297  DW_LLE_end_of_list = 0x00,
298  DW_LLE_base_addressx = 0x01,
299  DW_LLE_startx_endx = 0x02,
300  DW_LLE_startx_length = 0x03,
301  DW_LLE_offset_pair = 0x04,
302  DW_LLE_default_location = 0x05,
303  DW_LLE_base_address = 0x06,
304  DW_LLE_start_end = 0x07,
305  DW_LLE_start_length = 0x08
306};
307
308/// Constants for the DW_APPLE_PROPERTY_attributes attribute.
309/// Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
310enum ApplePropertyAttributes {
311#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) DW_APPLE_PROPERTY_##NAME = ID,
312#include "llvm/BinaryFormat/Dwarf.def"
313};
314
315/// Constants for unit types in DWARF v5.
316enum UnitType : unsigned char {
317#define HANDLE_DW_UT(ID, NAME) DW_UT_##NAME = ID,
318#include "llvm/BinaryFormat/Dwarf.def"
319  DW_UT_lo_user = 0x80,
320  DW_UT_hi_user = 0xff
321};
322
323// Constants for the DWARF v5 Accelerator Table Proposal
324enum AcceleratorTable {
325  // Data layout descriptors.
326  DW_ATOM_null = 0u,       // Marker as the end of a list of atoms.
327  DW_ATOM_die_offset = 1u, // DIE offset in the debug_info section.
328  DW_ATOM_cu_offset = 2u, // Offset of the compile unit header that contains the
329                          // item in question.
330  DW_ATOM_die_tag = 3u,   // A tag entry.
331  DW_ATOM_type_flags = 4u, // Set of flags for a type.
332
333  // DW_ATOM_type_flags values.
334
335  // Always set for C++, only set for ObjC if this is the @implementation for a
336  // class.
337  DW_FLAG_type_implementation = 2u,
338
339  // Hash functions.
340
341  // Daniel J. Bernstein hash.
342  DW_hash_function_djb = 0u
343};
344
345// Constants for the GNU pubnames/pubtypes extensions supporting gdb index.
346enum GDBIndexEntryKind {
347  GIEK_NONE,
348  GIEK_TYPE,
349  GIEK_VARIABLE,
350  GIEK_FUNCTION,
351  GIEK_OTHER,
352  GIEK_UNUSED5,
353  GIEK_UNUSED6,
354  GIEK_UNUSED7
355};
356
357enum GDBIndexEntryLinkage { GIEL_EXTERNAL, GIEL_STATIC };
358
359/// \defgroup DwarfConstantsDumping Dwarf constants dumping functions
360///
361/// All these functions map their argument's value back to the
362/// corresponding enumerator name or return nullptr if the value isn't
363/// known.
364///
365/// @{
366StringRef TagString(unsigned Tag);
367StringRef ChildrenString(unsigned Children);
368StringRef AttributeString(unsigned Attribute);
369StringRef FormEncodingString(unsigned Encoding);
370StringRef OperationEncodingString(unsigned Encoding);
371StringRef AttributeEncodingString(unsigned Encoding);
372StringRef DecimalSignString(unsigned Sign);
373StringRef EndianityString(unsigned Endian);
374StringRef AccessibilityString(unsigned Access);
375StringRef VisibilityString(unsigned Visibility);
376StringRef VirtualityString(unsigned Virtuality);
377StringRef LanguageString(unsigned Language);
378StringRef CaseString(unsigned Case);
379StringRef ConventionString(unsigned Convention);
380StringRef InlineCodeString(unsigned Code);
381StringRef ArrayOrderString(unsigned Order);
382StringRef DiscriminantString(unsigned Discriminant);
383StringRef LNStandardString(unsigned Standard);
384StringRef LNExtendedString(unsigned Encoding);
385StringRef MacinfoString(unsigned Encoding);
386StringRef CallFrameString(unsigned Encoding);
387StringRef ApplePropertyString(unsigned);
388StringRef UnitTypeString(unsigned);
389StringRef AtomTypeString(unsigned Atom);
390StringRef GDBIndexEntryKindString(GDBIndexEntryKind Kind);
391StringRef GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage);
392/// @}
393
394/// \defgroup DwarfConstantsParsing Dwarf constants parsing functions
395///
396/// These functions map their strings back to the corresponding enumeration
397/// value or return 0 if there is none, except for these exceptions:
398///
399/// \li \a getTag() returns \a DW_TAG_invalid on invalid input.
400/// \li \a getVirtuality() returns \a DW_VIRTUALITY_invalid on invalid input.
401/// \li \a getMacinfo() returns \a DW_MACINFO_invalid on invalid input.
402///
403/// @{
404unsigned getTag(StringRef TagString);
405unsigned getOperationEncoding(StringRef OperationEncodingString);
406unsigned getVirtuality(StringRef VirtualityString);
407unsigned getLanguage(StringRef LanguageString);
408unsigned getCallingConvention(StringRef LanguageString);
409unsigned getAttributeEncoding(StringRef EncodingString);
410unsigned getMacinfo(StringRef MacinfoString);
411/// @}
412
413/// \defgroup DwarfConstantsVersioning Dwarf version for constants
414///
415/// For constants defined by DWARF, returns the DWARF version when the constant
416/// was first defined. For vendor extensions, if there is a version-related
417/// policy for when to emit it, returns a version number for that policy.
418/// Otherwise returns 0.
419///
420/// @{
421unsigned TagVersion(Tag T);
422unsigned AttributeVersion(Attribute A);
423unsigned FormVersion(Form F);
424unsigned OperationVersion(LocationAtom O);
425unsigned AttributeEncodingVersion(TypeKind E);
426unsigned LanguageVersion(SourceLanguage L);
427/// @}
428
429/// \defgroup DwarfConstantsVendor Dwarf "vendor" for constants
430///
431/// These functions return an identifier describing "who" defined the constant,
432/// either the DWARF standard itself or the vendor who defined the extension.
433///
434/// @{
435unsigned TagVendor(Tag T);
436unsigned AttributeVendor(Attribute A);
437unsigned FormVendor(Form F);
438unsigned OperationVendor(LocationAtom O);
439unsigned AttributeEncodingVendor(TypeKind E);
440unsigned LanguageVendor(SourceLanguage L);
441/// @}
442
443/// Tells whether the specified form is defined in the specified version,
444/// or is an extension if extensions are allowed.
445bool isValidFormForVersion(Form F, unsigned Version, bool ExtensionsOk = true);
446
447/// \brief Returns the symbolic string representing Val when used as a value
448/// for attribute Attr.
449StringRef AttributeValueString(uint16_t Attr, unsigned Val);
450
451/// \brief Decsribes an entry of the various gnu_pub* debug sections.
452///
453/// The gnu_pub* kind looks like:
454///
455/// 0-3  reserved
456/// 4-6  symbol kind
457/// 7    0 == global, 1 == static
458///
459/// A gdb_index descriptor includes the above kind, shifted 24 bits up with the
460/// offset of the cu within the debug_info section stored in those 24 bits.
461struct PubIndexEntryDescriptor {
462  GDBIndexEntryKind Kind;
463  GDBIndexEntryLinkage Linkage;
464  PubIndexEntryDescriptor(GDBIndexEntryKind Kind, GDBIndexEntryLinkage Linkage)
465      : Kind(Kind), Linkage(Linkage) {}
466  /* implicit */ PubIndexEntryDescriptor(GDBIndexEntryKind Kind)
467      : Kind(Kind), Linkage(GIEL_EXTERNAL) {}
468  explicit PubIndexEntryDescriptor(uint8_t Value)
469      : Kind(
470            static_cast<GDBIndexEntryKind>((Value & KIND_MASK) >> KIND_OFFSET)),
471        Linkage(static_cast<GDBIndexEntryLinkage>((Value & LINKAGE_MASK) >>
472                                                  LINKAGE_OFFSET)) {}
473  uint8_t toBits() const {
474    return Kind << KIND_OFFSET | Linkage << LINKAGE_OFFSET;
475  }
476
477private:
478  enum {
479    KIND_OFFSET = 4,
480    KIND_MASK = 7 << KIND_OFFSET,
481    LINKAGE_OFFSET = 7,
482    LINKAGE_MASK = 1 << LINKAGE_OFFSET
483  };
484};
485
486/// Constants that define the DWARF format as 32 or 64 bit.
487enum DwarfFormat { DWARF32, DWARF64 };
488
489} // End of namespace dwarf
490
491} // End of namespace llvm
492
493#endif
494