1 //===-- llvm/BinaryFormat/Dwarf.cpp - Dwarf Framework ------------*- C++-*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file contains support for generic dwarf information. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/BinaryFormat/Dwarf.h" 14 #include "llvm/ADT/StringSwitch.h" 15 #include "llvm/ADT/Triple.h" 16 #include "llvm/Support/ErrorHandling.h" 17 18 using namespace llvm; 19 using namespace dwarf; 20 21 StringRef llvm::dwarf::TagString(unsigned Tag) { 22 switch (Tag) { 23 default: 24 return StringRef(); 25 #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 26 case DW_TAG_##NAME: \ 27 return "DW_TAG_" #NAME; 28 #include "llvm/BinaryFormat/Dwarf.def" 29 } 30 } 31 32 unsigned llvm::dwarf::getTag(StringRef TagString) { 33 return StringSwitch<unsigned>(TagString) 34 #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 35 .Case("DW_TAG_" #NAME, DW_TAG_##NAME) 36 #include "llvm/BinaryFormat/Dwarf.def" 37 .Default(DW_TAG_invalid); 38 } 39 40 unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) { 41 switch (Tag) { 42 default: 43 return 0; 44 #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 45 case DW_TAG_##NAME: \ 46 return VERSION; 47 #include "llvm/BinaryFormat/Dwarf.def" 48 } 49 } 50 51 unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) { 52 switch (Tag) { 53 default: 54 return 0; 55 #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 56 case DW_TAG_##NAME: \ 57 return DWARF_VENDOR_##VENDOR; 58 #include "llvm/BinaryFormat/Dwarf.def" 59 } 60 } 61 62 StringRef llvm::dwarf::ChildrenString(unsigned Children) { 63 switch (Children) { 64 case DW_CHILDREN_no: 65 return "DW_CHILDREN_no"; 66 case DW_CHILDREN_yes: 67 return "DW_CHILDREN_yes"; 68 } 69 return StringRef(); 70 } 71 72 StringRef llvm::dwarf::AttributeString(unsigned Attribute) { 73 switch (Attribute) { 74 default: 75 return StringRef(); 76 #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ 77 case DW_AT_##NAME: \ 78 return "DW_AT_" #NAME; 79 #include "llvm/BinaryFormat/Dwarf.def" 80 } 81 } 82 83 unsigned llvm::dwarf::AttributeVersion(dwarf::Attribute Attribute) { 84 switch (Attribute) { 85 default: 86 return 0; 87 #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ 88 case DW_AT_##NAME: \ 89 return VERSION; 90 #include "llvm/BinaryFormat/Dwarf.def" 91 } 92 } 93 94 unsigned llvm::dwarf::AttributeVendor(dwarf::Attribute Attribute) { 95 switch (Attribute) { 96 default: 97 return 0; 98 #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ 99 case DW_AT_##NAME: \ 100 return DWARF_VENDOR_##VENDOR; 101 #include "llvm/BinaryFormat/Dwarf.def" 102 } 103 } 104 105 StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) { 106 switch (Encoding) { 107 default: 108 return StringRef(); 109 #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ 110 case DW_FORM_##NAME: \ 111 return "DW_FORM_" #NAME; 112 #include "llvm/BinaryFormat/Dwarf.def" 113 } 114 } 115 116 unsigned llvm::dwarf::FormVersion(dwarf::Form Form) { 117 switch (Form) { 118 default: 119 return 0; 120 #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ 121 case DW_FORM_##NAME: \ 122 return VERSION; 123 #include "llvm/BinaryFormat/Dwarf.def" 124 } 125 } 126 127 unsigned llvm::dwarf::FormVendor(dwarf::Form Form) { 128 switch (Form) { 129 default: 130 return 0; 131 #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ 132 case DW_FORM_##NAME: \ 133 return DWARF_VENDOR_##VENDOR; 134 #include "llvm/BinaryFormat/Dwarf.def" 135 } 136 } 137 138 StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) { 139 switch (Encoding) { 140 default: 141 return StringRef(); 142 #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ 143 case DW_OP_##NAME: \ 144 return "DW_OP_" #NAME; 145 #include "llvm/BinaryFormat/Dwarf.def" 146 case DW_OP_LLVM_convert: 147 return "DW_OP_LLVM_convert"; 148 case DW_OP_LLVM_fragment: 149 return "DW_OP_LLVM_fragment"; 150 case DW_OP_LLVM_tag_offset: 151 return "DW_OP_LLVM_tag_offset"; 152 case DW_OP_LLVM_entry_value: 153 return "DW_OP_LLVM_entry_value"; 154 case DW_OP_LLVM_implicit_pointer: 155 return "DW_OP_LLVM_implicit_pointer"; 156 case DW_OP_LLVM_arg: 157 return "DW_OP_LLVM_arg"; 158 } 159 } 160 161 unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) { 162 return StringSwitch<unsigned>(OperationEncodingString) 163 #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ 164 .Case("DW_OP_" #NAME, DW_OP_##NAME) 165 #include "llvm/BinaryFormat/Dwarf.def" 166 .Case("DW_OP_LLVM_convert", DW_OP_LLVM_convert) 167 .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment) 168 .Case("DW_OP_LLVM_tag_offset", DW_OP_LLVM_tag_offset) 169 .Case("DW_OP_LLVM_entry_value", DW_OP_LLVM_entry_value) 170 .Case("DW_OP_LLVM_implicit_pointer", DW_OP_LLVM_implicit_pointer) 171 .Case("DW_OP_LLVM_arg", DW_OP_LLVM_arg) 172 .Default(0); 173 } 174 175 unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) { 176 switch (Op) { 177 default: 178 return 0; 179 #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ 180 case DW_OP_##NAME: \ 181 return VERSION; 182 #include "llvm/BinaryFormat/Dwarf.def" 183 } 184 } 185 186 unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) { 187 switch (Op) { 188 default: 189 return 0; 190 #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ 191 case DW_OP_##NAME: \ 192 return DWARF_VENDOR_##VENDOR; 193 #include "llvm/BinaryFormat/Dwarf.def" 194 } 195 } 196 197 StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) { 198 switch (Encoding) { 199 default: 200 return StringRef(); 201 #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 202 case DW_ATE_##NAME: \ 203 return "DW_ATE_" #NAME; 204 #include "llvm/BinaryFormat/Dwarf.def" 205 } 206 } 207 208 unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) { 209 return StringSwitch<unsigned>(EncodingString) 210 #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 211 .Case("DW_ATE_" #NAME, DW_ATE_##NAME) 212 #include "llvm/BinaryFormat/Dwarf.def" 213 .Default(0); 214 } 215 216 unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) { 217 switch (ATE) { 218 default: 219 return 0; 220 #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 221 case DW_ATE_##NAME: \ 222 return VERSION; 223 #include "llvm/BinaryFormat/Dwarf.def" 224 } 225 } 226 227 unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) { 228 switch (ATE) { 229 default: 230 return 0; 231 #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 232 case DW_ATE_##NAME: \ 233 return DWARF_VENDOR_##VENDOR; 234 #include "llvm/BinaryFormat/Dwarf.def" 235 } 236 } 237 238 StringRef llvm::dwarf::DecimalSignString(unsigned Sign) { 239 switch (Sign) { 240 case DW_DS_unsigned: 241 return "DW_DS_unsigned"; 242 case DW_DS_leading_overpunch: 243 return "DW_DS_leading_overpunch"; 244 case DW_DS_trailing_overpunch: 245 return "DW_DS_trailing_overpunch"; 246 case DW_DS_leading_separate: 247 return "DW_DS_leading_separate"; 248 case DW_DS_trailing_separate: 249 return "DW_DS_trailing_separate"; 250 } 251 return StringRef(); 252 } 253 254 StringRef llvm::dwarf::EndianityString(unsigned Endian) { 255 switch (Endian) { 256 case DW_END_default: 257 return "DW_END_default"; 258 case DW_END_big: 259 return "DW_END_big"; 260 case DW_END_little: 261 return "DW_END_little"; 262 case DW_END_lo_user: 263 return "DW_END_lo_user"; 264 case DW_END_hi_user: 265 return "DW_END_hi_user"; 266 } 267 return StringRef(); 268 } 269 270 StringRef llvm::dwarf::AccessibilityString(unsigned Access) { 271 switch (Access) { 272 // Accessibility codes 273 case DW_ACCESS_public: 274 return "DW_ACCESS_public"; 275 case DW_ACCESS_protected: 276 return "DW_ACCESS_protected"; 277 case DW_ACCESS_private: 278 return "DW_ACCESS_private"; 279 } 280 return StringRef(); 281 } 282 283 StringRef llvm::dwarf::DefaultedMemberString(unsigned DefaultedEncodings) { 284 switch (DefaultedEncodings) { 285 // Defaulted Member Encodings codes 286 case DW_DEFAULTED_no: 287 return "DW_DEFAULTED_no"; 288 case DW_DEFAULTED_in_class: 289 return "DW_DEFAULTED_in_class"; 290 case DW_DEFAULTED_out_of_class: 291 return "DW_DEFAULTED_out_of_class"; 292 } 293 return StringRef(); 294 } 295 296 StringRef llvm::dwarf::VisibilityString(unsigned Visibility) { 297 switch (Visibility) { 298 case DW_VIS_local: 299 return "DW_VIS_local"; 300 case DW_VIS_exported: 301 return "DW_VIS_exported"; 302 case DW_VIS_qualified: 303 return "DW_VIS_qualified"; 304 } 305 return StringRef(); 306 } 307 308 StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) { 309 switch (Virtuality) { 310 default: 311 return StringRef(); 312 #define HANDLE_DW_VIRTUALITY(ID, NAME) \ 313 case DW_VIRTUALITY_##NAME: \ 314 return "DW_VIRTUALITY_" #NAME; 315 #include "llvm/BinaryFormat/Dwarf.def" 316 } 317 } 318 319 unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) { 320 return StringSwitch<unsigned>(VirtualityString) 321 #define HANDLE_DW_VIRTUALITY(ID, NAME) \ 322 .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME) 323 #include "llvm/BinaryFormat/Dwarf.def" 324 .Default(DW_VIRTUALITY_invalid); 325 } 326 327 StringRef llvm::dwarf::LanguageString(unsigned Language) { 328 switch (Language) { 329 default: 330 return StringRef(); 331 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 332 case DW_LANG_##NAME: \ 333 return "DW_LANG_" #NAME; 334 #include "llvm/BinaryFormat/Dwarf.def" 335 } 336 } 337 338 unsigned llvm::dwarf::getLanguage(StringRef LanguageString) { 339 return StringSwitch<unsigned>(LanguageString) 340 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 341 .Case("DW_LANG_" #NAME, DW_LANG_##NAME) 342 #include "llvm/BinaryFormat/Dwarf.def" 343 .Default(0); 344 } 345 346 unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) { 347 switch (Lang) { 348 default: 349 return 0; 350 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 351 case DW_LANG_##NAME: \ 352 return VERSION; 353 #include "llvm/BinaryFormat/Dwarf.def" 354 } 355 } 356 357 unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) { 358 switch (Lang) { 359 default: 360 return 0; 361 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 362 case DW_LANG_##NAME: \ 363 return DWARF_VENDOR_##VENDOR; 364 #include "llvm/BinaryFormat/Dwarf.def" 365 } 366 } 367 368 Optional<unsigned> llvm::dwarf::LanguageLowerBound(dwarf::SourceLanguage Lang) { 369 switch (Lang) { 370 default: 371 return None; 372 #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 373 case DW_LANG_##NAME: \ 374 return LOWER_BOUND; 375 #include "llvm/BinaryFormat/Dwarf.def" 376 } 377 } 378 379 StringRef llvm::dwarf::CaseString(unsigned Case) { 380 switch (Case) { 381 case DW_ID_case_sensitive: 382 return "DW_ID_case_sensitive"; 383 case DW_ID_up_case: 384 return "DW_ID_up_case"; 385 case DW_ID_down_case: 386 return "DW_ID_down_case"; 387 case DW_ID_case_insensitive: 388 return "DW_ID_case_insensitive"; 389 } 390 return StringRef(); 391 } 392 393 StringRef llvm::dwarf::ConventionString(unsigned CC) { 394 switch (CC) { 395 default: 396 return StringRef(); 397 #define HANDLE_DW_CC(ID, NAME) \ 398 case DW_CC_##NAME: \ 399 return "DW_CC_" #NAME; 400 #include "llvm/BinaryFormat/Dwarf.def" 401 } 402 } 403 404 unsigned llvm::dwarf::getCallingConvention(StringRef CCString) { 405 return StringSwitch<unsigned>(CCString) 406 #define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME) 407 #include "llvm/BinaryFormat/Dwarf.def" 408 .Default(0); 409 } 410 411 StringRef llvm::dwarf::InlineCodeString(unsigned Code) { 412 switch (Code) { 413 case DW_INL_not_inlined: 414 return "DW_INL_not_inlined"; 415 case DW_INL_inlined: 416 return "DW_INL_inlined"; 417 case DW_INL_declared_not_inlined: 418 return "DW_INL_declared_not_inlined"; 419 case DW_INL_declared_inlined: 420 return "DW_INL_declared_inlined"; 421 } 422 return StringRef(); 423 } 424 425 StringRef llvm::dwarf::ArrayOrderString(unsigned Order) { 426 switch (Order) { 427 case DW_ORD_row_major: 428 return "DW_ORD_row_major"; 429 case DW_ORD_col_major: 430 return "DW_ORD_col_major"; 431 } 432 return StringRef(); 433 } 434 435 StringRef llvm::dwarf::LNStandardString(unsigned Standard) { 436 switch (Standard) { 437 default: 438 return StringRef(); 439 #define HANDLE_DW_LNS(ID, NAME) \ 440 case DW_LNS_##NAME: \ 441 return "DW_LNS_" #NAME; 442 #include "llvm/BinaryFormat/Dwarf.def" 443 } 444 } 445 446 StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) { 447 switch (Encoding) { 448 default: 449 return StringRef(); 450 #define HANDLE_DW_LNE(ID, NAME) \ 451 case DW_LNE_##NAME: \ 452 return "DW_LNE_" #NAME; 453 #include "llvm/BinaryFormat/Dwarf.def" 454 } 455 } 456 457 StringRef llvm::dwarf::MacinfoString(unsigned Encoding) { 458 switch (Encoding) { 459 // Macinfo Type Encodings 460 case DW_MACINFO_define: 461 return "DW_MACINFO_define"; 462 case DW_MACINFO_undef: 463 return "DW_MACINFO_undef"; 464 case DW_MACINFO_start_file: 465 return "DW_MACINFO_start_file"; 466 case DW_MACINFO_end_file: 467 return "DW_MACINFO_end_file"; 468 case DW_MACINFO_vendor_ext: 469 return "DW_MACINFO_vendor_ext"; 470 case DW_MACINFO_invalid: 471 return "DW_MACINFO_invalid"; 472 } 473 return StringRef(); 474 } 475 476 unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) { 477 return StringSwitch<unsigned>(MacinfoString) 478 .Case("DW_MACINFO_define", DW_MACINFO_define) 479 .Case("DW_MACINFO_undef", DW_MACINFO_undef) 480 .Case("DW_MACINFO_start_file", DW_MACINFO_start_file) 481 .Case("DW_MACINFO_end_file", DW_MACINFO_end_file) 482 .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext) 483 .Default(DW_MACINFO_invalid); 484 } 485 486 StringRef llvm::dwarf::MacroString(unsigned Encoding) { 487 switch (Encoding) { 488 default: 489 return StringRef(); 490 #define HANDLE_DW_MACRO(ID, NAME) \ 491 case DW_MACRO_##NAME: \ 492 return "DW_MACRO_" #NAME; 493 #include "llvm/BinaryFormat/Dwarf.def" 494 } 495 } 496 497 StringRef llvm::dwarf::GnuMacroString(unsigned Encoding) { 498 switch (Encoding) { 499 default: 500 return StringRef(); 501 #define HANDLE_DW_MACRO_GNU(ID, NAME) \ 502 case DW_MACRO_GNU_##NAME: \ 503 return "DW_MACRO_GNU_" #NAME; 504 #include "llvm/BinaryFormat/Dwarf.def" 505 } 506 } 507 508 unsigned llvm::dwarf::getMacro(StringRef MacroString) { 509 return StringSwitch<unsigned>(MacroString) 510 #define HANDLE_DW_MACRO(ID, NAME) .Case("DW_MACRO_" #NAME, ID) 511 #include "llvm/BinaryFormat/Dwarf.def" 512 .Default(DW_MACINFO_invalid); 513 } 514 StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) { 515 switch (Encoding) { 516 default: 517 return StringRef(); 518 #define HANDLE_DW_RLE(ID, NAME) \ 519 case DW_RLE_##NAME: \ 520 return "DW_RLE_" #NAME; 521 #include "llvm/BinaryFormat/Dwarf.def" 522 } 523 } 524 525 StringRef llvm::dwarf::LocListEncodingString(unsigned Encoding) { 526 switch (Encoding) { 527 default: 528 return StringRef(); 529 #define HANDLE_DW_LLE(ID, NAME) \ 530 case DW_LLE_##NAME: \ 531 return "DW_LLE_" #NAME; 532 #include "llvm/BinaryFormat/Dwarf.def" 533 } 534 } 535 536 StringRef llvm::dwarf::CallFrameString(unsigned Encoding, 537 Triple::ArchType Arch) { 538 assert(Arch != llvm::Triple::ArchType::UnknownArch); 539 #define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64) 540 #define SELECT_MIPS64 Arch == llvm::Triple::mips64 541 #define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9) 542 #define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) 543 #define HANDLE_DW_CFA(ID, NAME) 544 #define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \ 545 if (ID == Encoding && PRED) \ 546 return "DW_CFA_" #NAME; 547 #include "llvm/BinaryFormat/Dwarf.def" 548 549 switch (Encoding) { 550 default: 551 return StringRef(); 552 #define HANDLE_DW_CFA_PRED(ID, NAME, PRED) 553 #define HANDLE_DW_CFA(ID, NAME) \ 554 case DW_CFA_##NAME: \ 555 return "DW_CFA_" #NAME; 556 #include "llvm/BinaryFormat/Dwarf.def" 557 558 #undef SELECT_X86 559 #undef SELECT_SPARC 560 #undef SELECT_MIPS64 561 #undef SELECT_AARCH64 562 } 563 } 564 565 StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) { 566 switch (Prop) { 567 default: 568 return StringRef(); 569 #define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \ 570 case DW_APPLE_PROPERTY_##NAME: \ 571 return "DW_APPLE_PROPERTY_" #NAME; 572 #include "llvm/BinaryFormat/Dwarf.def" 573 } 574 } 575 576 StringRef llvm::dwarf::UnitTypeString(unsigned UT) { 577 switch (UT) { 578 default: 579 return StringRef(); 580 #define HANDLE_DW_UT(ID, NAME) \ 581 case DW_UT_##NAME: \ 582 return "DW_UT_" #NAME; 583 #include "llvm/BinaryFormat/Dwarf.def" 584 } 585 } 586 587 StringRef llvm::dwarf::AtomTypeString(unsigned AT) { 588 switch (AT) { 589 case dwarf::DW_ATOM_null: 590 return "DW_ATOM_null"; 591 case dwarf::DW_ATOM_die_offset: 592 return "DW_ATOM_die_offset"; 593 case DW_ATOM_cu_offset: 594 return "DW_ATOM_cu_offset"; 595 case DW_ATOM_die_tag: 596 return "DW_ATOM_die_tag"; 597 case DW_ATOM_type_flags: 598 case DW_ATOM_type_type_flags: 599 return "DW_ATOM_type_flags"; 600 case DW_ATOM_qual_name_hash: 601 return "DW_ATOM_qual_name_hash"; 602 } 603 return StringRef(); 604 } 605 606 StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) { 607 switch (Kind) { 608 case GIEK_NONE: 609 return "NONE"; 610 case GIEK_TYPE: 611 return "TYPE"; 612 case GIEK_VARIABLE: 613 return "VARIABLE"; 614 case GIEK_FUNCTION: 615 return "FUNCTION"; 616 case GIEK_OTHER: 617 return "OTHER"; 618 case GIEK_UNUSED5: 619 return "UNUSED5"; 620 case GIEK_UNUSED6: 621 return "UNUSED6"; 622 case GIEK_UNUSED7: 623 return "UNUSED7"; 624 } 625 llvm_unreachable("Unknown GDBIndexEntryKind value"); 626 } 627 628 StringRef 629 llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) { 630 switch (Linkage) { 631 case GIEL_EXTERNAL: 632 return "EXTERNAL"; 633 case GIEL_STATIC: 634 return "STATIC"; 635 } 636 llvm_unreachable("Unknown GDBIndexEntryLinkage value"); 637 } 638 639 StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) { 640 switch (Attr) { 641 case DW_AT_accessibility: 642 return AccessibilityString(Val); 643 case DW_AT_virtuality: 644 return VirtualityString(Val); 645 case DW_AT_language: 646 return LanguageString(Val); 647 case DW_AT_encoding: 648 return AttributeEncodingString(Val); 649 case DW_AT_decimal_sign: 650 return DecimalSignString(Val); 651 case DW_AT_endianity: 652 return EndianityString(Val); 653 case DW_AT_visibility: 654 return VisibilityString(Val); 655 case DW_AT_identifier_case: 656 return CaseString(Val); 657 case DW_AT_calling_convention: 658 return ConventionString(Val); 659 case DW_AT_inline: 660 return InlineCodeString(Val); 661 case DW_AT_ordering: 662 return ArrayOrderString(Val); 663 case DW_AT_APPLE_runtime_class: 664 return LanguageString(Val); 665 case DW_AT_defaulted: 666 return DefaultedMemberString(Val); 667 } 668 669 return StringRef(); 670 } 671 672 StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) { 673 switch (Atom) { 674 case DW_ATOM_null: 675 return "NULL"; 676 case DW_ATOM_die_tag: 677 return TagString(Val); 678 } 679 680 return StringRef(); 681 } 682 683 StringRef llvm::dwarf::IndexString(unsigned Idx) { 684 switch (Idx) { 685 default: 686 return StringRef(); 687 #define HANDLE_DW_IDX(ID, NAME) \ 688 case DW_IDX_##NAME: \ 689 return "DW_IDX_" #NAME; 690 #include "llvm/BinaryFormat/Dwarf.def" 691 } 692 } 693 694 Optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form, 695 FormParams Params) { 696 switch (Form) { 697 case DW_FORM_addr: 698 if (Params) 699 return Params.AddrSize; 700 return None; 701 702 case DW_FORM_block: // ULEB128 length L followed by L bytes. 703 case DW_FORM_block1: // 1 byte length L followed by L bytes. 704 case DW_FORM_block2: // 2 byte length L followed by L bytes. 705 case DW_FORM_block4: // 4 byte length L followed by L bytes. 706 case DW_FORM_string: // C-string with null terminator. 707 case DW_FORM_sdata: // SLEB128. 708 case DW_FORM_udata: // ULEB128. 709 case DW_FORM_ref_udata: // ULEB128. 710 case DW_FORM_indirect: // ULEB128. 711 case DW_FORM_exprloc: // ULEB128 length L followed by L bytes. 712 case DW_FORM_strx: // ULEB128. 713 case DW_FORM_addrx: // ULEB128. 714 case DW_FORM_loclistx: // ULEB128. 715 case DW_FORM_rnglistx: // ULEB128. 716 case DW_FORM_GNU_addr_index: // ULEB128. 717 case DW_FORM_GNU_str_index: // ULEB128. 718 return None; 719 720 case DW_FORM_ref_addr: 721 if (Params) 722 return Params.getRefAddrByteSize(); 723 return None; 724 725 case DW_FORM_flag: 726 case DW_FORM_data1: 727 case DW_FORM_ref1: 728 case DW_FORM_strx1: 729 case DW_FORM_addrx1: 730 return 1; 731 732 case DW_FORM_data2: 733 case DW_FORM_ref2: 734 case DW_FORM_strx2: 735 case DW_FORM_addrx2: 736 return 2; 737 738 case DW_FORM_strx3: 739 return 3; 740 741 case DW_FORM_data4: 742 case DW_FORM_ref4: 743 case DW_FORM_ref_sup4: 744 case DW_FORM_strx4: 745 case DW_FORM_addrx4: 746 return 4; 747 748 case DW_FORM_strp: 749 case DW_FORM_GNU_ref_alt: 750 case DW_FORM_GNU_strp_alt: 751 case DW_FORM_line_strp: 752 case DW_FORM_sec_offset: 753 case DW_FORM_strp_sup: 754 if (Params) 755 return Params.getDwarfOffsetByteSize(); 756 return None; 757 758 case DW_FORM_data8: 759 case DW_FORM_ref8: 760 case DW_FORM_ref_sig8: 761 case DW_FORM_ref_sup8: 762 return 8; 763 764 case DW_FORM_flag_present: 765 return 0; 766 767 case DW_FORM_data16: 768 return 16; 769 770 case DW_FORM_implicit_const: 771 // The implicit value is stored in the abbreviation as a SLEB128, and 772 // there no data in debug info. 773 return 0; 774 775 default: 776 break; 777 } 778 return None; 779 } 780 781 bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version, 782 bool ExtensionsOk) { 783 if (FormVendor(F) == DWARF_VENDOR_DWARF) { 784 unsigned FV = FormVersion(F); 785 return FV > 0 && FV <= Version; 786 } 787 return ExtensionsOk; 788 } 789 790 StringRef llvm::dwarf::FormatString(DwarfFormat Format) { 791 switch (Format) { 792 case DWARF32: 793 return "DWARF32"; 794 case DWARF64: 795 return "DWARF64"; 796 } 797 return StringRef(); 798 } 799 800 StringRef llvm::dwarf::FormatString(bool IsDWARF64) { 801 return FormatString(IsDWARF64 ? DWARF64 : DWARF32); 802 } 803 804 StringRef llvm::dwarf::RLEString(unsigned RLE) { 805 switch (RLE) { 806 default: 807 return StringRef(); 808 #define HANDLE_DW_RLE(ID, NAME) \ 809 case DW_RLE_##NAME: \ 810 return "DW_RLE_" #NAME; 811 #include "llvm/BinaryFormat/Dwarf.def" 812 } 813 } 814 815 constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[]; 816 constexpr char llvm::dwarf::EnumTraits<Form>::Type[]; 817 constexpr char llvm::dwarf::EnumTraits<Index>::Type[]; 818 constexpr char llvm::dwarf::EnumTraits<Tag>::Type[]; 819 constexpr char llvm::dwarf::EnumTraits<LineNumberOps>::Type[]; 820 constexpr char llvm::dwarf::EnumTraits<LocationAtom>::Type[]; 821