1079 lines · cpp
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-exception6//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/Support/ErrorHandling.h"16#include "llvm/TargetParser/Triple.h"17 18using namespace llvm;19using namespace dwarf;20 21StringRef 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 32unsigned 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 40unsigned 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 51unsigned 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 62StringRef 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 72StringRef 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 83unsigned 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 94unsigned 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 105StringRef 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 116unsigned 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 127unsigned 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 138StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) {139 switch (Encoding) {140 default:141 return StringRef();142#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, 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 case DW_OP_LLVM_extract_bits_sext:159 return "DW_OP_LLVM_extract_bits_sext";160 case DW_OP_LLVM_extract_bits_zext:161 return "DW_OP_LLVM_extract_bits_zext";162 }163}164 165unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) {166 return StringSwitch<unsigned>(OperationEncodingString)167#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \168 .Case("DW_OP_" #NAME, DW_OP_##NAME)169#include "llvm/BinaryFormat/Dwarf.def"170 .Case("DW_OP_LLVM_convert", DW_OP_LLVM_convert)171 .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment)172 .Case("DW_OP_LLVM_tag_offset", DW_OP_LLVM_tag_offset)173 .Case("DW_OP_LLVM_entry_value", DW_OP_LLVM_entry_value)174 .Case("DW_OP_LLVM_implicit_pointer", DW_OP_LLVM_implicit_pointer)175 .Case("DW_OP_LLVM_arg", DW_OP_LLVM_arg)176 .Case("DW_OP_LLVM_extract_bits_sext", DW_OP_LLVM_extract_bits_sext)177 .Case("DW_OP_LLVM_extract_bits_zext", DW_OP_LLVM_extract_bits_zext)178 .Default(0);179}180 181static StringRef LlvmUserOperationEncodingString(unsigned Encoding) {182 switch (Encoding) {183 default:184 llvm_unreachable("unhandled DWARF operation with LLVM user op");185#define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) \186 case DW_OP_LLVM_##NAME: \187 return "DW_OP_LLVM_" #NAME;188#include "llvm/BinaryFormat/Dwarf.def"189 }190}191 192static unsigned193getLlvmUserOperationEncoding(StringRef LlvmUserOperationEncodingString) {194 unsigned E = StringSwitch<unsigned>(LlvmUserOperationEncodingString)195#define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) .Case(#NAME, DW_OP_LLVM_##NAME)196#include "llvm/BinaryFormat/Dwarf.def"197 .Default(0);198 assert(E && "unhandled DWARF operation string with LLVM user op");199 return E;200}201 202StringRef llvm::dwarf::SubOperationEncodingString(unsigned OpEncoding,203 unsigned SubOpEncoding) {204 assert(OpEncoding == DW_OP_LLVM_user);205 return LlvmUserOperationEncodingString(SubOpEncoding);206}207 208unsigned209llvm::dwarf::getSubOperationEncoding(unsigned OpEncoding,210 StringRef SubOperationEncodingString) {211 assert(OpEncoding == DW_OP_LLVM_user);212 return getLlvmUserOperationEncoding(SubOperationEncodingString);213}214 215unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) {216 switch (Op) {217 default:218 return 0;219#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \220 case DW_OP_##NAME: \221 return VERSION;222#include "llvm/BinaryFormat/Dwarf.def"223 }224}225 226std::optional<unsigned> llvm::dwarf::OperationOperands(dwarf::LocationAtom Op) {227 switch (Op) {228 default:229 return std::nullopt;230#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \231 case DW_OP_##NAME: \232 if (OPERANDS == -1) \233 return std::nullopt; \234 return OPERANDS;235#include "llvm/BinaryFormat/Dwarf.def"236 }237}238 239std::optional<unsigned> llvm::dwarf::OperationArity(dwarf::LocationAtom Op) {240 switch (Op) {241 default:242 return std::nullopt;243#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \244 case DW_OP_##NAME: \245 if (ARITY == -1) \246 return std::nullopt; \247 return ARITY;248#include "llvm/BinaryFormat/Dwarf.def"249 }250}251 252unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) {253 switch (Op) {254 default:255 return 0;256#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \257 case DW_OP_##NAME: \258 return DWARF_VENDOR_##VENDOR;259#include "llvm/BinaryFormat/Dwarf.def"260 }261}262 263StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) {264 switch (Encoding) {265 default:266 return StringRef();267#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \268 case DW_ATE_##NAME: \269 return "DW_ATE_" #NAME;270#include "llvm/BinaryFormat/Dwarf.def"271 }272}273 274unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) {275 return StringSwitch<unsigned>(EncodingString)276#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \277 .Case("DW_ATE_" #NAME, DW_ATE_##NAME)278#include "llvm/BinaryFormat/Dwarf.def"279 .Default(0);280}281 282unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) {283 switch (ATE) {284 default:285 return 0;286#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \287 case DW_ATE_##NAME: \288 return VERSION;289#include "llvm/BinaryFormat/Dwarf.def"290 }291}292 293unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) {294 switch (ATE) {295 default:296 return 0;297#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \298 case DW_ATE_##NAME: \299 return DWARF_VENDOR_##VENDOR;300#include "llvm/BinaryFormat/Dwarf.def"301 }302}303 304StringRef llvm::dwarf::DecimalSignString(unsigned Sign) {305 switch (Sign) {306 case DW_DS_unsigned:307 return "DW_DS_unsigned";308 case DW_DS_leading_overpunch:309 return "DW_DS_leading_overpunch";310 case DW_DS_trailing_overpunch:311 return "DW_DS_trailing_overpunch";312 case DW_DS_leading_separate:313 return "DW_DS_leading_separate";314 case DW_DS_trailing_separate:315 return "DW_DS_trailing_separate";316 }317 return StringRef();318}319 320StringRef llvm::dwarf::EndianityString(unsigned Endian) {321 switch (Endian) {322 case DW_END_default:323 return "DW_END_default";324 case DW_END_big:325 return "DW_END_big";326 case DW_END_little:327 return "DW_END_little";328 case DW_END_lo_user:329 return "DW_END_lo_user";330 case DW_END_hi_user:331 return "DW_END_hi_user";332 }333 return StringRef();334}335 336StringRef llvm::dwarf::AccessibilityString(unsigned Access) {337 switch (Access) {338 // Accessibility codes339 case DW_ACCESS_public:340 return "DW_ACCESS_public";341 case DW_ACCESS_protected:342 return "DW_ACCESS_protected";343 case DW_ACCESS_private:344 return "DW_ACCESS_private";345 }346 return StringRef();347}348 349StringRef llvm::dwarf::DefaultedMemberString(unsigned DefaultedEncodings) {350 switch (DefaultedEncodings) {351 // Defaulted Member Encodings codes352 case DW_DEFAULTED_no:353 return "DW_DEFAULTED_no";354 case DW_DEFAULTED_in_class:355 return "DW_DEFAULTED_in_class";356 case DW_DEFAULTED_out_of_class:357 return "DW_DEFAULTED_out_of_class";358 }359 return StringRef();360}361 362StringRef llvm::dwarf::VisibilityString(unsigned Visibility) {363 switch (Visibility) {364 case DW_VIS_local:365 return "DW_VIS_local";366 case DW_VIS_exported:367 return "DW_VIS_exported";368 case DW_VIS_qualified:369 return "DW_VIS_qualified";370 }371 return StringRef();372}373 374StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) {375 switch (Virtuality) {376 default:377 return StringRef();378#define HANDLE_DW_VIRTUALITY(ID, NAME) \379 case DW_VIRTUALITY_##NAME: \380 return "DW_VIRTUALITY_" #NAME;381#include "llvm/BinaryFormat/Dwarf.def"382 }383}384 385unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) {386 return StringSwitch<unsigned>(VirtualityString)387#define HANDLE_DW_VIRTUALITY(ID, NAME) \388 .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME)389#include "llvm/BinaryFormat/Dwarf.def"390 .Default(DW_VIRTUALITY_invalid);391}392 393StringRef llvm::dwarf::EnumKindString(unsigned EnumKind) {394 switch (EnumKind) {395 default:396 return StringRef();397#define HANDLE_DW_APPLE_ENUM_KIND(ID, NAME) \398 case DW_APPLE_ENUM_KIND_##NAME: \399 return "DW_APPLE_ENUM_KIND_" #NAME;400#include "llvm/BinaryFormat/Dwarf.def"401 }402}403 404unsigned llvm::dwarf::getEnumKind(StringRef EnumKindString) {405 return StringSwitch<unsigned>(EnumKindString)406#define HANDLE_DW_APPLE_ENUM_KIND(ID, NAME) \407 .Case("DW_APPLE_ENUM_KIND_" #NAME, DW_APPLE_ENUM_KIND_##NAME)408#include "llvm/BinaryFormat/Dwarf.def"409 .Default(DW_APPLE_ENUM_KIND_invalid);410}411 412StringRef llvm::dwarf::LanguageString(unsigned Language) {413 switch (Language) {414 default:415 return StringRef();416#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \417 case DW_LANG_##NAME: \418 return "DW_LANG_" #NAME;419#include "llvm/BinaryFormat/Dwarf.def"420 }421}422 423unsigned llvm::dwarf::getLanguage(StringRef LanguageString) {424 return StringSwitch<unsigned>(LanguageString)425#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \426 .Case("DW_LANG_" #NAME, DW_LANG_##NAME)427#include "llvm/BinaryFormat/Dwarf.def"428 .Default(0);429}430 431unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) {432 switch (Lang) {433 default:434 return 0;435#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \436 case DW_LANG_##NAME: \437 return VERSION;438#include "llvm/BinaryFormat/Dwarf.def"439 }440}441 442unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) {443 switch (Lang) {444 default:445 return 0;446#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \447 case DW_LANG_##NAME: \448 return DWARF_VENDOR_##VENDOR;449#include "llvm/BinaryFormat/Dwarf.def"450 }451}452 453std::optional<unsigned>454llvm::dwarf::LanguageLowerBound(dwarf::SourceLanguage Lang) {455 switch (Lang) {456 default:457 return std::nullopt;458#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \459 case DW_LANG_##NAME: \460 return LOWER_BOUND;461#include "llvm/BinaryFormat/Dwarf.def"462 }463}464 465StringRef llvm::dwarf::LanguageDescription(dwarf::SourceLanguageName lname) {466 switch (lname) {467#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \468 case DW_LNAME_##NAME: \469 return DESC;470#include "llvm/BinaryFormat/Dwarf.def"471 }472 return "Unknown";473}474 475StringRef llvm::dwarf::LanguageDescription(dwarf::SourceLanguageName Name,476 uint32_t Version) {477 switch (Name) {478 // YYYY479 case DW_LNAME_Ada: {480 if (Version <= 1983)481 return "Ada 83";482 if (Version <= 1995)483 return "Ada 95";484 if (Version <= 2005)485 return "Ada 2005";486 if (Version <= 2012)487 return "Ada 2012";488 } break;489 490 case DW_LNAME_Cobol: {491 if (Version <= 1974)492 return "COBOL-74";493 if (Version <= 1985)494 return "COBOL-85";495 } break;496 497 case DW_LNAME_Fortran: {498 if (Version <= 1977)499 return "FORTRAN 77";500 if (Version <= 1990)501 return "FORTRAN 90";502 if (Version <= 1995)503 return "Fortran 95";504 if (Version <= 2003)505 return "Fortran 2003";506 if (Version <= 2008)507 return "Fortran 2008";508 if (Version <= 2018)509 return "Fortran 2018";510 } break;511 512 // YYYYMM513 case DW_LNAME_C: {514 if (Version == 0)515 break;516 if (Version <= 198912)517 return "C89";518 if (Version <= 199901)519 return "C99";520 if (Version <= 201112)521 return "C11";522 if (Version <= 201710)523 return "C17";524 } break;525 526 case DW_LNAME_C_plus_plus: {527 if (Version == 0)528 break;529 if (Version <= 199711)530 return "C++98";531 if (Version <= 200310)532 return "C++03";533 if (Version <= 201103)534 return "C++11";535 if (Version <= 201402)536 return "C++14";537 if (Version <= 201703)538 return "C++17";539 if (Version <= 202002)540 return "C++20";541 } break;542 543 case DW_LNAME_ObjC_plus_plus:544 case DW_LNAME_ObjC:545 case DW_LNAME_Move:546 case DW_LNAME_SYCL:547 case DW_LNAME_BLISS:548 case DW_LNAME_Crystal:549 case DW_LNAME_D:550 case DW_LNAME_Dylan:551 case DW_LNAME_Go:552 case DW_LNAME_Haskell:553 case DW_LNAME_HLSL:554 case DW_LNAME_Java:555 case DW_LNAME_Julia:556 case DW_LNAME_Kotlin:557 case DW_LNAME_Modula2:558 case DW_LNAME_Modula3:559 case DW_LNAME_OCaml:560 case DW_LNAME_OpenCL_C:561 case DW_LNAME_Pascal:562 case DW_LNAME_PLI:563 case DW_LNAME_Python:564 case DW_LNAME_RenderScript:565 case DW_LNAME_Rust:566 case DW_LNAME_Swift:567 case DW_LNAME_UPC:568 case DW_LNAME_Zig:569 case DW_LNAME_Assembly:570 case DW_LNAME_C_sharp:571 case DW_LNAME_Mojo:572 case DW_LNAME_GLSL:573 case DW_LNAME_GLSL_ES:574 case DW_LNAME_OpenCL_CPP:575 case DW_LNAME_CPP_for_OpenCL:576 case DW_LNAME_Ruby:577 case DW_LNAME_Hylo:578 case DW_LNAME_Metal:579 break;580 }581 582 // Fallback to un-versioned name.583 return LanguageDescription(Name);584}585 586llvm::StringRef llvm::dwarf::SourceLanguageNameString(SourceLanguageName Lang) {587 switch (Lang) {588#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \589 case DW_LNAME_##NAME: \590 return "DW_LNAME_" #NAME;591#include "llvm/BinaryFormat/Dwarf.def"592 }593 594 return {};595}596 597unsigned598llvm::dwarf::getSourceLanguageName(StringRef SourceLanguageNameString) {599 return StringSwitch<unsigned>(SourceLanguageNameString)600#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \601 .Case("DW_LNAME_" #NAME, DW_LNAME_##NAME)602#include "llvm/BinaryFormat/Dwarf.def"603 .Default(0);604}605 606StringRef llvm::dwarf::CaseString(unsigned Case) {607 switch (Case) {608 case DW_ID_case_sensitive:609 return "DW_ID_case_sensitive";610 case DW_ID_up_case:611 return "DW_ID_up_case";612 case DW_ID_down_case:613 return "DW_ID_down_case";614 case DW_ID_case_insensitive:615 return "DW_ID_case_insensitive";616 }617 return StringRef();618}619 620StringRef llvm::dwarf::ConventionString(unsigned CC) {621 switch (CC) {622 default:623 return StringRef();624#define HANDLE_DW_CC(ID, NAME) \625 case DW_CC_##NAME: \626 return "DW_CC_" #NAME;627#include "llvm/BinaryFormat/Dwarf.def"628 }629}630 631unsigned llvm::dwarf::getCallingConvention(StringRef CCString) {632 return StringSwitch<unsigned>(CCString)633#define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME)634#include "llvm/BinaryFormat/Dwarf.def"635 .Default(0);636}637 638StringRef llvm::dwarf::InlineCodeString(unsigned Code) {639 switch (Code) {640 case DW_INL_not_inlined:641 return "DW_INL_not_inlined";642 case DW_INL_inlined:643 return "DW_INL_inlined";644 case DW_INL_declared_not_inlined:645 return "DW_INL_declared_not_inlined";646 case DW_INL_declared_inlined:647 return "DW_INL_declared_inlined";648 }649 return StringRef();650}651 652StringRef llvm::dwarf::ArrayOrderString(unsigned Order) {653 switch (Order) {654 case DW_ORD_row_major:655 return "DW_ORD_row_major";656 case DW_ORD_col_major:657 return "DW_ORD_col_major";658 }659 return StringRef();660}661 662StringRef llvm::dwarf::LNStandardString(unsigned Standard) {663 switch (Standard) {664 default:665 return StringRef();666#define HANDLE_DW_LNS(ID, NAME) \667 case DW_LNS_##NAME: \668 return "DW_LNS_" #NAME;669#include "llvm/BinaryFormat/Dwarf.def"670 }671}672 673StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) {674 switch (Encoding) {675 default:676 return StringRef();677#define HANDLE_DW_LNE(ID, NAME) \678 case DW_LNE_##NAME: \679 return "DW_LNE_" #NAME;680#include "llvm/BinaryFormat/Dwarf.def"681 }682}683 684StringRef llvm::dwarf::MacinfoString(unsigned Encoding) {685 switch (Encoding) {686 // Macinfo Type Encodings687 case DW_MACINFO_define:688 return "DW_MACINFO_define";689 case DW_MACINFO_undef:690 return "DW_MACINFO_undef";691 case DW_MACINFO_start_file:692 return "DW_MACINFO_start_file";693 case DW_MACINFO_end_file:694 return "DW_MACINFO_end_file";695 case DW_MACINFO_vendor_ext:696 return "DW_MACINFO_vendor_ext";697 case DW_MACINFO_invalid:698 return "DW_MACINFO_invalid";699 }700 return StringRef();701}702 703unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) {704 return StringSwitch<unsigned>(MacinfoString)705 .Case("DW_MACINFO_define", DW_MACINFO_define)706 .Case("DW_MACINFO_undef", DW_MACINFO_undef)707 .Case("DW_MACINFO_start_file", DW_MACINFO_start_file)708 .Case("DW_MACINFO_end_file", DW_MACINFO_end_file)709 .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext)710 .Default(DW_MACINFO_invalid);711}712 713StringRef llvm::dwarf::MacroString(unsigned Encoding) {714 switch (Encoding) {715 default:716 return StringRef();717#define HANDLE_DW_MACRO(ID, NAME) \718 case DW_MACRO_##NAME: \719 return "DW_MACRO_" #NAME;720#include "llvm/BinaryFormat/Dwarf.def"721 }722}723 724StringRef llvm::dwarf::GnuMacroString(unsigned Encoding) {725 switch (Encoding) {726 default:727 return StringRef();728#define HANDLE_DW_MACRO_GNU(ID, NAME) \729 case DW_MACRO_GNU_##NAME: \730 return "DW_MACRO_GNU_" #NAME;731#include "llvm/BinaryFormat/Dwarf.def"732 }733}734 735unsigned llvm::dwarf::getMacro(StringRef MacroString) {736 return StringSwitch<unsigned>(MacroString)737#define HANDLE_DW_MACRO(ID, NAME) .Case("DW_MACRO_" #NAME, ID)738#include "llvm/BinaryFormat/Dwarf.def"739 .Default(DW_MACINFO_invalid);740}741StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) {742 switch (Encoding) {743 default:744 return StringRef();745#define HANDLE_DW_RLE(ID, NAME) \746 case DW_RLE_##NAME: \747 return "DW_RLE_" #NAME;748#include "llvm/BinaryFormat/Dwarf.def"749 }750}751 752StringRef llvm::dwarf::LocListEncodingString(unsigned Encoding) {753 switch (Encoding) {754 default:755 return StringRef();756#define HANDLE_DW_LLE(ID, NAME) \757 case DW_LLE_##NAME: \758 return "DW_LLE_" #NAME;759#include "llvm/BinaryFormat/Dwarf.def"760 }761}762 763StringRef llvm::dwarf::CallFrameString(unsigned Encoding,764 Triple::ArchType Arch) {765 assert(Arch != llvm::Triple::ArchType::UnknownArch);766#define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64)767#define SELECT_MIPS64 Arch == llvm::Triple::mips64768#define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9)769#define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64)770#define HANDLE_DW_CFA(ID, NAME)771#define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \772 if (ID == Encoding && PRED) \773 return "DW_CFA_" #NAME;774#include "llvm/BinaryFormat/Dwarf.def"775 776 switch (Encoding) {777 default:778 return StringRef();779#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)780#define HANDLE_DW_CFA(ID, NAME) \781 case DW_CFA_##NAME: \782 return "DW_CFA_" #NAME;783#include "llvm/BinaryFormat/Dwarf.def"784 785#undef SELECT_X86786#undef SELECT_SPARC787#undef SELECT_MIPS64788#undef SELECT_AARCH64789 }790}791 792StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) {793 switch (Prop) {794 default:795 return StringRef();796#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \797 case DW_APPLE_PROPERTY_##NAME: \798 return "DW_APPLE_PROPERTY_" #NAME;799#include "llvm/BinaryFormat/Dwarf.def"800 }801}802 803StringRef llvm::dwarf::UnitTypeString(unsigned UT) {804 switch (UT) {805 default:806 return StringRef();807#define HANDLE_DW_UT(ID, NAME) \808 case DW_UT_##NAME: \809 return "DW_UT_" #NAME;810#include "llvm/BinaryFormat/Dwarf.def"811 }812}813 814StringRef llvm::dwarf::AtomTypeString(unsigned AT) {815 switch (AT) {816 case dwarf::DW_ATOM_null:817 return "DW_ATOM_null";818 case dwarf::DW_ATOM_die_offset:819 return "DW_ATOM_die_offset";820 case DW_ATOM_cu_offset:821 return "DW_ATOM_cu_offset";822 case DW_ATOM_die_tag:823 return "DW_ATOM_die_tag";824 case DW_ATOM_type_flags:825 case DW_ATOM_type_type_flags:826 return "DW_ATOM_type_flags";827 case DW_ATOM_qual_name_hash:828 return "DW_ATOM_qual_name_hash";829 }830 return StringRef();831}832 833StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) {834 switch (Kind) {835 case GIEK_NONE:836 return "NONE";837 case GIEK_TYPE:838 return "TYPE";839 case GIEK_VARIABLE:840 return "VARIABLE";841 case GIEK_FUNCTION:842 return "FUNCTION";843 case GIEK_OTHER:844 return "OTHER";845 case GIEK_UNUSED5:846 return "UNUSED5";847 case GIEK_UNUSED6:848 return "UNUSED6";849 case GIEK_UNUSED7:850 return "UNUSED7";851 }852 llvm_unreachable("Unknown GDBIndexEntryKind value");853}854 855StringRef856llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) {857 switch (Linkage) {858 case GIEL_EXTERNAL:859 return "EXTERNAL";860 case GIEL_STATIC:861 return "STATIC";862 }863 llvm_unreachable("Unknown GDBIndexEntryLinkage value");864}865 866StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {867 switch (Attr) {868 case DW_AT_accessibility:869 return AccessibilityString(Val);870 case DW_AT_virtuality:871 return VirtualityString(Val);872 case DW_AT_language:873 return LanguageString(Val);874 case DW_AT_encoding:875 return AttributeEncodingString(Val);876 case DW_AT_decimal_sign:877 return DecimalSignString(Val);878 case DW_AT_endianity:879 return EndianityString(Val);880 case DW_AT_visibility:881 return VisibilityString(Val);882 case DW_AT_identifier_case:883 return CaseString(Val);884 case DW_AT_calling_convention:885 return ConventionString(Val);886 case DW_AT_inline:887 return InlineCodeString(Val);888 case DW_AT_ordering:889 return ArrayOrderString(Val);890 case DW_AT_APPLE_runtime_class:891 return LanguageString(Val);892 case DW_AT_defaulted:893 return DefaultedMemberString(Val);894 case DW_AT_APPLE_enum_kind:895 return EnumKindString(Val);896 case DW_AT_language_name:897 return SourceLanguageNameString(static_cast<SourceLanguageName>(Val));898 }899 900 return StringRef();901}902 903StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) {904 switch (Atom) {905 case DW_ATOM_null:906 return "NULL";907 case DW_ATOM_die_tag:908 return TagString(Val);909 }910 911 return StringRef();912}913 914StringRef llvm::dwarf::IndexString(unsigned Idx) {915 switch (Idx) {916 default:917 return StringRef();918#define HANDLE_DW_IDX(ID, NAME) \919 case DW_IDX_##NAME: \920 return "DW_IDX_" #NAME;921#include "llvm/BinaryFormat/Dwarf.def"922 }923}924 925std::optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form,926 FormParams Params) {927 switch (Form) {928 case DW_FORM_addr:929 if (Params)930 return Params.AddrSize;931 return std::nullopt;932 933 case DW_FORM_block: // ULEB128 length L followed by L bytes.934 case DW_FORM_block1: // 1 byte length L followed by L bytes.935 case DW_FORM_block2: // 2 byte length L followed by L bytes.936 case DW_FORM_block4: // 4 byte length L followed by L bytes.937 case DW_FORM_string: // C-string with null terminator.938 case DW_FORM_sdata: // SLEB128.939 case DW_FORM_udata: // ULEB128.940 case DW_FORM_ref_udata: // ULEB128.941 case DW_FORM_indirect: // ULEB128.942 case DW_FORM_exprloc: // ULEB128 length L followed by L bytes.943 case DW_FORM_strx: // ULEB128.944 case DW_FORM_addrx: // ULEB128.945 case DW_FORM_loclistx: // ULEB128.946 case DW_FORM_rnglistx: // ULEB128.947 case DW_FORM_GNU_addr_index: // ULEB128.948 case DW_FORM_GNU_str_index: // ULEB128.949 return std::nullopt;950 951 case DW_FORM_ref_addr:952 if (Params)953 return Params.getRefAddrByteSize();954 return std::nullopt;955 956 case DW_FORM_flag:957 case DW_FORM_data1:958 case DW_FORM_ref1:959 case DW_FORM_strx1:960 case DW_FORM_addrx1:961 return 1;962 963 case DW_FORM_data2:964 case DW_FORM_ref2:965 case DW_FORM_strx2:966 case DW_FORM_addrx2:967 return 2;968 969 case DW_FORM_strx3:970 case DW_FORM_addrx3:971 return 3;972 973 case DW_FORM_data4:974 case DW_FORM_ref4:975 case DW_FORM_ref_sup4:976 case DW_FORM_strx4:977 case DW_FORM_addrx4:978 return 4;979 980 case DW_FORM_strp:981 case DW_FORM_GNU_ref_alt:982 case DW_FORM_GNU_strp_alt:983 case DW_FORM_line_strp:984 case DW_FORM_sec_offset:985 case DW_FORM_strp_sup:986 if (Params)987 return Params.getDwarfOffsetByteSize();988 return std::nullopt;989 990 case DW_FORM_data8:991 case DW_FORM_ref8:992 case DW_FORM_ref_sig8:993 case DW_FORM_ref_sup8:994 return 8;995 996 case DW_FORM_flag_present:997 return 0;998 999 case DW_FORM_data16:1000 return 16;1001 1002 case DW_FORM_implicit_const:1003 // The implicit value is stored in the abbreviation as a SLEB128, and1004 // there no data in debug info.1005 return 0;1006 1007 default:1008 break;1009 }1010 return std::nullopt;1011}1012 1013bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version,1014 bool ExtensionsOk) {1015 if (FormVendor(F) == DWARF_VENDOR_DWARF) {1016 unsigned FV = FormVersion(F);1017 return FV > 0 && FV <= Version;1018 }1019 return ExtensionsOk;1020}1021 1022StringRef llvm::dwarf::FormatString(DwarfFormat Format) {1023 switch (Format) {1024 case DWARF32:1025 return "DWARF32";1026 case DWARF64:1027 return "DWARF64";1028 }1029 return StringRef();1030}1031 1032StringRef llvm::dwarf::FormatString(bool IsDWARF64) {1033 return FormatString(IsDWARF64 ? DWARF64 : DWARF32);1034}1035 1036StringRef llvm::dwarf::RLEString(unsigned RLE) {1037 switch (RLE) {1038 default:1039 return StringRef();1040#define HANDLE_DW_RLE(ID, NAME) \1041 case DW_RLE_##NAME: \1042 return "DW_RLE_" #NAME;1043#include "llvm/BinaryFormat/Dwarf.def"1044 }1045}1046 1047StringRef llvm::dwarf::AddressSpaceString(unsigned AS, const llvm::Triple &TT) {1048 switch (AS) {1049#define HANDLE_DW_ASPACE(ID, NAME) \1050 case DW_ASPACE_LLVM_##NAME: \1051 return "DW_ASPACE_LLVM_" #NAME;1052#define HANDLE_DW_ASPACE_PRED(ID, NAME, PRED)1053#include "llvm/BinaryFormat/Dwarf.def"1054 default:1055 break;1056 }1057 1058 bool SELECT_AMDGPU = TT.isAMDGPU();1059#define HANDLE_DW_ASPACE(ID, NAME)1060#define HANDLE_DW_ASPACE_PRED(ID, NAME, PRED) \1061 if (DW_ASPACE_LLVM_##NAME == AS && PRED) \1062 return "DW_ASPACE_LLVM_" #NAME;1063#include "llvm/BinaryFormat/Dwarf.def"1064 1065 return "";1066}1067 1068StringRef (*const llvm::dwarf::EnumTraits<Tag>::StringFn)(unsigned) = TagString;1069StringRef (*const llvm::dwarf::EnumTraits<Attribute>::StringFn)(unsigned) =1070 AttributeString;1071StringRef (*const llvm::dwarf::EnumTraits<Form>::StringFn)(unsigned) =1072 FormEncodingString;1073StringRef (*const llvm::dwarf::EnumTraits<LocationAtom>::StringFn)(unsigned) =1074 OperationEncodingString;1075StringRef (*const llvm::dwarf::EnumTraits<LineNumberOps>::StringFn)(unsigned) =1076 LNStandardString;1077StringRef (*const llvm::dwarf::EnumTraits<Index>::StringFn)(unsigned) =1078 IndexString;1079