]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Support/Dwarf.cpp
MFV 316905
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Support / Dwarf.cpp
1 //===-- llvm/Support/Dwarf.cpp - Dwarf Framework ----------------*- 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 // This file contains support for generic dwarf information.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/Support/Dwarf.h"
15 #include "llvm/ADT/StringSwitch.h"
16 #include "llvm/Support/ErrorHandling.h"
17
18 using namespace llvm;
19 using namespace dwarf;
20
21 StringRef llvm::dwarf::TagString(unsigned Tag) {
22   switch (Tag) {
23   default:
24     return StringRef();
25 #define HANDLE_DW_TAG(ID, NAME)                                                \
26   case DW_TAG_##NAME:                                                          \
27     return "DW_TAG_" #NAME;
28 #include "llvm/Support/Dwarf.def"
29   }
30 }
31
32 unsigned llvm::dwarf::getTag(StringRef TagString) {
33   return StringSwitch<unsigned>(TagString)
34 #define HANDLE_DW_TAG(ID, NAME) .Case("DW_TAG_" #NAME, DW_TAG_##NAME)
35 #include "llvm/Support/Dwarf.def"
36       .Default(DW_TAG_invalid);
37 }
38
39 StringRef llvm::dwarf::ChildrenString(unsigned Children) {
40   switch (Children) {
41   case DW_CHILDREN_no:                   return "DW_CHILDREN_no";
42   case DW_CHILDREN_yes:                  return "DW_CHILDREN_yes";
43   }
44   return StringRef();
45 }
46
47 StringRef llvm::dwarf::AttributeString(unsigned Attribute) {
48   switch (Attribute) {
49   default:
50     return StringRef();
51 #define HANDLE_DW_AT(ID, NAME)                                                \
52   case DW_AT_##NAME:                                                          \
53     return "DW_AT_" #NAME;
54 #include "llvm/Support/Dwarf.def"
55   }
56 }
57
58 StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) {
59   switch (Encoding) {
60   default:
61     return StringRef();
62 #define HANDLE_DW_FORM(ID, NAME)                                                \
63   case DW_FORM_##NAME:                                                          \
64     return "DW_FORM_" #NAME;
65 #include "llvm/Support/Dwarf.def"
66   }
67 }
68
69 StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) {
70   switch (Encoding) {
71   default:
72     return StringRef();
73 #define HANDLE_DW_OP(ID, NAME)                                                 \
74   case DW_OP_##NAME:                                                           \
75     return "DW_OP_" #NAME;
76 #include "llvm/Support/Dwarf.def"
77   case DW_OP_LLVM_fragment:
78     return "DW_OP_LLVM_fragment";
79   }
80 }
81
82 unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) {
83   return StringSwitch<unsigned>(OperationEncodingString)
84 #define HANDLE_DW_OP(ID, NAME) .Case("DW_OP_" #NAME, DW_OP_##NAME)
85 #include "llvm/Support/Dwarf.def"
86       .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment)
87       .Default(0);
88 }
89
90 StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) {
91   switch (Encoding) {
92   default:
93     return StringRef();
94 #define HANDLE_DW_ATE(ID, NAME)                                                \
95   case DW_ATE_##NAME:                                                          \
96     return "DW_ATE_" #NAME;
97 #include "llvm/Support/Dwarf.def"
98   }
99 }
100
101 unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) {
102   return StringSwitch<unsigned>(EncodingString)
103 #define HANDLE_DW_ATE(ID, NAME) .Case("DW_ATE_" #NAME, DW_ATE_##NAME)
104 #include "llvm/Support/Dwarf.def"
105       .Default(0);
106 }
107
108 StringRef llvm::dwarf::DecimalSignString(unsigned Sign) {
109   switch (Sign) {
110   case DW_DS_unsigned:                   return "DW_DS_unsigned";
111   case DW_DS_leading_overpunch:          return "DW_DS_leading_overpunch";
112   case DW_DS_trailing_overpunch:         return "DW_DS_trailing_overpunch";
113   case DW_DS_leading_separate:           return "DW_DS_leading_separate";
114   case DW_DS_trailing_separate:          return "DW_DS_trailing_separate";
115   }
116   return StringRef();
117 }
118
119 StringRef llvm::dwarf::EndianityString(unsigned Endian) {
120   switch (Endian) {
121   case DW_END_default:                   return "DW_END_default";
122   case DW_END_big:                       return "DW_END_big";
123   case DW_END_little:                    return "DW_END_little";
124   case DW_END_lo_user:                   return "DW_END_lo_user";
125   case DW_END_hi_user:                   return "DW_END_hi_user";
126   }
127   return StringRef();
128 }
129
130 StringRef llvm::dwarf::AccessibilityString(unsigned Access) {
131   switch (Access) {
132   // Accessibility codes
133   case DW_ACCESS_public:                 return "DW_ACCESS_public";
134   case DW_ACCESS_protected:              return "DW_ACCESS_protected";
135   case DW_ACCESS_private:                return "DW_ACCESS_private";
136   }
137   return StringRef();
138 }
139
140 StringRef llvm::dwarf::VisibilityString(unsigned Visibility) {
141   switch (Visibility) {
142   case DW_VIS_local:                     return "DW_VIS_local";
143   case DW_VIS_exported:                  return "DW_VIS_exported";
144   case DW_VIS_qualified:                 return "DW_VIS_qualified";
145   }
146   return StringRef();
147 }
148
149 StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) {
150   switch (Virtuality) {
151   default:
152     return StringRef();
153 #define HANDLE_DW_VIRTUALITY(ID, NAME)                                         \
154   case DW_VIRTUALITY_##NAME:                                                   \
155     return "DW_VIRTUALITY_" #NAME;
156 #include "llvm/Support/Dwarf.def"
157   }
158 }
159
160 unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) {
161   return StringSwitch<unsigned>(VirtualityString)
162 #define HANDLE_DW_VIRTUALITY(ID, NAME)                                         \
163   .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME)
164 #include "llvm/Support/Dwarf.def"
165       .Default(DW_VIRTUALITY_invalid);
166 }
167
168 StringRef llvm::dwarf::LanguageString(unsigned Language) {
169   switch (Language) {
170   default:
171     return StringRef();
172 #define HANDLE_DW_LANG(ID, NAME)                                               \
173   case DW_LANG_##NAME:                                                         \
174     return "DW_LANG_" #NAME;
175 #include "llvm/Support/Dwarf.def"
176   }
177 }
178
179 unsigned llvm::dwarf::getLanguage(StringRef LanguageString) {
180   return StringSwitch<unsigned>(LanguageString)
181 #define HANDLE_DW_LANG(ID, NAME) .Case("DW_LANG_" #NAME, DW_LANG_##NAME)
182 #include "llvm/Support/Dwarf.def"
183       .Default(0);
184 }
185
186 StringRef llvm::dwarf::CaseString(unsigned Case) {
187   switch (Case) {
188   case DW_ID_case_sensitive:             return "DW_ID_case_sensitive";
189   case DW_ID_up_case:                    return "DW_ID_up_case";
190   case DW_ID_down_case:                  return "DW_ID_down_case";
191   case DW_ID_case_insensitive:           return "DW_ID_case_insensitive";
192   }
193   return StringRef();
194 }
195
196 StringRef llvm::dwarf::ConventionString(unsigned CC) {
197   switch (CC) {
198   default:
199     return StringRef();
200 #define HANDLE_DW_CC(ID, NAME)                                               \
201   case DW_CC_##NAME:                                                         \
202     return "DW_CC_" #NAME;
203 #include "llvm/Support/Dwarf.def"
204   }
205 }
206
207 unsigned llvm::dwarf::getCallingConvention(StringRef CCString) {
208   return StringSwitch<unsigned>(CCString)
209 #define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME)
210 #include "llvm/Support/Dwarf.def"
211       .Default(0);
212 }
213
214 StringRef llvm::dwarf::InlineCodeString(unsigned Code) {
215   switch (Code) {
216   case DW_INL_not_inlined:               return "DW_INL_not_inlined";
217   case DW_INL_inlined:                   return "DW_INL_inlined";
218   case DW_INL_declared_not_inlined:      return "DW_INL_declared_not_inlined";
219   case DW_INL_declared_inlined:          return "DW_INL_declared_inlined";
220   }
221   return StringRef();
222 }
223
224 StringRef llvm::dwarf::ArrayOrderString(unsigned Order) {
225   switch (Order) {
226   case DW_ORD_row_major:                 return "DW_ORD_row_major";
227   case DW_ORD_col_major:                 return "DW_ORD_col_major";
228   }
229   return StringRef();
230 }
231
232 StringRef llvm::dwarf::DiscriminantString(unsigned Discriminant) {
233   switch (Discriminant) {
234   case DW_DSC_label:                     return "DW_DSC_label";
235   case DW_DSC_range:                     return "DW_DSC_range";
236   }
237   return StringRef();
238 }
239
240 StringRef llvm::dwarf::LNStandardString(unsigned Standard) {
241   switch (Standard) {
242   default:
243     return StringRef();
244 #define HANDLE_DW_LNS(ID, NAME)                                               \
245   case DW_LNS_##NAME:                                                         \
246     return "DW_LNS_" #NAME;
247 #include "llvm/Support/Dwarf.def"
248   }
249 }
250
251 StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) {
252   switch (Encoding) {
253   default:
254     return StringRef();
255 #define HANDLE_DW_LNE(ID, NAME)                                               \
256   case DW_LNE_##NAME:                                                         \
257     return "DW_LNE_" #NAME;
258 #include "llvm/Support/Dwarf.def"
259   }
260 }
261
262 StringRef llvm::dwarf::MacinfoString(unsigned Encoding) {
263   switch (Encoding) {
264   // Macinfo Type Encodings
265   case DW_MACINFO_define:                return "DW_MACINFO_define";
266   case DW_MACINFO_undef:                 return "DW_MACINFO_undef";
267   case DW_MACINFO_start_file:            return "DW_MACINFO_start_file";
268   case DW_MACINFO_end_file:              return "DW_MACINFO_end_file";
269   case DW_MACINFO_vendor_ext:            return "DW_MACINFO_vendor_ext";
270   case DW_MACINFO_invalid:               return "DW_MACINFO_invalid";
271   }
272   return StringRef();
273 }
274
275 unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) {
276   return StringSwitch<unsigned>(MacinfoString)
277       .Case("DW_MACINFO_define", DW_MACINFO_define)
278       .Case("DW_MACINFO_undef", DW_MACINFO_undef)
279       .Case("DW_MACINFO_start_file", DW_MACINFO_start_file)
280       .Case("DW_MACINFO_end_file", DW_MACINFO_end_file)
281       .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext)
282       .Default(DW_MACINFO_invalid);
283 }
284
285 StringRef llvm::dwarf::CallFrameString(unsigned Encoding) {
286   switch (Encoding) {
287   default:
288     return StringRef();
289 #define HANDLE_DW_CFA(ID, NAME)                                               \
290   case DW_CFA_##NAME:                                                         \
291     return "DW_CFA_" #NAME;
292 #include "llvm/Support/Dwarf.def"
293   }
294 }
295
296 StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) {
297   switch (Prop) {
298   default:
299     return StringRef();
300 #define HANDLE_DW_APPLE_PROPERTY(ID, NAME)                                               \
301   case DW_APPLE_PROPERTY_##NAME:                                                         \
302     return "DW_APPLE_PROPERTY_" #NAME;
303 #include "llvm/Support/Dwarf.def"
304   }
305 }
306
307 StringRef llvm::dwarf::AtomTypeString(unsigned AT) {
308   switch (AT) {
309   case dwarf::DW_ATOM_null:
310     return "DW_ATOM_null";
311   case dwarf::DW_ATOM_die_offset:
312     return "DW_ATOM_die_offset";
313   case DW_ATOM_cu_offset:
314     return "DW_ATOM_cu_offset";
315   case DW_ATOM_die_tag:
316     return "DW_ATOM_die_tag";
317   case DW_ATOM_type_flags:
318     return "DW_ATOM_type_flags";
319   }
320   return StringRef();
321 }
322
323 StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) {
324   switch (Kind) {
325   case GIEK_NONE:
326     return "NONE";
327   case GIEK_TYPE:
328     return "TYPE";
329   case GIEK_VARIABLE:
330     return "VARIABLE";
331   case GIEK_FUNCTION:
332     return "FUNCTION";
333   case GIEK_OTHER:
334     return "OTHER";
335   case GIEK_UNUSED5:
336     return "UNUSED5";
337   case GIEK_UNUSED6:
338     return "UNUSED6";
339   case GIEK_UNUSED7:
340     return "UNUSED7";
341   }
342   llvm_unreachable("Unknown GDBIndexEntryKind value");
343 }
344
345 StringRef
346 llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) {
347   switch (Linkage) {
348   case GIEL_EXTERNAL:
349     return "EXTERNAL";
350   case GIEL_STATIC:
351     return "STATIC";
352   }
353   llvm_unreachable("Unknown GDBIndexEntryLinkage value");
354 }
355
356 StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {
357   switch (Attr) {
358   case DW_AT_accessibility:
359     return AccessibilityString(Val);
360   case DW_AT_virtuality:
361     return VirtualityString(Val);
362   case DW_AT_language:
363     return LanguageString(Val);
364   case DW_AT_encoding:
365     return AttributeEncodingString(Val);
366   case DW_AT_decimal_sign:
367     return DecimalSignString(Val);
368   case DW_AT_endianity:
369     return EndianityString(Val);
370   case DW_AT_visibility:
371     return VisibilityString(Val);
372   case DW_AT_identifier_case:
373     return CaseString(Val);
374   case DW_AT_calling_convention:
375     return ConventionString(Val);
376   case DW_AT_inline:
377     return InlineCodeString(Val);
378   case DW_AT_ordering:
379     return ArrayOrderString(Val);
380   case DW_AT_discr_value:
381     return DiscriminantString(Val);
382   }
383
384   return StringRef();
385 }