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