diff options
Diffstat (limited to 'source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp')
-rw-r--r-- | source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp | 88 |
1 files changed, 39 insertions, 49 deletions
diff --git a/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp b/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp index d78b9ab10f5a..6128163a2926 100644 --- a/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp +++ b/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp @@ -1,9 +1,8 @@ //===-- DWARFAbbreviationDeclaration.cpp ------------------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -12,6 +11,8 @@ #include "lldb/Core/dwarf.h" #include "lldb/Utility/Stream.h" +#include "llvm/Object/Error.h" + #include "DWARFFormValue.h" using namespace lldb_private; @@ -24,57 +25,46 @@ DWARFAbbreviationDeclaration::DWARFAbbreviationDeclaration(dw_tag_t tag, : m_code(InvalidCode), m_tag(tag), m_has_children(has_children), m_attributes() {} -bool DWARFAbbreviationDeclaration::Extract(const DWARFDataExtractor &data, - lldb::offset_t *offset_ptr) { - return Extract(data, offset_ptr, data.GetULEB128(offset_ptr)); -} +llvm::Expected<DWARFEnumState> +DWARFAbbreviationDeclaration::extract(const DWARFDataExtractor &data, + lldb::offset_t *offset_ptr) { + m_code = data.GetULEB128(offset_ptr); + if (m_code == 0) + return DWARFEnumState::Complete; -bool DWARFAbbreviationDeclaration::Extract(const DWARFDataExtractor &data, - lldb::offset_t *offset_ptr, - dw_uleb128_t code) { - m_code = code; m_attributes.clear(); - if (m_code) { - m_tag = data.GetULEB128(offset_ptr); - m_has_children = data.GetU8(offset_ptr); - - while (data.ValidOffset(*offset_ptr)) { - dw_attr_t attr = data.GetULEB128(offset_ptr); - dw_form_t form = data.GetULEB128(offset_ptr); - DWARFFormValue::ValueType val; - - if (form == DW_FORM_implicit_const) - val.value.sval = data.GetULEB128(offset_ptr); - - if (attr && form) - m_attributes.push_back(DWARFAttribute(attr, form, val)); - else - break; - } - - return m_tag != 0; - } else { - m_tag = 0; - m_has_children = 0; - } + m_tag = data.GetULEB128(offset_ptr); + if (m_tag == DW_TAG_null) + return llvm::make_error<llvm::object::GenericBinaryError>( + "abbrev decl requires non-null tag."); - return false; -} + m_has_children = data.GetU8(offset_ptr); -void DWARFAbbreviationDeclaration::Dump(Stream *s) const { - s->Printf("Debug Abbreviation Declaration: code = 0x%4.4x, tag = %s, " - "has_children = %s\n", - m_code, DW_TAG_value_to_name(m_tag), - DW_CHILDREN_value_to_name(m_has_children)); + while (data.ValidOffset(*offset_ptr)) { + dw_attr_t attr = data.GetULEB128(offset_ptr); + dw_form_t form = data.GetULEB128(offset_ptr); - DWARFAttribute::const_iterator pos; + // This is the last attribute for this abbrev decl, but there may still be + // more abbrev decls, so return MoreItems to indicate to the caller that + // they should call this function again. + if (!attr && !form) + return DWARFEnumState::MoreItems; - for (pos = m_attributes.begin(); pos != m_attributes.end(); ++pos) - s->Printf(" attr = %s, form = %s\n", - DW_AT_value_to_name(pos->get_attr()), - DW_FORM_value_to_name(pos->get_form())); + if (!attr || !form) + return llvm::make_error<llvm::object::GenericBinaryError>( + "malformed abbreviation declaration attribute"); + + DWARFFormValue::ValueType val; + + if (form == DW_FORM_implicit_const) + val.value.sval = data.GetULEB128(offset_ptr); + + m_attributes.push_back(DWARFAttribute(attr, form, val)); + } - s->Printf("\n"); + return llvm::make_error<llvm::object::GenericBinaryError>( + "abbreviation declaration attribute list not terminated with a null " + "entry"); } bool DWARFAbbreviationDeclaration::IsValid() { @@ -95,5 +85,5 @@ DWARFAbbreviationDeclaration::FindAttributeIndex(dw_attr_t attr) const { bool DWARFAbbreviationDeclaration:: operator==(const DWARFAbbreviationDeclaration &rhs) const { return Tag() == rhs.Tag() && HasChildren() == rhs.HasChildren() && - Attributes() == rhs.Attributes(); + m_attributes == rhs.m_attributes; } |