1 //===-- DWARFDefines.cpp ----------------------------------------*- 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 #include "DWARFDefines.h" 10 #include "lldb/Utility/ConstString.h" 11 #include <cstdio> 12 #include <cstring> 13 #include <string> 14 15 namespace lldb_private { 16 17 const char *DW_TAG_value_to_name(uint32_t val) { 18 static char invalid[100]; 19 20 if (val == 0) 21 return "NULL"; 22 23 llvm::StringRef llvmstr = llvm::dwarf::TagString(val); 24 if (llvmstr.empty()) { 25 snprintf(invalid, sizeof(invalid), "Unknown DW_TAG constant: 0x%x", val); 26 return invalid; 27 } 28 return llvmstr.data(); 29 } 30 31 const char *DW_CHILDREN_value_to_name(uint8_t val) { 32 static char invalid[100]; 33 llvm::StringRef llvmstr = llvm::dwarf::ChildrenString(val); 34 if (llvmstr.empty()) { 35 snprintf(invalid, sizeof(invalid), "Unknown DW_CHILDREN constant: 0x%x", 36 val); 37 return invalid; 38 } 39 return llvmstr.data(); 40 } 41 42 const char *DW_AT_value_to_name(uint32_t val) { 43 static char invalid[100]; 44 llvm::StringRef llvmstr = llvm::dwarf::AttributeString(val); 45 if (llvmstr.empty()) { 46 snprintf(invalid, sizeof(invalid), "Unknown DW_AT constant: 0x%x", val); 47 return invalid; 48 } 49 return llvmstr.data(); 50 } 51 52 const char *DW_FORM_value_to_name(uint32_t val) { 53 static char invalid[100]; 54 llvm::StringRef llvmstr = llvm::dwarf::FormEncodingString(val); 55 if (llvmstr.empty()) { 56 snprintf(invalid, sizeof(invalid), "Unknown DW_FORM constant: 0x%x", val); 57 return invalid; 58 } 59 return llvmstr.data(); 60 } 61 62 const char *DW_OP_value_to_name(uint32_t val) { 63 static char invalid[100]; 64 llvm::StringRef llvmstr = llvm::dwarf::OperationEncodingString(val); 65 if (llvmstr.empty()) { 66 snprintf(invalid, sizeof(invalid), "Unknown DW_OP constant: 0x%x", val); 67 return invalid; 68 } 69 return llvmstr.data(); 70 } 71 72 DRC_class DW_OP_value_to_class(uint32_t val) { 73 switch (val) { 74 case 0x03: 75 return DRC_ONEOPERAND; 76 case 0x06: 77 return DRC_ZEROOPERANDS; 78 case 0x08: 79 return DRC_ONEOPERAND; 80 case 0x09: 81 return DRC_ONEOPERAND; 82 case 0x0a: 83 return DRC_ONEOPERAND; 84 case 0x0b: 85 return DRC_ONEOPERAND; 86 case 0x0c: 87 return DRC_ONEOPERAND; 88 case 0x0d: 89 return DRC_ONEOPERAND; 90 case 0x0e: 91 return DRC_ONEOPERAND; 92 case 0x0f: 93 return DRC_ONEOPERAND; 94 case 0x10: 95 return DRC_ONEOPERAND; 96 case 0x11: 97 return DRC_ONEOPERAND; 98 case 0x12: 99 return DRC_ZEROOPERANDS; 100 case 0x13: 101 return DRC_ZEROOPERANDS; 102 case 0x14: 103 return DRC_ZEROOPERANDS; 104 case 0x15: 105 return DRC_ONEOPERAND; 106 case 0x16: 107 return DRC_ZEROOPERANDS; 108 case 0x17: 109 return DRC_ZEROOPERANDS; 110 case 0x18: 111 return DRC_ZEROOPERANDS; 112 case 0x19: 113 return DRC_ZEROOPERANDS; 114 case 0x1a: 115 return DRC_ZEROOPERANDS; 116 case 0x1b: 117 return DRC_ZEROOPERANDS; 118 case 0x1c: 119 return DRC_ZEROOPERANDS; 120 case 0x1d: 121 return DRC_ZEROOPERANDS; 122 case 0x1e: 123 return DRC_ZEROOPERANDS; 124 case 0x1f: 125 return DRC_ZEROOPERANDS; 126 case 0x20: 127 return DRC_ZEROOPERANDS; 128 case 0x21: 129 return DRC_ZEROOPERANDS; 130 case 0x22: 131 return DRC_ZEROOPERANDS; 132 case 0x23: 133 return DRC_ONEOPERAND; 134 case 0x24: 135 return DRC_ZEROOPERANDS; 136 case 0x25: 137 return DRC_ZEROOPERANDS; 138 case 0x26: 139 return DRC_ZEROOPERANDS; 140 case 0x27: 141 return DRC_ZEROOPERANDS; 142 case 0x2f: 143 return DRC_ONEOPERAND; 144 case 0x28: 145 return DRC_ONEOPERAND; 146 case 0x29: 147 return DRC_ZEROOPERANDS; 148 case 0x2a: 149 return DRC_ZEROOPERANDS; 150 case 0x2b: 151 return DRC_ZEROOPERANDS; 152 case 0x2c: 153 return DRC_ZEROOPERANDS; 154 case 0x2d: 155 return DRC_ZEROOPERANDS; 156 case 0x2e: 157 return DRC_ZEROOPERANDS; 158 case 0x30: 159 return DRC_ZEROOPERANDS; 160 case 0x31: 161 return DRC_ZEROOPERANDS; 162 case 0x32: 163 return DRC_ZEROOPERANDS; 164 case 0x33: 165 return DRC_ZEROOPERANDS; 166 case 0x34: 167 return DRC_ZEROOPERANDS; 168 case 0x35: 169 return DRC_ZEROOPERANDS; 170 case 0x36: 171 return DRC_ZEROOPERANDS; 172 case 0x37: 173 return DRC_ZEROOPERANDS; 174 case 0x38: 175 return DRC_ZEROOPERANDS; 176 case 0x39: 177 return DRC_ZEROOPERANDS; 178 case 0x3a: 179 return DRC_ZEROOPERANDS; 180 case 0x3b: 181 return DRC_ZEROOPERANDS; 182 case 0x3c: 183 return DRC_ZEROOPERANDS; 184 case 0x3d: 185 return DRC_ZEROOPERANDS; 186 case 0x3e: 187 return DRC_ZEROOPERANDS; 188 case 0x3f: 189 return DRC_ZEROOPERANDS; 190 case 0x40: 191 return DRC_ZEROOPERANDS; 192 case 0x41: 193 return DRC_ZEROOPERANDS; 194 case 0x42: 195 return DRC_ZEROOPERANDS; 196 case 0x43: 197 return DRC_ZEROOPERANDS; 198 case 0x44: 199 return DRC_ZEROOPERANDS; 200 case 0x45: 201 return DRC_ZEROOPERANDS; 202 case 0x46: 203 return DRC_ZEROOPERANDS; 204 case 0x47: 205 return DRC_ZEROOPERANDS; 206 case 0x48: 207 return DRC_ZEROOPERANDS; 208 case 0x49: 209 return DRC_ZEROOPERANDS; 210 case 0x4a: 211 return DRC_ZEROOPERANDS; 212 case 0x4b: 213 return DRC_ZEROOPERANDS; 214 case 0x4c: 215 return DRC_ZEROOPERANDS; 216 case 0x4d: 217 return DRC_ZEROOPERANDS; 218 case 0x4e: 219 return DRC_ZEROOPERANDS; 220 case 0x4f: 221 return DRC_ZEROOPERANDS; 222 case 0x50: 223 return DRC_ZEROOPERANDS; 224 case 0x51: 225 return DRC_ZEROOPERANDS; 226 case 0x52: 227 return DRC_ZEROOPERANDS; 228 case 0x53: 229 return DRC_ZEROOPERANDS; 230 case 0x54: 231 return DRC_ZEROOPERANDS; 232 case 0x55: 233 return DRC_ZEROOPERANDS; 234 case 0x56: 235 return DRC_ZEROOPERANDS; 236 case 0x57: 237 return DRC_ZEROOPERANDS; 238 case 0x58: 239 return DRC_ZEROOPERANDS; 240 case 0x59: 241 return DRC_ZEROOPERANDS; 242 case 0x5a: 243 return DRC_ZEROOPERANDS; 244 case 0x5b: 245 return DRC_ZEROOPERANDS; 246 case 0x5c: 247 return DRC_ZEROOPERANDS; 248 case 0x5d: 249 return DRC_ZEROOPERANDS; 250 case 0x5e: 251 return DRC_ZEROOPERANDS; 252 case 0x5f: 253 return DRC_ZEROOPERANDS; 254 case 0x60: 255 return DRC_ZEROOPERANDS; 256 case 0x61: 257 return DRC_ZEROOPERANDS; 258 case 0x62: 259 return DRC_ZEROOPERANDS; 260 case 0x63: 261 return DRC_ZEROOPERANDS; 262 case 0x64: 263 return DRC_ZEROOPERANDS; 264 case 0x65: 265 return DRC_ZEROOPERANDS; 266 case 0x66: 267 return DRC_ZEROOPERANDS; 268 case 0x67: 269 return DRC_ZEROOPERANDS; 270 case 0x68: 271 return DRC_ZEROOPERANDS; 272 case 0x69: 273 return DRC_ZEROOPERANDS; 274 case 0x6a: 275 return DRC_ZEROOPERANDS; 276 case 0x6b: 277 return DRC_ZEROOPERANDS; 278 case 0x6c: 279 return DRC_ZEROOPERANDS; 280 case 0x6d: 281 return DRC_ZEROOPERANDS; 282 case 0x6e: 283 return DRC_ZEROOPERANDS; 284 case 0x6f: 285 return DRC_ZEROOPERANDS; 286 case 0x70: 287 return DRC_ONEOPERAND; 288 case 0x71: 289 return DRC_ONEOPERAND; 290 case 0x72: 291 return DRC_ONEOPERAND; 292 case 0x73: 293 return DRC_ONEOPERAND; 294 case 0x74: 295 return DRC_ONEOPERAND; 296 case 0x75: 297 return DRC_ONEOPERAND; 298 case 0x76: 299 return DRC_ONEOPERAND; 300 case 0x77: 301 return DRC_ONEOPERAND; 302 case 0x78: 303 return DRC_ONEOPERAND; 304 case 0x79: 305 return DRC_ONEOPERAND; 306 case 0x7a: 307 return DRC_ONEOPERAND; 308 case 0x7b: 309 return DRC_ONEOPERAND; 310 case 0x7c: 311 return DRC_ONEOPERAND; 312 case 0x7d: 313 return DRC_ONEOPERAND; 314 case 0x7e: 315 return DRC_ONEOPERAND; 316 case 0x7f: 317 return DRC_ONEOPERAND; 318 case 0x80: 319 return DRC_ONEOPERAND; 320 case 0x81: 321 return DRC_ONEOPERAND; 322 case 0x82: 323 return DRC_ONEOPERAND; 324 case 0x83: 325 return DRC_ONEOPERAND; 326 case 0x84: 327 return DRC_ONEOPERAND; 328 case 0x85: 329 return DRC_ONEOPERAND; 330 case 0x86: 331 return DRC_ONEOPERAND; 332 case 0x87: 333 return DRC_ONEOPERAND; 334 case 0x88: 335 return DRC_ONEOPERAND; 336 case 0x89: 337 return DRC_ONEOPERAND; 338 case 0x8a: 339 return DRC_ONEOPERAND; 340 case 0x8b: 341 return DRC_ONEOPERAND; 342 case 0x8c: 343 return DRC_ONEOPERAND; 344 case 0x8d: 345 return DRC_ONEOPERAND; 346 case 0x8e: 347 return DRC_ONEOPERAND; 348 case 0x8f: 349 return DRC_ONEOPERAND; 350 case 0x90: 351 return DRC_ONEOPERAND; 352 case 0x91: 353 return DRC_ONEOPERAND; 354 case 0x92: 355 return DRC_TWOOPERANDS; 356 case 0x93: 357 return DRC_ONEOPERAND; 358 case 0x94: 359 return DRC_ONEOPERAND; 360 case 0x95: 361 return DRC_ONEOPERAND; 362 case 0x96: 363 return DRC_ZEROOPERANDS; 364 case 0x97: 365 return DRC_DWARFv3 | DRC_ZEROOPERANDS; 366 case 0x98: 367 return DRC_DWARFv3 | DRC_ONEOPERAND; 368 case 0x99: 369 return DRC_DWARFv3 | DRC_ONEOPERAND; 370 case 0x9a: 371 return DRC_DWARFv3 | DRC_ONEOPERAND; 372 case 0xf0: 373 return DRC_ZEROOPERANDS; /* DW_OP_APPLE_uninit */ 374 case 0xe0: 375 return 0; 376 case 0xff: 377 return 0; 378 default: 379 return 0; 380 } 381 } 382 383 const char *DW_ATE_value_to_name(uint32_t val) { 384 static char invalid[100]; 385 llvm::StringRef llvmstr = llvm::dwarf::AttributeEncodingString(val); 386 if (llvmstr.empty()) { 387 snprintf(invalid, sizeof(invalid), "Unknown DW_ATE constant: 0x%x", val); 388 return invalid; 389 } 390 return llvmstr.data(); 391 } 392 393 const char *DW_ACCESS_value_to_name(uint32_t val) { 394 static char invalid[100]; 395 396 llvm::StringRef llvmstr = llvm::dwarf::AccessibilityString(val); 397 if (llvmstr.empty()) { 398 snprintf(invalid, sizeof(invalid), "Unknown DW_ACCESS constant: 0x%x", val); 399 return invalid; 400 } 401 return llvmstr.data(); 402 } 403 404 const char *DW_VIS_value_to_name(uint32_t val) { 405 static char invalid[100]; 406 llvm::StringRef llvmstr = llvm::dwarf::VisibilityString(val); 407 if (llvmstr.empty()) { 408 snprintf(invalid, sizeof(invalid), "Unknown DW_VIS constant: 0x%x", val); 409 return invalid; 410 } 411 return llvmstr.data(); 412 } 413 414 const char *DW_VIRTUALITY_value_to_name(uint32_t val) { 415 static char invalid[100]; 416 llvm::StringRef llvmstr = llvm::dwarf::VirtualityString(val); 417 if (llvmstr.empty()) { 418 snprintf(invalid, sizeof(invalid), "Unknown DW_VIRTUALITY constant: 0x%x", 419 val); 420 return invalid; 421 } 422 return llvmstr.data(); 423 } 424 425 const char *DW_LANG_value_to_name(uint32_t val) { 426 static char invalid[100]; 427 llvm::StringRef llvmstr = llvm::dwarf::LanguageString(val); 428 if (llvmstr.empty()) { 429 snprintf(invalid, sizeof(invalid), "Unknown DW_LANG constant: 0x%x", val); 430 return invalid; 431 } 432 return llvmstr.data(); 433 } 434 435 const char *DW_ID_value_to_name(uint32_t val) { 436 static char invalid[100]; 437 llvm::StringRef llvmstr = llvm::dwarf::CaseString(val); 438 if (llvmstr.empty()) { 439 snprintf(invalid, sizeof(invalid), "Unknown DW_ID constant: 0x%x", val); 440 return invalid; 441 } 442 return llvmstr.data(); 443 } 444 445 const char *DW_CC_value_to_name(uint32_t val) { 446 static char invalid[100]; 447 llvm::StringRef llvmstr = llvm::dwarf::ConventionString(val); 448 if (llvmstr.empty()) { 449 snprintf(invalid, sizeof(invalid), "Unknown DW_CC constant: 0x%x", val); 450 return invalid; 451 } 452 return llvmstr.data(); 453 } 454 455 const char *DW_INL_value_to_name(uint32_t val) { 456 static char invalid[100]; 457 llvm::StringRef llvmstr = llvm::dwarf::InlineCodeString(val); 458 if (llvmstr.empty()) { 459 snprintf(invalid, sizeof(invalid), "Unknown DW_INL constant: 0x%x", val); 460 return invalid; 461 } 462 return llvmstr.data(); 463 } 464 465 const char *DW_ORD_value_to_name(uint32_t val) { 466 static char invalid[100]; 467 llvm::StringRef llvmstr = llvm::dwarf::ArrayOrderString(val); 468 if (llvmstr.empty()) { 469 snprintf(invalid, sizeof(invalid), "Unknown DW_ORD constant: 0x%x", val); 470 return invalid; 471 } 472 return llvmstr.data(); 473 } 474 475 const char *DW_LNS_value_to_name(uint32_t val) { 476 static char invalid[100]; 477 llvm::StringRef llvmstr = llvm::dwarf::LNStandardString(val); 478 if (llvmstr.empty()) { 479 snprintf(invalid, sizeof(invalid), "Unknown DW_LNS constant: 0x%x", val); 480 return invalid; 481 } 482 return llvmstr.data(); 483 } 484 485 const char *DW_LNE_value_to_name(uint32_t val) { 486 static char invalid[100]; 487 llvm::StringRef llvmstr = llvm::dwarf::LNExtendedString(val); 488 if (llvmstr.empty()) { 489 snprintf(invalid, sizeof(invalid), "Unknown DW_LNE constant: 0x%x", val); 490 return invalid; 491 } 492 return llvmstr.data(); 493 } 494 495 const char *DW_MACINFO_value_to_name(uint32_t val) { 496 static char invalid[100]; 497 llvm::StringRef llvmstr = llvm::dwarf::MacinfoString(val); 498 if (llvmstr.empty()) { 499 snprintf(invalid, sizeof(invalid), "Unknown DW_MACINFO constant: 0x%x", 500 val); 501 return invalid; 502 } 503 return llvmstr.data(); 504 } 505 506 const char *DW_CFA_value_to_name(uint32_t val, llvm::Triple::ArchType Arch) { 507 static char invalid[100]; 508 llvm::StringRef llvmstr = llvm::dwarf::CallFrameString(val, Arch); 509 if (llvmstr.empty()) { 510 snprintf(invalid, sizeof(invalid), "Unknown DW_CFA constant: 0x%x", val); 511 return invalid; 512 } 513 return llvmstr.data(); 514 } 515 516 DW_TAG_CategoryEnum get_tag_category(uint16_t tag) { 517 switch (tag) { 518 case DW_TAG_array_type: 519 return TagCategoryType; 520 case DW_TAG_class_type: 521 return TagCategoryType; 522 case DW_TAG_entry_point: 523 return TagCategoryProgram; 524 case DW_TAG_enumeration_type: 525 return TagCategoryType; 526 case DW_TAG_formal_parameter: 527 return TagCategoryVariable; 528 case DW_TAG_imported_declaration: 529 return TagCategoryProgram; 530 case DW_TAG_label: 531 return TagCategoryProgram; 532 case DW_TAG_lexical_block: 533 return TagCategoryProgram; 534 case DW_TAG_member: 535 return TagCategoryType; 536 case DW_TAG_pointer_type: 537 return TagCategoryType; 538 case DW_TAG_reference_type: 539 return TagCategoryType; 540 case DW_TAG_compile_unit: 541 return TagCategoryProgram; 542 case DW_TAG_string_type: 543 return TagCategoryType; 544 case DW_TAG_structure_type: 545 return TagCategoryType; 546 case DW_TAG_subroutine_type: 547 return TagCategoryType; 548 case DW_TAG_typedef: 549 return TagCategoryType; 550 case DW_TAG_union_type: 551 return TagCategoryType; 552 case DW_TAG_unspecified_parameters: 553 return TagCategoryVariable; 554 case DW_TAG_variant: 555 return TagCategoryType; 556 case DW_TAG_common_block: 557 return TagCategoryProgram; 558 case DW_TAG_common_inclusion: 559 return TagCategoryProgram; 560 case DW_TAG_inheritance: 561 return TagCategoryType; 562 case DW_TAG_inlined_subroutine: 563 return TagCategoryProgram; 564 case DW_TAG_module: 565 return TagCategoryProgram; 566 case DW_TAG_ptr_to_member_type: 567 return TagCategoryType; 568 case DW_TAG_set_type: 569 return TagCategoryType; 570 case DW_TAG_subrange_type: 571 return TagCategoryType; 572 case DW_TAG_with_stmt: 573 return TagCategoryProgram; 574 case DW_TAG_access_declaration: 575 return TagCategoryProgram; 576 case DW_TAG_base_type: 577 return TagCategoryType; 578 case DW_TAG_catch_block: 579 return TagCategoryProgram; 580 case DW_TAG_const_type: 581 return TagCategoryType; 582 case DW_TAG_constant: 583 return TagCategoryVariable; 584 case DW_TAG_enumerator: 585 return TagCategoryType; 586 case DW_TAG_file_type: 587 return TagCategoryType; 588 case DW_TAG_friend: 589 return TagCategoryType; 590 case DW_TAG_namelist: 591 return TagCategoryVariable; 592 case DW_TAG_namelist_item: 593 return TagCategoryVariable; 594 case DW_TAG_packed_type: 595 return TagCategoryType; 596 case DW_TAG_subprogram: 597 return TagCategoryProgram; 598 case DW_TAG_template_type_parameter: 599 return TagCategoryType; 600 case DW_TAG_template_value_parameter: 601 return TagCategoryType; 602 case DW_TAG_GNU_template_parameter_pack: 603 return TagCategoryType; 604 case DW_TAG_thrown_type: 605 return TagCategoryType; 606 case DW_TAG_try_block: 607 return TagCategoryProgram; 608 case DW_TAG_variant_part: 609 return TagCategoryType; 610 case DW_TAG_variable: 611 return TagCategoryVariable; 612 case DW_TAG_volatile_type: 613 return TagCategoryType; 614 case DW_TAG_dwarf_procedure: 615 return TagCategoryProgram; 616 case DW_TAG_restrict_type: 617 return TagCategoryType; 618 case DW_TAG_interface_type: 619 return TagCategoryType; 620 case DW_TAG_namespace: 621 return TagCategoryProgram; 622 case DW_TAG_imported_module: 623 return TagCategoryProgram; 624 case DW_TAG_unspecified_type: 625 return TagCategoryType; 626 case DW_TAG_partial_unit: 627 return TagCategoryProgram; 628 case DW_TAG_imported_unit: 629 return TagCategoryProgram; 630 case DW_TAG_shared_type: 631 return TagCategoryType; 632 default: 633 break; 634 } 635 return TagCategoryProgram; 636 } 637 638 } // namespace lldb_private 639