10b57cec5SDimitry Andric //===-- llvm/BinaryFormat/Dwarf.cpp - Dwarf Framework ------------*- C++-*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file contains support for generic dwarf information. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h" 140b57cec5SDimitry Andric #include "llvm/ADT/StringSwitch.h" 150b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 1606c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric using namespace llvm; 190b57cec5SDimitry Andric using namespace dwarf; 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric StringRef llvm::dwarf::TagString(unsigned Tag) { 220b57cec5SDimitry Andric switch (Tag) { 230b57cec5SDimitry Andric default: 240b57cec5SDimitry Andric return StringRef(); 258bcb0991SDimitry Andric #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 260b57cec5SDimitry Andric case DW_TAG_##NAME: \ 270b57cec5SDimitry Andric return "DW_TAG_" #NAME; 280b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 290b57cec5SDimitry Andric } 300b57cec5SDimitry Andric } 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric unsigned llvm::dwarf::getTag(StringRef TagString) { 330b57cec5SDimitry Andric return StringSwitch<unsigned>(TagString) 348bcb0991SDimitry Andric #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 350b57cec5SDimitry Andric .Case("DW_TAG_" #NAME, DW_TAG_##NAME) 360b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 370b57cec5SDimitry Andric .Default(DW_TAG_invalid); 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) { 410b57cec5SDimitry Andric switch (Tag) { 420b57cec5SDimitry Andric default: 430b57cec5SDimitry Andric return 0; 448bcb0991SDimitry Andric #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 450b57cec5SDimitry Andric case DW_TAG_##NAME: \ 460b57cec5SDimitry Andric return VERSION; 470b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 480b57cec5SDimitry Andric } 490b57cec5SDimitry Andric } 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) { 520b57cec5SDimitry Andric switch (Tag) { 530b57cec5SDimitry Andric default: 540b57cec5SDimitry Andric return 0; 558bcb0991SDimitry Andric #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ 560b57cec5SDimitry Andric case DW_TAG_##NAME: \ 570b57cec5SDimitry Andric return DWARF_VENDOR_##VENDOR; 580b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 590b57cec5SDimitry Andric } 600b57cec5SDimitry Andric } 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric StringRef llvm::dwarf::ChildrenString(unsigned Children) { 630b57cec5SDimitry Andric switch (Children) { 640b57cec5SDimitry Andric case DW_CHILDREN_no: 650b57cec5SDimitry Andric return "DW_CHILDREN_no"; 660b57cec5SDimitry Andric case DW_CHILDREN_yes: 670b57cec5SDimitry Andric return "DW_CHILDREN_yes"; 680b57cec5SDimitry Andric } 690b57cec5SDimitry Andric return StringRef(); 700b57cec5SDimitry Andric } 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric StringRef llvm::dwarf::AttributeString(unsigned Attribute) { 730b57cec5SDimitry Andric switch (Attribute) { 740b57cec5SDimitry Andric default: 750b57cec5SDimitry Andric return StringRef(); 760b57cec5SDimitry Andric #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ 770b57cec5SDimitry Andric case DW_AT_##NAME: \ 780b57cec5SDimitry Andric return "DW_AT_" #NAME; 790b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 800b57cec5SDimitry Andric } 810b57cec5SDimitry Andric } 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric unsigned llvm::dwarf::AttributeVersion(dwarf::Attribute Attribute) { 840b57cec5SDimitry Andric switch (Attribute) { 850b57cec5SDimitry Andric default: 860b57cec5SDimitry Andric return 0; 870b57cec5SDimitry Andric #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ 880b57cec5SDimitry Andric case DW_AT_##NAME: \ 890b57cec5SDimitry Andric return VERSION; 900b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 910b57cec5SDimitry Andric } 920b57cec5SDimitry Andric } 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric unsigned llvm::dwarf::AttributeVendor(dwarf::Attribute Attribute) { 950b57cec5SDimitry Andric switch (Attribute) { 960b57cec5SDimitry Andric default: 970b57cec5SDimitry Andric return 0; 980b57cec5SDimitry Andric #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ 990b57cec5SDimitry Andric case DW_AT_##NAME: \ 1000b57cec5SDimitry Andric return DWARF_VENDOR_##VENDOR; 1010b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 1020b57cec5SDimitry Andric } 1030b57cec5SDimitry Andric } 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) { 1060b57cec5SDimitry Andric switch (Encoding) { 1070b57cec5SDimitry Andric default: 1080b57cec5SDimitry Andric return StringRef(); 1090b57cec5SDimitry Andric #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ 1100b57cec5SDimitry Andric case DW_FORM_##NAME: \ 1110b57cec5SDimitry Andric return "DW_FORM_" #NAME; 1120b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 1130b57cec5SDimitry Andric } 1140b57cec5SDimitry Andric } 1150b57cec5SDimitry Andric 1160b57cec5SDimitry Andric unsigned llvm::dwarf::FormVersion(dwarf::Form Form) { 1170b57cec5SDimitry Andric switch (Form) { 1180b57cec5SDimitry Andric default: 1190b57cec5SDimitry Andric return 0; 1200b57cec5SDimitry Andric #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ 1210b57cec5SDimitry Andric case DW_FORM_##NAME: \ 1220b57cec5SDimitry Andric return VERSION; 1230b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 1240b57cec5SDimitry Andric } 1250b57cec5SDimitry Andric } 1260b57cec5SDimitry Andric 1270b57cec5SDimitry Andric unsigned llvm::dwarf::FormVendor(dwarf::Form Form) { 1280b57cec5SDimitry Andric switch (Form) { 1290b57cec5SDimitry Andric default: 1300b57cec5SDimitry Andric return 0; 1310b57cec5SDimitry Andric #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ 1320b57cec5SDimitry Andric case DW_FORM_##NAME: \ 1330b57cec5SDimitry Andric return DWARF_VENDOR_##VENDOR; 1340b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 1350b57cec5SDimitry Andric } 1360b57cec5SDimitry Andric } 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) { 1390b57cec5SDimitry Andric switch (Encoding) { 1400b57cec5SDimitry Andric default: 1410b57cec5SDimitry Andric return StringRef(); 142*0fca6ea1SDimitry Andric #define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \ 1430b57cec5SDimitry Andric case DW_OP_##NAME: \ 1440b57cec5SDimitry Andric return "DW_OP_" #NAME; 1450b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 1460b57cec5SDimitry Andric case DW_OP_LLVM_convert: 1470b57cec5SDimitry Andric return "DW_OP_LLVM_convert"; 1480b57cec5SDimitry Andric case DW_OP_LLVM_fragment: 1490b57cec5SDimitry Andric return "DW_OP_LLVM_fragment"; 1500b57cec5SDimitry Andric case DW_OP_LLVM_tag_offset: 1510b57cec5SDimitry Andric return "DW_OP_LLVM_tag_offset"; 1528bcb0991SDimitry Andric case DW_OP_LLVM_entry_value: 1538bcb0991SDimitry Andric return "DW_OP_LLVM_entry_value"; 154e8d8bef9SDimitry Andric case DW_OP_LLVM_implicit_pointer: 155e8d8bef9SDimitry Andric return "DW_OP_LLVM_implicit_pointer"; 156fe6060f1SDimitry Andric case DW_OP_LLVM_arg: 157fe6060f1SDimitry Andric return "DW_OP_LLVM_arg"; 158*0fca6ea1SDimitry Andric case DW_OP_LLVM_extract_bits_sext: 159*0fca6ea1SDimitry Andric return "DW_OP_LLVM_extract_bits_sext"; 160*0fca6ea1SDimitry Andric case DW_OP_LLVM_extract_bits_zext: 161*0fca6ea1SDimitry Andric return "DW_OP_LLVM_extract_bits_zext"; 1620b57cec5SDimitry Andric } 1630b57cec5SDimitry Andric } 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) { 1660b57cec5SDimitry Andric return StringSwitch<unsigned>(OperationEncodingString) 167*0fca6ea1SDimitry Andric #define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \ 1680b57cec5SDimitry Andric .Case("DW_OP_" #NAME, DW_OP_##NAME) 1690b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 1700b57cec5SDimitry Andric .Case("DW_OP_LLVM_convert", DW_OP_LLVM_convert) 1710b57cec5SDimitry Andric .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment) 1720b57cec5SDimitry Andric .Case("DW_OP_LLVM_tag_offset", DW_OP_LLVM_tag_offset) 1738bcb0991SDimitry Andric .Case("DW_OP_LLVM_entry_value", DW_OP_LLVM_entry_value) 174e8d8bef9SDimitry Andric .Case("DW_OP_LLVM_implicit_pointer", DW_OP_LLVM_implicit_pointer) 175fe6060f1SDimitry Andric .Case("DW_OP_LLVM_arg", DW_OP_LLVM_arg) 176*0fca6ea1SDimitry Andric .Case("DW_OP_LLVM_extract_bits_sext", DW_OP_LLVM_extract_bits_sext) 177*0fca6ea1SDimitry Andric .Case("DW_OP_LLVM_extract_bits_zext", DW_OP_LLVM_extract_bits_zext) 1780b57cec5SDimitry Andric .Default(0); 1790b57cec5SDimitry Andric } 1800b57cec5SDimitry Andric 18106c3fb27SDimitry Andric static StringRef LlvmUserOperationEncodingString(unsigned Encoding) { 18206c3fb27SDimitry Andric switch (Encoding) { 18306c3fb27SDimitry Andric default: 18406c3fb27SDimitry Andric llvm_unreachable("unhandled DWARF operation with LLVM user op"); 18506c3fb27SDimitry Andric #define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) \ 18606c3fb27SDimitry Andric case DW_OP_LLVM_##NAME: \ 18706c3fb27SDimitry Andric return "DW_OP_LLVM_" #NAME; 18806c3fb27SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 18906c3fb27SDimitry Andric } 19006c3fb27SDimitry Andric } 19106c3fb27SDimitry Andric 19206c3fb27SDimitry Andric static unsigned 19306c3fb27SDimitry Andric getLlvmUserOperationEncoding(StringRef LlvmUserOperationEncodingString) { 19406c3fb27SDimitry Andric unsigned E = StringSwitch<unsigned>(LlvmUserOperationEncodingString) 19506c3fb27SDimitry Andric #define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) .Case(#NAME, DW_OP_LLVM_##NAME) 19606c3fb27SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 19706c3fb27SDimitry Andric .Default(0); 19806c3fb27SDimitry Andric assert(E && "unhandled DWARF operation string with LLVM user op"); 19906c3fb27SDimitry Andric return E; 20006c3fb27SDimitry Andric } 20106c3fb27SDimitry Andric 20206c3fb27SDimitry Andric StringRef llvm::dwarf::SubOperationEncodingString(unsigned OpEncoding, 20306c3fb27SDimitry Andric unsigned SubOpEncoding) { 20406c3fb27SDimitry Andric assert(OpEncoding == DW_OP_LLVM_user); 20506c3fb27SDimitry Andric return LlvmUserOperationEncodingString(SubOpEncoding); 20606c3fb27SDimitry Andric } 20706c3fb27SDimitry Andric 20806c3fb27SDimitry Andric unsigned 20906c3fb27SDimitry Andric llvm::dwarf::getSubOperationEncoding(unsigned OpEncoding, 21006c3fb27SDimitry Andric StringRef SubOperationEncodingString) { 21106c3fb27SDimitry Andric assert(OpEncoding == DW_OP_LLVM_user); 21206c3fb27SDimitry Andric return getLlvmUserOperationEncoding(SubOperationEncodingString); 21306c3fb27SDimitry Andric } 21406c3fb27SDimitry Andric 2150b57cec5SDimitry Andric unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) { 2160b57cec5SDimitry Andric switch (Op) { 2170b57cec5SDimitry Andric default: 2180b57cec5SDimitry Andric return 0; 219*0fca6ea1SDimitry Andric #define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \ 2200b57cec5SDimitry Andric case DW_OP_##NAME: \ 2210b57cec5SDimitry Andric return VERSION; 2220b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 2230b57cec5SDimitry Andric } 2240b57cec5SDimitry Andric } 2250b57cec5SDimitry Andric 226*0fca6ea1SDimitry Andric std::optional<unsigned> llvm::dwarf::OperationOperands(dwarf::LocationAtom Op) { 227*0fca6ea1SDimitry Andric switch (Op) { 228*0fca6ea1SDimitry Andric default: 229*0fca6ea1SDimitry Andric return std::nullopt; 230*0fca6ea1SDimitry Andric #define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \ 231*0fca6ea1SDimitry Andric case DW_OP_##NAME: \ 232*0fca6ea1SDimitry Andric if (OPERANDS == -1) \ 233*0fca6ea1SDimitry Andric return std::nullopt; \ 234*0fca6ea1SDimitry Andric return OPERANDS; 235*0fca6ea1SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 236*0fca6ea1SDimitry Andric } 237*0fca6ea1SDimitry Andric } 238*0fca6ea1SDimitry Andric 239*0fca6ea1SDimitry Andric std::optional<unsigned> llvm::dwarf::OperationArity(dwarf::LocationAtom Op) { 240*0fca6ea1SDimitry Andric switch (Op) { 241*0fca6ea1SDimitry Andric default: 242*0fca6ea1SDimitry Andric return std::nullopt; 243*0fca6ea1SDimitry Andric #define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \ 244*0fca6ea1SDimitry Andric case DW_OP_##NAME: \ 245*0fca6ea1SDimitry Andric if (ARITY == -1) \ 246*0fca6ea1SDimitry Andric return std::nullopt; \ 247*0fca6ea1SDimitry Andric return ARITY; 248*0fca6ea1SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 249*0fca6ea1SDimitry Andric } 250*0fca6ea1SDimitry Andric } 251*0fca6ea1SDimitry Andric 2520b57cec5SDimitry Andric unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) { 2530b57cec5SDimitry Andric switch (Op) { 2540b57cec5SDimitry Andric default: 2550b57cec5SDimitry Andric return 0; 256*0fca6ea1SDimitry Andric #define HANDLE_DW_OP(ID, NAME, OPERANDS, ARITY, VERSION, VENDOR) \ 2570b57cec5SDimitry Andric case DW_OP_##NAME: \ 2580b57cec5SDimitry Andric return DWARF_VENDOR_##VENDOR; 2590b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 2600b57cec5SDimitry Andric } 2610b57cec5SDimitry Andric } 2620b57cec5SDimitry Andric 2630b57cec5SDimitry Andric StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) { 2640b57cec5SDimitry Andric switch (Encoding) { 2650b57cec5SDimitry Andric default: 2660b57cec5SDimitry Andric return StringRef(); 2670b57cec5SDimitry Andric #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 2680b57cec5SDimitry Andric case DW_ATE_##NAME: \ 2690b57cec5SDimitry Andric return "DW_ATE_" #NAME; 2700b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 2710b57cec5SDimitry Andric } 2720b57cec5SDimitry Andric } 2730b57cec5SDimitry Andric 2740b57cec5SDimitry Andric unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) { 2750b57cec5SDimitry Andric return StringSwitch<unsigned>(EncodingString) 2760b57cec5SDimitry Andric #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 2770b57cec5SDimitry Andric .Case("DW_ATE_" #NAME, DW_ATE_##NAME) 2780b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 2790b57cec5SDimitry Andric .Default(0); 2800b57cec5SDimitry Andric } 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) { 2830b57cec5SDimitry Andric switch (ATE) { 2840b57cec5SDimitry Andric default: 2850b57cec5SDimitry Andric return 0; 2860b57cec5SDimitry Andric #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 2870b57cec5SDimitry Andric case DW_ATE_##NAME: \ 2880b57cec5SDimitry Andric return VERSION; 2890b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 2900b57cec5SDimitry Andric } 2910b57cec5SDimitry Andric } 2920b57cec5SDimitry Andric 2930b57cec5SDimitry Andric unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) { 2940b57cec5SDimitry Andric switch (ATE) { 2950b57cec5SDimitry Andric default: 2960b57cec5SDimitry Andric return 0; 2970b57cec5SDimitry Andric #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ 2980b57cec5SDimitry Andric case DW_ATE_##NAME: \ 2990b57cec5SDimitry Andric return DWARF_VENDOR_##VENDOR; 3000b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 3010b57cec5SDimitry Andric } 3020b57cec5SDimitry Andric } 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric StringRef llvm::dwarf::DecimalSignString(unsigned Sign) { 3050b57cec5SDimitry Andric switch (Sign) { 3060b57cec5SDimitry Andric case DW_DS_unsigned: 3070b57cec5SDimitry Andric return "DW_DS_unsigned"; 3080b57cec5SDimitry Andric case DW_DS_leading_overpunch: 3090b57cec5SDimitry Andric return "DW_DS_leading_overpunch"; 3100b57cec5SDimitry Andric case DW_DS_trailing_overpunch: 3110b57cec5SDimitry Andric return "DW_DS_trailing_overpunch"; 3120b57cec5SDimitry Andric case DW_DS_leading_separate: 3130b57cec5SDimitry Andric return "DW_DS_leading_separate"; 3140b57cec5SDimitry Andric case DW_DS_trailing_separate: 3150b57cec5SDimitry Andric return "DW_DS_trailing_separate"; 3160b57cec5SDimitry Andric } 3170b57cec5SDimitry Andric return StringRef(); 3180b57cec5SDimitry Andric } 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric StringRef llvm::dwarf::EndianityString(unsigned Endian) { 3210b57cec5SDimitry Andric switch (Endian) { 3220b57cec5SDimitry Andric case DW_END_default: 3230b57cec5SDimitry Andric return "DW_END_default"; 3240b57cec5SDimitry Andric case DW_END_big: 3250b57cec5SDimitry Andric return "DW_END_big"; 3260b57cec5SDimitry Andric case DW_END_little: 3270b57cec5SDimitry Andric return "DW_END_little"; 3280b57cec5SDimitry Andric case DW_END_lo_user: 3290b57cec5SDimitry Andric return "DW_END_lo_user"; 3300b57cec5SDimitry Andric case DW_END_hi_user: 3310b57cec5SDimitry Andric return "DW_END_hi_user"; 3320b57cec5SDimitry Andric } 3330b57cec5SDimitry Andric return StringRef(); 3340b57cec5SDimitry Andric } 3350b57cec5SDimitry Andric 3360b57cec5SDimitry Andric StringRef llvm::dwarf::AccessibilityString(unsigned Access) { 3370b57cec5SDimitry Andric switch (Access) { 3380b57cec5SDimitry Andric // Accessibility codes 3390b57cec5SDimitry Andric case DW_ACCESS_public: 3400b57cec5SDimitry Andric return "DW_ACCESS_public"; 3410b57cec5SDimitry Andric case DW_ACCESS_protected: 3420b57cec5SDimitry Andric return "DW_ACCESS_protected"; 3430b57cec5SDimitry Andric case DW_ACCESS_private: 3440b57cec5SDimitry Andric return "DW_ACCESS_private"; 3450b57cec5SDimitry Andric } 3460b57cec5SDimitry Andric return StringRef(); 3470b57cec5SDimitry Andric } 3480b57cec5SDimitry Andric 349480093f4SDimitry Andric StringRef llvm::dwarf::DefaultedMemberString(unsigned DefaultedEncodings) { 350480093f4SDimitry Andric switch (DefaultedEncodings) { 351480093f4SDimitry Andric // Defaulted Member Encodings codes 352480093f4SDimitry Andric case DW_DEFAULTED_no: 353480093f4SDimitry Andric return "DW_DEFAULTED_no"; 354480093f4SDimitry Andric case DW_DEFAULTED_in_class: 355480093f4SDimitry Andric return "DW_DEFAULTED_in_class"; 356480093f4SDimitry Andric case DW_DEFAULTED_out_of_class: 357480093f4SDimitry Andric return "DW_DEFAULTED_out_of_class"; 358480093f4SDimitry Andric } 359480093f4SDimitry Andric return StringRef(); 360480093f4SDimitry Andric } 361480093f4SDimitry Andric 3620b57cec5SDimitry Andric StringRef llvm::dwarf::VisibilityString(unsigned Visibility) { 3630b57cec5SDimitry Andric switch (Visibility) { 3640b57cec5SDimitry Andric case DW_VIS_local: 3650b57cec5SDimitry Andric return "DW_VIS_local"; 3660b57cec5SDimitry Andric case DW_VIS_exported: 3670b57cec5SDimitry Andric return "DW_VIS_exported"; 3680b57cec5SDimitry Andric case DW_VIS_qualified: 3690b57cec5SDimitry Andric return "DW_VIS_qualified"; 3700b57cec5SDimitry Andric } 3710b57cec5SDimitry Andric return StringRef(); 3720b57cec5SDimitry Andric } 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) { 3750b57cec5SDimitry Andric switch (Virtuality) { 3760b57cec5SDimitry Andric default: 3770b57cec5SDimitry Andric return StringRef(); 3780b57cec5SDimitry Andric #define HANDLE_DW_VIRTUALITY(ID, NAME) \ 3790b57cec5SDimitry Andric case DW_VIRTUALITY_##NAME: \ 3800b57cec5SDimitry Andric return "DW_VIRTUALITY_" #NAME; 3810b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric } 3840b57cec5SDimitry Andric 3850b57cec5SDimitry Andric unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) { 3860b57cec5SDimitry Andric return StringSwitch<unsigned>(VirtualityString) 3870b57cec5SDimitry Andric #define HANDLE_DW_VIRTUALITY(ID, NAME) \ 3880b57cec5SDimitry Andric .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME) 3890b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 3900b57cec5SDimitry Andric .Default(DW_VIRTUALITY_invalid); 3910b57cec5SDimitry Andric } 3920b57cec5SDimitry Andric 3930b57cec5SDimitry Andric StringRef llvm::dwarf::LanguageString(unsigned Language) { 3940b57cec5SDimitry Andric switch (Language) { 3950b57cec5SDimitry Andric default: 3960b57cec5SDimitry Andric return StringRef(); 3970b57cec5SDimitry Andric #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 3980b57cec5SDimitry Andric case DW_LANG_##NAME: \ 3990b57cec5SDimitry Andric return "DW_LANG_" #NAME; 4000b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4010b57cec5SDimitry Andric } 4020b57cec5SDimitry Andric } 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andric unsigned llvm::dwarf::getLanguage(StringRef LanguageString) { 4050b57cec5SDimitry Andric return StringSwitch<unsigned>(LanguageString) 4060b57cec5SDimitry Andric #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 4070b57cec5SDimitry Andric .Case("DW_LANG_" #NAME, DW_LANG_##NAME) 4080b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4090b57cec5SDimitry Andric .Default(0); 4100b57cec5SDimitry Andric } 4110b57cec5SDimitry Andric 4120b57cec5SDimitry Andric unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) { 4130b57cec5SDimitry Andric switch (Lang) { 4140b57cec5SDimitry Andric default: 4150b57cec5SDimitry Andric return 0; 4160b57cec5SDimitry Andric #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 4170b57cec5SDimitry Andric case DW_LANG_##NAME: \ 4180b57cec5SDimitry Andric return VERSION; 4190b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4200b57cec5SDimitry Andric } 4210b57cec5SDimitry Andric } 4220b57cec5SDimitry Andric 4230b57cec5SDimitry Andric unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) { 4240b57cec5SDimitry Andric switch (Lang) { 4250b57cec5SDimitry Andric default: 4260b57cec5SDimitry Andric return 0; 4270b57cec5SDimitry Andric #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 4280b57cec5SDimitry Andric case DW_LANG_##NAME: \ 4290b57cec5SDimitry Andric return DWARF_VENDOR_##VENDOR; 4300b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4310b57cec5SDimitry Andric } 4320b57cec5SDimitry Andric } 4330b57cec5SDimitry Andric 434bdd1243dSDimitry Andric std::optional<unsigned> 435bdd1243dSDimitry Andric llvm::dwarf::LanguageLowerBound(dwarf::SourceLanguage Lang) { 4360b57cec5SDimitry Andric switch (Lang) { 4370b57cec5SDimitry Andric default: 438bdd1243dSDimitry Andric return std::nullopt; 4390b57cec5SDimitry Andric #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ 4400b57cec5SDimitry Andric case DW_LANG_##NAME: \ 4410b57cec5SDimitry Andric return LOWER_BOUND; 4420b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4430b57cec5SDimitry Andric } 4440b57cec5SDimitry Andric } 4450b57cec5SDimitry Andric 446*0fca6ea1SDimitry Andric StringRef llvm::dwarf::LanguageDescription(dwarf::SourceLanguageName lname) { 447*0fca6ea1SDimitry Andric switch (lname) { 448*0fca6ea1SDimitry Andric #define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \ 449*0fca6ea1SDimitry Andric case DW_LNAME_##NAME: \ 450*0fca6ea1SDimitry Andric return DESC; 451*0fca6ea1SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 452*0fca6ea1SDimitry Andric } 453*0fca6ea1SDimitry Andric return "Unknown"; 454*0fca6ea1SDimitry Andric } 455*0fca6ea1SDimitry Andric 4560b57cec5SDimitry Andric StringRef llvm::dwarf::CaseString(unsigned Case) { 4570b57cec5SDimitry Andric switch (Case) { 4580b57cec5SDimitry Andric case DW_ID_case_sensitive: 4590b57cec5SDimitry Andric return "DW_ID_case_sensitive"; 4600b57cec5SDimitry Andric case DW_ID_up_case: 4610b57cec5SDimitry Andric return "DW_ID_up_case"; 4620b57cec5SDimitry Andric case DW_ID_down_case: 4630b57cec5SDimitry Andric return "DW_ID_down_case"; 4640b57cec5SDimitry Andric case DW_ID_case_insensitive: 4650b57cec5SDimitry Andric return "DW_ID_case_insensitive"; 4660b57cec5SDimitry Andric } 4670b57cec5SDimitry Andric return StringRef(); 4680b57cec5SDimitry Andric } 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andric StringRef llvm::dwarf::ConventionString(unsigned CC) { 4710b57cec5SDimitry Andric switch (CC) { 4720b57cec5SDimitry Andric default: 4730b57cec5SDimitry Andric return StringRef(); 4740b57cec5SDimitry Andric #define HANDLE_DW_CC(ID, NAME) \ 4750b57cec5SDimitry Andric case DW_CC_##NAME: \ 4760b57cec5SDimitry Andric return "DW_CC_" #NAME; 4770b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4780b57cec5SDimitry Andric } 4790b57cec5SDimitry Andric } 4800b57cec5SDimitry Andric 4810b57cec5SDimitry Andric unsigned llvm::dwarf::getCallingConvention(StringRef CCString) { 4820b57cec5SDimitry Andric return StringSwitch<unsigned>(CCString) 4830b57cec5SDimitry Andric #define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME) 4840b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 4850b57cec5SDimitry Andric .Default(0); 4860b57cec5SDimitry Andric } 4870b57cec5SDimitry Andric 4880b57cec5SDimitry Andric StringRef llvm::dwarf::InlineCodeString(unsigned Code) { 4890b57cec5SDimitry Andric switch (Code) { 4900b57cec5SDimitry Andric case DW_INL_not_inlined: 4910b57cec5SDimitry Andric return "DW_INL_not_inlined"; 4920b57cec5SDimitry Andric case DW_INL_inlined: 4930b57cec5SDimitry Andric return "DW_INL_inlined"; 4940b57cec5SDimitry Andric case DW_INL_declared_not_inlined: 4950b57cec5SDimitry Andric return "DW_INL_declared_not_inlined"; 4960b57cec5SDimitry Andric case DW_INL_declared_inlined: 4970b57cec5SDimitry Andric return "DW_INL_declared_inlined"; 4980b57cec5SDimitry Andric } 4990b57cec5SDimitry Andric return StringRef(); 5000b57cec5SDimitry Andric } 5010b57cec5SDimitry Andric 5020b57cec5SDimitry Andric StringRef llvm::dwarf::ArrayOrderString(unsigned Order) { 5030b57cec5SDimitry Andric switch (Order) { 5040b57cec5SDimitry Andric case DW_ORD_row_major: 5050b57cec5SDimitry Andric return "DW_ORD_row_major"; 5060b57cec5SDimitry Andric case DW_ORD_col_major: 5070b57cec5SDimitry Andric return "DW_ORD_col_major"; 5080b57cec5SDimitry Andric } 5090b57cec5SDimitry Andric return StringRef(); 5100b57cec5SDimitry Andric } 5110b57cec5SDimitry Andric 5120b57cec5SDimitry Andric StringRef llvm::dwarf::LNStandardString(unsigned Standard) { 5130b57cec5SDimitry Andric switch (Standard) { 5140b57cec5SDimitry Andric default: 5150b57cec5SDimitry Andric return StringRef(); 5160b57cec5SDimitry Andric #define HANDLE_DW_LNS(ID, NAME) \ 5170b57cec5SDimitry Andric case DW_LNS_##NAME: \ 5180b57cec5SDimitry Andric return "DW_LNS_" #NAME; 5190b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 5200b57cec5SDimitry Andric } 5210b57cec5SDimitry Andric } 5220b57cec5SDimitry Andric 5230b57cec5SDimitry Andric StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) { 5240b57cec5SDimitry Andric switch (Encoding) { 5250b57cec5SDimitry Andric default: 5260b57cec5SDimitry Andric return StringRef(); 5270b57cec5SDimitry Andric #define HANDLE_DW_LNE(ID, NAME) \ 5280b57cec5SDimitry Andric case DW_LNE_##NAME: \ 5290b57cec5SDimitry Andric return "DW_LNE_" #NAME; 5300b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 5310b57cec5SDimitry Andric } 5320b57cec5SDimitry Andric } 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andric StringRef llvm::dwarf::MacinfoString(unsigned Encoding) { 5350b57cec5SDimitry Andric switch (Encoding) { 5360b57cec5SDimitry Andric // Macinfo Type Encodings 5370b57cec5SDimitry Andric case DW_MACINFO_define: 5380b57cec5SDimitry Andric return "DW_MACINFO_define"; 5390b57cec5SDimitry Andric case DW_MACINFO_undef: 5400b57cec5SDimitry Andric return "DW_MACINFO_undef"; 5410b57cec5SDimitry Andric case DW_MACINFO_start_file: 5420b57cec5SDimitry Andric return "DW_MACINFO_start_file"; 5430b57cec5SDimitry Andric case DW_MACINFO_end_file: 5440b57cec5SDimitry Andric return "DW_MACINFO_end_file"; 5450b57cec5SDimitry Andric case DW_MACINFO_vendor_ext: 5460b57cec5SDimitry Andric return "DW_MACINFO_vendor_ext"; 5470b57cec5SDimitry Andric case DW_MACINFO_invalid: 5480b57cec5SDimitry Andric return "DW_MACINFO_invalid"; 5490b57cec5SDimitry Andric } 5500b57cec5SDimitry Andric return StringRef(); 5510b57cec5SDimitry Andric } 5520b57cec5SDimitry Andric 5530b57cec5SDimitry Andric unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) { 5540b57cec5SDimitry Andric return StringSwitch<unsigned>(MacinfoString) 5550b57cec5SDimitry Andric .Case("DW_MACINFO_define", DW_MACINFO_define) 5560b57cec5SDimitry Andric .Case("DW_MACINFO_undef", DW_MACINFO_undef) 5570b57cec5SDimitry Andric .Case("DW_MACINFO_start_file", DW_MACINFO_start_file) 5580b57cec5SDimitry Andric .Case("DW_MACINFO_end_file", DW_MACINFO_end_file) 5590b57cec5SDimitry Andric .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext) 5600b57cec5SDimitry Andric .Default(DW_MACINFO_invalid); 5610b57cec5SDimitry Andric } 5620b57cec5SDimitry Andric 5635ffd83dbSDimitry Andric StringRef llvm::dwarf::MacroString(unsigned Encoding) { 5645ffd83dbSDimitry Andric switch (Encoding) { 5655ffd83dbSDimitry Andric default: 5665ffd83dbSDimitry Andric return StringRef(); 5675ffd83dbSDimitry Andric #define HANDLE_DW_MACRO(ID, NAME) \ 5685ffd83dbSDimitry Andric case DW_MACRO_##NAME: \ 5695ffd83dbSDimitry Andric return "DW_MACRO_" #NAME; 5705ffd83dbSDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 5715ffd83dbSDimitry Andric } 5725ffd83dbSDimitry Andric } 5735ffd83dbSDimitry Andric 574e8d8bef9SDimitry Andric StringRef llvm::dwarf::GnuMacroString(unsigned Encoding) { 575e8d8bef9SDimitry Andric switch (Encoding) { 576e8d8bef9SDimitry Andric default: 577e8d8bef9SDimitry Andric return StringRef(); 578e8d8bef9SDimitry Andric #define HANDLE_DW_MACRO_GNU(ID, NAME) \ 579e8d8bef9SDimitry Andric case DW_MACRO_GNU_##NAME: \ 580e8d8bef9SDimitry Andric return "DW_MACRO_GNU_" #NAME; 581e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 582e8d8bef9SDimitry Andric } 583e8d8bef9SDimitry Andric } 584e8d8bef9SDimitry Andric 5855ffd83dbSDimitry Andric unsigned llvm::dwarf::getMacro(StringRef MacroString) { 5865ffd83dbSDimitry Andric return StringSwitch<unsigned>(MacroString) 5875ffd83dbSDimitry Andric #define HANDLE_DW_MACRO(ID, NAME) .Case("DW_MACRO_" #NAME, ID) 5885ffd83dbSDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 5895ffd83dbSDimitry Andric .Default(DW_MACINFO_invalid); 5905ffd83dbSDimitry Andric } 5910b57cec5SDimitry Andric StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) { 5920b57cec5SDimitry Andric switch (Encoding) { 5930b57cec5SDimitry Andric default: 5940b57cec5SDimitry Andric return StringRef(); 5950b57cec5SDimitry Andric #define HANDLE_DW_RLE(ID, NAME) \ 5960b57cec5SDimitry Andric case DW_RLE_##NAME: \ 5970b57cec5SDimitry Andric return "DW_RLE_" #NAME; 5980b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 5990b57cec5SDimitry Andric } 6000b57cec5SDimitry Andric } 6010b57cec5SDimitry Andric 6028bcb0991SDimitry Andric StringRef llvm::dwarf::LocListEncodingString(unsigned Encoding) { 6038bcb0991SDimitry Andric switch (Encoding) { 6048bcb0991SDimitry Andric default: 6058bcb0991SDimitry Andric return StringRef(); 6068bcb0991SDimitry Andric #define HANDLE_DW_LLE(ID, NAME) \ 6078bcb0991SDimitry Andric case DW_LLE_##NAME: \ 6088bcb0991SDimitry Andric return "DW_LLE_" #NAME; 6098bcb0991SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 6108bcb0991SDimitry Andric } 6118bcb0991SDimitry Andric } 6128bcb0991SDimitry Andric 6130b57cec5SDimitry Andric StringRef llvm::dwarf::CallFrameString(unsigned Encoding, 6140b57cec5SDimitry Andric Triple::ArchType Arch) { 6150b57cec5SDimitry Andric assert(Arch != llvm::Triple::ArchType::UnknownArch); 6160b57cec5SDimitry Andric #define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64) 6170b57cec5SDimitry Andric #define SELECT_MIPS64 Arch == llvm::Triple::mips64 6180b57cec5SDimitry Andric #define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9) 6190b57cec5SDimitry Andric #define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) 6200b57cec5SDimitry Andric #define HANDLE_DW_CFA(ID, NAME) 6210b57cec5SDimitry Andric #define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \ 6220b57cec5SDimitry Andric if (ID == Encoding && PRED) \ 6230b57cec5SDimitry Andric return "DW_CFA_" #NAME; 6240b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 6250b57cec5SDimitry Andric 6260b57cec5SDimitry Andric switch (Encoding) { 6270b57cec5SDimitry Andric default: 6280b57cec5SDimitry Andric return StringRef(); 6290b57cec5SDimitry Andric #define HANDLE_DW_CFA_PRED(ID, NAME, PRED) 6300b57cec5SDimitry Andric #define HANDLE_DW_CFA(ID, NAME) \ 6310b57cec5SDimitry Andric case DW_CFA_##NAME: \ 6320b57cec5SDimitry Andric return "DW_CFA_" #NAME; 6330b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andric #undef SELECT_X86 6360b57cec5SDimitry Andric #undef SELECT_SPARC 6370b57cec5SDimitry Andric #undef SELECT_MIPS64 6380b57cec5SDimitry Andric #undef SELECT_AARCH64 6390b57cec5SDimitry Andric } 6400b57cec5SDimitry Andric } 6410b57cec5SDimitry Andric 6420b57cec5SDimitry Andric StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) { 6430b57cec5SDimitry Andric switch (Prop) { 6440b57cec5SDimitry Andric default: 6450b57cec5SDimitry Andric return StringRef(); 6460b57cec5SDimitry Andric #define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \ 6470b57cec5SDimitry Andric case DW_APPLE_PROPERTY_##NAME: \ 6480b57cec5SDimitry Andric return "DW_APPLE_PROPERTY_" #NAME; 6490b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 6500b57cec5SDimitry Andric } 6510b57cec5SDimitry Andric } 6520b57cec5SDimitry Andric 6530b57cec5SDimitry Andric StringRef llvm::dwarf::UnitTypeString(unsigned UT) { 6540b57cec5SDimitry Andric switch (UT) { 6550b57cec5SDimitry Andric default: 6560b57cec5SDimitry Andric return StringRef(); 6570b57cec5SDimitry Andric #define HANDLE_DW_UT(ID, NAME) \ 6580b57cec5SDimitry Andric case DW_UT_##NAME: \ 6590b57cec5SDimitry Andric return "DW_UT_" #NAME; 6600b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 6610b57cec5SDimitry Andric } 6620b57cec5SDimitry Andric } 6630b57cec5SDimitry Andric 6640b57cec5SDimitry Andric StringRef llvm::dwarf::AtomTypeString(unsigned AT) { 6650b57cec5SDimitry Andric switch (AT) { 6660b57cec5SDimitry Andric case dwarf::DW_ATOM_null: 6670b57cec5SDimitry Andric return "DW_ATOM_null"; 6680b57cec5SDimitry Andric case dwarf::DW_ATOM_die_offset: 6690b57cec5SDimitry Andric return "DW_ATOM_die_offset"; 6700b57cec5SDimitry Andric case DW_ATOM_cu_offset: 6710b57cec5SDimitry Andric return "DW_ATOM_cu_offset"; 6720b57cec5SDimitry Andric case DW_ATOM_die_tag: 6730b57cec5SDimitry Andric return "DW_ATOM_die_tag"; 6740b57cec5SDimitry Andric case DW_ATOM_type_flags: 6750b57cec5SDimitry Andric case DW_ATOM_type_type_flags: 6760b57cec5SDimitry Andric return "DW_ATOM_type_flags"; 6770b57cec5SDimitry Andric case DW_ATOM_qual_name_hash: 6780b57cec5SDimitry Andric return "DW_ATOM_qual_name_hash"; 6790b57cec5SDimitry Andric } 6800b57cec5SDimitry Andric return StringRef(); 6810b57cec5SDimitry Andric } 6820b57cec5SDimitry Andric 6830b57cec5SDimitry Andric StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) { 6840b57cec5SDimitry Andric switch (Kind) { 6850b57cec5SDimitry Andric case GIEK_NONE: 6860b57cec5SDimitry Andric return "NONE"; 6870b57cec5SDimitry Andric case GIEK_TYPE: 6880b57cec5SDimitry Andric return "TYPE"; 6890b57cec5SDimitry Andric case GIEK_VARIABLE: 6900b57cec5SDimitry Andric return "VARIABLE"; 6910b57cec5SDimitry Andric case GIEK_FUNCTION: 6920b57cec5SDimitry Andric return "FUNCTION"; 6930b57cec5SDimitry Andric case GIEK_OTHER: 6940b57cec5SDimitry Andric return "OTHER"; 6950b57cec5SDimitry Andric case GIEK_UNUSED5: 6960b57cec5SDimitry Andric return "UNUSED5"; 6970b57cec5SDimitry Andric case GIEK_UNUSED6: 6980b57cec5SDimitry Andric return "UNUSED6"; 6990b57cec5SDimitry Andric case GIEK_UNUSED7: 7000b57cec5SDimitry Andric return "UNUSED7"; 7010b57cec5SDimitry Andric } 7020b57cec5SDimitry Andric llvm_unreachable("Unknown GDBIndexEntryKind value"); 7030b57cec5SDimitry Andric } 7040b57cec5SDimitry Andric 7050b57cec5SDimitry Andric StringRef 7060b57cec5SDimitry Andric llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) { 7070b57cec5SDimitry Andric switch (Linkage) { 7080b57cec5SDimitry Andric case GIEL_EXTERNAL: 7090b57cec5SDimitry Andric return "EXTERNAL"; 7100b57cec5SDimitry Andric case GIEL_STATIC: 7110b57cec5SDimitry Andric return "STATIC"; 7120b57cec5SDimitry Andric } 7130b57cec5SDimitry Andric llvm_unreachable("Unknown GDBIndexEntryLinkage value"); 7140b57cec5SDimitry Andric } 7150b57cec5SDimitry Andric 7160b57cec5SDimitry Andric StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) { 7170b57cec5SDimitry Andric switch (Attr) { 7180b57cec5SDimitry Andric case DW_AT_accessibility: 7190b57cec5SDimitry Andric return AccessibilityString(Val); 7200b57cec5SDimitry Andric case DW_AT_virtuality: 7210b57cec5SDimitry Andric return VirtualityString(Val); 7220b57cec5SDimitry Andric case DW_AT_language: 7230b57cec5SDimitry Andric return LanguageString(Val); 7240b57cec5SDimitry Andric case DW_AT_encoding: 7250b57cec5SDimitry Andric return AttributeEncodingString(Val); 7260b57cec5SDimitry Andric case DW_AT_decimal_sign: 7270b57cec5SDimitry Andric return DecimalSignString(Val); 7280b57cec5SDimitry Andric case DW_AT_endianity: 7290b57cec5SDimitry Andric return EndianityString(Val); 7300b57cec5SDimitry Andric case DW_AT_visibility: 7310b57cec5SDimitry Andric return VisibilityString(Val); 7320b57cec5SDimitry Andric case DW_AT_identifier_case: 7330b57cec5SDimitry Andric return CaseString(Val); 7340b57cec5SDimitry Andric case DW_AT_calling_convention: 7350b57cec5SDimitry Andric return ConventionString(Val); 7360b57cec5SDimitry Andric case DW_AT_inline: 7370b57cec5SDimitry Andric return InlineCodeString(Val); 7380b57cec5SDimitry Andric case DW_AT_ordering: 7390b57cec5SDimitry Andric return ArrayOrderString(Val); 7400b57cec5SDimitry Andric case DW_AT_APPLE_runtime_class: 7410b57cec5SDimitry Andric return LanguageString(Val); 742480093f4SDimitry Andric case DW_AT_defaulted: 743480093f4SDimitry Andric return DefaultedMemberString(Val); 7440b57cec5SDimitry Andric } 7450b57cec5SDimitry Andric 7460b57cec5SDimitry Andric return StringRef(); 7470b57cec5SDimitry Andric } 7480b57cec5SDimitry Andric 7490b57cec5SDimitry Andric StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) { 7500b57cec5SDimitry Andric switch (Atom) { 7510b57cec5SDimitry Andric case DW_ATOM_null: 7520b57cec5SDimitry Andric return "NULL"; 7530b57cec5SDimitry Andric case DW_ATOM_die_tag: 7540b57cec5SDimitry Andric return TagString(Val); 7550b57cec5SDimitry Andric } 7560b57cec5SDimitry Andric 7570b57cec5SDimitry Andric return StringRef(); 7580b57cec5SDimitry Andric } 7590b57cec5SDimitry Andric 7600b57cec5SDimitry Andric StringRef llvm::dwarf::IndexString(unsigned Idx) { 7610b57cec5SDimitry Andric switch (Idx) { 7620b57cec5SDimitry Andric default: 7630b57cec5SDimitry Andric return StringRef(); 7640b57cec5SDimitry Andric #define HANDLE_DW_IDX(ID, NAME) \ 7650b57cec5SDimitry Andric case DW_IDX_##NAME: \ 7660b57cec5SDimitry Andric return "DW_IDX_" #NAME; 7670b57cec5SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 7680b57cec5SDimitry Andric } 7690b57cec5SDimitry Andric } 7700b57cec5SDimitry Andric 771bdd1243dSDimitry Andric std::optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form, 7720b57cec5SDimitry Andric FormParams Params) { 7730b57cec5SDimitry Andric switch (Form) { 7740b57cec5SDimitry Andric case DW_FORM_addr: 7750b57cec5SDimitry Andric if (Params) 7760b57cec5SDimitry Andric return Params.AddrSize; 777bdd1243dSDimitry Andric return std::nullopt; 7780b57cec5SDimitry Andric 7790b57cec5SDimitry Andric case DW_FORM_block: // ULEB128 length L followed by L bytes. 7800b57cec5SDimitry Andric case DW_FORM_block1: // 1 byte length L followed by L bytes. 7810b57cec5SDimitry Andric case DW_FORM_block2: // 2 byte length L followed by L bytes. 7820b57cec5SDimitry Andric case DW_FORM_block4: // 4 byte length L followed by L bytes. 7830b57cec5SDimitry Andric case DW_FORM_string: // C-string with null terminator. 7840b57cec5SDimitry Andric case DW_FORM_sdata: // SLEB128. 7850b57cec5SDimitry Andric case DW_FORM_udata: // ULEB128. 7860b57cec5SDimitry Andric case DW_FORM_ref_udata: // ULEB128. 7870b57cec5SDimitry Andric case DW_FORM_indirect: // ULEB128. 7880b57cec5SDimitry Andric case DW_FORM_exprloc: // ULEB128 length L followed by L bytes. 7890b57cec5SDimitry Andric case DW_FORM_strx: // ULEB128. 7900b57cec5SDimitry Andric case DW_FORM_addrx: // ULEB128. 7910b57cec5SDimitry Andric case DW_FORM_loclistx: // ULEB128. 7920b57cec5SDimitry Andric case DW_FORM_rnglistx: // ULEB128. 7930b57cec5SDimitry Andric case DW_FORM_GNU_addr_index: // ULEB128. 7940b57cec5SDimitry Andric case DW_FORM_GNU_str_index: // ULEB128. 795bdd1243dSDimitry Andric return std::nullopt; 7960b57cec5SDimitry Andric 7970b57cec5SDimitry Andric case DW_FORM_ref_addr: 7980b57cec5SDimitry Andric if (Params) 7990b57cec5SDimitry Andric return Params.getRefAddrByteSize(); 800bdd1243dSDimitry Andric return std::nullopt; 8010b57cec5SDimitry Andric 8020b57cec5SDimitry Andric case DW_FORM_flag: 8030b57cec5SDimitry Andric case DW_FORM_data1: 8040b57cec5SDimitry Andric case DW_FORM_ref1: 8050b57cec5SDimitry Andric case DW_FORM_strx1: 8060b57cec5SDimitry Andric case DW_FORM_addrx1: 8070b57cec5SDimitry Andric return 1; 8080b57cec5SDimitry Andric 8090b57cec5SDimitry Andric case DW_FORM_data2: 8100b57cec5SDimitry Andric case DW_FORM_ref2: 8110b57cec5SDimitry Andric case DW_FORM_strx2: 8120b57cec5SDimitry Andric case DW_FORM_addrx2: 8130b57cec5SDimitry Andric return 2; 8140b57cec5SDimitry Andric 8150b57cec5SDimitry Andric case DW_FORM_strx3: 81606c3fb27SDimitry Andric case DW_FORM_addrx3: 8170b57cec5SDimitry Andric return 3; 8180b57cec5SDimitry Andric 8190b57cec5SDimitry Andric case DW_FORM_data4: 8200b57cec5SDimitry Andric case DW_FORM_ref4: 8210b57cec5SDimitry Andric case DW_FORM_ref_sup4: 8220b57cec5SDimitry Andric case DW_FORM_strx4: 8230b57cec5SDimitry Andric case DW_FORM_addrx4: 8240b57cec5SDimitry Andric return 4; 8250b57cec5SDimitry Andric 8260b57cec5SDimitry Andric case DW_FORM_strp: 8270b57cec5SDimitry Andric case DW_FORM_GNU_ref_alt: 8280b57cec5SDimitry Andric case DW_FORM_GNU_strp_alt: 8290b57cec5SDimitry Andric case DW_FORM_line_strp: 8300b57cec5SDimitry Andric case DW_FORM_sec_offset: 8310b57cec5SDimitry Andric case DW_FORM_strp_sup: 8320b57cec5SDimitry Andric if (Params) 8330b57cec5SDimitry Andric return Params.getDwarfOffsetByteSize(); 834bdd1243dSDimitry Andric return std::nullopt; 8350b57cec5SDimitry Andric 8360b57cec5SDimitry Andric case DW_FORM_data8: 8370b57cec5SDimitry Andric case DW_FORM_ref8: 8380b57cec5SDimitry Andric case DW_FORM_ref_sig8: 8390b57cec5SDimitry Andric case DW_FORM_ref_sup8: 8400b57cec5SDimitry Andric return 8; 8410b57cec5SDimitry Andric 8420b57cec5SDimitry Andric case DW_FORM_flag_present: 8430b57cec5SDimitry Andric return 0; 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andric case DW_FORM_data16: 8460b57cec5SDimitry Andric return 16; 8470b57cec5SDimitry Andric 8480b57cec5SDimitry Andric case DW_FORM_implicit_const: 8490b57cec5SDimitry Andric // The implicit value is stored in the abbreviation as a SLEB128, and 8500b57cec5SDimitry Andric // there no data in debug info. 8510b57cec5SDimitry Andric return 0; 8520b57cec5SDimitry Andric 8530b57cec5SDimitry Andric default: 8540b57cec5SDimitry Andric break; 8550b57cec5SDimitry Andric } 856bdd1243dSDimitry Andric return std::nullopt; 8570b57cec5SDimitry Andric } 8580b57cec5SDimitry Andric 8590b57cec5SDimitry Andric bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version, 8600b57cec5SDimitry Andric bool ExtensionsOk) { 8610b57cec5SDimitry Andric if (FormVendor(F) == DWARF_VENDOR_DWARF) { 8620b57cec5SDimitry Andric unsigned FV = FormVersion(F); 8630b57cec5SDimitry Andric return FV > 0 && FV <= Version; 8640b57cec5SDimitry Andric } 8650b57cec5SDimitry Andric return ExtensionsOk; 8660b57cec5SDimitry Andric } 8670b57cec5SDimitry Andric 8685ffd83dbSDimitry Andric StringRef llvm::dwarf::FormatString(DwarfFormat Format) { 8695ffd83dbSDimitry Andric switch (Format) { 8705ffd83dbSDimitry Andric case DWARF32: 8715ffd83dbSDimitry Andric return "DWARF32"; 8725ffd83dbSDimitry Andric case DWARF64: 8735ffd83dbSDimitry Andric return "DWARF64"; 8745ffd83dbSDimitry Andric } 8755ffd83dbSDimitry Andric return StringRef(); 8765ffd83dbSDimitry Andric } 8775ffd83dbSDimitry Andric 8785ffd83dbSDimitry Andric StringRef llvm::dwarf::FormatString(bool IsDWARF64) { 8795ffd83dbSDimitry Andric return FormatString(IsDWARF64 ? DWARF64 : DWARF32); 8805ffd83dbSDimitry Andric } 8815ffd83dbSDimitry Andric 882e8d8bef9SDimitry Andric StringRef llvm::dwarf::RLEString(unsigned RLE) { 883e8d8bef9SDimitry Andric switch (RLE) { 884e8d8bef9SDimitry Andric default: 885e8d8bef9SDimitry Andric return StringRef(); 886e8d8bef9SDimitry Andric #define HANDLE_DW_RLE(ID, NAME) \ 887e8d8bef9SDimitry Andric case DW_RLE_##NAME: \ 888e8d8bef9SDimitry Andric return "DW_RLE_" #NAME; 889e8d8bef9SDimitry Andric #include "llvm/BinaryFormat/Dwarf.def" 890e8d8bef9SDimitry Andric } 891e8d8bef9SDimitry Andric } 892e8d8bef9SDimitry Andric 8930b57cec5SDimitry Andric constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[]; 8940b57cec5SDimitry Andric constexpr char llvm::dwarf::EnumTraits<Form>::Type[]; 8950b57cec5SDimitry Andric constexpr char llvm::dwarf::EnumTraits<Index>::Type[]; 8960b57cec5SDimitry Andric constexpr char llvm::dwarf::EnumTraits<Tag>::Type[]; 8975ffd83dbSDimitry Andric constexpr char llvm::dwarf::EnumTraits<LineNumberOps>::Type[]; 8985ffd83dbSDimitry Andric constexpr char llvm::dwarf::EnumTraits<LocationAtom>::Type[]; 899