Dwarf.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. //===-- llvm/BinaryFormat/Dwarf.cpp - Dwarf Framework ------------*- C++-*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file contains support for generic dwarf information.
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/BinaryFormat/Dwarf.h"
  14. #include "llvm/ADT/StringSwitch.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) \
  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) \
  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) \
  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) \
  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_fragment:
  133. return "DW_OP_LLVM_fragment";
  134. }
  135. }
  136. unsigned llvm::dwarf::getOperationEncoding(StringRef OperationEncodingString) {
  137. return StringSwitch<unsigned>(OperationEncodingString)
  138. #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
  139. .Case("DW_OP_" #NAME, DW_OP_##NAME)
  140. #include "llvm/BinaryFormat/Dwarf.def"
  141. .Case("DW_OP_LLVM_fragment", DW_OP_LLVM_fragment)
  142. .Default(0);
  143. }
  144. unsigned llvm::dwarf::OperationVersion(dwarf::LocationAtom Op) {
  145. switch (Op) {
  146. default:
  147. return 0;
  148. #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
  149. case DW_OP_##NAME: \
  150. return VERSION;
  151. #include "llvm/BinaryFormat/Dwarf.def"
  152. }
  153. }
  154. unsigned llvm::dwarf::OperationVendor(dwarf::LocationAtom Op) {
  155. switch (Op) {
  156. default:
  157. return 0;
  158. #define HANDLE_DW_OP(ID, NAME, VERSION, VENDOR) \
  159. case DW_OP_##NAME: \
  160. return DWARF_VENDOR_##VENDOR;
  161. #include "llvm/BinaryFormat/Dwarf.def"
  162. }
  163. }
  164. StringRef llvm::dwarf::AttributeEncodingString(unsigned Encoding) {
  165. switch (Encoding) {
  166. default:
  167. return StringRef();
  168. #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
  169. case DW_ATE_##NAME: \
  170. return "DW_ATE_" #NAME;
  171. #include "llvm/BinaryFormat/Dwarf.def"
  172. }
  173. }
  174. unsigned llvm::dwarf::getAttributeEncoding(StringRef EncodingString) {
  175. return StringSwitch<unsigned>(EncodingString)
  176. #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
  177. .Case("DW_ATE_" #NAME, DW_ATE_##NAME)
  178. #include "llvm/BinaryFormat/Dwarf.def"
  179. .Default(0);
  180. }
  181. unsigned llvm::dwarf::AttributeEncodingVersion(dwarf::TypeKind ATE) {
  182. switch (ATE) {
  183. default:
  184. return 0;
  185. #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
  186. case DW_ATE_##NAME: \
  187. return VERSION;
  188. #include "llvm/BinaryFormat/Dwarf.def"
  189. }
  190. }
  191. unsigned llvm::dwarf::AttributeEncodingVendor(dwarf::TypeKind ATE) {
  192. switch (ATE) {
  193. default:
  194. return 0;
  195. #define HANDLE_DW_ATE(ID, NAME, VERSION, VENDOR) \
  196. case DW_ATE_##NAME: \
  197. return DWARF_VENDOR_##VENDOR;
  198. #include "llvm/BinaryFormat/Dwarf.def"
  199. }
  200. }
  201. StringRef llvm::dwarf::DecimalSignString(unsigned Sign) {
  202. switch (Sign) {
  203. case DW_DS_unsigned:
  204. return "DW_DS_unsigned";
  205. case DW_DS_leading_overpunch:
  206. return "DW_DS_leading_overpunch";
  207. case DW_DS_trailing_overpunch:
  208. return "DW_DS_trailing_overpunch";
  209. case DW_DS_leading_separate:
  210. return "DW_DS_leading_separate";
  211. case DW_DS_trailing_separate:
  212. return "DW_DS_trailing_separate";
  213. }
  214. return StringRef();
  215. }
  216. StringRef llvm::dwarf::EndianityString(unsigned Endian) {
  217. switch (Endian) {
  218. case DW_END_default:
  219. return "DW_END_default";
  220. case DW_END_big:
  221. return "DW_END_big";
  222. case DW_END_little:
  223. return "DW_END_little";
  224. case DW_END_lo_user:
  225. return "DW_END_lo_user";
  226. case DW_END_hi_user:
  227. return "DW_END_hi_user";
  228. }
  229. return StringRef();
  230. }
  231. StringRef llvm::dwarf::AccessibilityString(unsigned Access) {
  232. switch (Access) {
  233. // Accessibility codes
  234. case DW_ACCESS_public:
  235. return "DW_ACCESS_public";
  236. case DW_ACCESS_protected:
  237. return "DW_ACCESS_protected";
  238. case DW_ACCESS_private:
  239. return "DW_ACCESS_private";
  240. }
  241. return StringRef();
  242. }
  243. StringRef llvm::dwarf::VisibilityString(unsigned Visibility) {
  244. switch (Visibility) {
  245. case DW_VIS_local:
  246. return "DW_VIS_local";
  247. case DW_VIS_exported:
  248. return "DW_VIS_exported";
  249. case DW_VIS_qualified:
  250. return "DW_VIS_qualified";
  251. }
  252. return StringRef();
  253. }
  254. StringRef llvm::dwarf::VirtualityString(unsigned Virtuality) {
  255. switch (Virtuality) {
  256. default:
  257. return StringRef();
  258. #define HANDLE_DW_VIRTUALITY(ID, NAME) \
  259. case DW_VIRTUALITY_##NAME: \
  260. return "DW_VIRTUALITY_" #NAME;
  261. #include "llvm/BinaryFormat/Dwarf.def"
  262. }
  263. }
  264. unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) {
  265. return StringSwitch<unsigned>(VirtualityString)
  266. #define HANDLE_DW_VIRTUALITY(ID, NAME) \
  267. .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME)
  268. #include "llvm/BinaryFormat/Dwarf.def"
  269. .Default(DW_VIRTUALITY_invalid);
  270. }
  271. StringRef llvm::dwarf::LanguageString(unsigned Language) {
  272. switch (Language) {
  273. default:
  274. return StringRef();
  275. #define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
  276. case DW_LANG_##NAME: \
  277. return "DW_LANG_" #NAME;
  278. #include "llvm/BinaryFormat/Dwarf.def"
  279. }
  280. }
  281. unsigned llvm::dwarf::getLanguage(StringRef LanguageString) {
  282. return StringSwitch<unsigned>(LanguageString)
  283. #define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
  284. .Case("DW_LANG_" #NAME, DW_LANG_##NAME)
  285. #include "llvm/BinaryFormat/Dwarf.def"
  286. .Default(0);
  287. }
  288. unsigned llvm::dwarf::LanguageVersion(dwarf::SourceLanguage Lang) {
  289. switch (Lang) {
  290. default:
  291. return 0;
  292. #define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
  293. case DW_LANG_##NAME: \
  294. return VERSION;
  295. #include "llvm/BinaryFormat/Dwarf.def"
  296. }
  297. }
  298. unsigned llvm::dwarf::LanguageVendor(dwarf::SourceLanguage Lang) {
  299. switch (Lang) {
  300. default:
  301. return 0;
  302. #define HANDLE_DW_LANG(ID, NAME, VERSION, VENDOR) \
  303. case DW_LANG_##NAME: \
  304. return DWARF_VENDOR_##VENDOR;
  305. #include "llvm/BinaryFormat/Dwarf.def"
  306. }
  307. }
  308. StringRef llvm::dwarf::CaseString(unsigned Case) {
  309. switch (Case) {
  310. case DW_ID_case_sensitive:
  311. return "DW_ID_case_sensitive";
  312. case DW_ID_up_case:
  313. return "DW_ID_up_case";
  314. case DW_ID_down_case:
  315. return "DW_ID_down_case";
  316. case DW_ID_case_insensitive:
  317. return "DW_ID_case_insensitive";
  318. }
  319. return StringRef();
  320. }
  321. StringRef llvm::dwarf::ConventionString(unsigned CC) {
  322. switch (CC) {
  323. default:
  324. return StringRef();
  325. #define HANDLE_DW_CC(ID, NAME) \
  326. case DW_CC_##NAME: \
  327. return "DW_CC_" #NAME;
  328. #include "llvm/BinaryFormat/Dwarf.def"
  329. }
  330. }
  331. unsigned llvm::dwarf::getCallingConvention(StringRef CCString) {
  332. return StringSwitch<unsigned>(CCString)
  333. #define HANDLE_DW_CC(ID, NAME) .Case("DW_CC_" #NAME, DW_CC_##NAME)
  334. #include "llvm/BinaryFormat/Dwarf.def"
  335. .Default(0);
  336. }
  337. StringRef llvm::dwarf::InlineCodeString(unsigned Code) {
  338. switch (Code) {
  339. case DW_INL_not_inlined:
  340. return "DW_INL_not_inlined";
  341. case DW_INL_inlined:
  342. return "DW_INL_inlined";
  343. case DW_INL_declared_not_inlined:
  344. return "DW_INL_declared_not_inlined";
  345. case DW_INL_declared_inlined:
  346. return "DW_INL_declared_inlined";
  347. }
  348. return StringRef();
  349. }
  350. StringRef llvm::dwarf::ArrayOrderString(unsigned Order) {
  351. switch (Order) {
  352. case DW_ORD_row_major:
  353. return "DW_ORD_row_major";
  354. case DW_ORD_col_major:
  355. return "DW_ORD_col_major";
  356. }
  357. return StringRef();
  358. }
  359. StringRef llvm::dwarf::LNStandardString(unsigned Standard) {
  360. switch (Standard) {
  361. default:
  362. return StringRef();
  363. #define HANDLE_DW_LNS(ID, NAME) \
  364. case DW_LNS_##NAME: \
  365. return "DW_LNS_" #NAME;
  366. #include "llvm/BinaryFormat/Dwarf.def"
  367. }
  368. }
  369. StringRef llvm::dwarf::LNExtendedString(unsigned Encoding) {
  370. switch (Encoding) {
  371. default:
  372. return StringRef();
  373. #define HANDLE_DW_LNE(ID, NAME) \
  374. case DW_LNE_##NAME: \
  375. return "DW_LNE_" #NAME;
  376. #include "llvm/BinaryFormat/Dwarf.def"
  377. }
  378. }
  379. StringRef llvm::dwarf::MacinfoString(unsigned Encoding) {
  380. switch (Encoding) {
  381. // Macinfo Type Encodings
  382. case DW_MACINFO_define:
  383. return "DW_MACINFO_define";
  384. case DW_MACINFO_undef:
  385. return "DW_MACINFO_undef";
  386. case DW_MACINFO_start_file:
  387. return "DW_MACINFO_start_file";
  388. case DW_MACINFO_end_file:
  389. return "DW_MACINFO_end_file";
  390. case DW_MACINFO_vendor_ext:
  391. return "DW_MACINFO_vendor_ext";
  392. case DW_MACINFO_invalid:
  393. return "DW_MACINFO_invalid";
  394. }
  395. return StringRef();
  396. }
  397. unsigned llvm::dwarf::getMacinfo(StringRef MacinfoString) {
  398. return StringSwitch<unsigned>(MacinfoString)
  399. .Case("DW_MACINFO_define", DW_MACINFO_define)
  400. .Case("DW_MACINFO_undef", DW_MACINFO_undef)
  401. .Case("DW_MACINFO_start_file", DW_MACINFO_start_file)
  402. .Case("DW_MACINFO_end_file", DW_MACINFO_end_file)
  403. .Case("DW_MACINFO_vendor_ext", DW_MACINFO_vendor_ext)
  404. .Default(DW_MACINFO_invalid);
  405. }
  406. StringRef llvm::dwarf::RangeListEncodingString(unsigned Encoding) {
  407. switch (Encoding) {
  408. default:
  409. return StringRef();
  410. #define HANDLE_DW_RLE(ID, NAME) \
  411. case DW_RLE_##NAME: \
  412. return "DW_RLE_" #NAME;
  413. #include "llvm/BinaryFormat/Dwarf.def"
  414. }
  415. }
  416. StringRef llvm::dwarf::CallFrameString(unsigned Encoding) {
  417. switch (Encoding) {
  418. default:
  419. return StringRef();
  420. #define HANDLE_DW_CFA(ID, NAME) \
  421. case DW_CFA_##NAME: \
  422. return "DW_CFA_" #NAME;
  423. #include "llvm/BinaryFormat/Dwarf.def"
  424. }
  425. }
  426. StringRef llvm::dwarf::ApplePropertyString(unsigned Prop) {
  427. switch (Prop) {
  428. default:
  429. return StringRef();
  430. #define HANDLE_DW_APPLE_PROPERTY(ID, NAME) \
  431. case DW_APPLE_PROPERTY_##NAME: \
  432. return "DW_APPLE_PROPERTY_" #NAME;
  433. #include "llvm/BinaryFormat/Dwarf.def"
  434. }
  435. }
  436. StringRef llvm::dwarf::UnitTypeString(unsigned UT) {
  437. switch (UT) {
  438. default:
  439. return StringRef();
  440. #define HANDLE_DW_UT(ID, NAME) \
  441. case DW_UT_##NAME: \
  442. return "DW_UT_" #NAME;
  443. #include "llvm/BinaryFormat/Dwarf.def"
  444. }
  445. }
  446. StringRef llvm::dwarf::AtomTypeString(unsigned AT) {
  447. switch (AT) {
  448. case dwarf::DW_ATOM_null:
  449. return "DW_ATOM_null";
  450. case dwarf::DW_ATOM_die_offset:
  451. return "DW_ATOM_die_offset";
  452. case DW_ATOM_cu_offset:
  453. return "DW_ATOM_cu_offset";
  454. case DW_ATOM_die_tag:
  455. return "DW_ATOM_die_tag";
  456. case DW_ATOM_type_flags:
  457. case DW_ATOM_type_type_flags:
  458. return "DW_ATOM_type_flags";
  459. case DW_ATOM_qual_name_hash:
  460. return "DW_ATOM_qual_name_hash";
  461. }
  462. return StringRef();
  463. }
  464. StringRef llvm::dwarf::GDBIndexEntryKindString(GDBIndexEntryKind Kind) {
  465. switch (Kind) {
  466. case GIEK_NONE:
  467. return "NONE";
  468. case GIEK_TYPE:
  469. return "TYPE";
  470. case GIEK_VARIABLE:
  471. return "VARIABLE";
  472. case GIEK_FUNCTION:
  473. return "FUNCTION";
  474. case GIEK_OTHER:
  475. return "OTHER";
  476. case GIEK_UNUSED5:
  477. return "UNUSED5";
  478. case GIEK_UNUSED6:
  479. return "UNUSED6";
  480. case GIEK_UNUSED7:
  481. return "UNUSED7";
  482. }
  483. llvm_unreachable("Unknown GDBIndexEntryKind value");
  484. }
  485. StringRef
  486. llvm::dwarf::GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage) {
  487. switch (Linkage) {
  488. case GIEL_EXTERNAL:
  489. return "EXTERNAL";
  490. case GIEL_STATIC:
  491. return "STATIC";
  492. }
  493. llvm_unreachable("Unknown GDBIndexEntryLinkage value");
  494. }
  495. StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {
  496. switch (Attr) {
  497. case DW_AT_accessibility:
  498. return AccessibilityString(Val);
  499. case DW_AT_virtuality:
  500. return VirtualityString(Val);
  501. case DW_AT_language:
  502. return LanguageString(Val);
  503. case DW_AT_encoding:
  504. return AttributeEncodingString(Val);
  505. case DW_AT_decimal_sign:
  506. return DecimalSignString(Val);
  507. case DW_AT_endianity:
  508. return EndianityString(Val);
  509. case DW_AT_visibility:
  510. return VisibilityString(Val);
  511. case DW_AT_identifier_case:
  512. return CaseString(Val);
  513. case DW_AT_calling_convention:
  514. return ConventionString(Val);
  515. case DW_AT_inline:
  516. return InlineCodeString(Val);
  517. case DW_AT_ordering:
  518. return ArrayOrderString(Val);
  519. }
  520. return StringRef();
  521. }
  522. StringRef llvm::dwarf::IndexString(unsigned Idx) {
  523. switch (Idx) {
  524. default:
  525. return StringRef();
  526. #define HANDLE_DW_IDX(ID, NAME) \
  527. case DW_IDX_##NAME: \
  528. return "DW_IDX_" #NAME;
  529. #include "llvm/BinaryFormat/Dwarf.def"
  530. }
  531. }
  532. Optional<uint8_t> llvm::dwarf::getFixedFormByteSize(dwarf::Form Form,
  533. FormParams Params) {
  534. switch (Form) {
  535. case DW_FORM_addr:
  536. if (Params)
  537. return Params.AddrSize;
  538. return None;
  539. case DW_FORM_block: // ULEB128 length L followed by L bytes.
  540. case DW_FORM_block1: // 1 byte length L followed by L bytes.
  541. case DW_FORM_block2: // 2 byte length L followed by L bytes.
  542. case DW_FORM_block4: // 4 byte length L followed by L bytes.
  543. case DW_FORM_string: // C-string with null terminator.
  544. case DW_FORM_sdata: // SLEB128.
  545. case DW_FORM_udata: // ULEB128.
  546. case DW_FORM_ref_udata: // ULEB128.
  547. case DW_FORM_indirect: // ULEB128.
  548. case DW_FORM_exprloc: // ULEB128 length L followed by L bytes.
  549. case DW_FORM_strx: // ULEB128.
  550. case DW_FORM_addrx: // ULEB128.
  551. case DW_FORM_loclistx: // ULEB128.
  552. case DW_FORM_rnglistx: // ULEB128.
  553. case DW_FORM_GNU_addr_index: // ULEB128.
  554. case DW_FORM_GNU_str_index: // ULEB128.
  555. return None;
  556. case DW_FORM_ref_addr:
  557. if (Params)
  558. return Params.getRefAddrByteSize();
  559. return None;
  560. case DW_FORM_flag:
  561. case DW_FORM_data1:
  562. case DW_FORM_ref1:
  563. case DW_FORM_strx1:
  564. case DW_FORM_addrx1:
  565. return 1;
  566. case DW_FORM_data2:
  567. case DW_FORM_ref2:
  568. case DW_FORM_strx2:
  569. case DW_FORM_addrx2:
  570. return 2;
  571. case DW_FORM_strx3:
  572. return 3;
  573. case DW_FORM_data4:
  574. case DW_FORM_ref4:
  575. case DW_FORM_ref_sup4:
  576. case DW_FORM_strx4:
  577. case DW_FORM_addrx4:
  578. return 4;
  579. case DW_FORM_strp:
  580. case DW_FORM_GNU_ref_alt:
  581. case DW_FORM_GNU_strp_alt:
  582. case DW_FORM_line_strp:
  583. case DW_FORM_sec_offset:
  584. case DW_FORM_strp_sup:
  585. if (Params)
  586. return Params.getDwarfOffsetByteSize();
  587. return None;
  588. case DW_FORM_data8:
  589. case DW_FORM_ref8:
  590. case DW_FORM_ref_sig8:
  591. case DW_FORM_ref_sup8:
  592. return 8;
  593. case DW_FORM_flag_present:
  594. return 0;
  595. case DW_FORM_data16:
  596. return 16;
  597. case DW_FORM_implicit_const:
  598. // The implicit value is stored in the abbreviation as a SLEB128, and
  599. // there no data in debug info.
  600. return 0;
  601. default:
  602. break;
  603. }
  604. return None;
  605. }
  606. bool llvm::dwarf::isValidFormForVersion(Form F, unsigned Version,
  607. bool ExtensionsOk) {
  608. if (FormVendor(F) == DWARF_VENDOR_DWARF) {
  609. unsigned FV = FormVersion(F);
  610. return FV > 0 && FV <= Version;
  611. }
  612. return ExtensionsOk;
  613. }