Home | History | Annotate | Download | only in DebugInfo
      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