xref: /freebsd-src/contrib/llvm-project/llvm/lib/BinaryFormat/Dwarf.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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