xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/SymbolFile/DWARF/DWARFAttribute.h (revision be691f3bb6417f04a68938fadbcaee2d5795e764)
1061da546Spatrick //===-- DWARFAttribute.h ----------------------------------------*- C++ -*-===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFATTRIBUTE_H
10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFATTRIBUTE_H
11061da546Spatrick 
12061da546Spatrick #include "DWARFDefines.h"
13061da546Spatrick #include "DWARFFormValue.h"
14061da546Spatrick #include "llvm/ADT/SmallVector.h"
15061da546Spatrick #include <vector>
16061da546Spatrick 
17061da546Spatrick class DWARFUnit;
18061da546Spatrick 
19061da546Spatrick class DWARFAttribute {
20061da546Spatrick public:
DWARFAttribute(dw_attr_t attr,dw_form_t form,DWARFFormValue::ValueType value)21061da546Spatrick   DWARFAttribute(dw_attr_t attr, dw_form_t form,
22061da546Spatrick                  DWARFFormValue::ValueType value)
23061da546Spatrick       : m_attr(attr), m_form(form), m_value(value) {}
24061da546Spatrick 
get_attr()25061da546Spatrick   dw_attr_t get_attr() const { return m_attr; }
get_form()26061da546Spatrick   dw_form_t get_form() const { return m_form; }
get_value()27*be691f3bSpatrick   DWARFFormValue::ValueType get_value() const { return m_value; }
get(dw_attr_t & attr,dw_form_t & form,DWARFFormValue::ValueType & val)28061da546Spatrick   void get(dw_attr_t &attr, dw_form_t &form,
29061da546Spatrick            DWARFFormValue::ValueType &val) const {
30061da546Spatrick     attr = m_attr;
31061da546Spatrick     form = m_form;
32061da546Spatrick     val = m_value;
33061da546Spatrick   }
34061da546Spatrick   typedef std::vector<DWARFAttribute> collection;
35061da546Spatrick   typedef collection::iterator iterator;
36061da546Spatrick   typedef collection::const_iterator const_iterator;
37061da546Spatrick 
38061da546Spatrick protected:
39061da546Spatrick   dw_attr_t m_attr;
40061da546Spatrick   dw_form_t m_form;
41061da546Spatrick   DWARFFormValue::ValueType m_value;
42061da546Spatrick };
43061da546Spatrick 
44061da546Spatrick class DWARFAttributes {
45061da546Spatrick public:
46061da546Spatrick   DWARFAttributes();
47061da546Spatrick   ~DWARFAttributes();
48061da546Spatrick 
49*be691f3bSpatrick   void Append(const DWARFFormValue &form_value, dw_offset_t attr_die_offset,
50*be691f3bSpatrick               dw_attr_t attr);
CompileUnitAtIndex(uint32_t i)51*be691f3bSpatrick   DWARFUnit *CompileUnitAtIndex(uint32_t i) const { return m_infos[i].cu; }
DIEOffsetAtIndex(uint32_t i)52061da546Spatrick   dw_offset_t DIEOffsetAtIndex(uint32_t i) const {
53061da546Spatrick     return m_infos[i].die_offset;
54061da546Spatrick   }
AttributeAtIndex(uint32_t i)55061da546Spatrick   dw_attr_t AttributeAtIndex(uint32_t i) const {
56061da546Spatrick     return m_infos[i].attr.get_attr();
57061da546Spatrick   }
FormAtIndex(uint32_t i)58061da546Spatrick   dw_attr_t FormAtIndex(uint32_t i) const { return m_infos[i].attr.get_form(); }
ValueAtIndex(uint32_t i)59*be691f3bSpatrick   DWARFFormValue::ValueType ValueAtIndex(uint32_t i) const {
60*be691f3bSpatrick     return m_infos[i].attr.get_value();
61*be691f3bSpatrick   }
62061da546Spatrick   bool ExtractFormValueAtIndex(uint32_t i, DWARFFormValue &form_value) const;
63061da546Spatrick   DWARFDIE FormValueAsReferenceAtIndex(uint32_t i) const;
64061da546Spatrick   DWARFDIE FormValueAsReference(dw_attr_t attr) const;
65061da546Spatrick   uint32_t FindAttributeIndex(dw_attr_t attr) const;
Clear()66061da546Spatrick   void Clear() { m_infos.clear(); }
Size()67061da546Spatrick   size_t Size() const { return m_infos.size(); }
68061da546Spatrick 
69061da546Spatrick protected:
70061da546Spatrick   struct AttributeValue {
71*be691f3bSpatrick     DWARFUnit *cu; // Keep the compile unit with each attribute in
72061da546Spatrick                    // case we have DW_FORM_ref_addr values
73061da546Spatrick     dw_offset_t die_offset;
74061da546Spatrick     DWARFAttribute attr;
75061da546Spatrick   };
76061da546Spatrick   typedef llvm::SmallVector<AttributeValue, 8> collection;
77061da546Spatrick   collection m_infos;
78061da546Spatrick };
79061da546Spatrick 
80dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFATTRIBUTE_H
81