Home | History | Annotate | Download | only in DWARF
      1 //===-- DWARFAbbreviationDeclaration.h --------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_DWARFAbbreviationDeclaration_h_
     11 #define liblldb_DWARFAbbreviationDeclaration_h_
     12 
     13 #include "SymbolFileDWARF.h"
     14 #include "DWARFAttribute.h"
     15 
     16 class DWARFCompileUnit;
     17 
     18 class DWARFAbbreviationDeclaration
     19 {
     20 public:
     21     enum { InvalidCode = 0 };
     22                     DWARFAbbreviationDeclaration();
     23 
     24                     // For hand crafting an abbreviation declaration
     25                     DWARFAbbreviationDeclaration(dw_tag_t tag, uint8_t has_children);
     26     void            AddAttribute(const DWARFAttribute& attr)
     27                     {
     28                         m_attributes.push_back(attr);
     29                     }
     30 
     31     dw_uleb128_t    Code() const { return m_code; }
     32     void            SetCode(dw_uleb128_t code) { m_code = code; }
     33     dw_tag_t        Tag() const { return m_tag; }
     34     bool            HasChildren() const { return m_has_children; }
     35     size_t          NumAttributes() const { return m_attributes.size(); }
     36     dw_attr_t       GetAttrByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_attr() : 0; }
     37     dw_form_t       GetFormByIndex(uint32_t idx) const { return m_attributes.size() > idx ? m_attributes[idx].get_form() : 0; }
     38     bool            GetAttrAndFormByIndex(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const
     39                     {
     40                         if (m_attributes.size() > idx)
     41                         {
     42                             m_attributes[idx].get(attr, form);
     43                             return true;
     44                         }
     45                         attr = form = 0;
     46                         return false;
     47                     }
     48 
     49                     // idx is assumed to be valid when calling GetAttrAndFormByIndexUnchecked()
     50     void            GetAttrAndFormByIndexUnchecked(uint32_t idx, dw_attr_t& attr, dw_form_t& form) const
     51                     {
     52                         m_attributes[idx].get(attr, form);
     53                     }
     54     dw_form_t       GetFormByIndexUnchecked (uint32_t idx) const
     55                     {
     56                         return m_attributes[idx].get_form();
     57                     }
     58     void            CopyExcludingAddressAttributes(const DWARFAbbreviationDeclaration& abbr_decl, const uint32_t idx);
     59     void            CopyChangingStringToStrp(
     60                         const DWARFAbbreviationDeclaration& abbr_decl,
     61                         const lldb_private::DataExtractor& debug_info_data,
     62                         dw_offset_t debug_info_offset,
     63                         const DWARFCompileUnit* cu,
     64                         const uint32_t strp_min_len);
     65     uint32_t        FindAttributeIndex(dw_attr_t attr) const;
     66     bool            Extract(const lldb_private::DataExtractor& data, lldb::offset_t *offset_ptr);
     67     bool            Extract(const lldb_private::DataExtractor& data, lldb::offset_t *offset_ptr, dw_uleb128_t code);
     68 //  void            Append(BinaryStreamBuf& out_buff) const;
     69     bool            IsValid();
     70     void            Dump(lldb_private::Stream *s) const;
     71     bool            operator == (const DWARFAbbreviationDeclaration& rhs) const;
     72 //  DWARFAttribute::collection& Attributes() { return m_attributes; }
     73     const DWARFAttribute::collection& Attributes() const { return m_attributes; }
     74 protected:
     75     dw_uleb128_t        m_code;
     76     dw_tag_t            m_tag;
     77     uint8_t             m_has_children;
     78     DWARFAttribute::collection m_attributes;
     79 };
     80 
     81 #endif  // liblldb_DWARFAbbreviationDeclaration_h_
     82