Dwarf.cpp 24 KB

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