Path: blob/main/contrib/llvm-project/llvm/lib/BinaryFormat/Dwarf.cpp
35233 views
//===-- llvm/BinaryFormat/Dwarf.cpp - Dwarf Framework ------------*- C++-*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains support for generic dwarf information.9//10//===----------------------------------------------------------------------===//1112#include "llvm/BinaryFormat/Dwarf.h"13#include "llvm/ADT/StringSwitch.h"14#include "llvm/Support/ErrorHandling.h"15#include "llvm/TargetParser/Triple.h"1617using namespace llvm;18using namespace dwarf;1920StringRef llvm::dwarf::TagString(unsigned Tag) {21switch (Tag) {22default:23return StringRef();24#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \25case DW_TAG_##NAME: \26return "DW_TAG_" #NAME;27#include "llvm/BinaryFormat/Dwarf.def"28}29}3031unsigned llvm::dwarf::getTag(StringRef TagString) {32return StringSwitch<unsigned>(TagString)33#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \34.Case("DW_TAG_" #NAME, DW_TAG_##NAME)35#include "llvm/BinaryFormat/Dwarf.def"36.Default(DW_TAG_invalid);37}3839unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) {40switch (Tag) {41default:42return 0;43#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \44case DW_TAG_##NAME: \45return VERSION;46#include "llvm/BinaryFormat/Dwarf.def"47}48}4950unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) {51switch (Tag) {52default:53return 0;54#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \55case DW_TAG_##NAME: \56return DWARF_VENDOR_##VENDOR;57#include "llvm/BinaryFormat/Dwarf.def"58}59}6061StringRef llvm::dwarf::ChildrenString(unsigned Children) {62switch (Children) {63case DW_CHILDREN_no:64return "DW_CHILDREN_no";65case DW_CHILDREN_yes:66return "DW_CHILDREN_yes";67}68return StringRef();69}7071StringRef llvm::dwarf::AttributeString(unsigned Attribute) {72switch (Attribute) {73default:74return StringRef();75#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \76case DW_AT_##NAME: \77return "DW_AT_" #NAME;78#include "llvm/BinaryFormat/Dwarf.def"79}80}8182unsigned llvm::dwarf::AttributeVersion(dwarf::Attribute Attribute) {83switch (Attribute) {84default:85return 0;86#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \87case DW_AT_##NAME: \88return VERSION;89#include "llvm/BinaryFormat/Dwarf.def"90}91}9293unsigned llvm::dwarf::AttributeVendor(dwarf::Attribute Attribute) {94switch (Attribute) {95default:96return 0;97#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \98case DW_AT_##NAME: \99return DWARF_VENDOR_##VENDOR;100#include "llvm/BinaryFormat/Dwarf.def"101}102}103104StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) {105switch (Encoding) {106default:107return StringRef();108#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \109case DW_FORM_##NAME: \110return "DW_FORM_" #NAME;111#include "llvm/BinaryFormat/Dwarf.def"112}113}114115unsigned llvm::dwarf::FormVersion(dwarf::Form Form) {116switch (Form) {117default:118return 0;119#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \120case DW_FORM_##NAME: \121return VERSION;122#include "llvm/BinaryFormat/Dwarf.def"123}124}125126unsigned llvm::dwarf::FormVendor(dwarf::Form Form) {127switch (Form) {128default:129return 0;130#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \131case DW_FORM_##NAME: \132return DWARF_VENDOR_##VENDOR;133#include "llvm/BinaryFormat/Dwarf.def"134}135}136137StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) {138switch (Encoding) {139default:140return StringRef();141#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \142case DW_OP_##NAME: \143return "DW_OP_" #NAME;144#include "llvm/BinaryFormat/Dwarf.def"145case DW_OP_LLVM_convert:146return "DW_OP_LLVM_convert";147case DW_OP_LLVM_fragment:148return "DW_OP_LLVM_fragment";149case DW_OP_LLVM_tag_offset:150return "DW_OP_LLVM_tag_offset";151case DW_OP_LLVM_entry_value:152return "DW_OP_LLVM_entry_value";153case DW_OP_LLVM_implicit_pointer:154return "DW_OP_LLVM_implicit_pointer";155case DW_OP_LLVM_arg:156return "DW_OP_LLVM_arg";157case DW_OP_LLVM_extract_bits_sext:158return "DW_OP_LLVM_extract_bits_sext";159case DW_OP_LLVM_extract_bits_zext:160return "DW_OP_LLVM_extract_bits_zext";161}162}163164unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) {165return StringSwitch<unsigned>(OperationEncodingString)166#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \167.Case("DW_OP_" #NAME, DW_OP_##NAME)168#include "llvm/BinaryFormat/Dwarf.def"169.Case("DW_OP_LLVM_convert", DW_OP_LLVM_convert)170.Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment)171.Case("DW_OP_LLVM_tag_offset", DW_OP_LLVM_tag_offset)172.Case("DW_OP_LLVM_entry_value", DW_OP_LLVM_entry_value)173.Case("DW_OP_LLVM_implicit_pointer", DW_OP_LLVM_implicit_pointer)174.Case("DW_OP_LLVM_arg", DW_OP_LLVM_arg)175.Case("DW_OP_LLVM_extract_bits_sext", DW_OP_LLVM_extract_bits_sext)176.Case("DW_OP_LLVM_extract_bits_zext", DW_OP_LLVM_extract_bits_zext)177.Default(0);178}179180static StringRef LlvmUserOperationEncodingString(unsigned Encoding) {181switch (Encoding) {182default:183llvm_unreachable("unhandled DWARF operation with LLVM user op");184#define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) \185case DW_OP_LLVM_##NAME: \186return "DW_OP_LLVM_" #NAME;187#include "llvm/BinaryFormat/Dwarf.def"188}189}190191static unsigned192getLlvmUserOperationEncoding(StringRef LlvmUserOperationEncodingString) {193unsigned E = StringSwitch<unsigned>(LlvmUserOperationEncodingString)194#define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) .Case(#NAME, DW_OP_LLVM_##NAME)195#include "llvm/BinaryFormat/Dwarf.def"196.Default(0);197assert(E && "unhandled DWARF operation string with LLVM user op");198return E;199}200201StringRef llvm::dwarf::SubOperationEncodingString(unsigned OpEncoding,202unsigned SubOpEncoding) {203assert(OpEncoding == DW_OP_LLVM_user);204return LlvmUserOperationEncodingString(SubOpEncoding);205}206207unsigned208llvm::dwarf::getSubOperationEncoding(unsigned OpEncoding,209StringRef SubOperationEncodingString) {210assert(OpEncoding == DW_OP_LLVM_user);211return getLlvmUserOperationEncoding(SubOperationEncodingString);212}213214unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) {215switch (Op) {216default:217return 0;218#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \219case DW_OP_##NAME: \220return VERSION;221#include "llvm/BinaryFormat/Dwarf.def"222}223}224225std::optional<unsigned> llvm::dwarf::OperationOperands(dwarf::LocationAtom Op) {226switch (Op) {227default:228return std::nullopt;229#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \230case DW_OP_##NAME: \231if (OPERANDS == -1) \232return std::nullopt; \233return OPERANDS;234#include "llvm/BinaryFormat/Dwarf.def"235}236}237238std::optional<unsigned> llvm::dwarf::OperationArity(dwarf::LocationAtom Op) {239switch (Op) {240default:241return std::nullopt;242#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \243case DW_OP_##NAME: \244if (ARITY == -1) \245return std::nullopt; \246return ARITY;247#include "llvm/BinaryFormat/Dwarf.def"248}249}250251unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) {252switch (Op) {253default:254return 0;255#define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \256case DW_OP_##NAME: \257return DWARF_VENDOR_##VENDOR;258#include "llvm/BinaryFormat/Dwarf.def"259}260}261262StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) {263switch (Encoding) {264default:265return StringRef();266#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \267case DW_ATE_##NAME: \268return "DW_ATE_" #NAME;269#include "llvm/BinaryFormat/Dwarf.def"270}271}272273unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) {274return StringSwitch<unsigned>(EncodingString)275#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \276.Case("DW_ATE_" #NAME, DW_ATE_##NAME)277#include "llvm/BinaryFormat/Dwarf.def"278.Default(0);279}280281unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) {282switch (ATE) {283default:284return 0;285#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \286case DW_ATE_##NAME: \287return VERSION;288#include "llvm/BinaryFormat/Dwarf.def"289}290}291292unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) {293switch (ATE) {294default:295return 0;296#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \297case DW_ATE_##NAME: \298return DWARF_VENDOR_##VENDOR;299#include "llvm/BinaryFormat/Dwarf.def"300}301}302303StringRef llvm::dwarf::DecimalSignString(unsigned Sign) {304switch (Sign) {305case DW_DS_unsigned:306return "DW_DS_unsigned";307case DW_DS_leading_overpunch:308return "DW_DS_leading_overpunch";309case DW_DS_trailing_overpunch:310return "DW_DS_trailing_overpunch";311case DW_DS_leading_separate:312return "DW_DS_leading_separate";313case DW_DS_trailing_separate:314return "DW_DS_trailing_separate";315}316return StringRef();317}318319StringRef llvm::dwarf::EndianityString(unsigned Endian) {320switch (Endian) {321case DW_END_default:322return "DW_END_default";323case DW_END_big:324return "DW_END_big";325case DW_END_little:326return "DW_END_little";327case DW_END_lo_user:328return "DW_END_lo_user";329case DW_END_hi_user:330return "DW_END_hi_user";331}332return StringRef();333}334335StringRef llvm::dwarf::AccessibilityString(unsigned Access) {336switch (Access) {337// Accessibility codes338case DW_ACCESS_public:339return "DW_ACCESS_public";340case DW_ACCESS_protected:341return "DW_ACCESS_protected";342case DW_ACCESS_private:343return "DW_ACCESS_private";344}345return StringRef();346}347348StringRef llvm::dwarf::DefaultedMemberString(unsigned DefaultedEncodings) {349switch (DefaultedEncodings) {350// Defaulted Member Encodings codes351case DW_DEFAULTED_no:352return "DW_DEFAULTED_no";353case DW_DEFAULTED_in_class:354return "DW_DEFAULTED_in_class";355case DW_DEFAULTED_out_of_class:356return "DW_DEFAULTED_out_of_class";357}358return StringRef();359}360361StringRef llvm::dwarf::VisibilityString(unsigned Visibility) {362switch (Visibility) {363case DW_VIS_local:364return "DW_VIS_local";365case DW_VIS_exported:366return "DW_VIS_exported";367case DW_VIS_qualified:368return "DW_VIS_qualified";369}370return StringRef();371}372373StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) {374switch (Virtuality) {375default:376return StringRef();377#define HANDLE_DW_VIRTUALITY(ID, NAME) \378case DW_VIRTUALITY_##NAME: \379return "DW_VIRTUALITY_" #NAME;380#include "llvm/BinaryFormat/Dwarf.def"381}382}383384unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) {385return StringSwitch<unsigned>(VirtualityString)386#define HANDLE_DW_VIRTUALITY(ID, NAME) \387.Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME)388#include "llvm/BinaryFormat/Dwarf.def"389.Default(DW_VIRTUALITY_invalid);390}391392StringRef llvm::dwarf::LanguageString(unsigned Language) {393switch (Language) {394default:395return StringRef();396#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \397case DW_LANG_##NAME: \398return "DW_LANG_" #NAME;399#include "llvm/BinaryFormat/Dwarf.def"400}401}402403unsigned llvm::dwarf::getLanguage(StringRef LanguageString) {404return StringSwitch<unsigned>(LanguageString)405#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \406.Case("DW_LANG_" #NAME, DW_LANG_##NAME)407#include "llvm/BinaryFormat/Dwarf.def"408.Default(0);409}410411unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) {412switch (Lang) {413default:414return 0;415#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \416case DW_LANG_##NAME: \417return VERSION;418#include "llvm/BinaryFormat/Dwarf.def"419}420}421422unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) {423switch (Lang) {424default:425return 0;426#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \427case DW_LANG_##NAME: \428return DWARF_VENDOR_##VENDOR;429#include "llvm/BinaryFormat/Dwarf.def"430}431}432433std::optional<unsigned>434llvm::dwarf::LanguageLowerBound(dwarf::SourceLanguage Lang) {435switch (Lang) {436default:437return std::nullopt;438#define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \439case DW_LANG_##NAME: \440return LOWER_BOUND;441#include "llvm/BinaryFormat/Dwarf.def"442}443}444445StringRef llvm::dwarf::LanguageDescription(dwarf::SourceLanguageName lname) {446switch (lname) {447#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \448case DW_LNAME_##NAME: \449return DESC;450#include "llvm/BinaryFormat/Dwarf.def"451}452return "Unknown";453}454455StringRef llvm::dwarf::CaseString(unsigned Case) {456switch (Case) {457case DW_ID_case_sensitive:458return "DW_ID_case_sensitive";459case DW_ID_up_case:460return "DW_ID_up_case";461case DW_ID_down_case:462return "DW_ID_down_case";463case DW_ID_case_insensitive:464return "DW_ID_case_insensitive";465}466return StringRef();467}468469StringRef llvm::dwarf::ConventionString(unsigned CC) {470switch (CC) {471default:472return StringRef();473#define HANDLE_DW_CC(ID, NAME) \474case DW_CC_##NAME: \475return "DW_CC_" #NAME;476#include "llvm/BinaryFormat/Dwarf.def"477}478}479480unsigned llvm::dwarf::getCallingConvention(StringRef CCString) {481return StringSwitch<unsigned>(CCString)482#define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME)483#include "llvm/BinaryFormat/Dwarf.def"484.Default(0);485}486487StringRef llvm::dwarf::InlineCodeString(unsigned Code) {488switch (Code) {489case DW_INL_not_inlined:490return "DW_INL_not_inlined";491case DW_INL_inlined:492return "DW_INL_inlined";493case DW_INL_declared_not_inlined:494return "DW_INL_declared_not_inlined";495case DW_INL_declared_inlined:496return "DW_INL_declared_inlined";497}498return StringRef();499}500501StringRef llvm::dwarf::ArrayOrderString(unsigned Order) {502switch (Order) {503case DW_ORD_row_major:504return "DW_ORD_row_major";505case DW_ORD_col_major:506return "DW_ORD_col_major";507}508return StringRef();509}510511StringRef llvm::dwarf::LNStandardString(unsigned Standard) {512switch (Standard) {513default:514return StringRef();515#define HANDLE_DW_LNS(ID, NAME) \516case DW_LNS_##NAME: \517return "DW_LNS_" #NAME;518#include "llvm/BinaryFormat/Dwarf.def"519}520}521522StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) {523switch (Encoding) {524default:525return StringRef();526#define HANDLE_DW_LNE(ID, NAME) \527case DW_LNE_##NAME: \528return "DW_LNE_" #NAME;529#include "llvm/BinaryFormat/Dwarf.def"530}531}532533StringRef llvm::dwarf::MacinfoString(unsigned Encoding) {534switch (Encoding) {535// Macinfo Type Encodings536case DW_MACINFO_define:537return "DW_MACINFO_define";538case DW_MACINFO_undef:539return "DW_MACINFO_undef";540case DW_MACINFO_start_file:541return "DW_MACINFO_start_file";542case DW_MACINFO_end_file:543return "DW_MACINFO_end_file";544case DW_MACINFO_vendor_ext:545return "DW_MACINFO_vendor_ext";546case DW_MACINFO_invalid:547return "DW_MACINFO_invalid";548}549return StringRef();550}551552unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) {553return StringSwitch<unsigned>(MacinfoString)554.Case("DW_MACINFO_define", DW_MACINFO_define)555.Case("DW_MACINFO_undef", DW_MACINFO_undef)556.Case("DW_MACINFO_start_file", DW_MACINFO_start_file)557.Case("DW_MACINFO_end_file", DW_MACINFO_end_file)558.Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext)559.Default(DW_MACINFO_invalid);560}561562StringRef llvm::dwarf::MacroString(unsigned Encoding) {563switch (Encoding) {564default:565return StringRef();566#define HANDLE_DW_MACRO(ID, NAME) \567case DW_MACRO_##NAME: \568return "DW_MACRO_" #NAME;569#include "llvm/BinaryFormat/Dwarf.def"570}571}572573StringRef llvm::dwarf::GnuMacroString(unsigned Encoding) {574switch (Encoding) {575default:576return StringRef();577#define HANDLE_DW_MACRO_GNU(ID, NAME) \578case DW_MACRO_GNU_##NAME: \579return "DW_MACRO_GNU_" #NAME;580#include "llvm/BinaryFormat/Dwarf.def"581}582}583584unsigned llvm::dwarf::getMacro(StringRef MacroString) {585return StringSwitch<unsigned>(MacroString)586#define HANDLE_DW_MACRO(ID, NAME) .Case("DW_MACRO_" #NAME, ID)587#include "llvm/BinaryFormat/Dwarf.def"588.Default(DW_MACINFO_invalid);589}590StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) {591switch (Encoding) {592default:593return StringRef();594#define HANDLE_DW_RLE(ID, NAME) \595case DW_RLE_##NAME: \596return "DW_RLE_" #NAME;597#include "llvm/BinaryFormat/Dwarf.def"598}599}600601StringRef llvm::dwarf::LocListEncodingString(unsigned Encoding) {602switch (Encoding) {603default:604return StringRef();605#define HANDLE_DW_LLE(ID, NAME) \606case DW_LLE_##NAME: \607return "DW_LLE_" #NAME;608#include "llvm/BinaryFormat/Dwarf.def"609}610}611612StringRef llvm::dwarf::CallFrameString(unsigned Encoding,613Triple::ArchType Arch) {614assert(Arch != llvm::Triple::ArchType::UnknownArch);615#define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64)616#define SELECT_MIPS64 Arch == llvm::Triple::mips64617#define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9)618#define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64)619#define HANDLE_DW_CFA(ID, NAME)620#define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \621if (ID == Encoding && PRED) \622return "DW_CFA_" #NAME;623#include "llvm/BinaryFormat/Dwarf.def"624625switch (Encoding) {626default:627return StringRef();628#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)629#define HANDLE_DW_CFA(ID, NAME) \630case DW_CFA_##NAME: \631return "DW_CFA_" #NAME;632#include "llvm/BinaryFormat/Dwarf.def"633634#undef SELECT_X86635#undef SELECT_SPARC636#undef SELECT_MIPS64637#undef SELECT_AARCH64638}639}640641StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) {642switch (Prop) {643default:644return StringRef();645#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \646case DW_APPLE_PROPERTY_##NAME: \647return "DW_APPLE_PROPERTY_" #NAME;648#include "llvm/BinaryFormat/Dwarf.def"649}650}651652StringRef llvm::dwarf::UnitTypeString(unsigned UT) {653switch (UT) {654default:655return StringRef();656#define HANDLE_DW_UT(ID, NAME) \657case DW_UT_##NAME: \658return "DW_UT_" #NAME;659#include "llvm/BinaryFormat/Dwarf.def"660}661}662663StringRef llvm::dwarf::AtomTypeString(unsigned AT) {664switch (AT) {665case dwarf::DW_ATOM_null:666return "DW_ATOM_null";667case dwarf::DW_ATOM_die_offset:668return "DW_ATOM_die_offset";669case DW_ATOM_cu_offset:670return "DW_ATOM_cu_offset";671case DW_ATOM_die_tag:672return "DW_ATOM_die_tag";673case DW_ATOM_type_flags:674case DW_ATOM_type_type_flags:675return "DW_ATOM_type_flags";676case DW_ATOM_qual_name_hash:677return "DW_ATOM_qual_name_hash";678}679return StringRef();680}681682StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) {683switch (Kind) {684case GIEK_NONE:685return "NONE";686case GIEK_TYPE:687return "TYPE";688case GIEK_VARIABLE:689return "VARIABLE";690case GIEK_FUNCTION:691return "FUNCTION";692case GIEK_OTHER:693return "OTHER";694case GIEK_UNUSED5:695return "UNUSED5";696case GIEK_UNUSED6:697return "UNUSED6";698case GIEK_UNUSED7:699return "UNUSED7";700}701llvm_unreachable("Unknown GDBIndexEntryKind value");702}703704StringRef705llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) {706switch (Linkage) {707case GIEL_EXTERNAL:708return "EXTERNAL";709case GIEL_STATIC:710return "STATIC";711}712llvm_unreachable("Unknown GDBIndexEntryLinkage value");713}714715StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {716switch (Attr) {717case DW_AT_accessibility:718return AccessibilityString(Val);719case DW_AT_virtuality:720return VirtualityString(Val);721case DW_AT_language:722return LanguageString(Val);723case DW_AT_encoding:724return AttributeEncodingString(Val);725case DW_AT_decimal_sign:726return DecimalSignString(Val);727case DW_AT_endianity:728return EndianityString(Val);729case DW_AT_visibility:730return VisibilityString(Val);731case DW_AT_identifier_case:732return CaseString(Val);733case DW_AT_calling_convention:734return ConventionString(Val);735case DW_AT_inline:736return InlineCodeString(Val);737case DW_AT_ordering:738return ArrayOrderString(Val);739case DW_AT_APPLE_runtime_class:740return LanguageString(Val);741case DW_AT_defaulted:742return DefaultedMemberString(Val);743}744745return StringRef();746}747748StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) {749switch (Atom) {750case DW_ATOM_null:751return "NULL";752case DW_ATOM_die_tag:753return TagString(Val);754}755756return StringRef();757}758759StringRef llvm::dwarf::IndexString(unsigned Idx) {760switch (Idx) {761default:762return StringRef();763#define HANDLE_DW_IDX(ID, NAME) \764case DW_IDX_##NAME: \765return "DW_IDX_" #NAME;766#include "llvm/BinaryFormat/Dwarf.def"767}768}769770std::optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form,771FormParams Params) {772switch (Form) {773case DW_FORM_addr:774if (Params)775return Params.AddrSize;776return std::nullopt;777778case DW_FORM_block: // ULEB128 length L followed by L bytes.779case DW_FORM_block1: // 1 byte length L followed by L bytes.780case DW_FORM_block2: // 2 byte length L followed by L bytes.781case DW_FORM_block4: // 4 byte length L followed by L bytes.782case DW_FORM_string: // C-string with null terminator.783case DW_FORM_sdata: // SLEB128.784case DW_FORM_udata: // ULEB128.785case DW_FORM_ref_udata: // ULEB128.786case DW_FORM_indirect: // ULEB128.787case DW_FORM_exprloc: // ULEB128 length L followed by L bytes.788case DW_FORM_strx: // ULEB128.789case DW_FORM_addrx: // ULEB128.790case DW_FORM_loclistx: // ULEB128.791case DW_FORM_rnglistx: // ULEB128.792case DW_FORM_GNU_addr_index: // ULEB128.793case DW_FORM_GNU_str_index: // ULEB128.794return std::nullopt;795796case DW_FORM_ref_addr:797if (Params)798return Params.getRefAddrByteSize();799return std::nullopt;800801case DW_FORM_flag:802case DW_FORM_data1:803case DW_FORM_ref1:804case DW_FORM_strx1:805case DW_FORM_addrx1:806return 1;807808case DW_FORM_data2:809case DW_FORM_ref2:810case DW_FORM_strx2:811case DW_FORM_addrx2:812return 2;813814case DW_FORM_strx3:815case DW_FORM_addrx3:816return 3;817818case DW_FORM_data4:819case DW_FORM_ref4:820case DW_FORM_ref_sup4:821case DW_FORM_strx4:822case DW_FORM_addrx4:823return 4;824825case DW_FORM_strp:826case DW_FORM_GNU_ref_alt:827case DW_FORM_GNU_strp_alt:828case DW_FORM_line_strp:829case DW_FORM_sec_offset:830case DW_FORM_strp_sup:831if (Params)832return Params.getDwarfOffsetByteSize();833return std::nullopt;834835case DW_FORM_data8:836case DW_FORM_ref8:837case DW_FORM_ref_sig8:838case DW_FORM_ref_sup8:839return 8;840841case DW_FORM_flag_present:842return 0;843844case DW_FORM_data16:845return 16;846847case DW_FORM_implicit_const:848// The implicit value is stored in the abbreviation as a SLEB128, and849// there no data in debug info.850return 0;851852default:853break;854}855return std::nullopt;856}857858bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version,859bool ExtensionsOk) {860if (FormVendor(F) == DWARF_VENDOR_DWARF) {861unsigned FV = FormVersion(F);862return FV > 0 && FV <= Version;863}864return ExtensionsOk;865}866867StringRef llvm::dwarf::FormatString(DwarfFormat Format) {868switch (Format) {869case DWARF32:870return "DWARF32";871case DWARF64:872return "DWARF64";873}874return StringRef();875}876877StringRef llvm::dwarf::FormatString(bool IsDWARF64) {878return FormatString(IsDWARF64 ? DWARF64 : DWARF32);879}880881StringRef llvm::dwarf::RLEString(unsigned RLE) {882switch (RLE) {883default:884return StringRef();885#define HANDLE_DW_RLE(ID, NAME) \886case DW_RLE_##NAME: \887return "DW_RLE_" #NAME;888#include "llvm/BinaryFormat/Dwarf.def"889}890}891892constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[];893constexpr char llvm::dwarf::EnumTraits<Form>::Type[];894constexpr char llvm::dwarf::EnumTraits<Index>::Type[];895constexpr char llvm::dwarf::EnumTraits<Tag>::Type[];896constexpr char llvm::dwarf::EnumTraits<LineNumberOps>::Type[];897constexpr char llvm::dwarf::EnumTraits<LocationAtom>::Type[];898899900