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