Dwarf.h revision 319780
1319780Sdim//===-- llvm/BinaryFormat/Dwarf.h ---Dwarf Constants-------------*- C++ -*-===//
2319780Sdim//
3319780Sdim//                     The LLVM Compiler Infrastructure
4319780Sdim//
5319780Sdim// This file is distributed under the University of Illinois Open Source
6319780Sdim// License. See LICENSE.TXT for details.
7319780Sdim//
8319780Sdim//===----------------------------------------------------------------------===//
9319780Sdim//
10319780Sdim// \file
11319780Sdim// \brief This file contains constants used for implementing Dwarf
12319780Sdim// debug support.
13319780Sdim//
14319780Sdim// For details on the Dwarf specfication see the latest DWARF Debugging
15319780Sdim// Information Format standard document on http://www.dwarfstd.org. This
16319780Sdim// file often includes support for non-released standard features.
17319780Sdim//
18319780Sdim//===----------------------------------------------------------------------===//
19319780Sdim
20319780Sdim#ifndef LLVM_BINARYFORMAT_DWARF_H
21319780Sdim#define LLVM_BINARYFORMAT_DWARF_H
22319780Sdim
23319780Sdim#include "llvm/Support/Compiler.h"
24319780Sdim#include "llvm/Support/DataTypes.h"
25319780Sdim
26319780Sdimnamespace llvm {
27319780Sdimclass StringRef;
28319780Sdim
29319780Sdimnamespace dwarf {
30319780Sdim
31319780Sdim//===----------------------------------------------------------------------===//
32319780Sdim// DWARF constants as gleaned from the DWARF Debugging Information Format V.5
33319780Sdim// reference manual http://www.dwarfstd.org/.
34319780Sdim//
35319780Sdim
36319780Sdim// Do not mix the following two enumerations sets.  DW_TAG_invalid changes the
37319780Sdim// enumeration base type.
38319780Sdim
39319780Sdimenum LLVMConstants : uint32_t {
40319780Sdim  // LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
41319780Sdim  DW_TAG_invalid = ~0U,        // Tag for invalid results.
42319780Sdim  DW_VIRTUALITY_invalid = ~0U, // Virtuality for invalid results.
43319780Sdim  DW_MACINFO_invalid = ~0U,    // Macinfo type for invalid results.
44319780Sdim
45319780Sdim  // Other constants.
46319780Sdim  DWARF_VERSION = 4,       // Default dwarf version we output.
47319780Sdim  DW_PUBTYPES_VERSION = 2, // Section version number for .debug_pubtypes.
48319780Sdim  DW_PUBNAMES_VERSION = 2, // Section version number for .debug_pubnames.
49319780Sdim  DW_ARANGES_VERSION = 2,  // Section version number for .debug_aranges.
50319780Sdim  // Identifiers we use to distinguish vendor extensions.
51319780Sdim  DWARF_VENDOR_DWARF = 0, // Defined in v2 or later of the DWARF standard.
52319780Sdim  DWARF_VENDOR_APPLE = 1,
53319780Sdim  DWARF_VENDOR_BORLAND = 2,
54319780Sdim  DWARF_VENDOR_GNU = 3,
55319780Sdim  DWARF_VENDOR_GOOGLE = 4,
56319780Sdim  DWARF_VENDOR_LLVM = 5,
57319780Sdim  DWARF_VENDOR_MIPS = 6
58319780Sdim};
59319780Sdim
60319780Sdim// Special ID values that distinguish a CIE from a FDE in DWARF CFI.
61319780Sdim// Not inside an enum because a 64-bit value is needed.
62319780Sdimconst uint32_t DW_CIE_ID = UINT32_MAX;
63319780Sdimconst uint64_t DW64_CIE_ID = UINT64_MAX;
64319780Sdim
65319780Sdimenum Tag : uint16_t {
66319780Sdim#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) DW_TAG_##NAME = ID,
67319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
68319780Sdim  DW_TAG_lo_user = 0x4080,
69319780Sdim  DW_TAG_hi_user = 0xffff,
70319780Sdim  DW_TAG_user_base = 0x1000 // Recommended base for user tags.
71319780Sdim};
72319780Sdim
73319780Sdiminline bool isType(Tag T) {
74319780Sdim  switch (T) {
75319780Sdim  case DW_TAG_array_type:
76319780Sdim  case DW_TAG_class_type:
77319780Sdim  case DW_TAG_interface_type:
78319780Sdim  case DW_TAG_enumeration_type:
79319780Sdim  case DW_TAG_pointer_type:
80319780Sdim  case DW_TAG_reference_type:
81319780Sdim  case DW_TAG_rvalue_reference_type:
82319780Sdim  case DW_TAG_string_type:
83319780Sdim  case DW_TAG_structure_type:
84319780Sdim  case DW_TAG_subroutine_type:
85319780Sdim  case DW_TAG_union_type:
86319780Sdim  case DW_TAG_ptr_to_member_type:
87319780Sdim  case DW_TAG_set_type:
88319780Sdim  case DW_TAG_subrange_type:
89319780Sdim  case DW_TAG_base_type:
90319780Sdim  case DW_TAG_const_type:
91319780Sdim  case DW_TAG_file_type:
92319780Sdim  case DW_TAG_packed_type:
93319780Sdim  case DW_TAG_volatile_type:
94319780Sdim  case DW_TAG_typedef:
95319780Sdim    return true;
96319780Sdim  default:
97319780Sdim    return false;
98319780Sdim  }
99319780Sdim}
100319780Sdim
101319780Sdim/// Attributes.
102319780Sdimenum Attribute : uint16_t {
103319780Sdim#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) DW_AT_##NAME = ID,
104319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
105319780Sdim  DW_AT_lo_user = 0x2000,
106319780Sdim  DW_AT_hi_user = 0x3fff,
107319780Sdim};
108319780Sdim
109319780Sdimenum Form : uint16_t {
110319780Sdim#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) DW_FORM_##NAME = ID,
111319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
112319780Sdim  DW_FORM_lo_user = 0x1f00, ///< Not specified by DWARF.
113319780Sdim};
114319780Sdim
115319780Sdimenum LocationAtom {
116319780Sdim#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) DW_OP_##NAME = ID,
117319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
118319780Sdim  DW_OP_lo_user = 0xe0,
119319780Sdim  DW_OP_hi_user = 0xff,
120319780Sdim  DW_OP_LLVM_fragment = 0x1000 ///< Only used in LLVM metadata.
121319780Sdim};
122319780Sdim
123319780Sdimenum TypeKind {
124319780Sdim#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) DW_ATE_##NAME = ID,
125319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
126319780Sdim  DW_ATE_lo_user = 0x80,
127319780Sdim  DW_ATE_hi_user = 0xff
128319780Sdim};
129319780Sdim
130319780Sdimenum DecimalSignEncoding {
131319780Sdim  // Decimal sign attribute values
132319780Sdim  DW_DS_unsigned = 0x01,
133319780Sdim  DW_DS_leading_overpunch = 0x02,
134319780Sdim  DW_DS_trailing_overpunch = 0x03,
135319780Sdim  DW_DS_leading_separate = 0x04,
136319780Sdim  DW_DS_trailing_separate = 0x05
137319780Sdim};
138319780Sdim
139319780Sdimenum EndianityEncoding {
140319780Sdim  // Endianity attribute values
141319780Sdim  DW_END_default = 0x00,
142319780Sdim  DW_END_big = 0x01,
143319780Sdim  DW_END_little = 0x02,
144319780Sdim  DW_END_lo_user = 0x40,
145319780Sdim  DW_END_hi_user = 0xff
146319780Sdim};
147319780Sdim
148319780Sdimenum AccessAttribute {
149319780Sdim  // Accessibility codes
150319780Sdim  DW_ACCESS_public = 0x01,
151319780Sdim  DW_ACCESS_protected = 0x02,
152319780Sdim  DW_ACCESS_private = 0x03
153319780Sdim};
154319780Sdim
155319780Sdimenum VisibilityAttribute {
156319780Sdim  // Visibility codes
157319780Sdim  DW_VIS_local = 0x01,
158319780Sdim  DW_VIS_exported = 0x02,
159319780Sdim  DW_VIS_qualified = 0x03
160319780Sdim};
161319780Sdim
162319780Sdimenum VirtualityAttribute {
163319780Sdim#define HANDLE_DW_VIRTUALITY(ID, NAME) DW_VIRTUALITY_##NAME = ID,
164319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
165319780Sdim  DW_VIRTUALITY_max = 0x02
166319780Sdim};
167319780Sdim
168319780Sdimenum DefaultedMemberAttribute {
169319780Sdim#define HANDLE_DW_DEFAULTED(ID, NAME) DW_DEFAULTED_##NAME = ID,
170319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
171319780Sdim  DW_DEFAULTED_max = 0x02
172319780Sdim};
173319780Sdim
174319780Sdimenum SourceLanguage {
175319780Sdim#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) DW_LANG_##NAME = ID,
176319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
177319780Sdim  DW_LANG_lo_user = 0x8000,
178319780Sdim  DW_LANG_hi_user = 0xffff
179319780Sdim};
180319780Sdim
181319780Sdimenum CaseSensitivity {
182319780Sdim  // Identifier case codes
183319780Sdim  DW_ID_case_sensitive = 0x00,
184319780Sdim  DW_ID_up_case = 0x01,
185319780Sdim  DW_ID_down_case = 0x02,
186319780Sdim  DW_ID_case_insensitive = 0x03
187319780Sdim};
188319780Sdim
189319780Sdimenum CallingConvention {
190319780Sdim// Calling convention codes
191319780Sdim#define HANDLE_DW_CC(ID, NAME) DW_CC_##NAME = ID,
192319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
193319780Sdim  DW_CC_lo_user = 0x40,
194319780Sdim  DW_CC_hi_user = 0xff
195319780Sdim};
196319780Sdim
197319780Sdimenum InlineAttribute {
198319780Sdim  // Inline codes
199319780Sdim  DW_INL_not_inlined = 0x00,
200319780Sdim  DW_INL_inlined = 0x01,
201319780Sdim  DW_INL_declared_not_inlined = 0x02,
202319780Sdim  DW_INL_declared_inlined = 0x03
203319780Sdim};
204319780Sdim
205319780Sdimenum ArrayDimensionOrdering {
206319780Sdim  // Array ordering
207319780Sdim  DW_ORD_row_major = 0x00,
208319780Sdim  DW_ORD_col_major = 0x01
209319780Sdim};
210319780Sdim
211319780Sdimenum DiscriminantList {
212319780Sdim  // Discriminant descriptor values
213319780Sdim  DW_DSC_label = 0x00,
214319780Sdim  DW_DSC_range = 0x01
215319780Sdim};
216319780Sdim
217319780Sdim/// Line Number Standard Opcode Encodings.
218319780Sdimenum LineNumberOps : uint8_t {
219319780Sdim#define HANDLE_DW_LNS(ID, NAME) DW_LNS_##NAME = ID,
220319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
221319780Sdim};
222319780Sdim
223319780Sdim/// Line Number Extended Opcode Encodings.
224319780Sdimenum LineNumberExtendedOps {
225319780Sdim#define HANDLE_DW_LNE(ID, NAME) DW_LNE_##NAME = ID,
226319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
227319780Sdim  DW_LNE_lo_user = 0x80,
228319780Sdim  DW_LNE_hi_user = 0xff
229319780Sdim};
230319780Sdim
231319780Sdimenum LineNumberEntryFormat {
232319780Sdim#define HANDLE_DW_LNCT(ID, NAME) DW_LNCT_##NAME = ID,
233319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
234319780Sdim  DW_LNCT_lo_user = 0x2000,
235319780Sdim  DW_LNCT_hi_user = 0x3fff,
236319780Sdim};
237319780Sdim
238319780Sdimenum MacinfoRecordType {
239319780Sdim  // Macinfo Type Encodings
240319780Sdim  DW_MACINFO_define = 0x01,
241319780Sdim  DW_MACINFO_undef = 0x02,
242319780Sdim  DW_MACINFO_start_file = 0x03,
243319780Sdim  DW_MACINFO_end_file = 0x04,
244319780Sdim  DW_MACINFO_vendor_ext = 0xff
245319780Sdim};
246319780Sdim
247319780Sdim/// DWARF v5 macro information entry type encodings.
248319780Sdimenum MacroEntryType {
249319780Sdim#define HANDLE_DW_MACRO(ID, NAME) DW_MACRO_##NAME = ID,
250319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
251319780Sdim  DW_MACRO_lo_user = 0xe0,
252319780Sdim  DW_MACRO_hi_user = 0xff
253319780Sdim};
254319780Sdim
255319780Sdim/// DWARF v5 range list entry encoding values.
256319780Sdimenum RangeListEntries {
257319780Sdim#define HANDLE_DW_RLE(ID, NAME) DW_RLE_##NAME = ID,
258319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
259319780Sdim};
260319780Sdim
261319780Sdim/// Call frame instruction encodings.
262319780Sdimenum CallFrameInfo {
263319780Sdim#define HANDLE_DW_CFA(ID, NAME) DW_CFA_##NAME = ID,
264319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
265319780Sdim  DW_CFA_extended = 0x00,
266319780Sdim
267319780Sdim  DW_CFA_lo_user = 0x1c,
268319780Sdim  DW_CFA_hi_user = 0x3f
269319780Sdim};
270319780Sdim
271319780Sdimenum Constants {
272319780Sdim  // Children flag
273319780Sdim  DW_CHILDREN_no = 0x00,
274319780Sdim  DW_CHILDREN_yes = 0x01,
275319780Sdim
276319780Sdim  DW_EH_PE_absptr = 0x00,
277319780Sdim  DW_EH_PE_omit = 0xff,
278319780Sdim  DW_EH_PE_uleb128 = 0x01,
279319780Sdim  DW_EH_PE_udata2 = 0x02,
280319780Sdim  DW_EH_PE_udata4 = 0x03,
281319780Sdim  DW_EH_PE_udata8 = 0x04,
282319780Sdim  DW_EH_PE_sleb128 = 0x09,
283319780Sdim  DW_EH_PE_sdata2 = 0x0A,
284319780Sdim  DW_EH_PE_sdata4 = 0x0B,
285319780Sdim  DW_EH_PE_sdata8 = 0x0C,
286319780Sdim  DW_EH_PE_signed = 0x08,
287319780Sdim  DW_EH_PE_pcrel = 0x10,
288319780Sdim  DW_EH_PE_textrel = 0x20,
289319780Sdim  DW_EH_PE_datarel = 0x30,
290319780Sdim  DW_EH_PE_funcrel = 0x40,
291319780Sdim  DW_EH_PE_aligned = 0x50,
292319780Sdim  DW_EH_PE_indirect = 0x80
293319780Sdim};
294319780Sdim
295319780Sdim/// Constants for location lists in DWARF v5.
296319780Sdimenum LocationListEntry : unsigned char {
297319780Sdim  DW_LLE_end_of_list = 0x00,
298319780Sdim  DW_LLE_base_addressx = 0x01,
299319780Sdim  DW_LLE_startx_endx = 0x02,
300319780Sdim  DW_LLE_startx_length = 0x03,
301319780Sdim  DW_LLE_offset_pair = 0x04,
302319780Sdim  DW_LLE_default_location = 0x05,
303319780Sdim  DW_LLE_base_address = 0x06,
304319780Sdim  DW_LLE_start_end = 0x07,
305319780Sdim  DW_LLE_start_length = 0x08
306319780Sdim};
307319780Sdim
308319780Sdim/// Constants for the DW_APPLE_PROPERTY_attributes attribute.
309319780Sdim/// Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
310319780Sdimenum ApplePropertyAttributes {
311319780Sdim#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) DW_APPLE_PROPERTY_##NAME = ID,
312319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
313319780Sdim};
314319780Sdim
315319780Sdim/// Constants for unit types in DWARF v5.
316319780Sdimenum UnitType : unsigned char {
317319780Sdim#define HANDLE_DW_UT(ID, NAME) DW_UT_##NAME = ID,
318319780Sdim#include "llvm/BinaryFormat/Dwarf.def"
319319780Sdim  DW_UT_lo_user = 0x80,
320319780Sdim  DW_UT_hi_user = 0xff
321319780Sdim};
322319780Sdim
323319780Sdim// Constants for the DWARF v5 Accelerator Table Proposal
324319780Sdimenum AcceleratorTable {
325319780Sdim  // Data layout descriptors.
326319780Sdim  DW_ATOM_null = 0u,       // Marker as the end of a list of atoms.
327319780Sdim  DW_ATOM_die_offset = 1u, // DIE offset in the debug_info section.
328319780Sdim  DW_ATOM_cu_offset = 2u, // Offset of the compile unit header that contains the
329319780Sdim                          // item in question.
330319780Sdim  DW_ATOM_die_tag = 3u,   // A tag entry.
331319780Sdim  DW_ATOM_type_flags = 4u, // Set of flags for a type.
332319780Sdim
333319780Sdim  // DW_ATOM_type_flags values.
334319780Sdim
335319780Sdim  // Always set for C++, only set for ObjC if this is the @implementation for a
336319780Sdim  // class.
337319780Sdim  DW_FLAG_type_implementation = 2u,
338319780Sdim
339319780Sdim  // Hash functions.
340319780Sdim
341319780Sdim  // Daniel J. Bernstein hash.
342319780Sdim  DW_hash_function_djb = 0u
343319780Sdim};
344319780Sdim
345319780Sdim// Constants for the GNU pubnames/pubtypes extensions supporting gdb index.
346319780Sdimenum GDBIndexEntryKind {
347319780Sdim  GIEK_NONE,
348319780Sdim  GIEK_TYPE,
349319780Sdim  GIEK_VARIABLE,
350319780Sdim  GIEK_FUNCTION,
351319780Sdim  GIEK_OTHER,
352319780Sdim  GIEK_UNUSED5,
353319780Sdim  GIEK_UNUSED6,
354319780Sdim  GIEK_UNUSED7
355319780Sdim};
356319780Sdim
357319780Sdimenum GDBIndexEntryLinkage { GIEL_EXTERNAL, GIEL_STATIC };
358319780Sdim
359319780Sdim/// \defgroup DwarfConstantsDumping Dwarf constants dumping functions
360319780Sdim///
361319780Sdim/// All these functions map their argument's value back to the
362319780Sdim/// corresponding enumerator name or return nullptr if the value isn't
363319780Sdim/// known.
364319780Sdim///
365319780Sdim/// @{
366319780SdimStringRef TagString(unsigned Tag);
367319780SdimStringRef ChildrenString(unsigned Children);
368319780SdimStringRef AttributeString(unsigned Attribute);
369319780SdimStringRef FormEncodingString(unsigned Encoding);
370319780SdimStringRef OperationEncodingString(unsigned Encoding);
371319780SdimStringRef AttributeEncodingString(unsigned Encoding);
372319780SdimStringRef DecimalSignString(unsigned Sign);
373319780SdimStringRef EndianityString(unsigned Endian);
374319780SdimStringRef AccessibilityString(unsigned Access);
375319780SdimStringRef VisibilityString(unsigned Visibility);
376319780SdimStringRef VirtualityString(unsigned Virtuality);
377319780SdimStringRef LanguageString(unsigned Language);
378319780SdimStringRef CaseString(unsigned Case);
379319780SdimStringRef ConventionString(unsigned Convention);
380319780SdimStringRef InlineCodeString(unsigned Code);
381319780SdimStringRef ArrayOrderString(unsigned Order);
382319780SdimStringRef DiscriminantString(unsigned Discriminant);
383319780SdimStringRef LNStandardString(unsigned Standard);
384319780SdimStringRef LNExtendedString(unsigned Encoding);
385319780SdimStringRef MacinfoString(unsigned Encoding);
386319780SdimStringRef CallFrameString(unsigned Encoding);
387319780SdimStringRef ApplePropertyString(unsigned);
388319780SdimStringRef UnitTypeString(unsigned);
389319780SdimStringRef AtomTypeString(unsigned Atom);
390319780SdimStringRef GDBIndexEntryKindString(GDBIndexEntryKind Kind);
391319780SdimStringRef GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage);
392319780Sdim/// @}
393319780Sdim
394319780Sdim/// \defgroup DwarfConstantsParsing Dwarf constants parsing functions
395319780Sdim///
396319780Sdim/// These functions map their strings back to the corresponding enumeration
397319780Sdim/// value or return 0 if there is none, except for these exceptions:
398319780Sdim///
399319780Sdim/// \li \a getTag() returns \a DW_TAG_invalid on invalid input.
400319780Sdim/// \li \a getVirtuality() returns \a DW_VIRTUALITY_invalid on invalid input.
401319780Sdim/// \li \a getMacinfo() returns \a DW_MACINFO_invalid on invalid input.
402319780Sdim///
403319780Sdim/// @{
404319780Sdimunsigned getTag(StringRef TagString);
405319780Sdimunsigned getOperationEncoding(StringRef OperationEncodingString);
406319780Sdimunsigned getVirtuality(StringRef VirtualityString);
407319780Sdimunsigned getLanguage(StringRef LanguageString);
408319780Sdimunsigned getCallingConvention(StringRef LanguageString);
409319780Sdimunsigned getAttributeEncoding(StringRef EncodingString);
410319780Sdimunsigned getMacinfo(StringRef MacinfoString);
411319780Sdim/// @}
412319780Sdim
413319780Sdim/// \defgroup DwarfConstantsVersioning Dwarf version for constants
414319780Sdim///
415319780Sdim/// For constants defined by DWARF, returns the DWARF version when the constant
416319780Sdim/// was first defined. For vendor extensions, if there is a version-related
417319780Sdim/// policy for when to emit it, returns a version number for that policy.
418319780Sdim/// Otherwise returns 0.
419319780Sdim///
420319780Sdim/// @{
421319780Sdimunsigned TagVersion(Tag T);
422319780Sdimunsigned AttributeVersion(Attribute A);
423319780Sdimunsigned FormVersion(Form F);
424319780Sdimunsigned OperationVersion(LocationAtom O);
425319780Sdimunsigned AttributeEncodingVersion(TypeKind E);
426319780Sdimunsigned LanguageVersion(SourceLanguage L);
427319780Sdim/// @}
428319780Sdim
429319780Sdim/// \defgroup DwarfConstantsVendor Dwarf "vendor" for constants
430319780Sdim///
431319780Sdim/// These functions return an identifier describing "who" defined the constant,
432319780Sdim/// either the DWARF standard itself or the vendor who defined the extension.
433319780Sdim///
434319780Sdim/// @{
435319780Sdimunsigned TagVendor(Tag T);
436319780Sdimunsigned AttributeVendor(Attribute A);
437319780Sdimunsigned FormVendor(Form F);
438319780Sdimunsigned OperationVendor(LocationAtom O);
439319780Sdimunsigned AttributeEncodingVendor(TypeKind E);
440319780Sdimunsigned LanguageVendor(SourceLanguage L);
441319780Sdim/// @}
442319780Sdim
443319780Sdim/// Tells whether the specified form is defined in the specified version,
444319780Sdim/// or is an extension if extensions are allowed.
445319780Sdimbool isValidFormForVersion(Form F, unsigned Version, bool ExtensionsOk = true);
446319780Sdim
447319780Sdim/// \brief Returns the symbolic string representing Val when used as a value
448319780Sdim/// for attribute Attr.
449319780SdimStringRef AttributeValueString(uint16_t Attr, unsigned Val);
450319780Sdim
451319780Sdim/// \brief Decsribes an entry of the various gnu_pub* debug sections.
452319780Sdim///
453319780Sdim/// The gnu_pub* kind looks like:
454319780Sdim///
455319780Sdim/// 0-3  reserved
456319780Sdim/// 4-6  symbol kind
457319780Sdim/// 7    0 == global, 1 == static
458319780Sdim///
459319780Sdim/// A gdb_index descriptor includes the above kind, shifted 24 bits up with the
460319780Sdim/// offset of the cu within the debug_info section stored in those 24 bits.
461319780Sdimstruct PubIndexEntryDescriptor {
462319780Sdim  GDBIndexEntryKind Kind;
463319780Sdim  GDBIndexEntryLinkage Linkage;
464319780Sdim  PubIndexEntryDescriptor(GDBIndexEntryKind Kind, GDBIndexEntryLinkage Linkage)
465319780Sdim      : Kind(Kind), Linkage(Linkage) {}
466319780Sdim  /* implicit */ PubIndexEntryDescriptor(GDBIndexEntryKind Kind)
467319780Sdim      : Kind(Kind), Linkage(GIEL_EXTERNAL) {}
468319780Sdim  explicit PubIndexEntryDescriptor(uint8_t Value)
469319780Sdim      : Kind(
470319780Sdim            static_cast<GDBIndexEntryKind>((Value & KIND_MASK) >> KIND_OFFSET)),
471319780Sdim        Linkage(static_cast<GDBIndexEntryLinkage>((Value & LINKAGE_MASK) >>
472319780Sdim                                                  LINKAGE_OFFSET)) {}
473319780Sdim  uint8_t toBits() const {
474319780Sdim    return Kind << KIND_OFFSET | Linkage << LINKAGE_OFFSET;
475319780Sdim  }
476319780Sdim
477319780Sdimprivate:
478319780Sdim  enum {
479319780Sdim    KIND_OFFSET = 4,
480319780Sdim    KIND_MASK = 7 << KIND_OFFSET,
481319780Sdim    LINKAGE_OFFSET = 7,
482319780Sdim    LINKAGE_MASK = 1 << LINKAGE_OFFSET
483319780Sdim  };
484319780Sdim};
485319780Sdim
486319780Sdim/// Constants that define the DWARF format as 32 or 64 bit.
487319780Sdimenum DwarfFormat { DWARF32, DWARF64 };
488319780Sdim
489319780Sdim} // End of namespace dwarf
490319780Sdim
491319780Sdim} // End of namespace llvm
492319780Sdim
493319780Sdim#endif
494