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