1//===-- DWARFAbbreviationDeclaration.h --------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef liblldb_DWARFAbbreviationDeclaration_h_ 10#define liblldb_DWARFAbbreviationDeclaration_h_ 11 12#include "DWARFAttribute.h" 13#include "DWARFDefines.h" 14#include "SymbolFileDWARF.h" 15#include "llvm/Support/Error.h" 16 17class DWARFAbbreviationDeclaration { 18public: 19 enum { InvalidCode = 0 }; 20 DWARFAbbreviationDeclaration(); 21 22 // For hand crafting an abbreviation declaration 23 DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children); 24 25 dw_uleb128_t Code() const { return m_code; } 26 void SetCode(dw_uleb128_t code) { m_code = code; } 27 dw_tag_t Tag() const { return m_tag; } 28 bool HasChildren() const { return m_has_children; } 29 size_t NumAttributes() const { return m_attributes.size(); } 30 dw_form_t GetFormByIndex(uint32_t idx) const { 31 return m_attributes.size() > idx ? m_attributes[idx].get_form() : 0; 32 } 33 34 // idx is assumed to be valid when calling GetAttrAndFormByIndex() 35 void GetAttrAndFormValueByIndex(uint32_t idx, dw_attr_t &attr, 36 DWARFFormValue &form_value) const { 37 m_attributes[idx].get(attr, form_value.FormRef(), form_value.ValueRef()); 38 } 39 dw_form_t GetFormByIndexUnchecked(uint32_t idx) const { 40 return m_attributes[idx].get_form(); 41 } 42 uint32_t FindAttributeIndex(dw_attr_t attr) const; 43 44 /// Extract one abbreviation declaration and all of its associated attributes. 45 /// Possible return values: 46 /// DWARFEnumState::Complete - the extraction completed successfully. This 47 /// was the last abbrev decl in a sequence, and the user should not call 48 /// this function again. 49 /// DWARFEnumState::MoreItems - the extraction completed successfully. The 50 /// user should call this function again to retrieve the next decl. 51 /// llvm::Error - A parsing error occurred. The debug info is malformed. 52 llvm::Expected<lldb_private::DWARFEnumState> 53 extract(const lldb_private::DWARFDataExtractor &data, 54 lldb::offset_t *offset_ptr); 55 bool IsValid(); 56 bool operator==(const DWARFAbbreviationDeclaration &rhs) const; 57 58protected: 59 dw_uleb128_t m_code; 60 dw_tag_t m_tag; 61 uint8_t m_has_children; 62 DWARFAttribute::collection m_attributes; 63}; 64 65#endif // liblldb_DWARFAbbreviationDeclaration_h_ 66