blob: f5ca9cce525e86273d0e48aa41a9d21f57db59c8 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- DWARFAttribute.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
Greg Claytona76dd622011-09-12 04:20:38 +000010#ifndef SymbolFileDWARF_DWARFAttribute_h_
11#define SymbolFileDWARF_DWARFAttribute_h_
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012
Greg Clayton6071e6f2015-08-26 22:57:51 +000013#include "llvm/ADT/SmallVector.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014#include "DWARFDefines.h"
15#include <vector>
16
Greg Clayton6071e6f2015-08-26 22:57:51 +000017class DWARFCompileUnit;
18class DWARFFormValue;
19
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020class DWARFAttribute
21{
22public:
23 DWARFAttribute(dw_attr_t attr, dw_form_t form) :
Greg Clayton6071e6f2015-08-26 22:57:51 +000024 m_attr (attr),
25 m_form (form)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000026 {
27 }
28
Greg Clayton6071e6f2015-08-26 22:57:51 +000029 void set (dw_attr_t attr, dw_form_t form) { m_attr = attr; m_form = form; }
30 void set_attr (dw_attr_t attr) { m_attr = attr; }
31 void set_form (dw_form_t form) { m_form = form; }
32 dw_attr_t get_attr () const { return m_attr; }
33 dw_form_t get_form () const { return m_form; }
34 void get (dw_attr_t& attr, dw_form_t& form) const
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035 {
Greg Clayton6071e6f2015-08-26 22:57:51 +000036 attr = m_attr;
37 form = m_form;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000038 }
Greg Clayton6071e6f2015-08-26 22:57:51 +000039 bool operator == (const DWARFAttribute& rhs) const { return m_attr == rhs.m_attr && m_form == rhs.m_form; }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000040 typedef std::vector<DWARFAttribute> collection;
41 typedef collection::iterator iterator;
42 typedef collection::const_iterator const_iterator;
43
44protected:
Greg Clayton6071e6f2015-08-26 22:57:51 +000045 dw_attr_t m_attr;
46 dw_form_t m_form;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047};
48
49
Greg Clayton6071e6f2015-08-26 22:57:51 +000050class DWARFAttributes
51{
52public:
53 DWARFAttributes();
54 ~DWARFAttributes();
55
56 void Append(const DWARFCompileUnit *cu, dw_offset_t attr_die_offset, dw_attr_t attr, dw_form_t form);
57 const DWARFCompileUnit * CompileUnitAtIndex(uint32_t i) const { return m_infos[i].cu; }
58 dw_offset_t DIEOffsetAtIndex(uint32_t i) const { return m_infos[i].die_offset; }
59 dw_attr_t AttributeAtIndex(uint32_t i) const { return m_infos[i].attr.get_attr(); }
60 dw_attr_t FormAtIndex(uint32_t i) const { return m_infos[i].attr.get_form(); }
61 bool ExtractFormValueAtIndex (uint32_t i, DWARFFormValue &form_value) const;
62 uint64_t FormValueAsUnsignedAtIndex (uint32_t i, uint64_t fail_value) const;
63 uint64_t FormValueAsUnsigned (dw_attr_t attr, uint64_t fail_value) const;
64 uint32_t FindAttributeIndex(dw_attr_t attr) const;
65 bool ContainsAttribute(dw_attr_t attr) const;
66 bool RemoveAttribute(dw_attr_t attr);
67 void Clear() { m_infos.clear(); }
68 size_t Size() const { return m_infos.size(); }
69
70protected:
71 struct AttributeValue
72 {
73 const DWARFCompileUnit *cu; // Keep the compile unit with each attribute in case we have DW_FORM_ref_addr values
74 dw_offset_t die_offset;
75 DWARFAttribute attr;
76 };
77 typedef llvm::SmallVector<AttributeValue, 8> collection;
78 collection m_infos;
79};
80
Greg Claytona76dd622011-09-12 04:20:38 +000081#endif // SymbolFileDWARF_DWARFAttribute_h_