LLDB mainline
SymbolFile.h
Go to the documentation of this file.
1//===-- SymbolFile.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_SYMBOLFILE_H
10#define LLDB_SYMBOL_SYMBOLFILE_H
11
12#include "lldb/Core/Module.h"
22#include "lldb/Symbol/Type.h"
28#include "lldb/lldb-private.h"
29#include "llvm/ADT/DenseSet.h"
30#include "llvm/ADT/SmallSet.h"
31#include "llvm/Support/Errc.h"
32
33#include <mutex>
34#include <optional>
35#include <unordered_map>
36
37#if defined(LLDB_CONFIGURATION_DEBUG)
38#define ASSERT_MODULE_LOCK(expr) (expr->AssertModuleLock())
39#else
40#define ASSERT_MODULE_LOCK(expr) ((void)0)
41#endif
42
43namespace lldb_private {
44
45/// Provides public interface for all SymbolFiles. Any protected
46/// virtual members should go into SymbolFileCommon; most SymbolFile
47/// implementations should inherit from SymbolFileCommon to override
48/// the behaviors except SymbolFileOnDemand which inherits
49/// public interfaces from SymbolFile and forward to underlying concrete
50/// SymbolFile implementation.
52 /// LLVM RTTI support.
53 static char ID;
54
55public:
56 /// LLVM RTTI support.
57 /// \{
58 virtual bool isA(const void *ClassID) const { return ClassID == &ID; }
59 static bool classof(const SymbolFile *obj) { return obj->isA(&ID); }
60 /// \}
61
62 // Symbol file ability bits.
63 //
64 // Each symbol file can claim to support one or more symbol file abilities.
65 // These get returned from SymbolFile::GetAbilities(). These help us to
66 // determine which plug-in will be best to load the debug information found
67 // in files.
68 enum Abilities {
69 CompileUnits = (1u << 0),
70 LineTables = (1u << 1),
71 Functions = (1u << 2),
72 Blocks = (1u << 3),
73 GlobalVariables = (1u << 4),
74 LocalVariables = (1u << 5),
75 VariableTypes = (1u << 6),
76 kAllAbilities = ((1u << 7) - 1u)
77 };
78
79 static SymbolFile *FindPlugin(lldb::ObjectFileSP objfile_sp);
80
81 // Constructors and Destructors
82 SymbolFile() = default;
83
84 ~SymbolFile() override = default;
85
86 /// SymbolFileOnDemand class overrides this to return the underlying
87 /// backing SymbolFile implementation that loads on-demand.
88 virtual SymbolFile *GetBackingSymbolFile() { return this; }
89
90 /// Get a mask of what this symbol file supports for the object file
91 /// that it was constructed with.
92 ///
93 /// Each symbol file gets to respond with a mask of abilities that
94 /// it supports for each object file. This happens when we are
95 /// trying to figure out which symbol file plug-in will get used
96 /// for a given object file. The plug-in that responds with the
97 /// best mix of "SymbolFile::Abilities" bits set, will get chosen to
98 /// be the symbol file parser. This allows each plug-in to check for
99 /// sections that contain data a symbol file plug-in would need. For
100 /// example the DWARF plug-in requires DWARF sections in a file that
101 /// contain debug information. If the DWARF plug-in doesn't find
102 /// these sections, it won't respond with many ability bits set, and
103 /// we will probably fall back to the symbol table SymbolFile plug-in
104 /// which uses any information in the symbol table. Also, plug-ins
105 /// might check for some specific symbols in a symbol table in the
106 /// case where the symbol table contains debug information (STABS
107 /// and COFF). Not a lot of work should happen in these functions
108 /// as the plug-in might not get selected due to another plug-in
109 /// having more abilities. Any initialization work should be saved
110 /// for "void SymbolFile::InitializeObject()" which will get called
111 /// on the SymbolFile object with the best set of abilities.
112 ///
113 /// \return
114 /// A uint32_t mask containing bits from the SymbolFile::Abilities
115 /// enumeration. Any bits that are set represent an ability that
116 /// this symbol plug-in can parse from the object file.
117 virtual uint32_t GetAbilities() = 0;
118 virtual uint32_t CalculateAbilities() = 0;
119
120 /// Symbols file subclasses should override this to return the Module that
121 /// owns the TypeSystem that this symbol file modifies type information in.
122 virtual std::recursive_mutex &GetModuleMutex() const;
123
124 /// Initialize the SymbolFile object.
125 ///
126 /// The SymbolFile object with the best set of abilities (detected
127 /// in "uint32_t SymbolFile::GetAbilities()) will have this function
128 /// called if it is chosen to parse an object file. More complete
129 /// initialization can happen in this function which will get called
130 /// prior to any other functions in the SymbolFile protocol.
131 virtual void InitializeObject() {}
132
133 /// Whether debug info will be loaded or not.
134 ///
135 /// It will be true for most implementations except SymbolFileOnDemand.
136 virtual bool GetLoadDebugInfoEnabled() { return true; }
137
138 /// Specify debug info should be loaded.
139 ///
140 /// It will be no-op for most implementations except SymbolFileOnDemand.
141 virtual void SetLoadDebugInfoEnabled() {}
142
143 // Compile Unit function calls
144 // Approach 1 - iterator
145 virtual uint32_t GetNumCompileUnits() = 0;
146 virtual lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) = 0;
147
148 virtual Symtab *GetSymtab(bool can_create = true) = 0;
149
151 /// Return the Xcode SDK comp_unit was compiled against.
152 virtual XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) { return {}; }
153
154 /// This function exists because SymbolFileDWARFDebugMap may extra compile
155 /// units which aren't exposed as "real" compile units. In every other
156 /// case this function should behave identically as ParseLanguage.
157 virtual llvm::SmallSet<lldb::LanguageType, 4>
159 llvm::SmallSet<lldb::LanguageType, 4> langs;
160 langs.insert(ParseLanguage(comp_unit));
161 return langs;
162 }
163
164 virtual size_t ParseFunctions(CompileUnit &comp_unit) = 0;
165 virtual bool ParseLineTable(CompileUnit &comp_unit) = 0;
166 virtual bool ParseDebugMacros(CompileUnit &comp_unit) = 0;
167
168 /// Apply a lambda to each external lldb::Module referenced by this
169 /// \p comp_unit. Recursively also descends into the referenced external
170 /// modules of any encountered compilation unit.
171 ///
172 /// This function can be used to traverse Clang -gmodules debug
173 /// information, which is stored in DWARF files separate from the
174 /// object files.
175 ///
176 /// \param comp_unit
177 /// When this SymbolFile consists of multiple auxilliary
178 /// SymbolFiles, for example, a Darwin debug map that references
179 /// multiple .o files, comp_unit helps choose the auxilliary
180 /// file. In most other cases comp_unit's symbol file is
181 /// identical with *this.
182 ///
183 /// \param[in] lambda
184 /// The lambda that should be applied to every function. The lambda can
185 /// return true if the iteration should be aborted earlier.
186 ///
187 /// \param visited_symbol_files
188 /// A set of SymbolFiles that were already visited to avoid
189 /// visiting one file more than once.
190 ///
191 /// \return
192 /// If the lambda early-exited, this function returns true to
193 /// propagate the early exit.
195 lldb_private::CompileUnit &comp_unit,
196 llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files,
197 llvm::function_ref<bool(Module &)> lambda) {
198 return false;
199 }
200 virtual bool ParseSupportFiles(CompileUnit &comp_unit,
201 SupportFileList &support_files) = 0;
202 virtual size_t ParseTypes(CompileUnit &comp_unit) = 0;
203 virtual bool ParseIsOptimized(CompileUnit &comp_unit) { return false; }
204
205 virtual bool
207 std::vector<SourceModule> &imported_modules) = 0;
208 virtual size_t ParseBlocksRecursive(Function &func) = 0;
209 virtual size_t ParseVariablesForContext(const SymbolContext &sc) = 0;
210 virtual Type *ResolveTypeUID(lldb::user_id_t type_uid) = 0;
211
212 /// The characteristics of an array type.
213 struct ArrayInfo {
214 int64_t first_index = 0;
215
216 /// Each entry belongs to a distinct DW_TAG_subrange_type.
217 /// For multi-dimensional DW_TAG_array_types we would have
218 /// an entry for each dimension. An entry represents the
219 /// optional element count of the subrange.
220 ///
221 /// The order of entries follows the order of the DW_TAG_subrange_type
222 /// children of this DW_TAG_array_type.
223 llvm::SmallVector<std::optional<uint64_t>, 1> element_orders;
224 uint32_t byte_stride = 0;
225 uint32_t bit_stride = 0;
226 };
227 /// If \c type_uid points to an array type, return its characteristics.
228 /// To support variable-length array types, this function takes an
229 /// optional \p ExecutionContext. If \c exe_ctx is non-null, the
230 /// dynamic characteristics for that context are returned.
231 virtual std::optional<ArrayInfo>
233 const lldb_private::ExecutionContext *exe_ctx) = 0;
234
235 virtual bool CompleteType(CompilerType &compiler_type) = 0;
237 virtual CompilerDecl GetDeclForUID(lldb::user_id_t uid) { return {}; }
239 return {};
240 }
244 virtual std::vector<CompilerContext>
246 return {};
247 }
248 virtual uint32_t ResolveSymbolContext(const Address &so_addr,
249 lldb::SymbolContextItem resolve_scope,
250 SymbolContext &sc) = 0;
251
252 /// Get an error that describes why variables might be missing for a given
253 /// symbol context.
254 ///
255 /// If there is an error in the debug information that prevents variables from
256 /// being fetched, this error will get filled in. If there is no debug
257 /// informaiton, no error should be returned. But if there is debug
258 /// information and something prevents the variables from being available a
259 /// valid error should be returned. Valid cases include:
260 /// - compiler option that removes variables (-gline-tables-only)
261 /// - missing external files
262 /// - .dwo files in fission are not accessible or missing
263 /// - .o files on darwin when not using dSYM files that are not accessible
264 /// or missing
265 /// - mismatched exteral files
266 /// - .dwo files in fission where the DWO ID doesn't match
267 /// - .o files on darwin when modification timestamp doesn't match
268 /// - corrupted debug info
269 ///
270 /// \param[in] frame
271 /// The stack frame to use as a basis for the context to check. The frame
272 /// address can be used if there is not debug info due to it not being able
273 /// to be loaded, or if there is a debug info context, like a compile unit,
274 /// or function, it can be used to track down more information on why
275 /// variables are missing.
276 ///
277 /// \returns
278 /// An error specifying why there should have been debug info with variable
279 /// information but the variables were not able to be resolved.
282 if (err.Fail())
284 return err;
285 }
286
287 /// Subclasses will override this function to for GetFrameVariableError().
288 ///
289 /// This allows GetFrameVariableError() to set the member variable
290 /// m_debug_info_had_variable_errors correctly without users having to do it
291 /// manually which is error prone.
293 return Status();
294 }
295 virtual uint32_t
296 ResolveSymbolContext(const SourceLocationSpec &src_location_spec,
297 lldb::SymbolContextItem resolve_scope,
298 SymbolContextList &sc_list);
299
300 virtual void DumpClangAST(Stream &s, llvm::StringRef filter,
301 bool show_colors) {}
302 virtual void FindGlobalVariables(ConstString name,
303 const CompilerDeclContext &parent_decl_ctx,
304 uint32_t max_matches,
305 VariableList &variables);
306 virtual void FindGlobalVariables(const RegularExpression &regex,
307 uint32_t max_matches,
308 VariableList &variables);
309 virtual void FindFunctions(const Module::LookupInfo &lookup_info,
310 const CompilerDeclContext &parent_decl_ctx,
311 bool include_inlines, SymbolContextList &sc_list);
312 virtual void FindFunctions(const RegularExpression &regex,
313 bool include_inlines, SymbolContextList &sc_list);
314
315 /// Find types using a type-matching object that contains all search
316 /// parameters.
317 ///
318 /// \see lldb_private::TypeQuery
319 ///
320 /// \param[in] query
321 /// A type matching object that contains all of the details of the type
322 /// search.
323 ///
324 /// \param[in] results
325 /// Any matching types will be populated into the \a results object using
326 /// TypeMap::InsertUnique(...).
327 virtual void FindTypes(const TypeQuery &query, TypeResults &results) {}
328
329 virtual void
330 GetMangledNamesForFunction(const std::string &scope_qualified_name,
331 std::vector<ConstString> &mangled_names);
332
333 /// Resolves the function corresponding to the specified LLDB function
334 /// call \c label.
335 ///
336 /// \param[in,out] label The FunctionCallLabel to be resolved.
337 ///
338 /// \returns An llvm::Error if the specified \c label couldn't be resolved.
339 /// Returns the resolved function (as a SymbolContext) otherwise.
340 virtual llvm::Expected<SymbolContext>
342 return llvm::createStringError("Not implemented");
343 }
344
346 lldb::TypeClass type_mask,
347 lldb_private::TypeList &type_list) = 0;
348
349 virtual void PreloadSymbols();
350
351 virtual llvm::Expected<lldb::TypeSystemSP>
353
354 /// Finds a namespace of name \ref name and whose parent
355 /// context is \ref parent_decl_ctx.
356 ///
357 /// If \code{.cpp} !parent_decl_ctx.IsValid() \endcode
358 /// then this function will consider all namespaces that
359 /// match the name. If \ref only_root_namespaces is
360 /// true, only consider in the search those DIEs that
361 /// represent top-level namespaces.
362 virtual CompilerDeclContext
363 FindNamespace(ConstString name, const CompilerDeclContext &parent_decl_ctx,
364 bool only_root_namespaces = false) {
365 return CompilerDeclContext();
366 }
367
368 virtual ObjectFile *GetObjectFile() = 0;
369 virtual const ObjectFile *GetObjectFile() const = 0;
371
372 virtual std::vector<std::unique_ptr<CallEdge>>
374 return {};
375 }
376
377 virtual void AddSymbols(Symtab &symtab) {}
378
379 /// Notify the SymbolFile that the file addresses in the Sections
380 /// for this module have been changed.
381 virtual void SectionFileAddressesChanged() = 0;
382
384 virtual ~RegisterInfoResolver(); // anchor
385
386 virtual const RegisterInfo *ResolveName(llvm::StringRef name) const = 0;
388 uint32_t number) const = 0;
389 };
390 virtual lldb::UnwindPlanSP
391 GetUnwindPlan(const Address &address, const RegisterInfoResolver &resolver) {
392 return nullptr;
393 }
394
395 /// Return the number of stack bytes taken up by the parameters to this
396 /// function.
397 virtual llvm::Expected<lldb::addr_t> GetParameterStackSize(Symbol &symbol) {
398 return llvm::createStringError(make_error_code(llvm::errc::not_supported),
399 "Operation not supported.");
400 }
401
402 virtual void Dump(Stream &s) = 0;
403
404 /// Metrics gathering functions
405
406 /// Return the size in bytes of all loaded debug information or total possible
407 /// debug info in the symbol file.
408 ///
409 /// If the debug information is contained in sections of an ObjectFile, then
410 /// this call should add the size of all sections that contain debug
411 /// information. Symbols the symbol tables are not considered debug
412 /// information for this call to make it easy and quick for this number to be
413 /// calculated. If the symbol file is all debug information, the size of the
414 /// entire file should be returned. The default implementation of this
415 /// function will iterate over all sections in a module and add up their
416 /// debug info only section byte sizes.
417 ///
418 /// \param load_all_debug_info
419 /// If true, force loading any symbol files if they are not yet loaded and
420 /// add to the total size. Default to false.
421 ///
422 /// \returns
423 /// Total currently loaded debug info size in bytes
424 virtual uint64_t GetDebugInfoSize(bool load_all_debug_info = false) = 0;
425
426 /// Return the time taken to parse the debug information.
427 ///
428 /// \returns 0.0 if no information has been parsed or if there is
429 /// no computational cost to parsing the debug information.
431
432 /// Return the time it took to index the debug information in the object
433 /// file.
434 ///
435 /// \returns 0.0 if the file doesn't need to be indexed or if it
436 /// hasn't been indexed yet, or a valid duration if it has.
438
439 /// Reset the statistics for the symbol file.
440 virtual void ResetStatistics() {}
441
442 /// Get the additional modules that this symbol file uses to parse debug info.
443 ///
444 /// Some debug info is stored in stand alone object files that are represented
445 /// by unique modules that will show up in the statistics module list. Return
446 /// a list of modules that are not in the target module list that this symbol
447 /// file is currently using so that they can be tracked and assoicated with
448 /// the module in the statistics.
450
451 /// Accessors for the bool that indicates if the debug info index was loaded
452 /// from, or saved to the module index cache.
453 ///
454 /// In statistics it is handy to know if a module's debug info was loaded from
455 /// or saved to the cache. When the debug info index is loaded from the cache
456 /// startup times can be faster. When the cache is enabled and the debug info
457 /// index is saved to the cache, debug sessions can be slower. These accessors
458 /// can be accessed by the statistics and emitted to help track these costs.
459 /// \{
460 virtual bool GetDebugInfoIndexWasLoadedFromCache() const = 0;
462 virtual bool GetDebugInfoIndexWasSavedToCache() const = 0;
464 /// \}
465
466 /// Accessors for the bool that indicates if there was debug info, but errors
467 /// stopped variables from being able to be displayed correctly. See
468 /// GetFrameVariableError() for details on what are considered errors.
469 virtual bool GetDebugInfoHadFrameVariableErrors() const = 0;
471
472 /// Return true if separate debug info files are supported and this function
473 /// succeeded, false otherwise.
474 ///
475 /// \param[out] d
476 /// If this function succeeded, then this will be a dictionary that
477 /// contains the keys "type", "symfile", and "separate-debug-info-files".
478 /// "type" can be used to assume the structure of each object in
479 /// "separate-debug-info-files".
480 /// \param errors_only
481 /// If true, then only return separate debug info files that encountered
482 /// errors during loading. If false, then return all expected separate
483 /// debug info files, regardless of whether they were successfully loaded.
484 /// \param load_all_debug_info
485 /// If true, force loading any symbol files if they are not yet loaded.
487 bool errors_only,
488 bool load_all_debug_info = false) {
489 return false;
490 };
491
492 /// Retrieves statistics about DWO files associated with this symbol file.
493 /// This function returns a DWOStats struct containing:
494 /// - The number of successfully loaded/parsed DWO files.
495 /// - The total number of DWO files encountered.
496 /// - The number of DWO CUs that failed to load due to errors.
497 /// If this symbol file does not support DWO files, all counts will be zero.
498 ///
499 /// \returns
500 /// A DWOStats struct with loaded, total, and error counts for DWO files.
501 virtual DWOStats GetDwoStats() { return {}; }
502
503 virtual lldb::TypeSP
505 std::optional<uint64_t> byte_size, SymbolContextScope *context,
506 lldb::user_id_t encoding_uid,
507 Type::EncodingDataType encoding_uid_type, const Declaration &decl,
508 const CompilerType &compiler_qual_type,
509 Type::ResolveState compiler_type_resolve_state,
510 uint32_t opaque_payload = 0) = 0;
511
512 virtual lldb::TypeSP CopyType(const lldb::TypeSP &other_type) = 0;
513
514 /// Returns a map of compilation unit to the compile option arguments
515 /// associated with that compilation unit.
516 std::unordered_map<lldb::CompUnitSP, Args> GetCompileOptions() {
517 std::unordered_map<lldb::CompUnitSP, Args> args;
518 GetCompileOptions(args);
519 return args;
520 }
521
522 std::string GetObjectName() const;
523
524protected:
525 void AssertModuleLock();
526
527 virtual void GetCompileOptions(
528 std::unordered_map<lldb::CompUnitSP, lldb_private::Args> &args) {}
529
530private:
531 SymbolFile(const SymbolFile &) = delete;
532 const SymbolFile &operator=(const SymbolFile &) = delete;
533};
534
535/// Containing protected virtual methods for child classes to override.
536/// Most actual SymbolFile implementations should inherit from this class.
538 /// LLVM RTTI support.
539 static char ID;
540
541public:
542 /// LLVM RTTI support.
543 /// \{
544 bool isA(const void *ClassID) const override {
545 return ClassID == &ID || SymbolFile::isA(ClassID);
546 }
547 static bool classof(const SymbolFileCommon *obj) { return obj->isA(&ID); }
548 /// \}
549
550 // Constructors and Destructors
552 : m_objfile_sp(std::move(objfile_sp)) {}
553
554 ~SymbolFileCommon() override = default;
555
556 uint32_t GetAbilities() override {
560 }
561 return m_abilities;
562 }
563
564 Symtab *GetSymtab(bool can_create = true) override;
565
566 ObjectFile *GetObjectFile() override { return m_objfile_sp.get(); }
567 const ObjectFile *GetObjectFile() const override {
568 return m_objfile_sp.get();
569 }
570 ObjectFile *GetMainObjectFile() override;
571
572 /// Notify the SymbolFile that the file addresses in the Sections
573 /// for this module have been changed.
574 void SectionFileAddressesChanged() override;
575
576 // Compile Unit function calls
577 // Approach 1 - iterator
578 uint32_t GetNumCompileUnits() override;
579 lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) override;
580
581 llvm::Expected<lldb::TypeSystemSP>
583
584 void Dump(Stream &s) override;
585
586 uint64_t GetDebugInfoSize(bool load_all_debug_info = false) override;
587
594 bool GetDebugInfoIndexWasSavedToCache() const override {
596 }
606
607 /// This function is used to create types that belong to a SymbolFile. The
608 /// symbol file will own a strong reference to the type in an internal type
609 /// list.
611 std::optional<uint64_t> byte_size,
612 SymbolContextScope *context,
613 lldb::user_id_t encoding_uid,
614 Type::EncodingDataType encoding_uid_type,
615 const Declaration &decl,
616 const CompilerType &compiler_qual_type,
617 Type::ResolveState compiler_type_resolve_state,
618 uint32_t opaque_payload = 0) override {
619 lldb::TypeSP type_sp (new Type(
620 uid, this, name, byte_size, context, encoding_uid,
621 encoding_uid_type, decl, compiler_qual_type,
622 compiler_type_resolve_state, opaque_payload));
623 m_type_list.Insert(type_sp);
624 return type_sp;
625 }
626
627 lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override {
628 // Make sure the real symbol file matches when copying types.
629 if (GetBackingSymbolFile() != other_type->GetSymbolFile())
630 return lldb::TypeSP();
631 lldb::TypeSP type_sp(new Type(*other_type));
632 m_type_list.Insert(type_sp);
633 return type_sp;
634 }
635
636protected:
637 virtual uint32_t CalculateNumCompileUnits() = 0;
638 virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t idx) = 0;
639 virtual TypeList &GetTypeList() { return m_type_list; }
640 void SetCompileUnitAtIndex(uint32_t idx, const lldb::CompUnitSP &cu_sp);
641
642 lldb::ObjectFileSP m_objfile_sp; // Keep a reference to the object file in
643 // case it isn't the same as the module
644 // object file (debug symbols in a separate
645 // file)
646 std::optional<std::vector<lldb::CompUnitSP>> m_compile_units;
648 uint32_t m_abilities = 0;
652 /// Set to true if any variable feteching errors have been found when calling
653 /// GetFrameVariableError(). This will be emitted in the "statistics dump"
654 /// information for a module.
656
657private:
660
661 /// Do not use m_symtab directly, as it may be freed. Use GetSymtab()
662 /// to access it instead.
663 Symtab *m_symtab = nullptr;
664};
665
666} // namespace lldb_private
667
668#endif // LLDB_SYMBOL_SYMBOLFILE_H
A section + offset based address class.
Definition Address.h:62
A class that describes a compilation unit.
Definition CompileUnit.h:43
Represents a generic declaration context in a program.
Represents a generic declaration such as a function declaration.
Generic representation of a type in a programming language.
A uniqued constant string class.
Definition ConstString.h:40
A class that describes the declaration location of a lldb object.
Definition Declaration.h:24
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A class that describes a function.
Definition Function.h:400
A collection class for Module objects.
Definition ModuleList.h:104
A class that encapsulates name lookup information.
Definition Module.h:916
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:90
A plug-in interface definition class for object file parsers.
Definition ObjectFile.h:45
"lldb/Core/SourceLocationSpec.h" A source location specifier class.
This base class provides an interface to stack frames.
Definition StackFrame.h:44
std::chrono::duration< double > Duration
Definition Statistics.h:37
An error handling class.
Definition Status.h:118
bool Fail() const
Test for error condition.
Definition Status.cpp:294
A stream class that can stream formatted output to a file.
Definition Stream.h:28
A list of support files for a CompileUnit.
Defines a list of symbol context objects.
"lldb/Symbol/SymbolContextScope.h" Inherit from this if your object is part of a symbol context and c...
Defines a symbol context baton that can be handed other debug core functions.
const SymbolFileCommon & operator=(const SymbolFileCommon &)=delete
~SymbolFileCommon() override=default
bool GetDebugInfoHadFrameVariableErrors() const override
Accessors for the bool that indicates if there was debug info, but errors stopped variables from bein...
Definition SymbolFile.h:600
void SetDebugInfoIndexWasLoadedFromCache() override
Definition SymbolFile.h:591
bool GetDebugInfoIndexWasSavedToCache() const override
Definition SymbolFile.h:594
lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) override
ObjectFile * GetObjectFile() override
Definition SymbolFile.h:566
std::optional< std::vector< lldb::CompUnitSP > > m_compile_units
Definition SymbolFile.h:646
virtual TypeList & GetTypeList()
Definition SymbolFile.h:639
lldb::ObjectFileSP m_objfile_sp
Definition SymbolFile.h:642
bool isA(const void *ClassID) const override
LLVM RTTI support.
Definition SymbolFile.h:544
void SetDebugInfoIndexWasSavedToCache() override
Definition SymbolFile.h:597
virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t idx)=0
ObjectFile * GetMainObjectFile() override
bool m_debug_info_had_variable_errors
Set to true if any variable feteching errors have been found when calling GetFrameVariableError().
Definition SymbolFile.h:655
Symtab * m_symtab
Do not use m_symtab directly, as it may be freed.
Definition SymbolFile.h:663
static char ID
LLVM RTTI support.
Definition SymbolFile.h:539
void SetCompileUnitAtIndex(uint32_t idx, const lldb::CompUnitSP &cu_sp)
SymbolFileCommon(lldb::ObjectFileSP objfile_sp)
Definition SymbolFile.h:551
void SetDebugInfoHadFrameVariableErrors() override
Definition SymbolFile.h:603
static bool classof(const SymbolFileCommon *obj)
Definition SymbolFile.h:547
const ObjectFile * GetObjectFile() const override
Definition SymbolFile.h:567
Symtab * GetSymtab(bool can_create=true) override
uint32_t GetAbilities() override
Get a mask of what this symbol file supports for the object file that it was constructed with.
Definition SymbolFile.h:556
llvm::Expected< lldb::TypeSystemSP > GetTypeSystemForLanguage(lldb::LanguageType language) override
bool GetDebugInfoIndexWasLoadedFromCache() const override
Accessors for the bool that indicates if the debug info index was loaded from, or saved to the module...
Definition SymbolFile.h:588
uint32_t GetNumCompileUnits() override
SymbolFileCommon(const SymbolFileCommon &)=delete
lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override
Definition SymbolFile.h:627
void SectionFileAddressesChanged() override
Notify the SymbolFile that the file addresses in the Sections for this module have been changed.
virtual uint32_t CalculateNumCompileUnits()=0
void Dump(Stream &s) override
lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, std::optional< uint64_t > byte_size, SymbolContextScope *context, lldb::user_id_t encoding_uid, Type::EncodingDataType encoding_uid_type, const Declaration &decl, const CompilerType &compiler_qual_type, Type::ResolveState compiler_type_resolve_state, uint32_t opaque_payload=0) override
This function is used to create types that belong to a SymbolFile.
Definition SymbolFile.h:610
uint64_t GetDebugInfoSize(bool load_all_debug_info=false) override
Metrics gathering functions.
Provides public interface for all SymbolFiles.
Definition SymbolFile.h:51
virtual lldb::TypeSP CopyType(const lldb::TypeSP &other_type)=0
virtual llvm::SmallSet< lldb::LanguageType, 4 > ParseAllLanguages(CompileUnit &comp_unit)
This function exists because SymbolFileDWARFDebugMap may extra compile units which aren't exposed as ...
Definition SymbolFile.h:158
virtual void ParseDeclsForContext(CompilerDeclContext decl_ctx)
Definition SymbolFile.h:236
virtual uint64_t GetDebugInfoSize(bool load_all_debug_info=false)=0
Metrics gathering functions.
virtual llvm::Expected< lldb::addr_t > GetParameterStackSize(Symbol &symbol)
Return the number of stack bytes taken up by the parameters to this function.
Definition SymbolFile.h:397
virtual bool GetDebugInfoIndexWasLoadedFromCache() const =0
Accessors for the bool that indicates if the debug info index was loaded from, or saved to the module...
virtual XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit)
Return the Xcode SDK comp_unit was compiled against.
Definition SymbolFile.h:152
virtual void InitializeObject()
Initialize the SymbolFile object.
Definition SymbolFile.h:131
virtual bool CompleteType(CompilerType &compiler_type)=0
virtual Type * ResolveTypeUID(lldb::user_id_t type_uid)=0
virtual bool ParseIsOptimized(CompileUnit &comp_unit)
Definition SymbolFile.h:203
virtual bool isA(const void *ClassID) const
LLVM RTTI support.
Definition SymbolFile.h:58
~SymbolFile() override=default
virtual bool ForEachExternalModule(lldb_private::CompileUnit &comp_unit, llvm::DenseSet< lldb_private::SymbolFile * > &visited_symbol_files, llvm::function_ref< bool(Module &)> lambda)
Apply a lambda to each external lldb::Module referenced by this comp_unit.
Definition SymbolFile.h:194
virtual std::vector< CompilerContext > GetCompilerContextForUID(lldb::user_id_t uid)
Definition SymbolFile.h:245
virtual CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid)
Definition SymbolFile.h:238
virtual std::vector< std::unique_ptr< CallEdge > > ParseCallEdgesInFunction(UserID func_id)
Definition SymbolFile.h:373
virtual CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid)
Definition SymbolFile.h:241
virtual CompilerDecl GetDeclForUID(lldb::user_id_t uid)
Definition SymbolFile.h:237
virtual const ObjectFile * GetObjectFile() const =0
virtual size_t ParseTypes(CompileUnit &comp_unit)=0
virtual void SectionFileAddressesChanged()=0
Notify the SymbolFile that the file addresses in the Sections for this module have been changed.
virtual void SetLoadDebugInfoEnabled()
Specify debug info should be loaded.
Definition SymbolFile.h:141
virtual DWOStats GetDwoStats()
Retrieves statistics about DWO files associated with this symbol file.
Definition SymbolFile.h:501
virtual void PreloadSymbols()
virtual lldb::UnwindPlanSP GetUnwindPlan(const Address &address, const RegisterInfoResolver &resolver)
Definition SymbolFile.h:391
virtual SymbolFile * GetBackingSymbolFile()
SymbolFileOnDemand class overrides this to return the underlying backing SymbolFile implementation th...
Definition SymbolFile.h:88
virtual void FindGlobalVariables(ConstString name, const CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, VariableList &variables)
virtual Symtab * GetSymtab(bool can_create=true)=0
virtual bool GetDebugInfoIndexWasSavedToCache() const =0
virtual StatsDuration::Duration GetDebugInfoParseTime()
Return the time taken to parse the debug information.
Definition SymbolFile.h:430
virtual size_t ParseFunctions(CompileUnit &comp_unit)=0
virtual ObjectFile * GetMainObjectFile()=0
virtual size_t ParseBlocksRecursive(Function &func)=0
virtual uint32_t GetNumCompileUnits()=0
virtual bool ParseLineTable(CompileUnit &comp_unit)=0
virtual llvm::Expected< lldb::TypeSystemSP > GetTypeSystemForLanguage(lldb::LanguageType language)=0
virtual bool ParseDebugMacros(CompileUnit &comp_unit)=0
static SymbolFile * FindPlugin(lldb::ObjectFileSP objfile_sp)
virtual std::recursive_mutex & GetModuleMutex() const
Symbols file subclasses should override this to return the Module that owns the TypeSystem that this ...
virtual bool GetLoadDebugInfoEnabled()
Whether debug info will be loaded or not.
Definition SymbolFile.h:136
SymbolFile(const SymbolFile &)=delete
virtual lldb::TypeSP MakeType(lldb::user_id_t uid, ConstString name, std::optional< uint64_t > byte_size, SymbolContextScope *context, lldb::user_id_t encoding_uid, Type::EncodingDataType encoding_uid_type, const Declaration &decl, const CompilerType &compiler_qual_type, Type::ResolveState compiler_type_resolve_state, uint32_t opaque_payload=0)=0
Status GetFrameVariableError(StackFrame &frame)
Get an error that describes why variables might be missing for a given symbol context.
Definition SymbolFile.h:280
virtual bool GetDebugInfoHadFrameVariableErrors() const =0
Accessors for the bool that indicates if there was debug info, but errors stopped variables from bein...
virtual void GetTypes(lldb_private::SymbolContextScope *sc_scope, lldb::TypeClass type_mask, lldb_private::TypeList &type_list)=0
virtual std::optional< ArrayInfo > GetDynamicArrayInfoForUID(lldb::user_id_t type_uid, const lldb_private::ExecutionContext *exe_ctx)=0
If type_uid points to an array type, return its characteristics.
virtual void AddSymbols(Symtab &symtab)
Definition SymbolFile.h:377
virtual lldb::LanguageType ParseLanguage(CompileUnit &comp_unit)=0
virtual lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx)=0
virtual CompilerDeclContext FindNamespace(ConstString name, const CompilerDeclContext &parent_decl_ctx, bool only_root_namespaces=false)
Finds a namespace of name name and whose parent context is parent_decl_ctx.
Definition SymbolFile.h:363
const SymbolFile & operator=(const SymbolFile &)=delete
virtual llvm::Expected< SymbolContext > ResolveFunctionCallLabel(FunctionCallLabel &label)
Resolves the function corresponding to the specified LLDB function call label.
Definition SymbolFile.h:341
virtual bool ParseImportedModules(const SymbolContext &sc, std::vector< SourceModule > &imported_modules)=0
virtual void SetDebugInfoIndexWasSavedToCache()=0
virtual void FindTypes(const TypeQuery &query, TypeResults &results)
Find types using a type-matching object that contains all search parameters.
Definition SymbolFile.h:327
static char ID
LLVM RTTI support.
Definition SymbolFile.h:53
virtual bool GetSeparateDebugInfo(StructuredData::Dictionary &d, bool errors_only, bool load_all_debug_info=false)
Return true if separate debug info files are supported and this function succeeded,...
Definition SymbolFile.h:486
virtual void FindFunctions(const Module::LookupInfo &lookup_info, const CompilerDeclContext &parent_decl_ctx, bool include_inlines, SymbolContextList &sc_list)
virtual void SetDebugInfoHadFrameVariableErrors()=0
virtual ModuleList GetDebugInfoModules()
Get the additional modules that this symbol file uses to parse debug info.
Definition SymbolFile.h:449
virtual StatsDuration::Duration GetDebugInfoIndexTime()
Return the time it took to index the debug information in the object file.
Definition SymbolFile.h:437
virtual size_t ParseVariablesForContext(const SymbolContext &sc)=0
virtual uint32_t GetAbilities()=0
Get a mask of what this symbol file supports for the object file that it was constructed with.
static bool classof(const SymbolFile *obj)
Definition SymbolFile.h:59
virtual uint32_t CalculateAbilities()=0
virtual void GetCompileOptions(std::unordered_map< lldb::CompUnitSP, lldb_private::Args > &args)
Definition SymbolFile.h:527
std::unordered_map< lldb::CompUnitSP, Args > GetCompileOptions()
Returns a map of compilation unit to the compile option arguments associated with that compilation un...
Definition SymbolFile.h:516
virtual Status CalculateFrameVariableError(StackFrame &frame)
Subclasses will override this function to for GetFrameVariableError().
Definition SymbolFile.h:292
virtual void DumpClangAST(Stream &s, llvm::StringRef filter, bool show_colors)
Definition SymbolFile.h:300
virtual ObjectFile * GetObjectFile()=0
virtual void ResetStatistics()
Reset the statistics for the symbol file.
Definition SymbolFile.h:440
virtual uint32_t ResolveSymbolContext(const Address &so_addr, lldb::SymbolContextItem resolve_scope, SymbolContext &sc)=0
virtual void GetMangledNamesForFunction(const std::string &scope_qualified_name, std::vector< ConstString > &mangled_names)
virtual void Dump(Stream &s)=0
std::string GetObjectName() const
virtual void SetDebugInfoIndexWasLoadedFromCache()=0
virtual bool ParseSupportFiles(CompileUnit &comp_unit, SupportFileList &support_files)=0
A class that contains all state required for type lookups.
Definition Type.h:104
This class tracks the state and results of a TypeQuery.
Definition Type.h:344
An abstraction for Xcode-style SDKs that works like ArchSpec.
Definition XcodeSDK.h:25
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::ObjectFile > ObjectFileSP
LanguageType
Programming language type.
std::shared_ptr< lldb_private::Type > TypeSP
std::shared_ptr< lldb_private::UnwindPlan > UnwindPlanSP
uint64_t user_id_t
Definition lldb-types.h:82
std::shared_ptr< lldb_private::CompileUnit > CompUnitSP
RegisterKind
Register numbering types.
Holds statistics about DWO (Debug With Object) files.
Definition Statistics.h:127
Holds parsed information about a function call label that LLDB attaches as an AsmLabel to function AS...
Definition Expression.h:110
Every register is described in detail including its name, alternate name (optional),...
The characteristics of an array type.
Definition SymbolFile.h:213
llvm::SmallVector< std::optional< uint64_t >, 1 > element_orders
Each entry belongs to a distinct DW_TAG_subrange_type.
Definition SymbolFile.h:223
virtual const RegisterInfo * ResolveNumber(lldb::RegisterKind kind, uint32_t number) const =0
virtual const RegisterInfo * ResolveName(llvm::StringRef name) const =0
A mix in class that contains a generic user ID.
Definition UserID.h:31