1 //===-- DWARFDefines.cpp ----------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "DWARFDefines.h"
10 #include "lldb/Utility/ConstString.h"
11 #include <cstdio>
12 #include <cstring>
13 #include <string>
14 
15 namespace lldb_private {
16 
17 const char *DW_TAG_value_to_name(uint32_t val) {
18   static char invalid[100];
19 
20   if (val == 0)
21     return "NULL";
22 
23   llvm::StringRef llvmstr = llvm::dwarf::TagString(val);
24   if (llvmstr.empty()) {
25     snprintf(invalid, sizeof(invalid), "Unknown DW_TAG constant: 0x%x", val);
26     return invalid;
27   }
28   return llvmstr.data();
29 }
30 
31 const char *DW_CHILDREN_value_to_name(uint8_t val) {
32   static char invalid[100];
33   llvm::StringRef llvmstr = llvm::dwarf::ChildrenString(val);
34   if (llvmstr.empty()) {
35     snprintf(invalid, sizeof(invalid), "Unknown DW_CHILDREN constant: 0x%x",
36              val);
37     return invalid;
38   }
39   return llvmstr.data();
40 }
41 
42 const char *DW_AT_value_to_name(uint32_t val) {
43   static char invalid[100];
44   llvm::StringRef llvmstr = llvm::dwarf::AttributeString(val);
45   if (llvmstr.empty()) {
46     snprintf(invalid, sizeof(invalid), "Unknown DW_AT constant: 0x%x", val);
47     return invalid;
48   }
49   return llvmstr.data();
50 }
51 
52 const char *DW_FORM_value_to_name(uint32_t val) {
53   static char invalid[100];
54   llvm::StringRef llvmstr = llvm::dwarf::FormEncodingString(val);
55   if (llvmstr.empty()) {
56     snprintf(invalid, sizeof(invalid), "Unknown DW_FORM constant: 0x%x", val);
57     return invalid;
58   }
59   return llvmstr.data();
60 }
61 
62 const char *DW_OP_value_to_name(uint32_t val) {
63   static char invalid[100];
64   llvm::StringRef llvmstr = llvm::dwarf::OperationEncodingString(val);
65   if (llvmstr.empty()) {
66     snprintf(invalid, sizeof(invalid), "Unknown DW_OP constant: 0x%x", val);
67     return invalid;
68   }
69   return llvmstr.data();
70 }
71 
72 DRC_class DW_OP_value_to_class(uint32_t val) {
73   switch (val) {
74   case 0x03:
75     return DRC_ONEOPERAND;
76   case 0x06:
77     return DRC_ZEROOPERANDS;
78   case 0x08:
79     return DRC_ONEOPERAND;
80   case 0x09:
81     return DRC_ONEOPERAND;
82   case 0x0a:
83     return DRC_ONEOPERAND;
84   case 0x0b:
85     return DRC_ONEOPERAND;
86   case 0x0c:
87     return DRC_ONEOPERAND;
88   case 0x0d:
89     return DRC_ONEOPERAND;
90   case 0x0e:
91     return DRC_ONEOPERAND;
92   case 0x0f:
93     return DRC_ONEOPERAND;
94   case 0x10:
95     return DRC_ONEOPERAND;
96   case 0x11:
97     return DRC_ONEOPERAND;
98   case 0x12:
99     return DRC_ZEROOPERANDS;
100   case 0x13:
101     return DRC_ZEROOPERANDS;
102   case 0x14:
103     return DRC_ZEROOPERANDS;
104   case 0x15:
105     return DRC_ONEOPERAND;
106   case 0x16:
107     return DRC_ZEROOPERANDS;
108   case 0x17:
109     return DRC_ZEROOPERANDS;
110   case 0x18:
111     return DRC_ZEROOPERANDS;
112   case 0x19:
113     return DRC_ZEROOPERANDS;
114   case 0x1a:
115     return DRC_ZEROOPERANDS;
116   case 0x1b:
117     return DRC_ZEROOPERANDS;
118   case 0x1c:
119     return DRC_ZEROOPERANDS;
120   case 0x1d:
121     return DRC_ZEROOPERANDS;
122   case 0x1e:
123     return DRC_ZEROOPERANDS;
124   case 0x1f:
125     return DRC_ZEROOPERANDS;
126   case 0x20:
127     return DRC_ZEROOPERANDS;
128   case 0x21:
129     return DRC_ZEROOPERANDS;
130   case 0x22:
131     return DRC_ZEROOPERANDS;
132   case 0x23:
133     return DRC_ONEOPERAND;
134   case 0x24:
135     return DRC_ZEROOPERANDS;
136   case 0x25:
137     return DRC_ZEROOPERANDS;
138   case 0x26:
139     return DRC_ZEROOPERANDS;
140   case 0x27:
141     return DRC_ZEROOPERANDS;
142   case 0x2f:
143     return DRC_ONEOPERAND;
144   case 0x28:
145     return DRC_ONEOPERAND;
146   case 0x29:
147     return DRC_ZEROOPERANDS;
148   case 0x2a:
149     return DRC_ZEROOPERANDS;
150   case 0x2b:
151     return DRC_ZEROOPERANDS;
152   case 0x2c:
153     return DRC_ZEROOPERANDS;
154   case 0x2d:
155     return DRC_ZEROOPERANDS;
156   case 0x2e:
157     return DRC_ZEROOPERANDS;
158   case 0x30:
159     return DRC_ZEROOPERANDS;
160   case 0x31:
161     return DRC_ZEROOPERANDS;
162   case 0x32:
163     return DRC_ZEROOPERANDS;
164   case 0x33:
165     return DRC_ZEROOPERANDS;
166   case 0x34:
167     return DRC_ZEROOPERANDS;
168   case 0x35:
169     return DRC_ZEROOPERANDS;
170   case 0x36:
171     return DRC_ZEROOPERANDS;
172   case 0x37:
173     return DRC_ZEROOPERANDS;
174   case 0x38:
175     return DRC_ZEROOPERANDS;
176   case 0x39:
177     return DRC_ZEROOPERANDS;
178   case 0x3a:
179     return DRC_ZEROOPERANDS;
180   case 0x3b:
181     return DRC_ZEROOPERANDS;
182   case 0x3c:
183     return DRC_ZEROOPERANDS;
184   case 0x3d:
185     return DRC_ZEROOPERANDS;
186   case 0x3e:
187     return DRC_ZEROOPERANDS;
188   case 0x3f:
189     return DRC_ZEROOPERANDS;
190   case 0x40:
191     return DRC_ZEROOPERANDS;
192   case 0x41:
193     return DRC_ZEROOPERANDS;
194   case 0x42:
195     return DRC_ZEROOPERANDS;
196   case 0x43:
197     return DRC_ZEROOPERANDS;
198   case 0x44:
199     return DRC_ZEROOPERANDS;
200   case 0x45:
201     return DRC_ZEROOPERANDS;
202   case 0x46:
203     return DRC_ZEROOPERANDS;
204   case 0x47:
205     return DRC_ZEROOPERANDS;
206   case 0x48:
207     return DRC_ZEROOPERANDS;
208   case 0x49:
209     return DRC_ZEROOPERANDS;
210   case 0x4a:
211     return DRC_ZEROOPERANDS;
212   case 0x4b:
213     return DRC_ZEROOPERANDS;
214   case 0x4c:
215     return DRC_ZEROOPERANDS;
216   case 0x4d:
217     return DRC_ZEROOPERANDS;
218   case 0x4e:
219     return DRC_ZEROOPERANDS;
220   case 0x4f:
221     return DRC_ZEROOPERANDS;
222   case 0x50:
223     return DRC_ZEROOPERANDS;
224   case 0x51:
225     return DRC_ZEROOPERANDS;
226   case 0x52:
227     return DRC_ZEROOPERANDS;
228   case 0x53:
229     return DRC_ZEROOPERANDS;
230   case 0x54:
231     return DRC_ZEROOPERANDS;
232   case 0x55:
233     return DRC_ZEROOPERANDS;
234   case 0x56:
235     return DRC_ZEROOPERANDS;
236   case 0x57:
237     return DRC_ZEROOPERANDS;
238   case 0x58:
239     return DRC_ZEROOPERANDS;
240   case 0x59:
241     return DRC_ZEROOPERANDS;
242   case 0x5a:
243     return DRC_ZEROOPERANDS;
244   case 0x5b:
245     return DRC_ZEROOPERANDS;
246   case 0x5c:
247     return DRC_ZEROOPERANDS;
248   case 0x5d:
249     return DRC_ZEROOPERANDS;
250   case 0x5e:
251     return DRC_ZEROOPERANDS;
252   case 0x5f:
253     return DRC_ZEROOPERANDS;
254   case 0x60:
255     return DRC_ZEROOPERANDS;
256   case 0x61:
257     return DRC_ZEROOPERANDS;
258   case 0x62:
259     return DRC_ZEROOPERANDS;
260   case 0x63:
261     return DRC_ZEROOPERANDS;
262   case 0x64:
263     return DRC_ZEROOPERANDS;
264   case 0x65:
265     return DRC_ZEROOPERANDS;
266   case 0x66:
267     return DRC_ZEROOPERANDS;
268   case 0x67:
269     return DRC_ZEROOPERANDS;
270   case 0x68:
271     return DRC_ZEROOPERANDS;
272   case 0x69:
273     return DRC_ZEROOPERANDS;
274   case 0x6a:
275     return DRC_ZEROOPERANDS;
276   case 0x6b:
277     return DRC_ZEROOPERANDS;
278   case 0x6c:
279     return DRC_ZEROOPERANDS;
280   case 0x6d:
281     return DRC_ZEROOPERANDS;
282   case 0x6e:
283     return DRC_ZEROOPERANDS;
284   case 0x6f:
285     return DRC_ZEROOPERANDS;
286   case 0x70:
287     return DRC_ONEOPERAND;
288   case 0x71:
289     return DRC_ONEOPERAND;
290   case 0x72:
291     return DRC_ONEOPERAND;
292   case 0x73:
293     return DRC_ONEOPERAND;
294   case 0x74:
295     return DRC_ONEOPERAND;
296   case 0x75:
297     return DRC_ONEOPERAND;
298   case 0x76:
299     return DRC_ONEOPERAND;
300   case 0x77:
301     return DRC_ONEOPERAND;
302   case 0x78:
303     return DRC_ONEOPERAND;
304   case 0x79:
305     return DRC_ONEOPERAND;
306   case 0x7a:
307     return DRC_ONEOPERAND;
308   case 0x7b:
309     return DRC_ONEOPERAND;
310   case 0x7c:
311     return DRC_ONEOPERAND;
312   case 0x7d:
313     return DRC_ONEOPERAND;
314   case 0x7e:
315     return DRC_ONEOPERAND;
316   case 0x7f:
317     return DRC_ONEOPERAND;
318   case 0x80:
319     return DRC_ONEOPERAND;
320   case 0x81:
321     return DRC_ONEOPERAND;
322   case 0x82:
323     return DRC_ONEOPERAND;
324   case 0x83:
325     return DRC_ONEOPERAND;
326   case 0x84:
327     return DRC_ONEOPERAND;
328   case 0x85:
329     return DRC_ONEOPERAND;
330   case 0x86:
331     return DRC_ONEOPERAND;
332   case 0x87:
333     return DRC_ONEOPERAND;
334   case 0x88:
335     return DRC_ONEOPERAND;
336   case 0x89:
337     return DRC_ONEOPERAND;
338   case 0x8a:
339     return DRC_ONEOPERAND;
340   case 0x8b:
341     return DRC_ONEOPERAND;
342   case 0x8c:
343     return DRC_ONEOPERAND;
344   case 0x8d:
345     return DRC_ONEOPERAND;
346   case 0x8e:
347     return DRC_ONEOPERAND;
348   case 0x8f:
349     return DRC_ONEOPERAND;
350   case 0x90:
351     return DRC_ONEOPERAND;
352   case 0x91:
353     return DRC_ONEOPERAND;
354   case 0x92:
355     return DRC_TWOOPERANDS;
356   case 0x93:
357     return DRC_ONEOPERAND;
358   case 0x94:
359     return DRC_ONEOPERAND;
360   case 0x95:
361     return DRC_ONEOPERAND;
362   case 0x96:
363     return DRC_ZEROOPERANDS;
364   case 0x97:
365     return DRC_DWARFv3 | DRC_ZEROOPERANDS;
366   case 0x98:
367     return DRC_DWARFv3 | DRC_ONEOPERAND;
368   case 0x99:
369     return DRC_DWARFv3 | DRC_ONEOPERAND;
370   case 0x9a:
371     return DRC_DWARFv3 | DRC_ONEOPERAND;
372   case 0xf0:
373     return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */
374   case 0xe0:
375     return 0;
376   case 0xff:
377     return 0;
378   default:
379     return 0;
380   }
381 }
382 
383 const char *DW_ATE_value_to_name(uint32_t val) {
384   static char invalid[100];
385   llvm::StringRef llvmstr = llvm::dwarf::AttributeEncodingString(val);
386   if (llvmstr.empty()) {
387     snprintf(invalid, sizeof(invalid), "Unknown DW_ATE constant: 0x%x", val);
388     return invalid;
389   }
390   return llvmstr.data();
391 }
392 
393 const char *DW_ACCESS_value_to_name(uint32_t val) {
394   static char invalid[100];
395 
396   llvm::StringRef llvmstr = llvm::dwarf::AccessibilityString(val);
397   if (llvmstr.empty()) {
398     snprintf(invalid, sizeof(invalid), "Unknown DW_ACCESS constant: 0x%x", val);
399     return invalid;
400   }
401   return llvmstr.data();
402 }
403 
404 const char *DW_VIS_value_to_name(uint32_t val) {
405   static char invalid[100];
406   llvm::StringRef llvmstr = llvm::dwarf::VisibilityString(val);
407   if (llvmstr.empty()) {
408     snprintf(invalid, sizeof(invalid), "Unknown DW_VIS constant: 0x%x", val);
409     return invalid;
410   }
411   return llvmstr.data();
412 }
413 
414 const char *DW_VIRTUALITY_value_to_name(uint32_t val) {
415   static char invalid[100];
416   llvm::StringRef llvmstr = llvm::dwarf::VirtualityString(val);
417   if (llvmstr.empty()) {
418     snprintf(invalid, sizeof(invalid), "Unknown DW_VIRTUALITY constant: 0x%x",
419              val);
420     return invalid;
421   }
422   return llvmstr.data();
423 }
424 
425 const char *DW_LANG_value_to_name(uint32_t val) {
426   static char invalid[100];
427   llvm::StringRef llvmstr = llvm::dwarf::LanguageString(val);
428   if (llvmstr.empty()) {
429     snprintf(invalid, sizeof(invalid), "Unknown DW_LANG constant: 0x%x", val);
430     return invalid;
431   }
432   return llvmstr.data();
433 }
434 
435 const char *DW_ID_value_to_name(uint32_t val) {
436   static char invalid[100];
437   llvm::StringRef llvmstr = llvm::dwarf::CaseString(val);
438   if (llvmstr.empty()) {
439     snprintf(invalid, sizeof(invalid), "Unknown DW_ID constant: 0x%x", val);
440     return invalid;
441   }
442   return llvmstr.data();
443 }
444 
445 const char *DW_CC_value_to_name(uint32_t val) {
446   static char invalid[100];
447   llvm::StringRef llvmstr = llvm::dwarf::ConventionString(val);
448   if (llvmstr.empty()) {
449     snprintf(invalid, sizeof(invalid), "Unknown DW_CC constant: 0x%x", val);
450     return invalid;
451   }
452   return llvmstr.data();
453 }
454 
455 const char *DW_INL_value_to_name(uint32_t val) {
456   static char invalid[100];
457   llvm::StringRef llvmstr = llvm::dwarf::InlineCodeString(val);
458   if (llvmstr.empty()) {
459     snprintf(invalid, sizeof(invalid), "Unknown DW_INL constant: 0x%x", val);
460     return invalid;
461   }
462   return llvmstr.data();
463 }
464 
465 const char *DW_ORD_value_to_name(uint32_t val) {
466   static char invalid[100];
467   llvm::StringRef llvmstr = llvm::dwarf::ArrayOrderString(val);
468   if (llvmstr.empty()) {
469     snprintf(invalid, sizeof(invalid), "Unknown DW_ORD constant: 0x%x", val);
470     return invalid;
471   }
472   return llvmstr.data();
473 }
474 
475 const char *DW_LNS_value_to_name(uint32_t val) {
476   static char invalid[100];
477   llvm::StringRef llvmstr = llvm::dwarf::LNStandardString(val);
478   if (llvmstr.empty()) {
479     snprintf(invalid, sizeof(invalid), "Unknown DW_LNS constant: 0x%x", val);
480     return invalid;
481   }
482   return llvmstr.data();
483 }
484 
485 const char *DW_LNE_value_to_name(uint32_t val) {
486   static char invalid[100];
487   llvm::StringRef llvmstr = llvm::dwarf::LNExtendedString(val);
488   if (llvmstr.empty()) {
489     snprintf(invalid, sizeof(invalid), "Unknown DW_LNE constant: 0x%x", val);
490     return invalid;
491   }
492   return llvmstr.data();
493 }
494 
495 const char *DW_MACINFO_value_to_name(uint32_t val) {
496   static char invalid[100];
497   llvm::StringRef llvmstr = llvm::dwarf::MacinfoString(val);
498   if (llvmstr.empty()) {
499     snprintf(invalid, sizeof(invalid), "Unknown DW_MACINFO constant: 0x%x",
500              val);
501     return invalid;
502   }
503   return llvmstr.data();
504 }
505 
506 const char *DW_CFA_value_to_name(uint32_t val, llvm::Triple::ArchType Arch) {
507   static char invalid[100];
508   llvm::StringRef llvmstr = llvm::dwarf::CallFrameString(val, Arch);
509   if (llvmstr.empty()) {
510     snprintf(invalid, sizeof(invalid), "Unknown DW_CFA constant: 0x%x", val);
511     return invalid;
512   }
513   return llvmstr.data();
514 }
515 
516 DW_TAG_CategoryEnum get_tag_category(uint16_t tag) {
517   switch (tag) {
518   case DW_TAG_array_type:
519     return TagCategoryType;
520   case DW_TAG_class_type:
521     return TagCategoryType;
522   case DW_TAG_entry_point:
523     return TagCategoryProgram;
524   case DW_TAG_enumeration_type:
525     return TagCategoryType;
526   case DW_TAG_formal_parameter:
527     return TagCategoryVariable;
528   case DW_TAG_imported_declaration:
529     return TagCategoryProgram;
530   case DW_TAG_label:
531     return TagCategoryProgram;
532   case DW_TAG_lexical_block:
533     return TagCategoryProgram;
534   case DW_TAG_member:
535     return TagCategoryType;
536   case DW_TAG_pointer_type:
537     return TagCategoryType;
538   case DW_TAG_reference_type:
539     return TagCategoryType;
540   case DW_TAG_compile_unit:
541     return TagCategoryProgram;
542   case DW_TAG_string_type:
543     return TagCategoryType;
544   case DW_TAG_structure_type:
545     return TagCategoryType;
546   case DW_TAG_subroutine_type:
547     return TagCategoryType;
548   case DW_TAG_typedef:
549     return TagCategoryType;
550   case DW_TAG_union_type:
551     return TagCategoryType;
552   case DW_TAG_unspecified_parameters:
553     return TagCategoryVariable;
554   case DW_TAG_variant:
555     return TagCategoryType;
556   case DW_TAG_common_block:
557     return TagCategoryProgram;
558   case DW_TAG_common_inclusion:
559     return TagCategoryProgram;
560   case DW_TAG_inheritance:
561     return TagCategoryType;
562   case DW_TAG_inlined_subroutine:
563     return TagCategoryProgram;
564   case DW_TAG_module:
565     return TagCategoryProgram;
566   case DW_TAG_ptr_to_member_type:
567     return TagCategoryType;
568   case DW_TAG_set_type:
569     return TagCategoryType;
570   case DW_TAG_subrange_type:
571     return TagCategoryType;
572   case DW_TAG_with_stmt:
573     return TagCategoryProgram;
574   case DW_TAG_access_declaration:
575     return TagCategoryProgram;
576   case DW_TAG_base_type:
577     return TagCategoryType;
578   case DW_TAG_catch_block:
579     return TagCategoryProgram;
580   case DW_TAG_const_type:
581     return TagCategoryType;
582   case DW_TAG_constant:
583     return TagCategoryVariable;
584   case DW_TAG_enumerator:
585     return TagCategoryType;
586   case DW_TAG_file_type:
587     return TagCategoryType;
588   case DW_TAG_friend:
589     return TagCategoryType;
590   case DW_TAG_namelist:
591     return TagCategoryVariable;
592   case DW_TAG_namelist_item:
593     return TagCategoryVariable;
594   case DW_TAG_packed_type:
595     return TagCategoryType;
596   case DW_TAG_subprogram:
597     return TagCategoryProgram;
598   case DW_TAG_template_type_parameter:
599     return TagCategoryType;
600   case DW_TAG_template_value_parameter:
601     return TagCategoryType;
602   case DW_TAG_GNU_template_parameter_pack:
603     return TagCategoryType;
604   case DW_TAG_thrown_type:
605     return TagCategoryType;
606   case DW_TAG_try_block:
607     return TagCategoryProgram;
608   case DW_TAG_variant_part:
609     return TagCategoryType;
610   case DW_TAG_variable:
611     return TagCategoryVariable;
612   case DW_TAG_volatile_type:
613     return TagCategoryType;
614   case DW_TAG_dwarf_procedure:
615     return TagCategoryProgram;
616   case DW_TAG_restrict_type:
617     return TagCategoryType;
618   case DW_TAG_interface_type:
619     return TagCategoryType;
620   case DW_TAG_namespace:
621     return TagCategoryProgram;
622   case DW_TAG_imported_module:
623     return TagCategoryProgram;
624   case DW_TAG_unspecified_type:
625     return TagCategoryType;
626   case DW_TAG_partial_unit:
627     return TagCategoryProgram;
628   case DW_TAG_imported_unit:
629     return TagCategoryProgram;
630   case DW_TAG_shared_type:
631     return TagCategoryType;
632   default:
633     break;
634   }
635   return TagCategoryProgram;
636 }
637 
638 } // namespace lldb_private
639