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