1 //===-- DWARFDebugInfoEntry.cpp -------------------------------------------===// 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 #include "DWARFDebugInfoEntry.h" 11 #include "DWARFCompileUnit.h" 12 #include "DWARFContext.h" 13 #include "DWARFDebugAbbrev.h" 14 #include "DWARFFormValue.h" 15 #include "llvm/Support/Debug.h" 16 #include "llvm/Support/Dwarf.h" 17 #include "llvm/Support/Format.h" 18 #include "llvm/Support/raw_ostream.h" 19 using namespace llvm; 20 using namespace dwarf; 21 22 void DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, 23 const DWARFCompileUnit *cu, 24 unsigned recurseDepth, 25 unsigned indent) const { 26 DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 27 uint32_t offset = Offset; 28 29 if (debug_info_data.isValidOffset(offset)) { 30 uint32_t abbrCode = debug_info_data.getULEB128(&offset); 31 32 OS << format("\n0x%8.8x: ", Offset); 33 if (abbrCode) { 34 if (AbbrevDecl) { 35 const char *tagString = TagString(getTag()); 36 if (tagString) 37 OS.indent(indent) << tagString; 38 else 39 OS.indent(indent) << format("DW_TAG_Unknown_%x", getTag()); 40 OS << format(" [%u] %c\n", abbrCode, 41 AbbrevDecl->hasChildren() ? '*' : ' '); 42 43 // Dump all data in the DIE for the attributes. 44 const uint32_t numAttributes = AbbrevDecl->getNumAttributes(); 45 for (uint32_t i = 0; i != numAttributes; ++i) { 46 uint16_t attr = AbbrevDecl->getAttrByIndex(i); 47 uint16_t form = AbbrevDecl->getFormByIndex(i); 48 dumpAttribute(OS, cu, &offset, attr, form, indent); 49 } 50 51 const DWARFDebugInfoEntryMinimal *child = getFirstChild(); 52 if (recurseDepth > 0 && child) { 53 while (child) { 54 child->dump(OS, cu, recurseDepth-1, indent+2); 55 child = child->getSibling(); 56 } 57 } 58 } else { 59 OS << "Abbreviation code not found in 'debug_abbrev' class for code: " 60 << abbrCode << '\n'; 61 } 62 } else { 63 OS.indent(indent) << "NULL\n"; 64 } 65 } 66 } 67 68 void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, 69 const DWARFCompileUnit *cu, 70 uint32_t* offset_ptr, 71 uint16_t attr, 72 uint16_t form, 73 unsigned indent) const { 74 OS << format("0x%8.8x: ", *offset_ptr); 75 OS.indent(indent+2); 76 const char *attrString = AttributeString(attr); 77 if (attrString) 78 OS << attrString; 79 else 80 OS << format("DW_AT_Unknown_%x", attr); 81 const char *formString = FormEncodingString(form); 82 if (formString) 83 OS << " [" << formString << ']'; 84 else 85 OS << format(" [DW_FORM_Unknown_%x]", form); 86 87 DWARFFormValue formValue(form); 88 89 if (!formValue.extractValue(cu->getDebugInfoExtractor(), offset_ptr, cu)) 90 return; 91 92 OS << "\t("; 93 formValue.dump(OS, cu); 94 OS << ")\n"; 95 } 96 97 bool DWARFDebugInfoEntryMinimal::extractFast(const DWARFCompileUnit *cu, 98 const uint8_t *fixed_form_sizes, 99 uint32_t *offset_ptr) { 100 Offset = *offset_ptr; 101 102 DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 103 uint64_t abbrCode = debug_info_data.getULEB128(offset_ptr); 104 105 assert(fixed_form_sizes); // For best performance this should be specified! 106 107 if (abbrCode) { 108 uint32_t offset = *offset_ptr; 109 110 AbbrevDecl = cu->getAbbreviations()->getAbbreviationDeclaration(abbrCode); 111 112 // Skip all data in the .debug_info for the attributes 113 const uint32_t numAttributes = AbbrevDecl->getNumAttributes(); 114 uint32_t i; 115 uint16_t form; 116 for (i=0; i<numAttributes; ++i) { 117 118 form = AbbrevDecl->getFormByIndex(i); 119 120 // FIXME: Currently we're checking if this is less than the last 121 // entry in the fixed_form_sizes table, but this should be changed 122 // to use dynamic dispatch. 123 const uint8_t fixed_skip_size = (form < DW_FORM_ref_sig8) ? 124 fixed_form_sizes[form] : 0; 125 if (fixed_skip_size) 126 offset += fixed_skip_size; 127 else { 128 bool form_is_indirect = false; 129 do { 130 form_is_indirect = false; 131 uint32_t form_size = 0; 132 switch (form) { 133 // Blocks if inlined data that have a length field and the data bytes 134 // inlined in the .debug_info. 135 case DW_FORM_exprloc: 136 case DW_FORM_block: 137 form_size = debug_info_data.getULEB128(&offset); 138 break; 139 case DW_FORM_block1: 140 form_size = debug_info_data.getU8(&offset); 141 break; 142 case DW_FORM_block2: 143 form_size = debug_info_data.getU16(&offset); 144 break; 145 case DW_FORM_block4: 146 form_size = debug_info_data.getU32(&offset); 147 break; 148 149 // Inlined NULL terminated C-strings 150 case DW_FORM_string: 151 debug_info_data.getCStr(&offset); 152 break; 153 154 // Compile unit address sized values 155 case DW_FORM_addr: 156 case DW_FORM_ref_addr: 157 form_size = cu->getAddressByteSize(); 158 break; 159 160 // 0 sized form. 161 case DW_FORM_flag_present: 162 form_size = 0; 163 break; 164 165 // 1 byte values 166 case DW_FORM_data1: 167 case DW_FORM_flag: 168 case DW_FORM_ref1: 169 form_size = 1; 170 break; 171 172 // 2 byte values 173 case DW_FORM_data2: 174 case DW_FORM_ref2: 175 form_size = 2; 176 break; 177 178 // 4 byte values 179 case DW_FORM_strp: 180 case DW_FORM_data4: 181 case DW_FORM_ref4: 182 form_size = 4; 183 break; 184 185 // 8 byte values 186 case DW_FORM_data8: 187 case DW_FORM_ref8: 188 case DW_FORM_ref_sig8: 189 form_size = 8; 190 break; 191 192 // signed or unsigned LEB 128 values 193 case DW_FORM_sdata: 194 case DW_FORM_udata: 195 case DW_FORM_ref_udata: 196 case DW_FORM_GNU_str_index: 197 case DW_FORM_GNU_addr_index: 198 debug_info_data.getULEB128(&offset); 199 break; 200 201 case DW_FORM_indirect: 202 form_is_indirect = true; 203 form = debug_info_data.getULEB128(&offset); 204 break; 205 206 // FIXME: 64-bit for DWARF64 207 case DW_FORM_sec_offset: 208 debug_info_data.getU32(offset_ptr); 209 break; 210 211 default: 212 *offset_ptr = Offset; 213 return false; 214 } 215 offset += form_size; 216 } while (form_is_indirect); 217 } 218 } 219 *offset_ptr = offset; 220 return true; 221 } else { 222 AbbrevDecl = NULL; 223 return true; // NULL debug tag entry 224 } 225 } 226 227 bool 228 DWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *cu, 229 uint32_t *offset_ptr) { 230 DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 231 const uint32_t cu_end_offset = cu->getNextCompileUnitOffset(); 232 const uint8_t cu_addr_size = cu->getAddressByteSize(); 233 uint32_t offset = *offset_ptr; 234 if ((offset < cu_end_offset) && debug_info_data.isValidOffset(offset)) { 235 Offset = offset; 236 237 uint64_t abbrCode = debug_info_data.getULEB128(&offset); 238 239 if (abbrCode) { 240 AbbrevDecl = cu->getAbbreviations()->getAbbreviationDeclaration(abbrCode); 241 242 if (AbbrevDecl) { 243 uint16_t tag = AbbrevDecl->getTag(); 244 245 bool isCompileUnitTag = tag == DW_TAG_compile_unit; 246 if(cu && isCompileUnitTag) 247 const_cast<DWARFCompileUnit*>(cu)->setBaseAddress(0); 248 249 // Skip all data in the .debug_info for the attributes 250 const uint32_t numAttributes = AbbrevDecl->getNumAttributes(); 251 for (uint32_t i = 0; i != numAttributes; ++i) { 252 uint16_t attr = AbbrevDecl->getAttrByIndex(i); 253 uint16_t form = AbbrevDecl->getFormByIndex(i); 254 255 if (isCompileUnitTag && 256 ((attr == DW_AT_entry_pc) || (attr == DW_AT_low_pc))) { 257 DWARFFormValue form_value(form); 258 if (form_value.extractValue(debug_info_data, &offset, cu)) { 259 if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc) 260 const_cast<DWARFCompileUnit*>(cu) 261 ->setBaseAddress(form_value.getUnsigned()); 262 } 263 } else { 264 bool form_is_indirect = false; 265 do { 266 form_is_indirect = false; 267 register uint32_t form_size = 0; 268 switch (form) { 269 // Blocks if inlined data that have a length field and the data 270 // bytes // inlined in the .debug_info 271 case DW_FORM_exprloc: 272 case DW_FORM_block: 273 form_size = debug_info_data.getULEB128(&offset); 274 break; 275 case DW_FORM_block1: 276 form_size = debug_info_data.getU8(&offset); 277 break; 278 case DW_FORM_block2: 279 form_size = debug_info_data.getU16(&offset); 280 break; 281 case DW_FORM_block4: 282 form_size = debug_info_data.getU32(&offset); 283 break; 284 285 // Inlined NULL terminated C-strings 286 case DW_FORM_string: 287 debug_info_data.getCStr(&offset); 288 break; 289 290 // Compile unit address sized values 291 case DW_FORM_addr: 292 case DW_FORM_ref_addr: 293 form_size = cu_addr_size; 294 break; 295 296 // 0 byte value 297 case DW_FORM_flag_present: 298 form_size = 0; 299 break; 300 301 // 1 byte values 302 case DW_FORM_data1: 303 case DW_FORM_flag: 304 case DW_FORM_ref1: 305 form_size = 1; 306 break; 307 308 // 2 byte values 309 case DW_FORM_data2: 310 case DW_FORM_ref2: 311 form_size = 2; 312 break; 313 314 // 4 byte values 315 case DW_FORM_strp: 316 form_size = 4; 317 break; 318 319 case DW_FORM_data4: 320 case DW_FORM_ref4: 321 form_size = 4; 322 break; 323 324 // 8 byte values 325 case DW_FORM_data8: 326 case DW_FORM_ref8: 327 case DW_FORM_ref_sig8: 328 form_size = 8; 329 break; 330 331 // signed or unsigned LEB 128 values 332 case DW_FORM_sdata: 333 case DW_FORM_udata: 334 case DW_FORM_ref_udata: 335 case DW_FORM_GNU_str_index: 336 case DW_FORM_GNU_addr_index: 337 debug_info_data.getULEB128(&offset); 338 break; 339 340 case DW_FORM_indirect: 341 form = debug_info_data.getULEB128(&offset); 342 form_is_indirect = true; 343 break; 344 345 // FIXME: 64-bit for DWARF64. 346 case DW_FORM_sec_offset: 347 debug_info_data.getU32(offset_ptr); 348 break; 349 350 default: 351 *offset_ptr = offset; 352 return false; 353 } 354 355 offset += form_size; 356 } while (form_is_indirect); 357 } 358 } 359 *offset_ptr = offset; 360 return true; 361 } 362 } else { 363 AbbrevDecl = NULL; 364 *offset_ptr = offset; 365 return true; // NULL debug tag entry 366 } 367 } 368 369 return false; 370 } 371 372 bool DWARFDebugInfoEntryMinimal::isSubprogramDIE() const { 373 return getTag() == DW_TAG_subprogram; 374 } 375 376 bool DWARFDebugInfoEntryMinimal::isSubroutineDIE() const { 377 uint32_t Tag = getTag(); 378 return Tag == DW_TAG_subprogram || 379 Tag == DW_TAG_inlined_subroutine; 380 } 381 382 uint32_t 383 DWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu, 384 const uint16_t attr, 385 DWARFFormValue &form_value, 386 uint32_t *end_attr_offset_ptr) 387 const { 388 if (AbbrevDecl) { 389 uint32_t attr_idx = AbbrevDecl->findAttributeIndex(attr); 390 391 if (attr_idx != -1U) { 392 uint32_t offset = getOffset(); 393 394 DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 395 396 // Skip the abbreviation code so we are at the data for the attributes 397 debug_info_data.getULEB128(&offset); 398 399 uint32_t idx = 0; 400 while (idx < attr_idx) 401 DWARFFormValue::skipValue(AbbrevDecl->getFormByIndex(idx++), 402 debug_info_data, &offset, cu); 403 404 const uint32_t attr_offset = offset; 405 form_value = DWARFFormValue(AbbrevDecl->getFormByIndex(idx)); 406 if (form_value.extractValue(debug_info_data, &offset, cu)) { 407 if (end_attr_offset_ptr) 408 *end_attr_offset_ptr = offset; 409 return attr_offset; 410 } 411 } 412 } 413 414 return 0; 415 } 416 417 const char* 418 DWARFDebugInfoEntryMinimal::getAttributeValueAsString( 419 const DWARFCompileUnit* cu, 420 const uint16_t attr, 421 const char* fail_value) 422 const { 423 DWARFFormValue form_value; 424 if (getAttributeValue(cu, attr, form_value)) { 425 DataExtractor stringExtractor(cu->getStringSection(), false, 0); 426 return form_value.getAsCString(&stringExtractor); 427 } 428 return fail_value; 429 } 430 431 uint64_t 432 DWARFDebugInfoEntryMinimal::getAttributeValueAsUnsigned( 433 const DWARFCompileUnit* cu, 434 const uint16_t attr, 435 uint64_t fail_value) const { 436 DWARFFormValue form_value; 437 if (getAttributeValue(cu, attr, form_value)) 438 return form_value.getUnsigned(); 439 return fail_value; 440 } 441 442 int64_t 443 DWARFDebugInfoEntryMinimal::getAttributeValueAsSigned( 444 const DWARFCompileUnit* cu, 445 const uint16_t attr, 446 int64_t fail_value) const { 447 DWARFFormValue form_value; 448 if (getAttributeValue(cu, attr, form_value)) 449 return form_value.getSigned(); 450 return fail_value; 451 } 452 453 uint64_t 454 DWARFDebugInfoEntryMinimal::getAttributeValueAsReference( 455 const DWARFCompileUnit* cu, 456 const uint16_t attr, 457 uint64_t fail_value) 458 const { 459 DWARFFormValue form_value; 460 if (getAttributeValue(cu, attr, form_value)) 461 return form_value.getReference(cu); 462 return fail_value; 463 } 464 465 bool DWARFDebugInfoEntryMinimal::getLowAndHighPC(const DWARFCompileUnit *CU, 466 uint64_t &LowPC, 467 uint64_t &HighPC) const { 468 HighPC = -1ULL; 469 LowPC = getAttributeValueAsUnsigned(CU, DW_AT_low_pc, -1ULL); 470 if (LowPC != -1ULL) 471 HighPC = getAttributeValueAsUnsigned(CU, DW_AT_high_pc, -1ULL); 472 return (HighPC != -1ULL); 473 } 474 475 void 476 DWARFDebugInfoEntryMinimal::buildAddressRangeTable(const DWARFCompileUnit *CU, 477 DWARFDebugAranges *DebugAranges) 478 const { 479 if (AbbrevDecl) { 480 if (isSubprogramDIE()) { 481 uint64_t LowPC, HighPC; 482 if (getLowAndHighPC(CU, LowPC, HighPC)) { 483 DebugAranges->appendRange(CU->getOffset(), LowPC, HighPC); 484 } 485 // FIXME: try to append ranges from .debug_ranges section. 486 } 487 488 const DWARFDebugInfoEntryMinimal *child = getFirstChild(); 489 while (child) { 490 child->buildAddressRangeTable(CU, DebugAranges); 491 child = child->getSibling(); 492 } 493 } 494 } 495 496 bool 497 DWARFDebugInfoEntryMinimal::addressRangeContainsAddress( 498 const DWARFCompileUnit *CU, 499 const uint64_t Address) 500 const { 501 if (isNULL()) 502 return false; 503 uint64_t LowPC, HighPC; 504 if (getLowAndHighPC(CU, LowPC, HighPC)) 505 return (LowPC <= Address && Address <= HighPC); 506 // Try to get address ranges from .debug_ranges section. 507 uint32_t RangesOffset = getAttributeValueAsReference(CU, DW_AT_ranges, -1U); 508 if (RangesOffset != -1U) { 509 DWARFDebugRangeList RangeList; 510 if (CU->extractRangeList(RangesOffset, RangeList)) 511 return RangeList.containsAddress(CU->getBaseAddress(), Address); 512 } 513 return false; 514 } 515 516 const char* 517 DWARFDebugInfoEntryMinimal::getSubroutineName(const DWARFCompileUnit *CU) 518 const { 519 if (!isSubroutineDIE()) 520 return 0; 521 // Try to get mangled name if possible. 522 if (const char *name = 523 getAttributeValueAsString(CU, DW_AT_MIPS_linkage_name, 0)) 524 return name; 525 if (const char *name = getAttributeValueAsString(CU, DW_AT_linkage_name, 0)) 526 return name; 527 if (const char *name = getAttributeValueAsString(CU, DW_AT_name, 0)) 528 return name; 529 // Try to get name from specification DIE. 530 uint32_t spec_ref = 531 getAttributeValueAsReference(CU, DW_AT_specification, -1U); 532 if (spec_ref != -1U) { 533 DWARFDebugInfoEntryMinimal spec_die; 534 if (spec_die.extract(CU, &spec_ref)) { 535 if (const char *name = spec_die.getSubroutineName(CU)) 536 return name; 537 } 538 } 539 // Try to get name from abstract origin DIE. 540 uint32_t abs_origin_ref = 541 getAttributeValueAsReference(CU, DW_AT_abstract_origin, -1U); 542 if (abs_origin_ref != -1U) { 543 DWARFDebugInfoEntryMinimal abs_origin_die; 544 if (abs_origin_die.extract(CU, &abs_origin_ref)) { 545 if (const char *name = abs_origin_die.getSubroutineName(CU)) 546 return name; 547 } 548 } 549 return 0; 550 } 551 552 void DWARFDebugInfoEntryMinimal::getCallerFrame(const DWARFCompileUnit *CU, 553 uint32_t &CallFile, 554 uint32_t &CallLine, 555 uint32_t &CallColumn) const { 556 CallFile = getAttributeValueAsUnsigned(CU, DW_AT_call_file, 0); 557 CallLine = getAttributeValueAsUnsigned(CU, DW_AT_call_line, 0); 558 CallColumn = getAttributeValueAsUnsigned(CU, DW_AT_call_column, 0); 559 } 560 561 DWARFDebugInfoEntryMinimal::InlinedChain 562 DWARFDebugInfoEntryMinimal::getInlinedChainForAddress( 563 const DWARFCompileUnit *CU, 564 const uint64_t Address) 565 const { 566 DWARFDebugInfoEntryMinimal::InlinedChain InlinedChain; 567 if (isNULL()) 568 return InlinedChain; 569 for (const DWARFDebugInfoEntryMinimal *DIE = this; DIE; ) { 570 // Append current DIE to inlined chain only if it has correct tag 571 // (e.g. it is not a lexical block). 572 if (DIE->isSubroutineDIE()) { 573 InlinedChain.push_back(*DIE); 574 } 575 // Try to get child which also contains provided address. 576 const DWARFDebugInfoEntryMinimal *Child = DIE->getFirstChild(); 577 while (Child) { 578 if (Child->addressRangeContainsAddress(CU, Address)) { 579 // Assume there is only one such child. 580 break; 581 } 582 Child = Child->getSibling(); 583 } 584 DIE = Child; 585 } 586 // Reverse the obtained chain to make the root of inlined chain last. 587 std::reverse(InlinedChain.begin(), InlinedChain.end()); 588 return InlinedChain; 589 } 590