1 //===-- DWARFDIE.h ----------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDIE_H 10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDIE_H 11 12 #include "DWARFBaseDIE.h" 13 #include "llvm/ADT/SmallSet.h" 14 #include "llvm/ADT/iterator_range.h" 15 16 class DWARFDIE : public DWARFBaseDIE { 17 public: 18 class child_iterator; 19 using DWARFBaseDIE::DWARFBaseDIE; 20 21 // Tests 22 bool IsStructUnionOrClass() const; 23 24 bool IsMethod() const; 25 26 // Accessors 27 28 // Accessing information about a DIE 29 const char *GetMangledName() const; 30 31 const char *GetPubname() const; 32 33 const char *GetQualifiedName(std::string &storage) const; 34 35 using DWARFBaseDIE::GetName; 36 void GetName(lldb_private::Stream &s) const; 37 38 void AppendTypeName(lldb_private::Stream &s) const; 39 40 lldb_private::Type *ResolveType() const; 41 42 // Resolve a type by UID using this DIE's DWARF file 43 lldb_private::Type *ResolveTypeUID(const DWARFDIE &die) const; 44 45 // Functions for obtaining DIE relations and references 46 47 DWARFDIE 48 GetParent() const; 49 50 DWARFDIE 51 GetFirstChild() const; 52 53 DWARFDIE 54 GetSibling() const; 55 56 DWARFDIE 57 GetReferencedDIE(const dw_attr_t attr) const; 58 59 // Get a another DIE from the same DWARF file as this DIE. This will 60 // check the current DIE's compile unit first to see if "die_offset" is 61 // in the same compile unit, and fall back to checking the DWARF file. 62 DWARFDIE 63 GetDIE(dw_offset_t die_offset) const; 64 using DWARFBaseDIE::GetDIE; 65 66 DWARFDIE 67 LookupDeepestBlock(lldb::addr_t file_addr) const; 68 69 DWARFDIE 70 GetParentDeclContextDIE() const; 71 72 // DeclContext related functions 73 std::vector<DWARFDIE> GetDeclContextDIEs() const; 74 75 /// Return this DIE's decl context as it is needed to look up types 76 /// in Clang's -gmodules debug info format. 77 void GetDeclContext( 78 llvm::SmallVectorImpl<lldb_private::CompilerContext> &context) const; 79 80 // Getting attribute values from the DIE. 81 // 82 // GetAttributeValueAsXXX() functions should only be used if you are 83 // looking for one or two attributes on a DIE. If you are trying to 84 // parse all attributes, use GetAttributes (...) instead 85 DWARFDIE 86 GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const; 87 88 bool GetDIENamesAndRanges(const char *&name, const char *&mangled, 89 DWARFRangeList &ranges, int &decl_file, 90 int &decl_line, int &decl_column, int &call_file, 91 int &call_line, int &call_column, 92 lldb_private::DWARFExpression *frame_base) const; 93 /// The range of all the children of this DIE. 94 /// 95 /// This is a template just because child_iterator is not completely defined 96 /// at this point. 97 template <typename T = child_iterator> 98 llvm::iterator_range<T> children() const { 99 return llvm::make_range(T(*this), T()); 100 } 101 }; 102 103 class DWARFDIE::child_iterator 104 : public llvm::iterator_facade_base<DWARFDIE::child_iterator, 105 std::forward_iterator_tag, DWARFDIE> { 106 /// The current child or an invalid DWARFDie. 107 DWARFDIE m_die; 108 109 public: 110 child_iterator() = default; 111 child_iterator(const DWARFDIE &parent) : m_die(parent.GetFirstChild()) {} 112 bool operator==(const child_iterator &it) const { 113 // DWARFDIE's operator== differentiates between an invalid DWARFDIE that 114 // has a CU but no DIE and one that has neither CU nor DIE. The 'end' 115 // iterator could be default constructed, so explicitly allow 116 // (CU, (DIE)nullptr) == (nullptr, nullptr) -> true 117 if (!m_die.IsValid() && !it.m_die.IsValid()) 118 return true; 119 return m_die == it.m_die; 120 } 121 const DWARFDIE &operator*() const { 122 assert(m_die.IsValid() && "Derefencing invalid iterator?"); 123 return m_die; 124 } 125 DWARFDIE &operator*() { 126 assert(m_die.IsValid() && "Derefencing invalid iterator?"); 127 return m_die; 128 } 129 child_iterator &operator++() { 130 assert(m_die.IsValid() && "Incrementing invalid iterator?"); 131 m_die = m_die.GetSibling(); 132 return *this; 133 } 134 }; 135 136 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFDIE_H 137