brintos

brintos / llvm-project-archived public Read only

0
0
Text · 31.9 KiB · a6c7e6a Raw
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