blob: fe8ce2bd7aa36558d586415516f86abc7066517a [file] [log] [blame]
Zachary Turner264b5d92017-06-07 03:48:56 +00001//===-- llvm/BinaryFormat/Dwarf.cpp - Dwarf Framework ------------*- C++-*-===//
Jim Laskey22e47b92006-02-27 12:43:29 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Jim Laskey22e47b92006-02-27 12:43:29 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file contains support for generic dwarf information.
11//
12//===----------------------------------------------------------------------===//
13
Zachary Turner264b5d92017-06-07 03:48:56 +000014#include "llvm/BinaryFormat/Dwarf.h"
Duncan P. N. Exon Smith6f5546c2015-02-03 21:16:49 +000015#include "llvm/ADT/StringSwitch.h"
Luke Cheesemanf57d7d82018-12-18 10:37:42 +000016#include "llvm/ADT/Triple.h"
David Blaikied0a869d2013-09-19 22:19:37 +000017#include "llvm/Support/ErrorHandling.h"
18
Chris Lattner3b326722009-12-29 07:28:33 +000019using namespace llvm;
20using namespace dwarf;
Jim Laskey22e47b92006-02-27 12:43:29 +000021
Mehdi Amini149f6ea2016-10-05 05:59:29 +000022StringRef llvm::dwarf::TagString(unsigned Tag) {
Mike Stump889285d2009-05-13 23:23:20 +000023 switch (Tag) {
Mehdi Amini149f6ea2016-10-05 05:59:29 +000024 default:
25 return StringRef();
Paul Robinson70b34532017-04-20 19:16:51 +000026#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
Duncan P. N. Exon Smith981811e2015-02-03 21:13:16 +000027 case DW_TAG_##NAME: \
28 return "DW_TAG_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +000029#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +000030 }
Jim Laskey22e47b92006-02-27 12:43:29 +000031}
32
Duncan P. N. Exon Smith6f5546c2015-02-03 21:16:49 +000033unsigned llvm::dwarf::getTag(StringRef TagString) {
34 return StringSwitch<unsigned>(TagString)
Paul Robinson70b34532017-04-20 19:16:51 +000035#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
Zachary Turner264b5d92017-06-07 03:48:56 +000036 .Case("DW_TAG_" #NAME, DW_TAG_##NAME)
37#include "llvm/BinaryFormat/Dwarf.def"
Duncan P. N. Exon Smith6f5546c2015-02-03 21:16:49 +000038 .Default(DW_TAG_invalid);
39}
40
Paul Robinson70b34532017-04-20 19:16:51 +000041unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) {
42 switch (Tag) {
43 default:
44 return 0;
45#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
46 case DW_TAG_##NAME: \
47 return VERSION;
Zachary Turner264b5d92017-06-07 03:48:56 +000048#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +000049 }
50}
51
52unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) {
53 switch (Tag) {
54 default:
55 return 0;
56#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
57 case DW_TAG_##NAME: \
58 return DWARF_VENDOR_##VENDOR;
Zachary Turner264b5d92017-06-07 03:48:56 +000059#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +000060 }
61}
62
Mehdi Amini149f6ea2016-10-05 05:59:29 +000063StringRef llvm::dwarf::ChildrenString(unsigned Children) {
Mike Stump889285d2009-05-13 23:23:20 +000064 switch (Children) {
Zachary Turner264b5d92017-06-07 03:48:56 +000065 case DW_CHILDREN_no:
66 return "DW_CHILDREN_no";
67 case DW_CHILDREN_yes:
68 return "DW_CHILDREN_yes";
Jim Laskey22e47b92006-02-27 12:43:29 +000069 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +000070 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +000071}
72
Mehdi Amini149f6ea2016-10-05 05:59:29 +000073StringRef llvm::dwarf::AttributeString(unsigned Attribute) {
Mike Stump889285d2009-05-13 23:23:20 +000074 switch (Attribute) {
Adrian Prantl7e55f172016-10-28 18:21:39 +000075 default:
76 return StringRef();
Paul Robinson70b34532017-04-20 19:16:51 +000077#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \
78 case DW_AT_##NAME: \
Adrian Prantl7e55f172016-10-28 18:21:39 +000079 return "DW_AT_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +000080#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +000081 }
Jim Laskey22e47b92006-02-27 12:43:29 +000082}
83
Paul Robinson70b34532017-04-20 19:16:51 +000084unsigned llvm::dwarf::AttributeVersion(dwarf::Attribute Attribute) {
85 switch (Attribute) {
86 default:
87 return 0;
88#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \
89 case DW_AT_##NAME: \
90 return VERSION;
Zachary Turner264b5d92017-06-07 03:48:56 +000091#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +000092 }
93}
94
95unsigned llvm::dwarf::AttributeVendor(dwarf::Attribute Attribute) {
96 switch (Attribute) {
97 default:
98 return 0;
99#define HANDLE_DW_AT(ID, NAME, VERSION, VENDOR) \
100 case DW_AT_##NAME: \
101 return DWARF_VENDOR_##VENDOR;
Zachary Turner264b5d92017-06-07 03:48:56 +0000102#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000103 }
104}
105
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000106StringRef llvm::dwarf::FormEncodingString(unsigned Encoding) {
Mike Stump889285d2009-05-13 23:23:20 +0000107 switch (Encoding) {
Adrian Prantl23865812016-10-28 22:56:45 +0000108 default:
109 return StringRef();
Paul Robinson70b34532017-04-20 19:16:51 +0000110#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \
111 case DW_FORM_##NAME: \
Adrian Prantl23865812016-10-28 22:56:45 +0000112 return "DW_FORM_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000113#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000114 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000115}
116
Paul Robinson70b34532017-04-20 19:16:51 +0000117unsigned llvm::dwarf::FormVersion(dwarf::Form Form) {
118 switch (Form) {
119 default:
120 return 0;
121#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \
122 case DW_FORM_##NAME: \
123 return VERSION;
Zachary Turner264b5d92017-06-07 03:48:56 +0000124#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000125 }
126}
127
128unsigned llvm::dwarf::FormVendor(dwarf::Form Form) {
129 switch (Form) {
130 default:
131 return 0;
132#define HANDLE_DW_FORM(ID, NAME, VERSION, VENDOR) \
133 case DW_FORM_##NAME: \
134 return DWARF_VENDOR_##VENDOR;
Zachary Turner264b5d92017-06-07 03:48:56 +0000135#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000136 }
137}
138
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000139StringRef llvm::dwarf::OperationEncodingString(unsigned Encoding) {
Mike Stump889285d2009-05-13 23:23:20 +0000140 switch (Encoding) {
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000141 default:
142 return StringRef();
Paul Robinson70b34532017-04-20 19:16:51 +0000143#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
Duncan P. N. Exon Smith8f46ee62015-02-13 01:04:08 +0000144 case DW_OP_##NAME: \
145 return "DW_OP_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000146#include "llvm/BinaryFormat/Dwarf.def"
Adrian Prantl941fa752016-12-05 18:04:47 +0000147 case DW_OP_LLVM_fragment:
148 return "DW_OP_LLVM_fragment";
Jim Laskey22e47b92006-02-27 12:43:29 +0000149 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000150}
151
Duncan P. N. Exon Smith3b631d22015-02-13 01:05:00 +0000152unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) {
153 return StringSwitch<unsigned>(OperationEncodingString)
Paul Robinson70b34532017-04-20 19:16:51 +0000154#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
Zachary Turner264b5d92017-06-07 03:48:56 +0000155 .Case("DW_OP_" #NAME, DW_OP_##NAME)
156#include "llvm/BinaryFormat/Dwarf.def"
Adrian Prantl941fa752016-12-05 18:04:47 +0000157 .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment)
Duncan P. N. Exon Smith3b631d22015-02-13 01:05:00 +0000158 .Default(0);
159}
160
Paul Robinson70b34532017-04-20 19:16:51 +0000161unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) {
162 switch (Op) {
163 default:
164 return 0;
165#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
166 case DW_OP_##NAME: \
167 return VERSION;
Zachary Turner264b5d92017-06-07 03:48:56 +0000168#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000169 }
170}
171
172unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) {
173 switch (Op) {
174 default:
175 return 0;
176#define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
177 case DW_OP_##NAME: \
178 return DWARF_VENDOR_##VENDOR;
Zachary Turner264b5d92017-06-07 03:48:56 +0000179#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000180 }
181}
182
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000183StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) {
Mike Stump889285d2009-05-13 23:23:20 +0000184 switch (Encoding) {
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000185 default:
186 return StringRef();
Paul Robinson70b34532017-04-20 19:16:51 +0000187#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
Duncan P. N. Exon Smithdd563dd2015-02-06 23:45:37 +0000188 case DW_ATE_##NAME: \
189 return "DW_ATE_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000190#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000191 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000192}
193
Duncan P. N. Exon Smithe07f13a2015-02-06 23:46:49 +0000194unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) {
195 return StringSwitch<unsigned>(EncodingString)
Paul Robinson70b34532017-04-20 19:16:51 +0000196#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
Zachary Turner264b5d92017-06-07 03:48:56 +0000197 .Case("DW_ATE_" #NAME, DW_ATE_##NAME)
198#include "llvm/BinaryFormat/Dwarf.def"
Duncan P. N. Exon Smithe07f13a2015-02-06 23:46:49 +0000199 .Default(0);
200}
201
Paul Robinson70b34532017-04-20 19:16:51 +0000202unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) {
203 switch (ATE) {
204 default:
205 return 0;
206#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
207 case DW_ATE_##NAME: \
208 return VERSION;
Zachary Turner264b5d92017-06-07 03:48:56 +0000209#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000210 }
211}
212
213unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) {
214 switch (ATE) {
215 default:
216 return 0;
217#define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
218 case DW_ATE_##NAME: \
219 return DWARF_VENDOR_##VENDOR;
Zachary Turner264b5d92017-06-07 03:48:56 +0000220#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000221 }
222}
223
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000224StringRef llvm::dwarf::DecimalSignString(unsigned Sign) {
Mike Stump889285d2009-05-13 23:23:20 +0000225 switch (Sign) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000226 case DW_DS_unsigned:
227 return "DW_DS_unsigned";
228 case DW_DS_leading_overpunch:
229 return "DW_DS_leading_overpunch";
230 case DW_DS_trailing_overpunch:
231 return "DW_DS_trailing_overpunch";
232 case DW_DS_leading_separate:
233 return "DW_DS_leading_separate";
234 case DW_DS_trailing_separate:
235 return "DW_DS_trailing_separate";
Jim Laskey22e47b92006-02-27 12:43:29 +0000236 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000237 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000238}
239
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000240StringRef llvm::dwarf::EndianityString(unsigned Endian) {
Mike Stump889285d2009-05-13 23:23:20 +0000241 switch (Endian) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000242 case DW_END_default:
243 return "DW_END_default";
244 case DW_END_big:
245 return "DW_END_big";
246 case DW_END_little:
247 return "DW_END_little";
248 case DW_END_lo_user:
249 return "DW_END_lo_user";
250 case DW_END_hi_user:
251 return "DW_END_hi_user";
Jim Laskey22e47b92006-02-27 12:43:29 +0000252 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000253 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000254}
255
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000256StringRef llvm::dwarf::AccessibilityString(unsigned Access) {
Mike Stump889285d2009-05-13 23:23:20 +0000257 switch (Access) {
Chris Lattner0709a272009-12-29 21:09:57 +0000258 // Accessibility codes
Zachary Turner264b5d92017-06-07 03:48:56 +0000259 case DW_ACCESS_public:
260 return "DW_ACCESS_public";
261 case DW_ACCESS_protected:
262 return "DW_ACCESS_protected";
263 case DW_ACCESS_private:
264 return "DW_ACCESS_private";
Jim Laskey22e47b92006-02-27 12:43:29 +0000265 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000266 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000267}
268
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000269StringRef llvm::dwarf::VisibilityString(unsigned Visibility) {
Mike Stump889285d2009-05-13 23:23:20 +0000270 switch (Visibility) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000271 case DW_VIS_local:
272 return "DW_VIS_local";
273 case DW_VIS_exported:
274 return "DW_VIS_exported";
275 case DW_VIS_qualified:
276 return "DW_VIS_qualified";
Jim Laskey22e47b92006-02-27 12:43:29 +0000277 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000278 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000279}
280
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000281StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) {
Mike Stump889285d2009-05-13 23:23:20 +0000282 switch (Virtuality) {
Duncan P. N. Exon Smithd6f35742015-02-07 00:36:23 +0000283 default:
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000284 return StringRef();
Duncan P. N. Exon Smithd6f35742015-02-07 00:36:23 +0000285#define HANDLE_DW_VIRTUALITY(ID, NAME) \
286 case DW_VIRTUALITY_##NAME: \
287 return "DW_VIRTUALITY_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000288#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000289 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000290}
291
Duncan P. N. Exon Smithe7e2abe2015-02-07 00:37:15 +0000292unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) {
293 return StringSwitch<unsigned>(VirtualityString)
294#define HANDLE_DW_VIRTUALITY(ID, NAME) \
295 .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME)
Zachary Turner264b5d92017-06-07 03:48:56 +0000296#include "llvm/BinaryFormat/Dwarf.def"
Duncan P. N. Exon Smithe7e2abe2015-02-07 00:37:15 +0000297 .Default(DW_VIRTUALITY_invalid);
298}
299
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000300StringRef llvm::dwarf::LanguageString(unsigned Language) {
Mike Stump889285d2009-05-13 23:23:20 +0000301 switch (Language) {
Duncan P. N. Exon Smith03179442015-02-06 22:53:19 +0000302 default:
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000303 return StringRef();
Paul Robinson70b34532017-04-20 19:16:51 +0000304#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
Duncan P. N. Exon Smith03179442015-02-06 22:53:19 +0000305 case DW_LANG_##NAME: \
306 return "DW_LANG_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000307#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000308 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000309}
310
Duncan P. N. Exon Smithd40af002015-02-06 22:55:13 +0000311unsigned llvm::dwarf::getLanguage(StringRef LanguageString) {
312 return StringSwitch<unsigned>(LanguageString)
Paul Robinson70b34532017-04-20 19:16:51 +0000313#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
314 .Case("DW_LANG_" #NAME, DW_LANG_##NAME)
Zachary Turner264b5d92017-06-07 03:48:56 +0000315#include "llvm/BinaryFormat/Dwarf.def"
Duncan P. N. Exon Smithd40af002015-02-06 22:55:13 +0000316 .Default(0);
317}
318
Paul Robinson70b34532017-04-20 19:16:51 +0000319unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) {
320 switch (Lang) {
321 default:
322 return 0;
323#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
324 case DW_LANG_##NAME: \
325 return VERSION;
Zachary Turner264b5d92017-06-07 03:48:56 +0000326#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000327 }
328}
329
330unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) {
331 switch (Lang) {
332 default:
333 return 0;
334#define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
335 case DW_LANG_##NAME: \
336 return DWARF_VENDOR_##VENDOR;
Zachary Turner264b5d92017-06-07 03:48:56 +0000337#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinson70b34532017-04-20 19:16:51 +0000338 }
339}
340
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000341StringRef llvm::dwarf::CaseString(unsigned Case) {
Chris Lattner0709a272009-12-29 21:09:57 +0000342 switch (Case) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000343 case DW_ID_case_sensitive:
344 return "DW_ID_case_sensitive";
345 case DW_ID_up_case:
346 return "DW_ID_up_case";
347 case DW_ID_down_case:
348 return "DW_ID_down_case";
349 case DW_ID_case_insensitive:
350 return "DW_ID_case_insensitive";
Jim Laskey22e47b92006-02-27 12:43:29 +0000351 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000352 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000353}
354
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000355StringRef llvm::dwarf::ConventionString(unsigned CC) {
Reid Klecknerde3d8b52016-06-08 20:34:29 +0000356 switch (CC) {
357 default:
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000358 return StringRef();
Zachary Turner264b5d92017-06-07 03:48:56 +0000359#define HANDLE_DW_CC(ID, NAME) \
360 case DW_CC_##NAME: \
Reid Klecknerde3d8b52016-06-08 20:34:29 +0000361 return "DW_CC_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000362#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000363 }
Reid Klecknerde3d8b52016-06-08 20:34:29 +0000364}
365
366unsigned llvm::dwarf::getCallingConvention(StringRef CCString) {
367 return StringSwitch<unsigned>(CCString)
368#define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME)
Zachary Turner264b5d92017-06-07 03:48:56 +0000369#include "llvm/BinaryFormat/Dwarf.def"
Reid Klecknerde3d8b52016-06-08 20:34:29 +0000370 .Default(0);
Jim Laskey22e47b92006-02-27 12:43:29 +0000371}
372
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000373StringRef llvm::dwarf::InlineCodeString(unsigned Code) {
Chris Lattner0709a272009-12-29 21:09:57 +0000374 switch (Code) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000375 case DW_INL_not_inlined:
376 return "DW_INL_not_inlined";
377 case DW_INL_inlined:
378 return "DW_INL_inlined";
379 case DW_INL_declared_not_inlined:
380 return "DW_INL_declared_not_inlined";
381 case DW_INL_declared_inlined:
382 return "DW_INL_declared_inlined";
Jim Laskey22e47b92006-02-27 12:43:29 +0000383 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000384 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000385}
386
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000387StringRef llvm::dwarf::ArrayOrderString(unsigned Order) {
Chris Lattner0709a272009-12-29 21:09:57 +0000388 switch (Order) {
Zachary Turner264b5d92017-06-07 03:48:56 +0000389 case DW_ORD_row_major:
390 return "DW_ORD_row_major";
391 case DW_ORD_col_major:
392 return "DW_ORD_col_major";
Jim Laskey22e47b92006-02-27 12:43:29 +0000393 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000394 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000395}
396
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000397StringRef llvm::dwarf::LNStandardString(unsigned Standard) {
Chris Lattner0709a272009-12-29 21:09:57 +0000398 switch (Standard) {
Adrian Prantl79deba62016-10-28 22:56:59 +0000399 default:
400 return StringRef();
Zachary Turner264b5d92017-06-07 03:48:56 +0000401#define HANDLE_DW_LNS(ID, NAME) \
402 case DW_LNS_##NAME: \
Adrian Prantl79deba62016-10-28 22:56:59 +0000403 return "DW_LNS_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000404#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000405 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000406}
407
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000408StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) {
Chris Lattner0709a272009-12-29 21:09:57 +0000409 switch (Encoding) {
Adrian Prantl3cd37d02016-10-28 22:57:02 +0000410 default:
411 return StringRef();
Zachary Turner264b5d92017-06-07 03:48:56 +0000412#define HANDLE_DW_LNE(ID, NAME) \
413 case DW_LNE_##NAME: \
Adrian Prantl3cd37d02016-10-28 22:57:02 +0000414 return "DW_LNE_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000415#include "llvm/BinaryFormat/Dwarf.def"
Jim Laskey22e47b92006-02-27 12:43:29 +0000416 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000417}
418
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000419StringRef llvm::dwarf::MacinfoString(unsigned Encoding) {
Chris Lattner0709a272009-12-29 21:09:57 +0000420 switch (Encoding) {
421 // Macinfo Type Encodings
Zachary Turner264b5d92017-06-07 03:48:56 +0000422 case DW_MACINFO_define:
423 return "DW_MACINFO_define";
424 case DW_MACINFO_undef:
425 return "DW_MACINFO_undef";
426 case DW_MACINFO_start_file:
427 return "DW_MACINFO_start_file";
428 case DW_MACINFO_end_file:
429 return "DW_MACINFO_end_file";
430 case DW_MACINFO_vendor_ext:
431 return "DW_MACINFO_vendor_ext";
432 case DW_MACINFO_invalid:
433 return "DW_MACINFO_invalid";
Jim Laskey22e47b92006-02-27 12:43:29 +0000434 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000435 return StringRef();
Jim Laskey22e47b92006-02-27 12:43:29 +0000436}
437
Amjad Abouda9bcf162015-12-10 12:56:35 +0000438unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) {
439 return StringSwitch<unsigned>(MacinfoString)
440 .Case("DW_MACINFO_define", DW_MACINFO_define)
441 .Case("DW_MACINFO_undef", DW_MACINFO_undef)
442 .Case("DW_MACINFO_start_file", DW_MACINFO_start_file)
443 .Case("DW_MACINFO_end_file", DW_MACINFO_end_file)
444 .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext)
445 .Default(DW_MACINFO_invalid);
446}
447
Wolfgang Pieba0729d42018-03-08 20:52:35 +0000448StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) {
449 switch (Encoding) {
450 default:
451 return StringRef();
452#define HANDLE_DW_RLE(ID, NAME) \
453 case DW_RLE_##NAME: \
454 return "DW_RLE_" #NAME;
455#include "llvm/BinaryFormat/Dwarf.def"
456 }
457}
458
Luke Cheesemanf57d7d82018-12-18 10:37:42 +0000459StringRef llvm::dwarf::CallFrameString(unsigned Encoding,
460 Triple::ArchType Arch) {
461 assert(Arch != llvm::Triple::ArchType::UnknownArch);
462#define SELECT_AARCH64 (Arch == llvm::Triple::aarch64_be || Arch == llvm::Triple::aarch64)
463#define SELECT_MIPS64 Arch == llvm::Triple::mips64
464#define SELECT_SPARC (Arch == llvm::Triple::sparc || Arch == llvm::Triple::sparcv9)
465#define SELECT_X86 (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64)
466#define HANDLE_DW_CFA(ID, NAME)
467#define HANDLE_DW_CFA_PRED(ID, NAME, PRED) \
468 if (ID == Encoding && PRED) \
469 return "DW_CFA_" #NAME;
470#include "llvm/BinaryFormat/Dwarf.def"
471
Chris Lattner0709a272009-12-29 21:09:57 +0000472 switch (Encoding) {
Adrian Prantl44a44612016-10-28 22:56:53 +0000473 default:
474 return StringRef();
Luke Cheesemanf57d7d82018-12-18 10:37:42 +0000475#define HANDLE_DW_CFA_PRED(ID, NAME, PRED)
Zachary Turner264b5d92017-06-07 03:48:56 +0000476#define HANDLE_DW_CFA(ID, NAME) \
477 case DW_CFA_##NAME: \
Adrian Prantl44a44612016-10-28 22:56:53 +0000478 return "DW_CFA_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000479#include "llvm/BinaryFormat/Dwarf.def"
Luke Cheesemanf57d7d82018-12-18 10:37:42 +0000480
481#undef SELECT_X86
482#undef SELECT_SPARC
483#undef SELECT_MIPS64
484#undef SELECT_AARCH64
Jim Laskey22e47b92006-02-27 12:43:29 +0000485 }
Jim Laskey22e47b92006-02-27 12:43:29 +0000486}
Eric Christophercf7289f2013-09-05 18:20:16 +0000487
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000488StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) {
Frederic Rissb5e53ee2014-10-09 20:43:04 +0000489 switch (Prop) {
Adrian Prantl8580d3f2016-10-28 22:56:56 +0000490 default:
491 return StringRef();
Zachary Turner264b5d92017-06-07 03:48:56 +0000492#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \
493 case DW_APPLE_PROPERTY_##NAME: \
Adrian Prantl8580d3f2016-10-28 22:56:56 +0000494 return "DW_APPLE_PROPERTY_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000495#include "llvm/BinaryFormat/Dwarf.def"
Frederic Rissb5e53ee2014-10-09 20:43:04 +0000496 }
Frederic Rissb5e53ee2014-10-09 20:43:04 +0000497}
498
Paul Robinsoncddd6042017-02-28 20:24:55 +0000499StringRef llvm::dwarf::UnitTypeString(unsigned UT) {
500 switch (UT) {
501 default:
502 return StringRef();
503#define HANDLE_DW_UT(ID, NAME) \
504 case DW_UT_##NAME: \
505 return "DW_UT_" #NAME;
Zachary Turner264b5d92017-06-07 03:48:56 +0000506#include "llvm/BinaryFormat/Dwarf.def"
Paul Robinsoncddd6042017-02-28 20:24:55 +0000507 }
508}
509
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000510StringRef llvm::dwarf::AtomTypeString(unsigned AT) {
Eric Christophercf7289f2013-09-05 18:20:16 +0000511 switch (AT) {
512 case dwarf::DW_ATOM_null:
513 return "DW_ATOM_null";
514 case dwarf::DW_ATOM_die_offset:
515 return "DW_ATOM_die_offset";
516 case DW_ATOM_cu_offset:
517 return "DW_ATOM_cu_offset";
518 case DW_ATOM_die_tag:
519 return "DW_ATOM_die_tag";
520 case DW_ATOM_type_flags:
Jonas Devlieghere2c14b152018-01-25 11:19:08 +0000521 case DW_ATOM_type_type_flags:
Eric Christophercf7289f2013-09-05 18:20:16 +0000522 return "DW_ATOM_type_flags";
Jonas Devlieghere2c14b152018-01-25 11:19:08 +0000523 case DW_ATOM_qual_name_hash:
524 return "DW_ATOM_qual_name_hash";
Eric Christophercf7289f2013-09-05 18:20:16 +0000525 }
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000526 return StringRef();
Eric Christophercf7289f2013-09-05 18:20:16 +0000527}
David Blaikied0a869d2013-09-19 22:19:37 +0000528
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000529StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) {
David Blaikied0a869d2013-09-19 22:19:37 +0000530 switch (Kind) {
531 case GIEK_NONE:
532 return "NONE";
533 case GIEK_TYPE:
534 return "TYPE";
535 case GIEK_VARIABLE:
536 return "VARIABLE";
537 case GIEK_FUNCTION:
538 return "FUNCTION";
539 case GIEK_OTHER:
540 return "OTHER";
541 case GIEK_UNUSED5:
542 return "UNUSED5";
543 case GIEK_UNUSED6:
544 return "UNUSED6";
545 case GIEK_UNUSED7:
546 return "UNUSED7";
547 }
548 llvm_unreachable("Unknown GDBIndexEntryKind value");
549}
550
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000551StringRef
552llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) {
David Blaikied0a869d2013-09-19 22:19:37 +0000553 switch (Linkage) {
554 case GIEL_EXTERNAL:
555 return "EXTERNAL";
556 case GIEL_STATIC:
557 return "STATIC";
558 }
559 llvm_unreachable("Unknown GDBIndexEntryLinkage value");
560}
Frederic Riss878065b2014-09-04 19:39:20 +0000561
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000562StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {
Frederic Riss878065b2014-09-04 19:39:20 +0000563 switch (Attr) {
564 case DW_AT_accessibility:
565 return AccessibilityString(Val);
566 case DW_AT_virtuality:
567 return VirtualityString(Val);
568 case DW_AT_language:
569 return LanguageString(Val);
570 case DW_AT_encoding:
571 return AttributeEncodingString(Val);
572 case DW_AT_decimal_sign:
573 return DecimalSignString(Val);
574 case DW_AT_endianity:
575 return EndianityString(Val);
576 case DW_AT_visibility:
577 return VisibilityString(Val);
578 case DW_AT_identifier_case:
579 return CaseString(Val);
580 case DW_AT_calling_convention:
581 return ConventionString(Val);
582 case DW_AT_inline:
583 return InlineCodeString(Val);
584 case DW_AT_ordering:
585 return ArrayOrderString(Val);
Jonas Devlieghere8afd9262018-07-13 16:06:17 +0000586 case DW_AT_APPLE_runtime_class:
587 return LanguageString(Val);
Frederic Riss878065b2014-09-04 19:39:20 +0000588 }
589
Mehdi Amini149f6ea2016-10-05 05:59:29 +0000590 return StringRef();
Frederic Riss878065b2014-09-04 19:39:20 +0000591}
Paul Robinson70b34532017-04-20 19:16:51 +0000592
Jonas Devlieghere327e7a12018-07-13 17:21:51 +0000593StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) {
594 switch (Atom) {
595 case DW_ATOM_null:
596 return "NULL";
597 case DW_ATOM_die_tag:
598 return TagString(Val);
599 }
600
601 return StringRef();
602}
603
Pavel Labath44197df2018-01-22 09:41:36 +0000604StringRef llvm::dwarf::IndexString(unsigned Idx) {
605 switch (Idx) {
606 default:
607 return StringRef();
608#define HANDLE_DW_IDX(ID, NAME) \
609 case DW_IDX_##NAME: \
610 return "DW_IDX_" #NAME;
611#include "llvm/BinaryFormat/Dwarf.def"
612 }
613}
614
Pavel Labath322711f2018-03-14 09:39:54 +0000615Optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form,
616 FormParams Params) {
617 switch (Form) {
618 case DW_FORM_addr:
619 if (Params)
620 return Params.AddrSize;
621 return None;
622
623 case DW_FORM_block: // ULEB128 length L followed by L bytes.
624 case DW_FORM_block1: // 1 byte length L followed by L bytes.
625 case DW_FORM_block2: // 2 byte length L followed by L bytes.
626 case DW_FORM_block4: // 4 byte length L followed by L bytes.
627 case DW_FORM_string: // C-string with null terminator.
628 case DW_FORM_sdata: // SLEB128.
629 case DW_FORM_udata: // ULEB128.
630 case DW_FORM_ref_udata: // ULEB128.
631 case DW_FORM_indirect: // ULEB128.
632 case DW_FORM_exprloc: // ULEB128 length L followed by L bytes.
633 case DW_FORM_strx: // ULEB128.
634 case DW_FORM_addrx: // ULEB128.
635 case DW_FORM_loclistx: // ULEB128.
636 case DW_FORM_rnglistx: // ULEB128.
637 case DW_FORM_GNU_addr_index: // ULEB128.
638 case DW_FORM_GNU_str_index: // ULEB128.
639 return None;
640
641 case DW_FORM_ref_addr:
642 if (Params)
643 return Params.getRefAddrByteSize();
644 return None;
645
646 case DW_FORM_flag:
647 case DW_FORM_data1:
648 case DW_FORM_ref1:
649 case DW_FORM_strx1:
650 case DW_FORM_addrx1:
651 return 1;
652
653 case DW_FORM_data2:
654 case DW_FORM_ref2:
655 case DW_FORM_strx2:
656 case DW_FORM_addrx2:
657 return 2;
658
659 case DW_FORM_strx3:
660 return 3;
661
662 case DW_FORM_data4:
663 case DW_FORM_ref4:
664 case DW_FORM_ref_sup4:
665 case DW_FORM_strx4:
666 case DW_FORM_addrx4:
667 return 4;
668
669 case DW_FORM_strp:
670 case DW_FORM_GNU_ref_alt:
671 case DW_FORM_GNU_strp_alt:
672 case DW_FORM_line_strp:
673 case DW_FORM_sec_offset:
674 case DW_FORM_strp_sup:
675 if (Params)
676 return Params.getDwarfOffsetByteSize();
677 return None;
678
679 case DW_FORM_data8:
680 case DW_FORM_ref8:
681 case DW_FORM_ref_sig8:
682 case DW_FORM_ref_sup8:
683 return 8;
684
685 case DW_FORM_flag_present:
686 return 0;
687
688 case DW_FORM_data16:
689 return 16;
690
691 case DW_FORM_implicit_const:
692 // The implicit value is stored in the abbreviation as a SLEB128, and
693 // there no data in debug info.
694 return 0;
695
696 default:
697 break;
698 }
699 return None;
700}
701
Paul Robinson70b34532017-04-20 19:16:51 +0000702bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version,
703 bool ExtensionsOk) {
704 if (FormVendor(F) == DWARF_VENDOR_DWARF) {
705 unsigned FV = FormVersion(F);
706 return FV > 0 && FV <= Version;
707 }
708 return ExtensionsOk;
709}
Pavel Labath9025f952018-03-21 11:46:37 +0000710
Pavel Labath646ab412018-03-21 12:18:03 +0000711constexpr char llvm::dwarf::EnumTraits<Attribute>::Type[];
712constexpr char llvm::dwarf::EnumTraits<Form>::Type[];
713constexpr char llvm::dwarf::EnumTraits<Index>::Type[];
714constexpr char llvm::dwarf::EnumTraits<Tag>::Type[];