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