139 lines · c
1//===-- DWARFBaseDIE.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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFBASEDIE_H10#define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFBASEDIE_H11 12#include "lldb/Core/dwarf.h"13#include "lldb/lldb-types.h"14 15#include "llvm/Support/Error.h"16#include <optional>17 18namespace lldb_private::plugin {19namespace dwarf {20class DIERef;21class DWARFASTParser;22class DWARFAttributes;23class DWARFUnit;24class DWARFDebugInfoEntry;25class DWARFDeclContext;26class SymbolFileDWARF;27class DWARFFormValue;28 29class DWARFBaseDIE {30public:31 using DWARFFormValue = dwarf::DWARFFormValue;32 DWARFBaseDIE() = default;33 34 DWARFBaseDIE(DWARFUnit *cu, DWARFDebugInfoEntry *die)35 : m_cu(cu), m_die(die) {}36 37 DWARFBaseDIE(const DWARFUnit *cu, DWARFDebugInfoEntry *die)38 : m_cu(const_cast<DWARFUnit *>(cu)), m_die(die) {}39 40 DWARFBaseDIE(DWARFUnit *cu, const DWARFDebugInfoEntry *die)41 : m_cu(cu), m_die(const_cast<DWARFDebugInfoEntry *>(die)) {}42 43 DWARFBaseDIE(const DWARFUnit *cu, const DWARFDebugInfoEntry *die)44 : m_cu(const_cast<DWARFUnit *>(cu)),45 m_die(const_cast<DWARFDebugInfoEntry *>(die)) {}46 47 // Tests48 explicit operator bool() const { return IsValid(); }49 50 bool IsValid() const { return m_cu && m_die; }51 52 bool HasChildren() const;53 54 bool Supports_DW_AT_APPLE_objc_complete_type() const;55 56 // Accessors57 SymbolFileDWARF *GetDWARF() const;58 59 DWARFUnit *GetCU() const { return m_cu; }60 61 DWARFDebugInfoEntry *GetDIE() const { return m_die; }62 63 std::optional<DIERef> GetDIERef() const;64 65 void Set(DWARFUnit *cu, DWARFDebugInfoEntry *die) {66 if (cu && die) {67 m_cu = cu;68 m_die = die;69 } else {70 Clear();71 }72 }73 74 void Clear() {75 m_cu = nullptr;76 m_die = nullptr;77 }78 79 // Get the data that contains the attribute values for this DIE. Support80 // for .debug_types means that any DIE can have its data either in the81 // .debug_info or the .debug_types section; this method will return the82 // correct section data.83 //84 // Clients must validate that this object is valid before calling this.85 const DWARFDataExtractor &GetData() const;86 87 // Accessing information about a DIE88 dw_tag_t Tag() const;89 90 dw_offset_t GetOffset() const;91 92 // Get the LLDB user ID for this DIE. This is often just the DIE offset,93 // but it might have a SymbolFileDWARF::GetID() in the high 32 bits if94 // we are doing Darwin DWARF in .o file, or DWARF stand alone debug95 // info.96 lldb::user_id_t GetID() const;97 98 const char *GetName() const;99 100 lldb::ModuleSP GetModule() const;101 102 // Getting attribute values from the DIE.103 //104 // GetAttributeValueAsXXX() functions should only be used if you are105 // looking for one or two attributes on a DIE. If you are trying to106 // parse all attributes, use GetAttributes (...) instead107 const char *GetAttributeValueAsString(const dw_attr_t attr,108 const char *fail_value) const;109 110 uint64_t GetAttributeValueAsUnsigned(const dw_attr_t attr,111 uint64_t fail_value) const;112 113 std::optional<uint64_t>114 GetAttributeValueAsOptionalUnsigned(const dw_attr_t attr) const;115 116 uint64_t GetAttributeValueAsAddress(const dw_attr_t attr,117 uint64_t fail_value) const;118 119 enum class Recurse : bool { no, yes };120 DWARFAttributes GetAttributes(Recurse recurse = Recurse::yes) const;121 122 // The following methods use LLVM naming convension in order to be are used by123 // LLVM libraries.124 dw_tag_t getTag() const { return Tag(); }125 126 const char *getShortName() const { return GetName(); }127 128protected:129 DWARFUnit *m_cu = nullptr;130 DWARFDebugInfoEntry *m_die = nullptr;131};132 133bool operator==(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs);134bool operator!=(const DWARFBaseDIE &lhs, const DWARFBaseDIE &rhs);135} // namespace dwarf136} // namespace lldb_private::plugin137 138#endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFBASEDIE_H139