178344Sobrien//===-- DWARFAbbreviationDeclaration.h --------------------------*- C++ -*-===// 278344Sobrien// 398184Sgordon// The LLVM Compiler Infrastructure 498184Sgordon// 578344Sobrien// This file is distributed under the University of Illinois Open Source 678344Sobrien// License. See LICENSE.TXT for details. 778344Sobrien// 8140339Sobrien//===----------------------------------------------------------------------===// 978344Sobrien 1078344Sobrien#ifndef liblldb_DWARFAbbreviationDeclaration_h_ 1178344Sobrien#define liblldb_DWARFAbbreviationDeclaration_h_ 1278344Sobrien 1398184Sgordon#include "SymbolFileDWARF.h" 1498184Sgordon#include "DWARFAttribute.h" 1598184Sgordon 1678344Sobrienclass DWARFCompileUnit; 1778344Sobrien 1878344Sobrienclass DWARFAbbreviationDeclaration 19133110Smarkm{ 20133110Smarkmpublic: 21133110Smarkm enum { InvalidCode = 0 }; 22133110Smarkm DWARFAbbreviationDeclaration(); 23133110Smarkm 24133110Smarkm // For hand crafting an abbreviation declaration 25133110Smarkm DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children); 26133110Smarkm void AddAttribute(const DWARFAttribute& attr) 27133110Smarkm { 28133110Smarkm m_attributes.push_back(attr); 29133110Smarkm } 30133110Smarkm 31133110Smarkm dw_uleb128_t Code() const { return m_code; } 32133110Smarkm void SetCode(dw_uleb128_t code) { m_code = code; } 33133110Smarkm dw_tag_t Tag() const { return m_tag; } 34133110Smarkm bool HasChildren() const { return m_has_children; } 35133110Smarkm size_t NumAttributes() const { return m_attributes.size(); } 36133110Smarkm dw_attr_t GetAttrByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_attr() : 0; } 37133110Smarkm dw_form_t GetFormByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_form() : 0; } 38133110Smarkm bool GetAttrAndFormByIndex(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const 39133110Smarkm { 40133110Smarkm if (m_attributes.size() > idx) 41133110Smarkm { 42133110Smarkm m_attributes[idx].get(attr, form); 4378344Sobrien return true; 4478344Sobrien } 4598184Sgordon attr = form = 0; 4698184Sgordon return false; 4798184Sgordon } 4898184Sgordon 4998184Sgordon // idx is assumed to be valid when calling GetAttrAndFormByIndexUnchecked() 5098184Sgordon void GetAttrAndFormByIndexUnchecked(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const 5198184Sgordon { 5298184Sgordon m_attributes[idx].get(attr, form); 5398184Sgordon } 5498184Sgordon dw_form_t GetFormByIndexUnchecked (uint32_t idx) const 5598184Sgordon { 5698184Sgordon return m_attributes[idx].get_form(); 5798184Sgordon } 5878344Sobrien void CopyExcludingAddressAttributes(const DWARFAbbreviationDeclaration& abbr_decl, const uint32_t idx); 5998184Sgordon void CopyChangingStringToStrp( 6098184Sgordon const DWARFAbbreviationDeclaration& abbr_decl, 6178344Sobrien const lldb_private::DataExtractor& debug_info_data, 6278344Sobrien dw_offset_t debug_info_offset, 6398184Sgordon const DWARFCompileUnit* cu, 6498184Sgordon const uint32_t strp_min_len); 6598184Sgordon uint32_t FindAttributeIndex(dw_attr_t attr) const; 6698184Sgordon bool Extract(const lldb_private::DataExtractor& data, lldb::offset_t *offset_ptr); 6778344Sobrien bool Extract(const lldb_private::DataExtractor& data, lldb::offset_t *offset_ptr, dw_uleb128_t code); 6898184Sgordon// void Append(BinaryStreamBuf& out_buff) const; 6978344Sobrien bool IsValid(); 7098184Sgordon void Dump(lldb_private::Stream *s) const; 7198184Sgordon bool operator == (const DWARFAbbreviationDeclaration& rhs) const; 7298184Sgordon// DWARFAttribute::collection& Attributes() { return m_attributes; } 7398184Sgordon const DWARFAttribute::collection& Attributes() const { return m_attributes; } 7498184Sgordonprotected: 7598184Sgordon dw_uleb128_t m_code; 7698184Sgordon dw_tag_t m_tag; 7798184Sgordon uint8_t m_has_children; 7898184Sgordon DWARFAttribute::collection m_attributes; 7978344Sobrien}; 8078344Sobrien 8178344Sobrien#endif // liblldb_DWARFAbbreviationDeclaration_h_ 8278344Sobrien