/src/llvm-project/llvm/lib/BinaryFormat/Dwarf.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- llvm/BinaryFormat/Dwarf.cpp - Dwarf Framework ------------*- 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 | | // This file contains support for generic dwarf information. |
10 | | // |
11 | | //===----------------------------------------------------------------------===// |
12 | | |
13 | | #include "llvm/BinaryFormat/Dwarf.h" |
14 | | #include "llvm/ADT/StringSwitch.h" |
15 | | #include "llvm/Support/ErrorHandling.h" |
16 | | #include "llvm/TargetParser/Triple.h" |
17 | | |
18 | | using namespace llvm; |
19 | | using namespace dwarf; |
20 | | |
21 | 3.89k | StringRef llvm::dwarf::TagString(unsigned Tag) { |
22 | 3.89k | switch (Tag) { |
23 | 5 | default: |
24 | 5 | return StringRef(); |
25 | 0 | #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ |
26 | 3.88k | case DW_TAG_##NAME: \ |
27 | 3.88k | return "DW_TAG_" #NAME; |
28 | 3.89k | #include "llvm/BinaryFormat/Dwarf.def" |
29 | 3.89k | } |
30 | 3.89k | } |
31 | | |
32 | 0 | unsigned llvm::dwarf::getTag(StringRef TagString) { |
33 | 0 | return StringSwitch<unsigned>(TagString) |
34 | 0 | #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ |
35 | 0 | .Case("DW_TAG_" #NAME, DW_TAG_##NAME) |
36 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
37 | 0 | .Default(DW_TAG_invalid); |
38 | 0 | } |
39 | | |
40 | 0 | unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) { |
41 | 0 | switch (Tag) { |
42 | 0 | default: |
43 | 0 | return 0; |
44 | 0 | #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ |
45 | 0 | case DW_TAG_##NAME: \ |
46 | 0 | return VERSION; |
47 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
48 | 0 | } |
49 | 0 | } |
50 | | |
51 | 0 | unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) { |
52 | 0 | switch (Tag) { |
53 | 0 | default: |
54 | 0 | return 0; |
55 | 0 | #define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \ |
56 | 0 | case DW_TAG_##NAME: \ |
57 | 0 | return DWARF_VENDOR_##VENDOR; |
58 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
59 | 0 | } |
60 | 0 | } |
61 | | |
62 | 3.69k | StringRef llvm::dwarf::ChildrenString(unsigned Children) { |
63 | 3.69k | switch (Children) { |
64 | 2.22k | case DW_CHILDREN_no: |
65 | 2.22k | return "DW_CHILDREN_no"; |
66 | 1.46k | case DW_CHILDREN_yes: |
67 | 1.46k | return "DW_CHILDREN_yes"; |
68 | 3.69k | } |
69 | 0 | return StringRef(); |
70 | 3.69k | } |
71 | | |
72 | 20.0k | StringRef llvm::dwarf::AttributeString(unsigned Attribute) { |
73 | 20.0k | switch (Attribute) { |
74 | 0 | default: |
75 | 0 | return StringRef(); |
76 | 0 | #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ |
77 | 20.0k | case DW_AT_##NAME: \ |
78 | 20.0k | return "DW_AT_" #NAME; |
79 | 20.0k | #include "llvm/BinaryFormat/Dwarf.def" |
80 | 20.0k | } |
81 | 20.0k | } |
82 | | |
83 | 0 | unsigned llvm::dwarf::AttributeVersion(dwarf::Attribute Attribute) { |
84 | 0 | switch (Attribute) { |
85 | 0 | default: |
86 | 0 | return 0; |
87 | 0 | #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ |
88 | 0 | case DW_AT_##NAME: \ |
89 | 0 | return VERSION; |
90 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
91 | 0 | } |
92 | 0 | } |
93 | | |
94 | 0 | unsigned llvm::dwarf::AttributeVendor(dwarf::Attribute Attribute) { |
95 | 0 | switch (Attribute) { |
96 | 0 | default: |
97 | 0 | return 0; |
98 | 0 | #define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \ |
99 | 0 | case DW_AT_##NAME: \ |
100 | 0 | return DWARF_VENDOR_##VENDOR; |
101 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
102 | 0 | } |
103 | 0 | } |
104 | | |
105 | 20.0k | StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) { |
106 | 20.0k | switch (Encoding) { |
107 | 1 | default: |
108 | 1 | return StringRef(); |
109 | 0 | #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ |
110 | 20.0k | case DW_FORM_##NAME: \ |
111 | 20.0k | return "DW_FORM_" #NAME; |
112 | 20.0k | #include "llvm/BinaryFormat/Dwarf.def" |
113 | 20.0k | } |
114 | 20.0k | } |
115 | | |
116 | 19.8k | unsigned llvm::dwarf::FormVersion(dwarf::Form Form) { |
117 | 19.8k | switch (Form) { |
118 | 0 | default: |
119 | 0 | return 0; |
120 | 0 | #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ |
121 | 19.8k | case DW_FORM_##NAME: \ |
122 | 19.8k | return VERSION; |
123 | 19.8k | #include "llvm/BinaryFormat/Dwarf.def" |
124 | 19.8k | } |
125 | 19.8k | } |
126 | | |
127 | 19.8k | unsigned llvm::dwarf::FormVendor(dwarf::Form Form) { |
128 | 19.8k | switch (Form) { |
129 | 0 | default: |
130 | 0 | return 0; |
131 | 0 | #define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \ |
132 | 19.8k | case DW_FORM_##NAME: \ |
133 | 19.8k | return DWARF_VENDOR_##VENDOR; |
134 | 19.8k | #include "llvm/BinaryFormat/Dwarf.def" |
135 | 19.8k | } |
136 | 19.8k | } |
137 | | |
138 | 2.74k | StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) { |
139 | 2.74k | switch (Encoding) { |
140 | 0 | default: |
141 | 0 | return StringRef(); |
142 | 0 | #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ |
143 | 2.67k | case DW_OP_##NAME: \ |
144 | 2.67k | return "DW_OP_" #NAME; |
145 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
146 | 20 | case DW_OP_LLVM_convert: |
147 | 20 | return "DW_OP_LLVM_convert"; |
148 | 0 | case DW_OP_LLVM_fragment: |
149 | 0 | return "DW_OP_LLVM_fragment"; |
150 | 0 | case DW_OP_LLVM_tag_offset: |
151 | 0 | return "DW_OP_LLVM_tag_offset"; |
152 | 0 | case DW_OP_LLVM_entry_value: |
153 | 0 | return "DW_OP_LLVM_entry_value"; |
154 | 0 | case DW_OP_LLVM_implicit_pointer: |
155 | 0 | return "DW_OP_LLVM_implicit_pointer"; |
156 | 52 | case DW_OP_LLVM_arg: |
157 | 52 | return "DW_OP_LLVM_arg"; |
158 | 2.74k | } |
159 | 2.74k | } |
160 | | |
161 | 289 | unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) { |
162 | 289 | return StringSwitch<unsigned>(OperationEncodingString) |
163 | 289 | #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ |
164 | 52.0k | .Case("DW_OP_" #NAME, DW_OP_##NAME) |
165 | 289 | #include "llvm/BinaryFormat/Dwarf.def" |
166 | 289 | .Case("DW_OP_LLVM_convert", DW_OP_LLVM_convert) |
167 | 289 | .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment) |
168 | 289 | .Case("DW_OP_LLVM_tag_offset", DW_OP_LLVM_tag_offset) |
169 | 289 | .Case("DW_OP_LLVM_entry_value", DW_OP_LLVM_entry_value) |
170 | 289 | .Case("DW_OP_LLVM_implicit_pointer", DW_OP_LLVM_implicit_pointer) |
171 | 289 | .Case("DW_OP_LLVM_arg", DW_OP_LLVM_arg) |
172 | 289 | .Default(0); |
173 | 289 | } |
174 | | |
175 | 0 | static StringRef LlvmUserOperationEncodingString(unsigned Encoding) { |
176 | 0 | switch (Encoding) { |
177 | 0 | default: |
178 | 0 | llvm_unreachable("unhandled DWARF operation with LLVM user op"); |
179 | 0 | #define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) \ |
180 | 0 | case DW_OP_LLVM_##NAME: \ |
181 | 0 | return "DW_OP_LLVM_" #NAME; |
182 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
183 | 0 | } |
184 | 0 | } |
185 | | |
186 | | static unsigned |
187 | 0 | getLlvmUserOperationEncoding(StringRef LlvmUserOperationEncodingString) { |
188 | 0 | unsigned E = StringSwitch<unsigned>(LlvmUserOperationEncodingString) |
189 | 0 | #define HANDLE_DW_OP_LLVM_USEROP(ID, NAME) .Case(#NAME, DW_OP_LLVM_##NAME) |
190 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
191 | 0 | .Default(0); |
192 | 0 | assert(E && "unhandled DWARF operation string with LLVM user op"); |
193 | 0 | return E; |
194 | 0 | } |
195 | | |
196 | | StringRef llvm::dwarf::SubOperationEncodingString(unsigned OpEncoding, |
197 | 0 | unsigned SubOpEncoding) { |
198 | 0 | assert(OpEncoding == DW_OP_LLVM_user); |
199 | 0 | return LlvmUserOperationEncodingString(SubOpEncoding); |
200 | 0 | } |
201 | | |
202 | | unsigned |
203 | | llvm::dwarf::getSubOperationEncoding(unsigned OpEncoding, |
204 | 0 | StringRef SubOperationEncodingString) { |
205 | 0 | assert(OpEncoding == DW_OP_LLVM_user); |
206 | 0 | return getLlvmUserOperationEncoding(SubOperationEncodingString); |
207 | 0 | } |
208 | | |
209 | 0 | unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) { |
210 | 0 | switch (Op) { |
211 | 0 | default: |
212 | 0 | return 0; |
213 | 0 | #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ |
214 | 0 | case DW_OP_##NAME: \ |
215 | 0 | return VERSION; |
216 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
217 | 0 | } |
218 | 0 | } |
219 | | |
220 | 0 | unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) { |
221 | 0 | switch (Op) { |
222 | 0 | default: |
223 | 0 | return 0; |
224 | 0 | #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \ |
225 | 0 | case DW_OP_##NAME: \ |
226 | 0 | return DWARF_VENDOR_##VENDOR; |
227 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
228 | 0 | } |
229 | 0 | } |
230 | | |
231 | 82 | StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) { |
232 | 82 | switch (Encoding) { |
233 | 0 | default: |
234 | 0 | return StringRef(); |
235 | 0 | #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ |
236 | 82 | case DW_ATE_##NAME: \ |
237 | 82 | return "DW_ATE_" #NAME; |
238 | 82 | #include "llvm/BinaryFormat/Dwarf.def" |
239 | 82 | } |
240 | 82 | } |
241 | | |
242 | 36 | unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) { |
243 | 36 | return StringSwitch<unsigned>(EncodingString) |
244 | 36 | #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ |
245 | 864 | .Case("DW_ATE_" #NAME, DW_ATE_##NAME) |
246 | 36 | #include "llvm/BinaryFormat/Dwarf.def" |
247 | 36 | .Default(0); |
248 | 36 | } |
249 | | |
250 | 0 | unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) { |
251 | 0 | switch (ATE) { |
252 | 0 | default: |
253 | 0 | return 0; |
254 | 0 | #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ |
255 | 0 | case DW_ATE_##NAME: \ |
256 | 0 | return VERSION; |
257 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
258 | 0 | } |
259 | 0 | } |
260 | | |
261 | 0 | unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) { |
262 | 0 | switch (ATE) { |
263 | 0 | default: |
264 | 0 | return 0; |
265 | 0 | #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \ |
266 | 0 | case DW_ATE_##NAME: \ |
267 | 0 | return DWARF_VENDOR_##VENDOR; |
268 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
269 | 0 | } |
270 | 0 | } |
271 | | |
272 | 0 | StringRef llvm::dwarf::DecimalSignString(unsigned Sign) { |
273 | 0 | switch (Sign) { |
274 | 0 | case DW_DS_unsigned: |
275 | 0 | return "DW_DS_unsigned"; |
276 | 0 | case DW_DS_leading_overpunch: |
277 | 0 | return "DW_DS_leading_overpunch"; |
278 | 0 | case DW_DS_trailing_overpunch: |
279 | 0 | return "DW_DS_trailing_overpunch"; |
280 | 0 | case DW_DS_leading_separate: |
281 | 0 | return "DW_DS_leading_separate"; |
282 | 0 | case DW_DS_trailing_separate: |
283 | 0 | return "DW_DS_trailing_separate"; |
284 | 0 | } |
285 | 0 | return StringRef(); |
286 | 0 | } |
287 | | |
288 | 0 | StringRef llvm::dwarf::EndianityString(unsigned Endian) { |
289 | 0 | switch (Endian) { |
290 | 0 | case DW_END_default: |
291 | 0 | return "DW_END_default"; |
292 | 0 | case DW_END_big: |
293 | 0 | return "DW_END_big"; |
294 | 0 | case DW_END_little: |
295 | 0 | return "DW_END_little"; |
296 | 0 | case DW_END_lo_user: |
297 | 0 | return "DW_END_lo_user"; |
298 | 0 | case DW_END_hi_user: |
299 | 0 | return "DW_END_hi_user"; |
300 | 0 | } |
301 | 0 | return StringRef(); |
302 | 0 | } |
303 | | |
304 | 0 | StringRef llvm::dwarf::AccessibilityString(unsigned Access) { |
305 | 0 | switch (Access) { |
306 | | // Accessibility codes |
307 | 0 | case DW_ACCESS_public: |
308 | 0 | return "DW_ACCESS_public"; |
309 | 0 | case DW_ACCESS_protected: |
310 | 0 | return "DW_ACCESS_protected"; |
311 | 0 | case DW_ACCESS_private: |
312 | 0 | return "DW_ACCESS_private"; |
313 | 0 | } |
314 | 0 | return StringRef(); |
315 | 0 | } |
316 | | |
317 | 0 | StringRef llvm::dwarf::DefaultedMemberString(unsigned DefaultedEncodings) { |
318 | 0 | switch (DefaultedEncodings) { |
319 | | // Defaulted Member Encodings codes |
320 | 0 | case DW_DEFAULTED_no: |
321 | 0 | return "DW_DEFAULTED_no"; |
322 | 0 | case DW_DEFAULTED_in_class: |
323 | 0 | return "DW_DEFAULTED_in_class"; |
324 | 0 | case DW_DEFAULTED_out_of_class: |
325 | 0 | return "DW_DEFAULTED_out_of_class"; |
326 | 0 | } |
327 | 0 | return StringRef(); |
328 | 0 | } |
329 | | |
330 | 0 | StringRef llvm::dwarf::VisibilityString(unsigned Visibility) { |
331 | 0 | switch (Visibility) { |
332 | 0 | case DW_VIS_local: |
333 | 0 | return "DW_VIS_local"; |
334 | 0 | case DW_VIS_exported: |
335 | 0 | return "DW_VIS_exported"; |
336 | 0 | case DW_VIS_qualified: |
337 | 0 | return "DW_VIS_qualified"; |
338 | 0 | } |
339 | 0 | return StringRef(); |
340 | 0 | } |
341 | | |
342 | 0 | StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) { |
343 | 0 | switch (Virtuality) { |
344 | 0 | default: |
345 | 0 | return StringRef(); |
346 | 0 | #define HANDLE_DW_VIRTUALITY(ID, NAME) \ |
347 | 0 | case DW_VIRTUALITY_##NAME: \ |
348 | 0 | return "DW_VIRTUALITY_" #NAME; |
349 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
350 | 0 | } |
351 | 0 | } |
352 | | |
353 | 0 | unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) { |
354 | 0 | return StringSwitch<unsigned>(VirtualityString) |
355 | 0 | #define HANDLE_DW_VIRTUALITY(ID, NAME) \ |
356 | 0 | .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME) |
357 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
358 | 0 | .Default(DW_VIRTUALITY_invalid); |
359 | 0 | } |
360 | | |
361 | 208 | StringRef llvm::dwarf::LanguageString(unsigned Language) { |
362 | 208 | switch (Language) { |
363 | 0 | default: |
364 | 0 | return StringRef(); |
365 | 0 | #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ |
366 | 208 | case DW_LANG_##NAME: \ |
367 | 208 | return "DW_LANG_" #NAME; |
368 | 208 | #include "llvm/BinaryFormat/Dwarf.def" |
369 | 208 | } |
370 | 208 | } |
371 | | |
372 | 0 | unsigned llvm::dwarf::getLanguage(StringRef LanguageString) { |
373 | 0 | return StringSwitch<unsigned>(LanguageString) |
374 | 0 | #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ |
375 | 0 | .Case("DW_LANG_" #NAME, DW_LANG_##NAME) |
376 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
377 | 0 | .Default(0); |
378 | 0 | } |
379 | | |
380 | 0 | unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) { |
381 | 0 | switch (Lang) { |
382 | 0 | default: |
383 | 0 | return 0; |
384 | 0 | #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ |
385 | 0 | case DW_LANG_##NAME: \ |
386 | 0 | return VERSION; |
387 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
388 | 0 | } |
389 | 0 | } |
390 | | |
391 | 0 | unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) { |
392 | 0 | switch (Lang) { |
393 | 0 | default: |
394 | 0 | return 0; |
395 | 0 | #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ |
396 | 0 | case DW_LANG_##NAME: \ |
397 | 0 | return DWARF_VENDOR_##VENDOR; |
398 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
399 | 0 | } |
400 | 0 | } |
401 | | |
402 | | std::optional<unsigned> |
403 | 0 | llvm::dwarf::LanguageLowerBound(dwarf::SourceLanguage Lang) { |
404 | 0 | switch (Lang) { |
405 | 0 | default: |
406 | 0 | return std::nullopt; |
407 | 0 | #define HANDLE_DW_LANG(ID, NAME, LOWER_BOUND, VERSION, VENDOR) \ |
408 | 0 | case DW_LANG_##NAME: \ |
409 | 0 | return LOWER_BOUND; |
410 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
411 | 0 | } |
412 | 0 | } |
413 | | |
414 | 0 | StringRef llvm::dwarf::CaseString(unsigned Case) { |
415 | 0 | switch (Case) { |
416 | 0 | case DW_ID_case_sensitive: |
417 | 0 | return "DW_ID_case_sensitive"; |
418 | 0 | case DW_ID_up_case: |
419 | 0 | return "DW_ID_up_case"; |
420 | 0 | case DW_ID_down_case: |
421 | 0 | return "DW_ID_down_case"; |
422 | 0 | case DW_ID_case_insensitive: |
423 | 0 | return "DW_ID_case_insensitive"; |
424 | 0 | } |
425 | 0 | return StringRef(); |
426 | 0 | } |
427 | | |
428 | 5 | StringRef llvm::dwarf::ConventionString(unsigned CC) { |
429 | 5 | switch (CC) { |
430 | 4 | default: |
431 | 4 | return StringRef(); |
432 | 0 | #define HANDLE_DW_CC(ID, NAME) \ |
433 | 1 | case DW_CC_##NAME: \ |
434 | 1 | return "DW_CC_" #NAME; |
435 | 5 | #include "llvm/BinaryFormat/Dwarf.def" |
436 | 5 | } |
437 | 5 | } |
438 | | |
439 | 0 | unsigned llvm::dwarf::getCallingConvention(StringRef CCString) { |
440 | 0 | return StringSwitch<unsigned>(CCString) |
441 | 0 | #define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME) |
442 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
443 | 0 | .Default(0); |
444 | 0 | } |
445 | | |
446 | 0 | StringRef llvm::dwarf::InlineCodeString(unsigned Code) { |
447 | 0 | switch (Code) { |
448 | 0 | case DW_INL_not_inlined: |
449 | 0 | return "DW_INL_not_inlined"; |
450 | 0 | case DW_INL_inlined: |
451 | 0 | return "DW_INL_inlined"; |
452 | 0 | case DW_INL_declared_not_inlined: |
453 | 0 | return "DW_INL_declared_not_inlined"; |
454 | 0 | case DW_INL_declared_inlined: |
455 | 0 | return "DW_INL_declared_inlined"; |
456 | 0 | } |
457 | 0 | return StringRef(); |
458 | 0 | } |
459 | | |
460 | 0 | StringRef llvm::dwarf::ArrayOrderString(unsigned Order) { |
461 | 0 | switch (Order) { |
462 | 0 | case DW_ORD_row_major: |
463 | 0 | return "DW_ORD_row_major"; |
464 | 0 | case DW_ORD_col_major: |
465 | 0 | return "DW_ORD_col_major"; |
466 | 0 | } |
467 | 0 | return StringRef(); |
468 | 0 | } |
469 | | |
470 | 3.57k | StringRef llvm::dwarf::LNStandardString(unsigned Standard) { |
471 | 3.57k | switch (Standard) { |
472 | 0 | default: |
473 | 0 | return StringRef(); |
474 | 0 | #define HANDLE_DW_LNS(ID, NAME) \ |
475 | 3.57k | case DW_LNS_##NAME: \ |
476 | 3.57k | return "DW_LNS_" #NAME; |
477 | 3.57k | #include "llvm/BinaryFormat/Dwarf.def" |
478 | 3.57k | } |
479 | 3.57k | } |
480 | | |
481 | 0 | StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) { |
482 | 0 | switch (Encoding) { |
483 | 0 | default: |
484 | 0 | return StringRef(); |
485 | 0 | #define HANDLE_DW_LNE(ID, NAME) \ |
486 | 0 | case DW_LNE_##NAME: \ |
487 | 0 | return "DW_LNE_" #NAME; |
488 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
489 | 0 | } |
490 | 0 | } |
491 | | |
492 | 0 | StringRef llvm::dwarf::MacinfoString(unsigned Encoding) { |
493 | 0 | switch (Encoding) { |
494 | | // Macinfo Type Encodings |
495 | 0 | case DW_MACINFO_define: |
496 | 0 | return "DW_MACINFO_define"; |
497 | 0 | case DW_MACINFO_undef: |
498 | 0 | return "DW_MACINFO_undef"; |
499 | 0 | case DW_MACINFO_start_file: |
500 | 0 | return "DW_MACINFO_start_file"; |
501 | 0 | case DW_MACINFO_end_file: |
502 | 0 | return "DW_MACINFO_end_file"; |
503 | 0 | case DW_MACINFO_vendor_ext: |
504 | 0 | return "DW_MACINFO_vendor_ext"; |
505 | 0 | case DW_MACINFO_invalid: |
506 | 0 | return "DW_MACINFO_invalid"; |
507 | 0 | } |
508 | 0 | return StringRef(); |
509 | 0 | } |
510 | | |
511 | 0 | unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) { |
512 | 0 | return StringSwitch<unsigned>(MacinfoString) |
513 | 0 | .Case("DW_MACINFO_define", DW_MACINFO_define) |
514 | 0 | .Case("DW_MACINFO_undef", DW_MACINFO_undef) |
515 | 0 | .Case("DW_MACINFO_start_file", DW_MACINFO_start_file) |
516 | 0 | .Case("DW_MACINFO_end_file", DW_MACINFO_end_file) |
517 | 0 | .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext) |
518 | 0 | .Default(DW_MACINFO_invalid); |
519 | 0 | } |
520 | | |
521 | 0 | StringRef llvm::dwarf::MacroString(unsigned Encoding) { |
522 | 0 | switch (Encoding) { |
523 | 0 | default: |
524 | 0 | return StringRef(); |
525 | 0 | #define HANDLE_DW_MACRO(ID, NAME) \ |
526 | 0 | case DW_MACRO_##NAME: \ |
527 | 0 | return "DW_MACRO_" #NAME; |
528 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
529 | 0 | } |
530 | 0 | } |
531 | | |
532 | 0 | StringRef llvm::dwarf::GnuMacroString(unsigned Encoding) { |
533 | 0 | switch (Encoding) { |
534 | 0 | default: |
535 | 0 | return StringRef(); |
536 | 0 | #define HANDLE_DW_MACRO_GNU(ID, NAME) \ |
537 | 0 | case DW_MACRO_GNU_##NAME: \ |
538 | 0 | return "DW_MACRO_GNU_" #NAME; |
539 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
540 | 0 | } |
541 | 0 | } |
542 | | |
543 | 0 | unsigned llvm::dwarf::getMacro(StringRef MacroString) { |
544 | 0 | return StringSwitch<unsigned>(MacroString) |
545 | 0 | #define HANDLE_DW_MACRO(ID, NAME) .Case("DW_MACRO_" #NAME, ID) |
546 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
547 | 0 | .Default(DW_MACINFO_invalid); |
548 | 0 | } |
549 | 0 | StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) { |
550 | 0 | switch (Encoding) { |
551 | 0 | default: |
552 | 0 | return StringRef(); |
553 | 0 | #define HANDLE_DW_RLE(ID, NAME) \ |
554 | 0 | case DW_RLE_##NAME: \ |
555 | 0 | return "DW_RLE_" #NAME; |
556 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
557 | 0 | } |
558 | 0 | } |
559 | | |
560 | 0 | StringRef llvm::dwarf::LocListEncodingString(unsigned Encoding) { |
561 | 0 | switch (Encoding) { |
562 | 0 | default: |
563 | 0 | return StringRef(); |
564 | 0 | #define HANDLE_DW_LLE(ID, NAME) \ |
565 | 0 | case DW_LLE_##NAME: \ |
566 | 0 | return "DW_LLE_" #NAME; |
567 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
568 | 0 | } |
569 | 0 | } |
570 | | |
571 | | StringRef llvm::dwarf::CallFrameString(unsigned Encoding, |
572 | 243k | Triple::ArchType Arch) { |
573 | 243k | assert(Arch != llvm::Triple::ArchType::UnknownArch); |
574 | 0 | #define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64) |
575 | 0 | #define SELECT_MIPS64 Arch == llvm::Triple::mips64 |
576 | 0 | #define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9) |
577 | 0 | #define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) |
578 | 0 | #define HANDLE_DW_CFA(ID, NAME) |
579 | 0 | #define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \ |
580 | 975k | if (ID == Encoding && PRED) \ |
581 | 975k | return "DW_CFA_" #NAME; |
582 | 243k | #include "llvm/BinaryFormat/Dwarf.def" |
583 | | |
584 | 234k | switch (Encoding) { |
585 | 2 | default: |
586 | 2 | return StringRef(); |
587 | 0 | #define HANDLE_DW_CFA_PRED(ID, NAME, PRED) |
588 | 0 | #define HANDLE_DW_CFA(ID, NAME) \ |
589 | 234k | case DW_CFA_##NAME: \ |
590 | 234k | return "DW_CFA_" #NAME; |
591 | 234k | #include "llvm/BinaryFormat/Dwarf.def" |
592 | | |
593 | 234k | #undef SELECT_X86 |
594 | 234k | #undef SELECT_SPARC |
595 | 234k | #undef SELECT_MIPS64 |
596 | 234k | #undef SELECT_AARCH64 |
597 | 234k | } |
598 | 234k | } |
599 | | |
600 | 0 | StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) { |
601 | 0 | switch (Prop) { |
602 | 0 | default: |
603 | 0 | return StringRef(); |
604 | 0 | #define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \ |
605 | 0 | case DW_APPLE_PROPERTY_##NAME: \ |
606 | 0 | return "DW_APPLE_PROPERTY_" #NAME; |
607 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
608 | 0 | } |
609 | 0 | } |
610 | | |
611 | 0 | StringRef llvm::dwarf::UnitTypeString(unsigned UT) { |
612 | 0 | switch (UT) { |
613 | 0 | default: |
614 | 0 | return StringRef(); |
615 | 0 | #define HANDLE_DW_UT(ID, NAME) \ |
616 | 0 | case DW_UT_##NAME: \ |
617 | 0 | return "DW_UT_" #NAME; |
618 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
619 | 0 | } |
620 | 0 | } |
621 | | |
622 | 0 | StringRef llvm::dwarf::AtomTypeString(unsigned AT) { |
623 | 0 | switch (AT) { |
624 | 0 | case dwarf::DW_ATOM_null: |
625 | 0 | return "DW_ATOM_null"; |
626 | 0 | case dwarf::DW_ATOM_die_offset: |
627 | 0 | return "DW_ATOM_die_offset"; |
628 | 0 | case DW_ATOM_cu_offset: |
629 | 0 | return "DW_ATOM_cu_offset"; |
630 | 0 | case DW_ATOM_die_tag: |
631 | 0 | return "DW_ATOM_die_tag"; |
632 | 0 | case DW_ATOM_type_flags: |
633 | 0 | case DW_ATOM_type_type_flags: |
634 | 0 | return "DW_ATOM_type_flags"; |
635 | 0 | case DW_ATOM_qual_name_hash: |
636 | 0 | return "DW_ATOM_qual_name_hash"; |
637 | 0 | } |
638 | 0 | return StringRef(); |
639 | 0 | } |
640 | | |
641 | 24 | StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) { |
642 | 24 | switch (Kind) { |
643 | 9 | case GIEK_NONE: |
644 | 9 | return "NONE"; |
645 | 3 | case GIEK_TYPE: |
646 | 3 | return "TYPE"; |
647 | 4 | case GIEK_VARIABLE: |
648 | 4 | return "VARIABLE"; |
649 | 4 | case GIEK_FUNCTION: |
650 | 4 | return "FUNCTION"; |
651 | 0 | case GIEK_OTHER: |
652 | 0 | return "OTHER"; |
653 | 0 | case GIEK_UNUSED5: |
654 | 0 | return "UNUSED5"; |
655 | 0 | case GIEK_UNUSED6: |
656 | 0 | return "UNUSED6"; |
657 | 4 | case GIEK_UNUSED7: |
658 | 4 | return "UNUSED7"; |
659 | 24 | } |
660 | 0 | llvm_unreachable("Unknown GDBIndexEntryKind value"); |
661 | 0 | } |
662 | | |
663 | | StringRef |
664 | 24 | llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) { |
665 | 24 | switch (Linkage) { |
666 | 17 | case GIEL_EXTERNAL: |
667 | 17 | return "EXTERNAL"; |
668 | 7 | case GIEL_STATIC: |
669 | 7 | return "STATIC"; |
670 | 24 | } |
671 | 0 | llvm_unreachable("Unknown GDBIndexEntryLinkage value"); |
672 | 0 | } |
673 | | |
674 | 3 | StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) { |
675 | 3 | switch (Attr) { |
676 | 0 | case DW_AT_accessibility: |
677 | 0 | return AccessibilityString(Val); |
678 | 0 | case DW_AT_virtuality: |
679 | 0 | return VirtualityString(Val); |
680 | 3 | case DW_AT_language: |
681 | 3 | return LanguageString(Val); |
682 | 0 | case DW_AT_encoding: |
683 | 0 | return AttributeEncodingString(Val); |
684 | 0 | case DW_AT_decimal_sign: |
685 | 0 | return DecimalSignString(Val); |
686 | 0 | case DW_AT_endianity: |
687 | 0 | return EndianityString(Val); |
688 | 0 | case DW_AT_visibility: |
689 | 0 | return VisibilityString(Val); |
690 | 0 | case DW_AT_identifier_case: |
691 | 0 | return CaseString(Val); |
692 | 0 | case DW_AT_calling_convention: |
693 | 0 | return ConventionString(Val); |
694 | 0 | case DW_AT_inline: |
695 | 0 | return InlineCodeString(Val); |
696 | 0 | case DW_AT_ordering: |
697 | 0 | return ArrayOrderString(Val); |
698 | 0 | case DW_AT_APPLE_runtime_class: |
699 | 0 | return LanguageString(Val); |
700 | 0 | case DW_AT_defaulted: |
701 | 0 | return DefaultedMemberString(Val); |
702 | 3 | } |
703 | | |
704 | 0 | return StringRef(); |
705 | 3 | } |
706 | | |
707 | 0 | StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) { |
708 | 0 | switch (Atom) { |
709 | 0 | case DW_ATOM_null: |
710 | 0 | return "NULL"; |
711 | 0 | case DW_ATOM_die_tag: |
712 | 0 | return TagString(Val); |
713 | 0 | } |
714 | | |
715 | 0 | return StringRef(); |
716 | 0 | } |
717 | | |
718 | 8 | StringRef llvm::dwarf::IndexString(unsigned Idx) { |
719 | 8 | switch (Idx) { |
720 | 0 | default: |
721 | 0 | return StringRef(); |
722 | 0 | #define HANDLE_DW_IDX(ID, NAME) \ |
723 | 8 | case DW_IDX_##NAME: \ |
724 | 8 | return "DW_IDX_" #NAME; |
725 | 8 | #include "llvm/BinaryFormat/Dwarf.def" |
726 | 8 | } |
727 | 8 | } |
728 | | |
729 | | std::optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form, |
730 | 19.6k | FormParams Params) { |
731 | 19.6k | switch (Form) { |
732 | 32 | case DW_FORM_addr: |
733 | 32 | if (Params) |
734 | 32 | return Params.AddrSize; |
735 | 0 | return std::nullopt; |
736 | | |
737 | 0 | case DW_FORM_block: // ULEB128 length L followed by L bytes. |
738 | 0 | case DW_FORM_block1: // 1 byte length L followed by L bytes. |
739 | 0 | case DW_FORM_block2: // 2 byte length L followed by L bytes. |
740 | 0 | case DW_FORM_block4: // 4 byte length L followed by L bytes. |
741 | 0 | case DW_FORM_string: // C-string with null terminator. |
742 | 61 | case DW_FORM_sdata: // SLEB128. |
743 | 244 | case DW_FORM_udata: // ULEB128. |
744 | 244 | case DW_FORM_ref_udata: // ULEB128. |
745 | 244 | case DW_FORM_indirect: // ULEB128. |
746 | 275 | case DW_FORM_exprloc: // ULEB128 length L followed by L bytes. |
747 | 275 | case DW_FORM_strx: // ULEB128. |
748 | 279 | case DW_FORM_addrx: // ULEB128. |
749 | 279 | case DW_FORM_loclistx: // ULEB128. |
750 | 279 | case DW_FORM_rnglistx: // ULEB128. |
751 | 279 | case DW_FORM_GNU_addr_index: // ULEB128. |
752 | 279 | case DW_FORM_GNU_str_index: // ULEB128. |
753 | 279 | return std::nullopt; |
754 | | |
755 | 0 | case DW_FORM_ref_addr: |
756 | 0 | if (Params) |
757 | 0 | return Params.getRefAddrByteSize(); |
758 | 0 | return std::nullopt; |
759 | | |
760 | 784 | case DW_FORM_flag: |
761 | 16.0k | case DW_FORM_data1: |
762 | 16.0k | case DW_FORM_ref1: |
763 | 16.1k | case DW_FORM_strx1: |
764 | 16.1k | case DW_FORM_addrx1: |
765 | 16.1k | return 1; |
766 | | |
767 | 1.47k | case DW_FORM_data2: |
768 | 1.47k | case DW_FORM_ref2: |
769 | 1.47k | case DW_FORM_strx2: |
770 | 1.47k | case DW_FORM_addrx2: |
771 | 1.47k | return 2; |
772 | | |
773 | 0 | case DW_FORM_strx3: |
774 | 0 | case DW_FORM_addrx3: |
775 | 0 | return 3; |
776 | | |
777 | 14 | case DW_FORM_data4: |
778 | 36 | case DW_FORM_ref4: |
779 | 36 | case DW_FORM_ref_sup4: |
780 | 36 | case DW_FORM_strx4: |
781 | 36 | case DW_FORM_addrx4: |
782 | 36 | return 4; |
783 | | |
784 | 33 | case DW_FORM_strp: |
785 | 33 | case DW_FORM_GNU_ref_alt: |
786 | 33 | case DW_FORM_GNU_strp_alt: |
787 | 33 | case DW_FORM_line_strp: |
788 | 42 | case DW_FORM_sec_offset: |
789 | 42 | case DW_FORM_strp_sup: |
790 | 42 | if (Params) |
791 | 42 | return Params.getDwarfOffsetByteSize(); |
792 | 0 | return std::nullopt; |
793 | | |
794 | 0 | case DW_FORM_data8: |
795 | 0 | case DW_FORM_ref8: |
796 | 19 | case DW_FORM_ref_sig8: |
797 | 19 | case DW_FORM_ref_sup8: |
798 | 19 | return 8; |
799 | | |
800 | 1.52k | case DW_FORM_flag_present: |
801 | 1.52k | return 0; |
802 | | |
803 | 0 | case DW_FORM_data16: |
804 | 0 | return 16; |
805 | | |
806 | 0 | case DW_FORM_implicit_const: |
807 | | // The implicit value is stored in the abbreviation as a SLEB128, and |
808 | | // there no data in debug info. |
809 | 0 | return 0; |
810 | | |
811 | 98 | default: |
812 | 98 | break; |
813 | 19.6k | } |
814 | 98 | return std::nullopt; |
815 | 19.6k | } |
816 | | |
817 | | bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version, |
818 | 19.8k | bool ExtensionsOk) { |
819 | 19.8k | if (FormVendor(F) == DWARF_VENDOR_DWARF) { |
820 | 19.8k | unsigned FV = FormVersion(F); |
821 | 19.8k | return FV > 0 && FV <= Version; |
822 | 19.8k | } |
823 | 0 | return ExtensionsOk; |
824 | 19.8k | } |
825 | | |
826 | 12.6k | StringRef llvm::dwarf::FormatString(DwarfFormat Format) { |
827 | 12.6k | switch (Format) { |
828 | 12.6k | case DWARF32: |
829 | 12.6k | return "DWARF32"; |
830 | 0 | case DWARF64: |
831 | 0 | return "DWARF64"; |
832 | 12.6k | } |
833 | 0 | return StringRef(); |
834 | 12.6k | } |
835 | | |
836 | 12.6k | StringRef llvm::dwarf::FormatString(bool IsDWARF64) { |
837 | 12.6k | return FormatString(IsDWARF64 ? DWARF64 : DWARF32); |
838 | 12.6k | } |
839 | | |
840 | 0 | StringRef llvm::dwarf::RLEString(unsigned RLE) { |
841 | 0 | switch (RLE) { |
842 | 0 | default: |
843 | 0 | return StringRef(); |
844 | 0 | #define HANDLE_DW_RLE(ID, NAME) \ |
845 | 0 | case DW_RLE_##NAME: \ |
846 | 0 | return "DW_RLE_" #NAME; |
847 | 0 | #include "llvm/BinaryFormat/Dwarf.def" |
848 | 0 | } |
849 | 0 | } |
850 | | |
851 | | constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[]; |
852 | | constexpr char llvm::dwarf::EnumTraits<Form>::Type[]; |
853 | | constexpr char llvm::dwarf::EnumTraits<Index>::Type[]; |
854 | | constexpr char llvm::dwarf::EnumTraits<Tag>::Type[]; |
855 | | constexpr char llvm::dwarf::EnumTraits<LineNumberOps>::Type[]; |
856 | | constexpr char llvm::dwarf::EnumTraits<LocationAtom>::Type[]; |