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.
153 return {};
154 }
155
156 /// This function exists because SymbolFileDWARFDebugMap may extra compile
157 /// units which aren't exposed as "real" compile units. In every other
158 /// case this function should behave identically as ParseLanguage.
159 virtual llvm::SmallSet<lldb::LanguageType, 4>
161 llvm::SmallSet<lldb::LanguageType, 4> langs;
162 langs.insert(ParseLanguage(comp_unit));
163 return langs;
164 }
165
166 virtual size_t ParseFunctions(CompileUnit &comp_unit) = 0;
167 virtual bool ParseLineTable(CompileUnit &comp_unit) = 0;
168 virtual bool ParseDebugMacros(CompileUnit &comp_unit) = 0;
169
170 /// Apply a lambda to each external lldb::Module referenced by this
171 /// \p comp_unit. Recursively also descends into the referenced external
172 /// modules of any encountered compilation unit.
173 ///
174 /// This function can be used to traverse Clang -gmodules debug
175 /// information, which is stored in DWARF files separate from the
176 /// object files.
177 ///
178 /// \param comp_unit
179 /// When this SymbolFile consists of multiple auxilliary
180 /// SymbolFiles, for example, a Darwin debug map that references
181 /// multiple .o files, comp_unit helps choose the auxilliary
182 /// file. In most other cases comp_unit's symbol file is
183 /// identical with *this.
184 ///
185 /// \param[in] lambda
186 /// The lambda that should be applied to every function. The lambda can
187 /// return true if the iteration should be aborted earlier.
188 ///
189 /// \param visited_symbol_files
190 /// A set of SymbolFiles that were already visited to avoid
191 /// visiting one file more than once.
192 ///
193 /// \return
194 /// If the lambda early-exited, this function returns true to
195 /// propagate the early exit.
197 lldb_private::CompileUnit &comp_unit,
198 llvm::DenseSet<lldb_private::SymbolFile *> &visited_symbol_files,
199 llvm::function_ref<bool(Module &)> lambda) {
200 return false;
201 }
202 virtual bool ParseSupportFiles(CompileUnit &comp_unit,
203 SupportFileList &support_files) = 0;
204 virtual size_t ParseTypes(CompileUnit &comp_unit) = 0;
205 virtual bool ParseIsOptimized(CompileUnit &comp_unit) { return false; }
206
207 virtual bool
209 std::vector<SourceModule> &imported_modules) = 0;
210 virtual size_t ParseBlocksRecursive(Function &func) = 0;
211 virtual size_t ParseVariablesForContext(const SymbolContext &sc) = 0;
212 virtual Type *ResolveTypeUID(lldb::user_id_t type_uid) = 0;
213
214 /// The characteristics of an array type.
215 struct ArrayInfo {
216 int64_t first_index = 0;
217
218 /// Each entry belongs to a distinct DW_TAG_subrange_type.
219 /// For multi-dimensional DW_TAG_array_types we would have
220 /// an entry for each dimension. An entry represents the
221 /// optional element count of the subrange.
222 ///
223 /// The order of entries follows the order of the DW_TAG_subrange_type
224 /// children of this DW_TAG_array_type.
225 llvm::SmallVector<std::optional<uint64_t>, 1> element_orders;
226 uint32_t byte_stride = 0;
227 uint32_t bit_stride = 0;
228 };
229 /// If \c type_uid points to an array type, return its characteristics.
230 /// To support variable-length array types, this function takes an
231 /// optional \p ExecutionContext. If \c exe_ctx is non-null, the
232 /// dynamic characteristics for that context are returned.
233 virtual std::optional<ArrayInfo>
235 const lldb_private::ExecutionContext *exe_ctx) = 0;
236
237 virtual bool CompleteType(CompilerType &compiler_type) = 0;
239 virtual CompilerDecl GetDeclForUID(lldb::user_id_t uid) { return {}; }
241 return {};
242 }
246 virtual std::vector<CompilerContext>
248 return {};
249 }
250 virtual uint32_t ResolveSymbolContext(const Address &so_addr,
251 lldb::SymbolContextItem resolve_scope,
252 SymbolContext &sc) = 0;
253
254 /// Get an error that describes why variables might be missing for a given
255 /// symbol context.
256 ///
257 /// If there is an error in the debug information that prevents variables from
258 /// being fetched, this error will get filled in. If there is no debug
259 /// informaiton, no error should be returned. But if there is debug
260 /// information and something prevents the variables from being available a
261 /// valid error should be returned. Valid cases include:
262 /// - compiler option that removes variables (-gline-tables-only)
263 /// - missing external files
264 /// - .dwo files in fission are not accessible or missing
265 /// - .o files on darwin when not using dSYM files that are not accessible
266 /// or missing
267 /// - mismatched exteral files
268 /// - .dwo files in fission where the DWO ID doesn't match
269 /// - .o files on darwin when modification timestamp doesn't match
270 /// - corrupted debug info
271 ///
272 /// \param[in] frame
273 /// The stack frame to use as a basis for the context to check. The frame
274 /// address can be used if there is not debug info due to it not being able
275 /// to be loaded, or if there is a debug info context, like a compile unit,
276 /// or function, it can be used to track down more information on why
277 /// variables are missing.
278 ///
279 /// \returns
280 /// An error specifying why there should have been debug info with variable
281 /// information but the variables were not able to be resolved.
284 if (err.Fail())
286 return err;
287 }
288
289 /// Subclasses will override this function to for GetFrameVariableError().
290 ///
291 /// This allows GetFrameVariableError() to set the member variable
292 /// m_debug_info_had_variable_errors correctly without users having to do it
293 /// manually which is error prone.
295 return Status();
296 }
297 virtual uint32_t
298 ResolveSymbolContext(const SourceLocationSpec &src_location_spec,
299 lldb::SymbolContextItem resolve_scope,
300 SymbolContextList &sc_list);
301
302 virtual void DumpClangAST(Stream &s, llvm::StringRef filter,
303 bool show_colors) {}
304 virtual void FindGlobalVariables(ConstString name,
305 const CompilerDeclContext &parent_decl_ctx,
306 uint32_t max_matches,
307 VariableList &variables);
308 virtual void FindGlobalVariables(const RegularExpression &regex,
309 uint32_t max_matches,
310 VariableList &variables);
311 virtual void FindFunctions(const Module::LookupInfo &lookup_info,
312 const CompilerDeclContext &parent_decl_ctx,
313 bool include_inlines, SymbolContextList &sc_list);
314 virtual void FindFunctions(llvm::ArrayRef<Module::LookupInfo> lookup_infos,
315 const CompilerDeclContext &parent_decl_ctx,
316 bool include_inlines, SymbolContextList &sc_list);
317 virtual void FindFunctions(const RegularExpression &regex,
318 bool include_inlines, SymbolContextList &sc_list);
319
320 /// Find types using a type-matching object that contains all search
321 /// parameters.
322 ///
323 /// \see lldb_private::TypeQuery
324 ///
325 /// \param[in] query
326 /// A type matching object that contains all of the details of the type
327 /// search.
328 ///
329 /// \param[in] results
330 /// Any matching types will be populated into the \a results object using
331 /// TypeMap::InsertUnique(...).
332 virtual void FindTypes(const TypeQuery &query, TypeResults &results) {}
333
334 virtual void
335 GetMangledNamesForFunction(const std::string &scope_qualified_name,
336 std::vector<ConstString> &mangled_names);
337
338 /// Resolves the function corresponding to the specified LLDB function
339 /// call \c label.
340 ///
341 /// \param[in,out] label The FunctionCallLabel to be resolved.
342 ///
343 /// \returns An llvm::Error if the specified \c label couldn't be resolved.
344 /// Returns the resolved function (as a SymbolContext) otherwise.
345 virtual llvm::Expected<SymbolContext>
347 return llvm::createStringError("Not implemented");
348 }
349
351 lldb::TypeClass type_mask,
352 lldb_private::TypeList &type_list) = 0;
353
354 virtual void PreloadSymbols();
355
356 virtual llvm::Expected<lldb::TypeSystemSP>
358
359 /// Finds a namespace of name \ref name and whose parent
360 /// context is \ref parent_decl_ctx.
361 ///
362 /// If \code{.cpp} !parent_decl_ctx.IsValid() \endcode
363 /// then this function will consider all namespaces that
364 /// match the name. If \ref only_root_namespaces is
365 /// true, only consider in the search those DIEs that
366 /// represent top-level namespaces.
367 virtual CompilerDeclContext
368 FindNamespace(ConstString name, const CompilerDeclContext &parent_decl_ctx,
369 bool only_root_namespaces = false) {
370 return CompilerDeclContext();
371 }
372
373 virtual ObjectFile *GetObjectFile() = 0;
374 virtual const ObjectFile *GetObjectFile() const = 0;
376
377 virtual std::vector<std::unique_ptr<CallEdge>>
379 return {};
380 }
381
382 virtual void AddSymbols(Symtab &symtab) {}
383
384 /// Notify the SymbolFile that the file addresses in the Sections
385 /// for this module have been changed.
386 virtual void SectionFileAddressesChanged() = 0;
387
389 virtual ~RegisterInfoResolver(); // anchor
390
391 virtual const RegisterInfo *ResolveName(llvm::StringRef name) const = 0;
393 uint32_t number) const = 0;
394 };
395 virtual lldb::UnwindPlanSP
396 GetUnwindPlan(const Address &address, const RegisterInfoResolver &resolver) {
397 return nullptr;
398 }
399
400 /// Return the number of stack bytes taken up by the parameters to this
401 /// function.
402 virtual llvm::Expected<lldb::addr_t>
404 return llvm::createStringError(make_error_code(llvm::errc::not_supported),
405 "Operation not supported.");
406 }
407
408 virtual void Dump(Stream &s) = 0;
409
410 /// Metrics gathering functions
411
412 /// Return the size in bytes of all loaded debug information or total possible
413 /// debug info in the symbol file.
414 ///
415 /// If the debug information is contained in sections of an ObjectFile, then
416 /// this call should add the size of all sections that contain debug
417 /// information. Symbols the symbol tables are not considered debug
418 /// information for this call to make it easy and quick for this number to be
419 /// calculated. If the symbol file is all debug information, the size of the
420 /// entire file should be returned. The default implementation of this
421 /// function will iterate over all sections in a module and add up their
422 /// debug info only section byte sizes.
423 ///
424 /// \param load_all_debug_info
425 /// If true, force loading any symbol files if they are not yet loaded and
426 /// add to the total size. Default to false.
427 ///
428 /// \returns
429 /// Total currently loaded debug info size in bytes
430 virtual uint64_t GetDebugInfoSize(bool load_all_debug_info = false) = 0;
431
432 /// Return the time taken to parse the debug information.
433 ///
434 /// \returns 0.0 if no information has been parsed or if there is
435 /// no computational cost to parsing the debug information.
437
438 /// Return the time it took to index the debug information in the object
439 /// file.
440 ///
441 /// \returns 0.0 if the file doesn't need to be indexed or if it
442 /// hasn't been indexed yet, or a valid duration if it has.
444
445 /// Reset the statistics for the symbol file.
446 virtual void ResetStatistics() {}
447
448 /// Get the additional modules that this symbol file uses to parse debug info.
449 ///
450 /// Some debug info is stored in stand alone object files that are represented
451 /// by unique modules that will show up in the statistics module list. Return
452 /// a list of modules that are not in the target module list that this symbol
453 /// file is currently using so that they can be tracked and assoicated with
454 /// the module in the statistics.
456
457 /// Accessors for the bool that indicates if the debug info index was loaded
458 /// from, or saved to the module index cache.
459 ///
460 /// In statistics it is handy to know if a module's debug info was loaded from
461 /// or saved to the cache. When the debug info index is loaded from the cache
462 /// startup times can be faster. When the cache is enabled and the debug info
463 /// index is saved to the cache, debug sessions can be slower. These accessors
464 /// can be accessed by the statistics and emitted to help track these costs.
465 /// \{
466 virtual bool GetDebugInfoIndexWasLoadedFromCache() const = 0;
468 virtual bool GetDebugInfoIndexWasSavedToCache() const = 0;
470 /// \}
471
472 /// Accessors for the bool that indicates if there was debug info, but errors
473 /// stopped variables from being able to be displayed correctly. See
474 /// GetFrameVariableError() for details on what are considered errors.
475 virtual bool GetDebugInfoHadFrameVariableErrors() const = 0;
477
478 /// Return true if separate debug info files are supported and this function
479 /// succeeded, false otherwise.
480 ///
481 /// \param[out] d
482 /// If this function succeeded, then this will be a dictionary that
483 /// contains the keys "type", "symfile", and "separate-debug-info-files".
484 /// "type" can be used to assume the structure of each object in
485 /// "separate-debug-info-files".
486 /// \param errors_only
487 /// If true, then only return separate debug info files that encountered
488 /// errors during loading. If false, then return all expected separate
489 /// debug info files, regardless of whether they were successfully loaded.
490 /// \param load_all_debug_info
491 /// If true, force loading any symbol files if they are not yet loaded.
493 bool errors_only,
494 bool load_all_debug_info = false) {
495 return false;
496 };
497
498 /// Retrieves statistics about DWO files associated with this symbol file.
499 /// This function returns a DWOStats struct containing:
500 /// - The number of successfully loaded/parsed DWO files.
501 /// - The total number of DWO files encountered.
502 /// - The number of DWO CUs that failed to load due to errors.
503 /// If this symbol file does not support DWO files, all counts will be zero.
504 ///
505 /// \returns
506 /// A DWOStats struct with loaded, total, and error counts for DWO files.
507 virtual DWOStats GetDwoStats() { return {}; }
508
509 /// Return a map of separate debug info files that are loaded.
510 ///
511 /// Unlike GetSeparateDebugInfo(), this function will only return the list of
512 /// files, if there are errors they are simply ignored. This function will
513 /// always return a valid list, even if it is empty.
514 ///
515 /// \return
516 /// A unique list of all the filespecs, or an empty list.
520
521 virtual lldb::TypeSP
523 std::optional<uint64_t> byte_size, SymbolContextScope *context,
524 lldb::user_id_t encoding_uid,
525 Type::EncodingDataType encoding_uid_type, const Declaration &decl,
526 const CompilerType &compiler_qual_type,
527 Type::ResolveState compiler_type_resolve_state,
528 uint32_t opaque_payload = 0) = 0;
529
530 virtual lldb::TypeSP CopyType(const lldb::TypeSP &other_type) = 0;
531
532 /// Returns a map of compilation unit to the compile option arguments
533 /// associated with that compilation unit.
534 std::unordered_map<lldb::CompUnitSP, Args> GetCompileOptions() {
535 std::unordered_map<lldb::CompUnitSP, Args> args;
536 GetCompileOptions(args);
537 return args;
538 }
539
540 std::string GetObjectName() const;
541
542 /// Get the semantically innermost non-function type that encloses the
543 /// provided variable
545 return {};
546 }
547
548protected:
549 void AssertModuleLock();
550
551 virtual void GetCompileOptions(
552 std::unordered_map<lldb::CompUnitSP, lldb_private::Args> &args) {}
553
554private:
555 SymbolFile(const SymbolFile &) = delete;
556 const SymbolFile &operator=(const SymbolFile &) = delete;
557};
558
559/// Containing protected virtual methods for child classes to override.
560/// Most actual SymbolFile implementations should inherit from this class.
562 /// LLVM RTTI support.
563 static char ID;
564
565public:
566 /// LLVM RTTI support.
567 /// \{
568 bool isA(const void *ClassID) const override {
569 return ClassID == &ID || SymbolFile::isA(ClassID);
570 }
571 static bool classof(const SymbolFileCommon *obj) { return obj->isA(&ID); }
572 /// \}
573
574 // Constructors and Destructors
576 : m_objfile_sp(std::move(objfile_sp)) {}
577
578 ~SymbolFileCommon() override = default;
579
580 uint32_t GetAbilities() override {
584 }
585 return m_abilities;
586 }
587
588 Symtab *GetSymtab(bool can_create = true) override;
589
590 ObjectFile *GetObjectFile() override { return m_objfile_sp.get(); }
591 const ObjectFile *GetObjectFile() const override {
592 return m_objfile_sp.get();
593 }
594 ObjectFile *GetMainObjectFile() override;
595
596 /// Notify the SymbolFile that the file addresses in the Sections
597 /// for this module have been changed.
598 void SectionFileAddressesChanged() override;
599
600 // Compile Unit function calls
601 // Approach 1 - iterator
602 uint32_t GetNumCompileUnits() override;
603 lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) override;
604
605 llvm::Expected<lldb::TypeSystemSP>
607
608 void Dump(Stream &s) override;
609
610 uint64_t GetDebugInfoSize(bool load_all_debug_info = false) override;
611
618 bool GetDebugInfoIndexWasSavedToCache() const override {
620 }
630
631 /// This function is used to create types that belong to a SymbolFile. The
632 /// symbol file will own a strong reference to the type in an internal type
633 /// list.
635 std::optional<uint64_t> byte_size,
636 SymbolContextScope *context,
637 lldb::user_id_t encoding_uid,
638 Type::EncodingDataType encoding_uid_type,
639 const Declaration &decl,
640 const CompilerType &compiler_qual_type,
641 Type::ResolveState compiler_type_resolve_state,
642 uint32_t opaque_payload = 0) override {
643 lldb::TypeSP type_sp (new Type(
644 uid, this, name, byte_size, context, encoding_uid,
645 encoding_uid_type, decl, compiler_qual_type,
646 compiler_type_resolve_state, opaque_payload));
647 m_type_list.Insert(type_sp);
648 return type_sp;
649 }
650
651 lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override {
652 // Make sure the real symbol file matches when copying types.
653 if (GetBackingSymbolFile() != other_type->GetSymbolFile())
654 return lldb::TypeSP();
655 lldb::TypeSP type_sp(new Type(*other_type));
656 m_type_list.Insert(type_sp);
657 return type_sp;
658 }
659
660protected:
661 virtual uint32_t CalculateNumCompileUnits() = 0;
662 virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t idx) = 0;
663 virtual TypeList &GetTypeList() { return m_type_list; }
664 void SetCompileUnitAtIndex(uint32_t idx, const lldb::CompUnitSP &cu_sp);
665
666 lldb::ObjectFileSP m_objfile_sp; // Keep a reference to the object file in
667 // case it isn't the same as the module
668 // object file (debug symbols in a separate
669 // file)
670 std::optional<std::vector<lldb::CompUnitSP>> m_compile_units;
672 uint32_t m_abilities = 0;
676 /// Set to true if any variable feteching errors have been found when calling
677 /// GetFrameVariableError(). This will be emitted in the "statistics dump"
678 /// information for a module.
680
681private:
684
685 /// Do not use m_symtab directly, as it may be freed. Use GetSymtab()
686 /// to access it instead.
687 Symtab *m_symtab = nullptr;
688};
689
690} // namespace lldb_private
691
692#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:386
A collection class for Module objects.
Definition ModuleList.h:125
A class that encapsulates name lookup information.
Definition Module.h:935
A class that describes an executable image and its associated object and symbol files.
Definition Module.h:91
A plug-in interface definition class for object file parsers.
Definition ObjectFile.h:46
"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:293
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:624
void SetDebugInfoIndexWasLoadedFromCache() override
Definition SymbolFile.h:615
bool GetDebugInfoIndexWasSavedToCache() const override
Definition SymbolFile.h:618
lldb::CompUnitSP GetCompileUnitAtIndex(uint32_t idx) override
ObjectFile * GetObjectFile() override
Definition SymbolFile.h:590
std::optional< std::vector< lldb::CompUnitSP > > m_compile_units
Definition SymbolFile.h:670
virtual TypeList & GetTypeList()
Definition SymbolFile.h:663
lldb::ObjectFileSP m_objfile_sp
Definition SymbolFile.h:666
bool isA(const void *ClassID) const override
LLVM RTTI support.
Definition SymbolFile.h:568
void SetDebugInfoIndexWasSavedToCache() override
Definition SymbolFile.h:621
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:679
Symtab * m_symtab
Do not use m_symtab directly, as it may be freed.
Definition SymbolFile.h:687
static char ID
LLVM RTTI support.
Definition SymbolFile.h:563
void SetCompileUnitAtIndex(uint32_t idx, const lldb::CompUnitSP &cu_sp)
SymbolFileCommon(lldb::ObjectFileSP objfile_sp)
Definition SymbolFile.h:575
void SetDebugInfoHadFrameVariableErrors() override
Definition SymbolFile.h:627
static bool classof(const SymbolFileCommon *obj)
Definition SymbolFile.h:571
const ObjectFile * GetObjectFile() const override
Definition SymbolFile.h:591
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:580
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:612
uint32_t GetNumCompileUnits() override
SymbolFileCommon(const SymbolFileCommon &)=delete
lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override
Definition SymbolFile.h:651
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:634
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:160
virtual void ParseDeclsForContext(CompilerDeclContext decl_ctx)
Definition SymbolFile.h:238
virtual uint64_t GetDebugInfoSize(bool load_all_debug_info=false)=0
Metrics gathering functions.
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 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:205
virtual bool isA(const void *ClassID) const
LLVM RTTI support.
Definition SymbolFile.h:58
virtual llvm::Expected< lldb::addr_t > GetParameterStackSize(const Symbol &symbol)
Return the number of stack bytes taken up by the parameters to this function.
Definition SymbolFile.h:403
~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:196
virtual std::vector< CompilerContext > GetCompilerContextForUID(lldb::user_id_t uid)
Definition SymbolFile.h:247
virtual CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid)
Definition SymbolFile.h:240
virtual std::vector< std::unique_ptr< CallEdge > > ParseCallEdgesInFunction(UserID func_id)
Definition SymbolFile.h:378
virtual CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid)
Definition SymbolFile.h:243
virtual CompilerDecl GetDeclForUID(lldb::user_id_t uid)
Definition SymbolFile.h:239
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:507
virtual void PreloadSymbols()
virtual lldb::UnwindPlanSP GetUnwindPlan(const Address &address, const RegisterInfoResolver &resolver)
Definition SymbolFile.h:396
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:436
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:282
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:382
virtual lldb::LanguageType ParseLanguage(CompileUnit &comp_unit)=0
virtual lldb::TypeSP GetTypeEnclosingVariableUID(lldb::user_id_t uid)
Get the semantically innermost non-function type that encloses the provided variable.
Definition SymbolFile.h:544
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:368
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:346
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:332
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:492
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:455
virtual StatsDuration::Duration GetDebugInfoIndexTime()
Return the time it took to index the debug information in the object file.
Definition SymbolFile.h:443
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:551
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:534
virtual Status CalculateFrameVariableError(StackFrame &frame)
Subclasses will override this function to for GetFrameVariableError().
Definition SymbolFile.h:294
virtual lldb_private::ModuleSpecList GetSeparateDebugInfoFiles()
Return a map of separate debug info files that are loaded.
Definition SymbolFile.h:517
virtual XcodeSDKAndSysroot ParseXcodeSDK(CompileUnit &comp_unit)
Return the Xcode SDK comp_unit was compiled against.
Definition SymbolFile.h:152
virtual void DumpClangAST(Stream &s, llvm::StringRef filter, bool show_colors)
Definition SymbolFile.h:302
virtual ObjectFile * GetObjectFile()=0
virtual void ResetStatistics()
Reset the statistics for the symbol file.
Definition SymbolFile.h:446
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 which groups an XcodeSDK with the sysroot it was used from.
Definition XcodeSDK.h:101
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:83
std::shared_ptr< lldb_private::CompileUnit > CompUnitSP
RegisterKind
Register numbering types.
Holds statistics about DWO (Debug With Object) files.
Definition Statistics.h:124
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:215
llvm::SmallVector< std::optional< uint64_t >, 1 > element_orders
Each entry belongs to a distinct DW_TAG_subrange_type.
Definition SymbolFile.h:225
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