/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Symbol/SymbolFileOnDemand.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- SymbolFileOnDemand.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_SYMBOL_SYMBOLFILEONDEMAND_H |
10 | | #define LLDB_SYMBOL_SYMBOLFILEONDEMAND_H |
11 | | |
12 | | #include <mutex> |
13 | | #include <optional> |
14 | | #include <vector> |
15 | | |
16 | | #include "lldb/Symbol/ObjectFile.h" |
17 | | #include "lldb/Symbol/SymbolContext.h" |
18 | | #include "lldb/Symbol/SymbolFile.h" |
19 | | #include "lldb/Target/Statistics.h" |
20 | | #include "lldb/Utility/ConstString.h" |
21 | | #include "lldb/Utility/Flags.h" |
22 | | #include "lldb/Utility/LLDBLog.h" |
23 | | #include "lldb/Utility/Log.h" |
24 | | #include "lldb/lldb-private.h" |
25 | | |
26 | | namespace lldb_private { |
27 | | |
28 | | /// SymbolFileOnDemand wraps an actual SymbolFile by providing |
29 | | /// on demand symbol parsing/indexing to improve performance. |
30 | | /// By default SymbolFileOnDemand will skip load the underlying |
31 | | /// symbols. Any client can on demand hydrate the underlying |
32 | | /// SymbolFile via SymbolFile::SetLoadDebugInfoEnabled(). |
33 | | class SymbolFileOnDemand : public lldb_private::SymbolFile { |
34 | | /// LLVM RTTI support. |
35 | | static char ID; |
36 | | |
37 | | public: |
38 | | /// LLVM RTTI support. |
39 | | /// \{ |
40 | 0 | bool isA(const void *ClassID) const override { |
41 | 0 | return ClassID == &ID || SymbolFile::isA(ClassID); |
42 | 0 | } |
43 | 0 | static bool classof(const SymbolFile *obj) { return obj->isA(&ID); } |
44 | | /// \} |
45 | | |
46 | | SymbolFileOnDemand(std::unique_ptr<SymbolFile> &&symbol_file); |
47 | | ~SymbolFileOnDemand() override; |
48 | | |
49 | | // PluginInterface protocol |
50 | 0 | llvm::StringRef GetPluginName() override { return "ondemand"; } |
51 | | |
52 | 0 | bool GetLoadDebugInfoEnabled() override { return m_debug_info_enabled; } |
53 | | |
54 | | void SetLoadDebugInfoEnabled() override; |
55 | | |
56 | | uint32_t GetNumCompileUnits() override; |
57 | | lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) override; |
58 | | |
59 | 19 | SymbolFile *GetBackingSymbolFile() override { return m_sym_file_impl.get(); } |
60 | | |
61 | | uint32_t CalculateAbilities() override; |
62 | | |
63 | | std::recursive_mutex &GetModuleMutex() const override; |
64 | | |
65 | | lldb::LanguageType |
66 | | ParseLanguage(lldb_private::CompileUnit &comp_unit) override; |
67 | | |
68 | | lldb_private::XcodeSDK |
69 | | ParseXcodeSDK(lldb_private::CompileUnit &comp_unit) override; |
70 | | |
71 | | void InitializeObject() override; |
72 | | |
73 | | size_t ParseFunctions(lldb_private::CompileUnit &comp_unit) override; |
74 | | |
75 | | bool ParseLineTable(lldb_private::CompileUnit &comp_unit) override; |
76 | | |
77 | | bool ParseDebugMacros(lldb_private::CompileUnit &comp_unit) override; |
78 | | |
79 | | bool ForEachExternalModule( |
80 | | lldb_private::CompileUnit &, llvm::DenseSet<lldb_private::SymbolFile *> &, |
81 | | llvm::function_ref<bool(lldb_private::Module &)>) override; |
82 | | |
83 | | bool ParseSupportFiles(lldb_private::CompileUnit &comp_unit, |
84 | | lldb_private::FileSpecList &support_files) override; |
85 | | |
86 | | bool ParseIsOptimized(lldb_private::CompileUnit &comp_unit) override; |
87 | | |
88 | | size_t ParseTypes(lldb_private::CompileUnit &comp_unit) override; |
89 | | |
90 | | bool ParseImportedModules( |
91 | | const lldb_private::SymbolContext &sc, |
92 | | std::vector<lldb_private::SourceModule> &imported_modules) override; |
93 | | |
94 | | size_t ParseBlocksRecursive(lldb_private::Function &func) override; |
95 | | |
96 | | size_t |
97 | | ParseVariablesForContext(const lldb_private::SymbolContext &sc) override; |
98 | | |
99 | | lldb_private::Type *ResolveTypeUID(lldb::user_id_t type_uid) override; |
100 | | std::optional<ArrayInfo> GetDynamicArrayInfoForUID( |
101 | | lldb::user_id_t type_uid, |
102 | | const lldb_private::ExecutionContext *exe_ctx) override; |
103 | | |
104 | | bool CompleteType(lldb_private::CompilerType &compiler_type) override; |
105 | | |
106 | | lldb_private::CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; |
107 | | |
108 | | lldb_private::CompilerDeclContext |
109 | | GetDeclContextForUID(lldb::user_id_t uid) override; |
110 | | |
111 | | lldb_private::CompilerDeclContext |
112 | | GetDeclContextContainingUID(lldb::user_id_t uid) override; |
113 | | |
114 | | void |
115 | | ParseDeclsForContext(lldb_private::CompilerDeclContext decl_ctx) override; |
116 | | |
117 | | uint32_t ResolveSymbolContext(const lldb_private::Address &so_addr, |
118 | | lldb::SymbolContextItem resolve_scope, |
119 | | lldb_private::SymbolContext &sc) override; |
120 | | |
121 | | lldb_private::Status |
122 | | CalculateFrameVariableError(lldb_private::StackFrame &frame) override; |
123 | | |
124 | | uint32_t ResolveSymbolContext( |
125 | | const lldb_private::SourceLocationSpec &src_location_spec, |
126 | | lldb::SymbolContextItem resolve_scope, |
127 | | lldb_private::SymbolContextList &sc_list) override; |
128 | | |
129 | | void Dump(lldb_private::Stream &s) override; |
130 | | void DumpClangAST(lldb_private::Stream &s) override; |
131 | | |
132 | | void |
133 | | FindGlobalVariables(lldb_private::ConstString name, |
134 | | const lldb_private::CompilerDeclContext &parent_decl_ctx, |
135 | | uint32_t max_matches, |
136 | | lldb_private::VariableList &variables) override; |
137 | | |
138 | | void FindGlobalVariables(const lldb_private::RegularExpression ®ex, |
139 | | uint32_t max_matches, |
140 | | lldb_private::VariableList &variables) override; |
141 | | |
142 | | void FindFunctions(const lldb_private::Module::LookupInfo &lookup_info, |
143 | | const lldb_private::CompilerDeclContext &parent_decl_ctx, |
144 | | bool include_inlines, |
145 | | lldb_private::SymbolContextList &sc_list) override; |
146 | | |
147 | | void FindFunctions(const lldb_private::RegularExpression ®ex, |
148 | | bool include_inlines, |
149 | | lldb_private::SymbolContextList &sc_list) override; |
150 | | |
151 | | void GetMangledNamesForFunction( |
152 | | const std::string &scope_qualified_name, |
153 | | std::vector<lldb_private::ConstString> &mangled_names) override; |
154 | | |
155 | | void |
156 | | FindTypes(lldb_private::ConstString name, |
157 | | const lldb_private::CompilerDeclContext &parent_decl_ctx, |
158 | | uint32_t max_matches, |
159 | | llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, |
160 | | lldb_private::TypeMap &types) override; |
161 | | |
162 | | void FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, |
163 | | lldb_private::LanguageSet languages, |
164 | | llvm::DenseSet<SymbolFile *> &searched_symbol_files, |
165 | | lldb_private::TypeMap &types) override; |
166 | | |
167 | | void GetTypes(lldb_private::SymbolContextScope *sc_scope, |
168 | | lldb::TypeClass type_mask, |
169 | | lldb_private::TypeList &type_list) override; |
170 | | |
171 | | llvm::Expected<lldb::TypeSystemSP> |
172 | | GetTypeSystemForLanguage(lldb::LanguageType language) override; |
173 | | |
174 | | lldb_private::CompilerDeclContext |
175 | | FindNamespace(lldb_private::ConstString name, |
176 | | const lldb_private::CompilerDeclContext &parent_decl_ctx, |
177 | | bool only_root_namespaces) override; |
178 | | |
179 | | std::vector<std::unique_ptr<lldb_private::CallEdge>> |
180 | | ParseCallEdgesInFunction(UserID func_id) override; |
181 | | |
182 | | lldb::UnwindPlanSP |
183 | | GetUnwindPlan(const Address &address, |
184 | | const RegisterInfoResolver &resolver) override; |
185 | | |
186 | | llvm::Expected<lldb::addr_t> GetParameterStackSize(Symbol &symbol) override; |
187 | | |
188 | | void PreloadSymbols() override; |
189 | | |
190 | | uint64_t GetDebugInfoSize() override; |
191 | | lldb_private::StatsDuration::Duration GetDebugInfoParseTime() override; |
192 | | lldb_private::StatsDuration::Duration GetDebugInfoIndexTime() override; |
193 | | |
194 | | uint32_t GetAbilities() override; |
195 | | |
196 | 2.84k | Symtab *GetSymtab() override { return m_sym_file_impl->GetSymtab(); } |
197 | | |
198 | 834 | ObjectFile *GetObjectFile() override { |
199 | 834 | return m_sym_file_impl->GetObjectFile(); |
200 | 834 | } |
201 | 0 | const ObjectFile *GetObjectFile() const override { |
202 | 0 | return m_sym_file_impl->GetObjectFile(); |
203 | 0 | } |
204 | 0 | ObjectFile *GetMainObjectFile() override { |
205 | 0 | return m_sym_file_impl->GetMainObjectFile(); |
206 | 0 | } |
207 | | |
208 | 0 | void SectionFileAddressesChanged() override { |
209 | 0 | return m_sym_file_impl->SectionFileAddressesChanged(); |
210 | 0 | } |
211 | | |
212 | 0 | bool GetDebugInfoIndexWasLoadedFromCache() const override { |
213 | 0 | return m_sym_file_impl->GetDebugInfoIndexWasLoadedFromCache(); |
214 | 0 | } |
215 | 0 | void SetDebugInfoIndexWasLoadedFromCache() override { |
216 | 0 | m_sym_file_impl->SetDebugInfoIndexWasLoadedFromCache(); |
217 | 0 | } |
218 | 0 | bool GetDebugInfoIndexWasSavedToCache() const override { |
219 | 0 | return m_sym_file_impl->GetDebugInfoIndexWasSavedToCache(); |
220 | 0 | } |
221 | 0 | void SetDebugInfoIndexWasSavedToCache() override { |
222 | 0 | m_sym_file_impl->SetDebugInfoIndexWasSavedToCache(); |
223 | 0 | } |
224 | 0 | bool GetDebugInfoHadFrameVariableErrors() const override { |
225 | 0 | return m_sym_file_impl->GetDebugInfoHadFrameVariableErrors(); |
226 | 0 | } |
227 | 0 | void SetDebugInfoHadFrameVariableErrors() override { |
228 | 0 | return m_sym_file_impl->SetDebugInfoHadFrameVariableErrors(); |
229 | 0 | } |
230 | | |
231 | | lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, |
232 | | std::optional<uint64_t> byte_size, |
233 | | SymbolContextScope *context, |
234 | | lldb::user_id_t encoding_uid, |
235 | | Type::EncodingDataType encoding_uid_type, |
236 | | const Declaration &decl, |
237 | | const CompilerType &compiler_qual_type, |
238 | | Type::ResolveState compiler_type_resolve_state, |
239 | 0 | uint32_t opaque_payload = 0) override { |
240 | 0 | return m_sym_file_impl->MakeType( |
241 | 0 | uid, name, byte_size, context, encoding_uid, encoding_uid_type, decl, |
242 | 0 | compiler_qual_type, compiler_type_resolve_state, opaque_payload); |
243 | 0 | } |
244 | | |
245 | 0 | lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override { |
246 | 0 | return m_sym_file_impl->CopyType(other_type); |
247 | 0 | } |
248 | | |
249 | | private: |
250 | 2.23k | Log *GetLog() const { return ::lldb_private::GetLog(LLDBLog::OnDemand); } |
251 | | |
252 | 0 | ConstString GetSymbolFileName() { |
253 | 0 | return GetObjectFile()->GetFileSpec().GetFilename(); |
254 | 0 | } |
255 | | |
256 | | private: |
257 | | bool m_debug_info_enabled = false; |
258 | | bool m_preload_symbols = false; |
259 | | std::unique_ptr<SymbolFile> m_sym_file_impl; |
260 | | }; |
261 | | } // namespace lldb_private |
262 | | |
263 | | #endif // LLDB_SYMBOL_SYMBOLFILEONDEMAND_H |