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