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