diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.h @@ -16,6 +16,29 @@ class DWARFAbbreviationDeclaration { public: + struct AttributeSpec { + AttributeSpec(dw_attr_t attr, dw_form_t form, int64_t value) + : m_attr(attr), m_form(form), m_value(value) {} + + AttributeSpec(dw_attr_t attr, dw_form_t form) + : m_attr(attr), m_form(form), m_value(0) {} + + bool IsImplicitConst() const { + return m_form == lldb_private::dwarf::DW_FORM_implicit_const; + } + + int64_t GetImplicitConstValue() const { return m_value; } + + dw_attr_t GetAttribute() const { return m_attr; } + + dw_form_t GetForm() const { return m_form; } + + private: + dw_attr_t m_attr; + dw_form_t m_form; + int64_t m_value; + }; + enum { InvalidCode = 0 }; DWARFAbbreviationDeclaration(); @@ -28,17 +51,21 @@ bool HasChildren() const { return m_has_children; } size_t NumAttributes() const { return m_attributes.size(); } dw_form_t GetFormByIndex(uint32_t idx) const { - return m_attributes.size() > idx ? m_attributes[idx].get_form() + return m_attributes.size() > idx ? m_attributes[idx].GetForm() : dw_form_t(0); } // idx is assumed to be valid when calling GetAttrAndFormByIndex() void GetAttrAndFormValueByIndex(uint32_t idx, dw_attr_t &attr, DWARFFormValue &form_value) const { - m_attributes[idx].get(attr, form_value.FormRef(), form_value.ValueRef()); + const AttributeSpec &spec = m_attributes[idx]; + attr = spec.GetAttribute(); + form_value.FormRef() = spec.GetForm(); + if (spec.IsImplicitConst()) + form_value.SetSigned(spec.GetImplicitConstValue()); } dw_form_t GetFormByIndexUnchecked(uint32_t idx) const { - return m_attributes[idx].get_form(); + return m_attributes[idx].GetForm(); } uint32_t FindAttributeIndex(dw_attr_t attr) const; @@ -59,7 +86,7 @@ uint32_t m_code = InvalidCode; dw_tag_t m_tag = llvm::dwarf::DW_TAG_null; uint8_t m_has_children = 0; - DWARFAttribute::collection m_attributes; + llvm::SmallVector m_attributes; }; #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFABBREVIATIONDECLARATION_H diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAbbreviationDeclaration.cpp @@ -53,12 +53,13 @@ return llvm::make_error( "malformed abbreviation declaration attribute"); - DWARFFormValue::ValueType val; + if (form == DW_FORM_implicit_const) { + int64_t value = data.GetSLEB128(offset_ptr); + m_attributes.emplace_back(attr, form, value); + continue; + } - if (form == DW_FORM_implicit_const) - val.value.sval = data.GetSLEB128(offset_ptr); - - m_attributes.push_back(DWARFAttribute(attr, form, val)); + m_attributes.emplace_back(attr, form); } return llvm::make_error( @@ -72,10 +73,8 @@ uint32_t DWARFAbbreviationDeclaration::FindAttributeIndex(dw_attr_t attr) const { - uint32_t i; - const uint32_t kNumAttributes = m_attributes.size(); - for (i = 0; i < kNumAttributes; ++i) { - if (m_attributes[i].get_attr() == attr) + for (size_t i = 0; i < m_attributes.size(); ++i) { + if (m_attributes[i].GetAttribute() == attr) return i; } return DW_INVALID_INDEX; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h @@ -31,10 +31,6 @@ form = m_form; val = m_value; } - typedef std::vector collection; - typedef collection::iterator iterator; - typedef collection::const_iterator const_iterator; - protected: dw_attr_t m_attr; dw_form_t m_form;