1 //===-- DWARFIndex.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_DWARFINDEX_H
10 #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFINDEX_H
11 
12 #include "Plugins/SymbolFile/DWARF/DIERef.h"
13 #include "Plugins/SymbolFile/DWARF/DWARFDIE.h"
14 #include "Plugins/SymbolFile/DWARF/DWARFFormValue.h"
15 #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h"
16 
17 #include "lldb/Core/Module.h"
18 #include "lldb/Target/Statistics.h"
19 
20 namespace lldb_private::plugin {
21 namespace dwarf {
22 class DWARFDeclContext;
23 class DWARFDIE;
24 
25 class DWARFIndex {
26 public:
DWARFIndex(Module & module)27   DWARFIndex(Module &module) : m_module(module) {}
28   virtual ~DWARFIndex();
29 
30   virtual void Preload() = 0;
31 
32   /// Finds global variables with the given base name. Any additional filtering
33   /// (e.g., to only retrieve variables from a given context) should be done by
34   /// the consumer.
35   virtual void
36   GetGlobalVariables(ConstString basename,
37                      llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
38 
39   virtual void
40   GetGlobalVariables(const RegularExpression &regex,
41                      llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
42   /// \a cu must be the skeleton unit if possible, not GetNonSkeletonUnit().
43   virtual void
44   GetGlobalVariables(DWARFUnit &cu,
45                      llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
46   virtual void
47   GetObjCMethods(ConstString class_name,
48                  llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
49   virtual void
50   GetCompleteObjCClass(ConstString class_name, bool must_be_implementation,
51                        llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
52   virtual void GetTypes(ConstString name,
53                         llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
54   virtual void GetTypes(const DWARFDeclContext &context,
55                         llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
56 
57   /// Finds all DIEs whose fully qualified name matches `context`. A base
58   /// implementation is provided, and it uses the entire CU to check the DIE
59   /// parent hierarchy. Specializations should override this if they are able
60   /// to provide a faster implementation.
61   virtual void
62   GetFullyQualifiedType(const DWARFDeclContext &context,
63                         llvm::function_ref<bool(DWARFDIE die)> callback);
64   virtual void
65   GetNamespaces(ConstString name,
66                 llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
67   virtual void
68   GetFunctions(const Module::LookupInfo &lookup_info, SymbolFileDWARF &dwarf,
69                const CompilerDeclContext &parent_decl_ctx,
70                llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
71   virtual void
72   GetFunctions(const RegularExpression &regex,
73                llvm::function_ref<bool(DWARFDIE die)> callback) = 0;
74 
75   virtual void Dump(Stream &s) = 0;
76 
GetIndexTime()77   StatsDuration::Duration GetIndexTime() { return m_index_time; }
78 
79 protected:
80   Module &m_module;
81   StatsDuration m_index_time;
82 
83   /// Helper function implementing common logic for processing function dies. If
84   /// the function given by "ref" matches search criteria given by
85   /// "parent_decl_ctx" and "name_type_mask", it is inserted into the "dies"
86   /// vector.
87   bool ProcessFunctionDIE(const Module::LookupInfo &lookup_info, DIERef ref,
88                           SymbolFileDWARF &dwarf,
89                           const CompilerDeclContext &parent_decl_ctx,
90                           llvm::function_ref<bool(DWARFDIE die)> callback);
91 
92   class DIERefCallbackImpl {
93   public:
94     DIERefCallbackImpl(const DWARFIndex &index,
95                        llvm::function_ref<bool(DWARFDIE die)> callback,
96                        llvm::StringRef name);
97     bool operator()(DIERef ref) const;
98     bool operator()(const llvm::AppleAcceleratorTable::Entry &entry) const;
99 
100   private:
101     const DWARFIndex &m_index;
102     SymbolFileDWARF &m_dwarf;
103     const llvm::function_ref<bool(DWARFDIE die)> m_callback;
104     const llvm::StringRef m_name;
105   };
106   DIERefCallbackImpl
107   DIERefCallback(llvm::function_ref<bool(DWARFDIE die)> callback,
108                  llvm::StringRef name = {}) const {
109     return DIERefCallbackImpl(*this, callback, name);
110   }
111 
112   void ReportInvalidDIERef(DIERef ref, llvm::StringRef name) const;
113 
114   /// Implementation of `GetFullyQualifiedType` to check a single entry,
115   /// shareable with derived classes.
116   bool
117   GetFullyQualifiedTypeImpl(const DWARFDeclContext &context, DWARFDIE die,
118                             llvm::function_ref<bool(DWARFDIE die)> callback);
119 };
120 } // namespace dwarf
121 } // namespace lldb_private::plugin
122 
123 #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_DWARFINDEX_H
124