Coverage Report

Created: 2024-01-17 10:31

/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[];