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