DWARFDebugInfoEntry.cpp revision 0942255f6daf49354dd1e19cc5f07aca65bea0d1
172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===-- DWARFDebugInfoEntry.cpp --------------------------------------------===// 272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// The LLVM Compiler Infrastructure 472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// This file is distributed under the University of Illinois Open Source 672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// License. See LICENSE.TXT for details. 772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// 872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===----------------------------------------------------------------------===// 972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 1072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "DWARFDebugInfoEntry.h" 1172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "DWARFCompileUnit.h" 1272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "DWARFContext.h" 1372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "DWARFDebugAbbrev.h" 1472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "DWARFFormValue.h" 1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/Dwarf.h" 1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/Format.h" 1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/raw_ostream.h" 1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerusing namespace llvm; 1972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerusing namespace dwarf; 2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid DWARFDebugInfoEntryMinimal::dump(raw_ostream &OS, 2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit *cu, 2372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer unsigned recurseDepth, 2472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer unsigned indent) const { 2572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 2672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t offset = Offset; 2772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 2872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (debug_info_data.isValidOffset(offset)) { 2972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t abbrCode = debug_info_data.getULEB128(&offset); 3072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 310942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer OS << format("\n0x%8.8x: ", Offset); 3272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (abbrCode) { 3372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (AbbrevDecl) { 340942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer OS.indent(indent) << TagString(AbbrevDecl->getTag()) 350942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer << format(" [%u] %c\n", abbrCode, 360942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer AbbrevDecl->hasChildren() ? '*': ' '); 3772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Dump all data in the .debug_info for the attributes 3972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint32_t numAttributes = AbbrevDecl->getNumAttributes(); 4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer for (uint32_t i = 0; i != numAttributes; ++i) { 4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t attr = AbbrevDecl->getAttrByIndex(i); 4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t form = AbbrevDecl->getFormByIndex(i); 4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer dumpAttribute(OS, cu, &offset, attr, form, indent); 4472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 4572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 4672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFDebugInfoEntryMinimal *child = getFirstChild(); 4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (recurseDepth > 0 && child) { 4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer while (child) { 4915ec085c40cf45726a5c8925706795b52fd231bdBenjamin Kramer child->dump(OS, cu, recurseDepth-1, indent+2); 5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer child = child->getSibling(); 5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } else { 5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer OS << "Abbreviation code not found in 'debug_abbrev' class for code: " 5572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer << abbrCode << '\n'; 5672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 5772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } else { 580942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer OS.indent(indent) << "NULL\n"; 5972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 6072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 6172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 6272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 6372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramervoid DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS, 6472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit *cu, 6572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t* offset_ptr, 6672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t attr, 6772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t form, 6872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer unsigned indent) const { 690942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer OS << format("0x%8.8x: ", *offset_ptr); 700942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer OS.indent(indent+2) << AttributeString(attr) 710942255f6daf49354dd1e19cc5f07aca65bea0d1Benjamin Kramer << " [" << FormEncodingString(form) << ']'; 7272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 7372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue formValue(form); 7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 7572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (!formValue.extractValue(cu->getDebugInfoExtractor(), offset_ptr, cu)) 7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return; 7772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 7872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer OS << "\t("; 7972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer formValue.dump(OS, 0, cu); 8072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer OS << ")\n"; 8172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 8272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 8372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerbool DWARFDebugInfoEntryMinimal::extractFast(const DWARFCompileUnit *cu, 8472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint8_t *fixed_form_sizes, 8572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t *offset_ptr) { 8672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer Offset = *offset_ptr; 8772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 8872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 8972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t abbrCode = debug_info_data.getULEB128(offset_ptr); 9072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 9172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer assert (fixed_form_sizes); // For best performance this should be specified! 9272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 9372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (abbrCode) { 9472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t offset = *offset_ptr; 9572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 9672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer AbbrevDecl = cu->getAbbreviations()->getAbbreviationDeclaration(abbrCode); 9772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 9872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Skip all data in the .debug_info for the attributes 9972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint32_t numAttributes = AbbrevDecl->getNumAttributes(); 10072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t i; 10172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t form; 10272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer for (i=0; i<numAttributes; ++i) { 10372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form = AbbrevDecl->getFormByIndex(i); 10472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 10572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint8_t fixed_skip_size = fixed_form_sizes[form]; 10672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (fixed_skip_size) 10772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer offset += fixed_skip_size; 10872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer else { 10972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool form_is_indirect = false; 11072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer do { 11172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_is_indirect = false; 11272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t form_size = 0; 11372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer switch (form) { 11472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Blocks if inlined data that have a length field and the data bytes 11572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // inlined in the .debug_info. 11672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block: 11772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getULEB128(&offset); 11872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 11972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block1: 12072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getU8(&offset); 12172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 12272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block2: 12372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getU16(&offset); 12472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 12572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block4: 12672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getU32(&offset); 12772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 12872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 12972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Inlined NULL terminated C-strings 13072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_string: 13172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer debug_info_data.getCStr(&offset); 13272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 13372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 13472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Compile unit address sized values 13572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_addr: 13672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref_addr: 13772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = cu->getAddressByteSize(); 13872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 13972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 14072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 1 byte values 14172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data1: 14272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_flag: 14372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref1: 14472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 1; 14572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 14672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 14772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 2 byte values 14872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data2: 14972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref2: 15072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 2; 15172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 15272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 15372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 4 byte values 15472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_strp: 15572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data4: 15672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref4: 15772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 4; 15872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 15972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 16072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 8 byte values 16172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data8: 16272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref8: 16372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 8; 16472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 16572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 16672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // signed or unsigned LEB 128 values 16772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_sdata: 16872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_udata: 16972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref_udata: 17072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer debug_info_data.getULEB128(&offset); 17172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 17272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 17372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_indirect: 17472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_is_indirect = true; 17572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form = debug_info_data.getULEB128(&offset); 17672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 17772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 17872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer default: 17972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer *offset_ptr = Offset; 18072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return false; 18172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 18272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer offset += form_size; 18372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 18472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } while (form_is_indirect); 18572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 18672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 18772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer *offset_ptr = offset; 18872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return true; 18972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } else { 19072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer AbbrevDecl = NULL; 19172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return true; // NULL debug tag entry 19272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 19372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 19472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return false; 19572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 19672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 19772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerbool 19872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerDWARFDebugInfoEntryMinimal::extract(const DWARFCompileUnit *cu, 19972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t *offset_ptr) { 20072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 20172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint32_t cu_end_offset = cu->getNextCompileUnitOffset(); 20272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint8_t cu_addr_size = cu->getAddressByteSize(); 20372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t offset = *offset_ptr; 20472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if ((offset < cu_end_offset) && debug_info_data.isValidOffset(offset)) { 20572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer Offset = offset; 20672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 20772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t abbrCode = debug_info_data.getULEB128(&offset); 20872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 20972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (abbrCode) { 21072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer AbbrevDecl = cu->getAbbreviations()->getAbbreviationDeclaration(abbrCode); 21172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 21272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (AbbrevDecl) { 21372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t tag = AbbrevDecl->getTag(); 21472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 21572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool isCompileUnitTag = tag == DW_TAG_compile_unit; 21672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if(cu && isCompileUnitTag) 21772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const_cast<DWARFCompileUnit*>(cu)->setBaseAddress(0); 21872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 21972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Skip all data in the .debug_info for the attributes 22072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint32_t numAttributes = AbbrevDecl->getNumAttributes(); 22172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer for (uint32_t i = 0; i != numAttributes; ++i) { 22272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t attr = AbbrevDecl->getAttrByIndex(i); 22372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint16_t form = AbbrevDecl->getFormByIndex(i); 22472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 22572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (isCompileUnitTag && 22672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ((attr == DW_AT_entry_pc) || (attr == DW_AT_low_pc))) { 22772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue form_value(form); 22872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (form_value.extractValue(debug_info_data, &offset, cu)) { 22972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (attr == DW_AT_low_pc || attr == DW_AT_entry_pc) 23072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const_cast<DWARFCompileUnit*>(cu) 23172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer ->setBaseAddress(form_value.getUnsigned()); 23272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 23372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } else { 23472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer bool form_is_indirect = false; 23572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer do { 23672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_is_indirect = false; 23772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer register uint32_t form_size = 0; 23872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer switch (form) { 23972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Blocks if inlined data that have a length field and the data 24072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // bytes // inlined in the .debug_info 24172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block: 24272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getULEB128(&offset); 24372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 24472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block1: 24572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getU8(&offset); 24672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 24772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block2: 24872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getU16(&offset); 24972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 25072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_block4: 25172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = debug_info_data.getU32(&offset); 25272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 25372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 25472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Inlined NULL terminated C-strings 25572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_string: 25672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer debug_info_data.getCStr(&offset); 25772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 25872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 25972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Compile unit address sized values 26072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_addr: 26172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref_addr: 26272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = cu_addr_size; 26372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 26472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 26572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 1 byte values 26672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data1: 26772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_flag: 26872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref1: 26972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 1; 27072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 27172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 27272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 2 byte values 27372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data2: 27472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref2: 27572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 2; 27672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 27772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 27872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 4 byte values 27972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_strp: 28072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 4; 28172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 28272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 28372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data4: 28472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref4: 28572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 4; 28672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 28772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 28872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // 8 byte values 28972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_data8: 29072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref8: 29172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_size = 8; 29272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 29372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 29472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // signed or unsigned LEB 128 values 29572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_sdata: 29672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_udata: 29772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_ref_udata: 29872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer debug_info_data.getULEB128(&offset); 29972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 30072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 30172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer case DW_FORM_indirect: 30272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form = debug_info_data.getULEB128(&offset); 30372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_is_indirect = true; 30472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer break; 30572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 30672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer default: 30772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer *offset_ptr = offset; 30872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return false; 30972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 31072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 31172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer offset += form_size; 31272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } while (form_is_indirect); 31372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 31472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 31572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer *offset_ptr = offset; 31672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return true; 31772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 31872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } else { 31972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer AbbrevDecl = NULL; 32072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer *offset_ptr = offset; 32172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return true; // NULL debug tag entry 32272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 32372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 32472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 32572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return false; 32672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 32772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 32872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Krameruint32_t 32972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerDWARFDebugInfoEntryMinimal::getAttributeValue(const DWARFCompileUnit *cu, 33072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint16_t attr, 33172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue &form_value, 33272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t *end_attr_offset_ptr) 33372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const { 33472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (AbbrevDecl) { 33572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t attr_idx = AbbrevDecl->findAttributeIndex(attr); 33672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 33772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (attr_idx != -1U) { 33872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t offset = getOffset(); 33972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 34072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DataExtractor debug_info_data = cu->getDebugInfoExtractor(); 34172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 34272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer // Skip the abbreviation code so we are at the data for the attributes 34372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer debug_info_data.getULEB128(&offset); 34472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 34572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint32_t idx = 0; 34672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer while (idx < attr_idx) 34772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue::skipValue(AbbrevDecl->getFormByIndex(idx++), 34872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer debug_info_data, &offset, cu); 34972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 35072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint32_t attr_offset = offset; 35172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer form_value = DWARFFormValue(AbbrevDecl->getFormByIndex(idx)); 3524aa3fea8b13b91800c908f8e7d74fad96adba69aBenjamin Kramer if (form_value.extractValue(debug_info_data, &offset, cu)) { 35372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (end_attr_offset_ptr) 35472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer *end_attr_offset_ptr = offset; 35572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return attr_offset; 35672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 35772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 35872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 35972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 36072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return 0; 36172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 36272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 36372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerconst char* 36472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerDWARFDebugInfoEntryMinimal::getAttributeValueAsString( 36572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit* cu, 36672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint16_t attr, 36772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const char* fail_value) const { 36872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue form_value; 36972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (getAttributeValue(cu, attr, form_value)) { 37072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DataExtractor stringExtractor(cu->getContext().getStringSection(), 37172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer false, 0); 37272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return form_value.getAsCString(&stringExtractor); 37372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer } 37472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return fail_value; 37572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 37672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 37772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Krameruint64_t 37872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerDWARFDebugInfoEntryMinimal::getAttributeValueAsUnsigned( 37972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit* cu, 38072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint16_t attr, 38172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t fail_value) const { 38272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue form_value; 38372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (getAttributeValue(cu, attr, form_value)) 38472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return form_value.getUnsigned(); 38572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return fail_value; 38672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 38772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 38872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerint64_t 38972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerDWARFDebugInfoEntryMinimal::getAttributeValueAsSigned( 39072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const DWARFCompileUnit* cu, 39172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint16_t attr, 39272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer int64_t fail_value) const { 39372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue form_value; 39472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (getAttributeValue(cu, attr, form_value)) 39572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return form_value.getSigned(); 39672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return fail_value; 39772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 39872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer 39972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Krameruint64_t 40072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin KramerDWARFDebugInfoEntryMinimal::getAttributeValueAsReference(const DWARFCompileUnit* cu, 40172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer const uint16_t attr, 40272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer uint64_t fail_value) const { 40372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer DWARFFormValue form_value; 40472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer if (getAttributeValue(cu, attr, form_value)) 40572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return form_value.getReference(cu); 40672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer return fail_value; 40772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer} 408