1 | //===-- SymbolFileDWARF.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_SYMBOLFILEDWARF_H |
10 | #define LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARF_H |
11 | |
12 | #include <list> |
13 | #include <map> |
14 | #include <mutex> |
15 | #include <optional> |
16 | #include <unordered_map> |
17 | #include <vector> |
18 | |
19 | #include "llvm/ADT/DenseMap.h" |
20 | #include "llvm/ADT/SetVector.h" |
21 | #include "llvm/Support/Threading.h" |
22 | |
23 | #include "lldb/Core/UniqueCStringMap.h" |
24 | #include "lldb/Core/dwarf.h" |
25 | #include "lldb/Expression/DWARFExpressionList.h" |
26 | #include "lldb/Symbol/DebugMacros.h" |
27 | #include "lldb/Symbol/SymbolContext.h" |
28 | #include "lldb/Symbol/SymbolFile.h" |
29 | #include "lldb/Target/Statistics.h" |
30 | #include "lldb/Utility/ConstString.h" |
31 | #include "lldb/Utility/Flags.h" |
32 | #include "lldb/Utility/RangeMap.h" |
33 | #include "lldb/Utility/StructuredData.h" |
34 | #include "lldb/lldb-private.h" |
35 | |
36 | #include "DWARFContext.h" |
37 | #include "DWARFDataExtractor.h" |
38 | #include "DWARFDefines.h" |
39 | #include "DWARFIndex.h" |
40 | #include "UniqueDWARFASTType.h" |
41 | |
42 | class DWARFASTParserClang; |
43 | |
44 | namespace llvm { |
45 | class DWARFDebugAbbrev; |
46 | } // namespace llvm |
47 | |
48 | namespace lldb_private::plugin { |
49 | namespace dwarf { |
50 | // Forward Declarations for this DWARF plugin |
51 | class DebugMapModule; |
52 | class DWARFCompileUnit; |
53 | class DWARFDebugAranges; |
54 | class DWARFDebugInfo; |
55 | class DWARFDebugInfoEntry; |
56 | class DWARFDebugLine; |
57 | class DWARFDebugRanges; |
58 | class DWARFDeclContext; |
59 | class DWARFFormValue; |
60 | class DWARFTypeUnit; |
61 | class SymbolFileDWARFDebugMap; |
62 | class SymbolFileDWARFDwo; |
63 | class SymbolFileDWARFDwp; |
64 | |
65 | #define DIE_IS_BEING_PARSED ((lldb_private::Type *)1) |
66 | |
67 | class SymbolFileDWARF : public SymbolFileCommon { |
68 | /// LLVM RTTI support. |
69 | static char ID; |
70 | |
71 | public: |
72 | /// LLVM RTTI support. |
73 | /// \{ |
74 | bool isA(const void *ClassID) const override { |
75 | return ClassID == &ID || SymbolFileCommon::isA(ClassID); |
76 | } |
77 | static bool classof(const SymbolFile *obj) { return obj->isA(ClassID: &ID); } |
78 | /// \} |
79 | |
80 | friend class SymbolFileDWARFDebugMap; |
81 | friend class SymbolFileDWARFDwo; |
82 | friend class DebugMapModule; |
83 | friend class DWARFCompileUnit; |
84 | friend class DWARFDIE; |
85 | friend class DWARFASTParser; |
86 | |
87 | // Static Functions |
88 | static void Initialize(); |
89 | |
90 | static void Terminate(); |
91 | |
92 | static void DebuggerInitialize(Debugger &debugger); |
93 | |
94 | static llvm::StringRef GetPluginNameStatic() { return "dwarf" ; } |
95 | |
96 | static llvm::StringRef GetPluginDescriptionStatic(); |
97 | |
98 | static SymbolFile *CreateInstance(lldb::ObjectFileSP objfile_sp); |
99 | |
100 | // Constructors and Destructors |
101 | |
102 | SymbolFileDWARF(lldb::ObjectFileSP objfile_sp, SectionList *dwo_section_list); |
103 | |
104 | ~SymbolFileDWARF() override; |
105 | |
106 | uint32_t CalculateAbilities() override; |
107 | |
108 | void InitializeObject() override; |
109 | |
110 | // Compile Unit function calls |
111 | |
112 | lldb::LanguageType ParseLanguage(CompileUnit &comp_unit) override; |
113 | |
114 | XcodeSDK ParseXcodeSDK(CompileUnit &comp_unit) override; |
115 | |
116 | size_t ParseFunctions(CompileUnit &comp_unit) override; |
117 | |
118 | bool ParseLineTable(CompileUnit &comp_unit) override; |
119 | |
120 | bool ParseDebugMacros(CompileUnit &comp_unit) override; |
121 | |
122 | bool ForEachExternalModule(CompileUnit &, llvm::DenseSet<SymbolFile *> &, |
123 | llvm::function_ref<bool(Module &)>) override; |
124 | |
125 | bool ParseSupportFiles(CompileUnit &comp_unit, |
126 | SupportFileList &support_files) override; |
127 | |
128 | bool ParseIsOptimized(CompileUnit &comp_unit) override; |
129 | |
130 | size_t ParseTypes(CompileUnit &comp_unit) override; |
131 | |
132 | bool |
133 | ParseImportedModules(const SymbolContext &sc, |
134 | std::vector<SourceModule> &imported_modules) override; |
135 | |
136 | size_t ParseBlocksRecursive(Function &func) override; |
137 | |
138 | size_t ParseVariablesForContext(const SymbolContext &sc) override; |
139 | |
140 | std::optional<ArrayInfo> |
141 | GetDynamicArrayInfoForUID(lldb::user_id_t type_uid, |
142 | const ExecutionContext *exe_ctx) override; |
143 | |
144 | bool CompleteType(CompilerType &compiler_type) override; |
145 | |
146 | Type *ResolveType(const DWARFDIE &die, bool assert_not_being_parsed = true, |
147 | bool resolve_function_context = false); |
148 | |
149 | CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; |
150 | |
151 | CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override; |
152 | |
153 | CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override; |
154 | |
155 | std::vector<CompilerContext> |
156 | GetCompilerContextForUID(lldb::user_id_t uid) override; |
157 | |
158 | void ParseDeclsForContext(CompilerDeclContext decl_ctx) override; |
159 | |
160 | uint32_t ResolveSymbolContext(const Address &so_addr, |
161 | lldb::SymbolContextItem resolve_scope, |
162 | SymbolContext &sc) override; |
163 | |
164 | Status CalculateFrameVariableError(StackFrame &frame) override; |
165 | |
166 | uint32_t ResolveSymbolContext(const SourceLocationSpec &src_location_spec, |
167 | lldb::SymbolContextItem resolve_scope, |
168 | SymbolContextList &sc_list) override; |
169 | |
170 | void FindGlobalVariables(ConstString name, |
171 | const CompilerDeclContext &parent_decl_ctx, |
172 | uint32_t max_matches, |
173 | VariableList &variables) override; |
174 | |
175 | void FindGlobalVariables(const RegularExpression ®ex, uint32_t max_matches, |
176 | VariableList &variables) override; |
177 | |
178 | void FindFunctions(const Module::LookupInfo &lookup_info, |
179 | const CompilerDeclContext &parent_decl_ctx, |
180 | bool include_inlines, SymbolContextList &sc_list) override; |
181 | |
182 | void FindFunctions(const RegularExpression ®ex, bool include_inlines, |
183 | SymbolContextList &sc_list) override; |
184 | |
185 | void |
186 | GetMangledNamesForFunction(const std::string &scope_qualified_name, |
187 | std::vector<ConstString> &mangled_names) override; |
188 | |
189 | uint64_t GetDebugInfoSize(bool load_all_debug_info = false) override; |
190 | |
191 | void FindTypes(const lldb_private::TypeQuery &match, |
192 | lldb_private::TypeResults &results) override; |
193 | |
194 | void GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask, |
195 | TypeList &type_list) override; |
196 | |
197 | llvm::Expected<lldb::TypeSystemSP> |
198 | GetTypeSystemForLanguage(lldb::LanguageType language) override; |
199 | |
200 | CompilerDeclContext FindNamespace(ConstString name, |
201 | const CompilerDeclContext &parent_decl_ctx, |
202 | bool only_root_namespaces) override; |
203 | |
204 | void PreloadSymbols() override; |
205 | |
206 | std::recursive_mutex &GetModuleMutex() const override; |
207 | |
208 | // PluginInterface protocol |
209 | llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } |
210 | |
211 | llvm::DWARFDebugAbbrev *DebugAbbrev(); |
212 | |
213 | DWARFDebugInfo &DebugInfo(); |
214 | |
215 | DWARFDebugRanges *GetDebugRanges(); |
216 | |
217 | static bool SupportedVersion(uint16_t version); |
218 | |
219 | DWARFDIE |
220 | GetDeclContextDIEContainingDIE(const DWARFDIE &die); |
221 | |
222 | bool HasForwardDeclForCompilerType(const CompilerType &compiler_type); |
223 | |
224 | CompileUnit *GetCompUnitForDWARFCompUnit(DWARFCompileUnit &dwarf_cu); |
225 | |
226 | virtual void GetObjCMethods(ConstString class_name, |
227 | llvm::function_ref<bool(DWARFDIE die)> callback); |
228 | |
229 | bool Supports_DW_AT_APPLE_objc_complete_type(DWARFUnit *cu); |
230 | |
231 | DebugMacrosSP ParseDebugMacros(lldb::offset_t *offset); |
232 | |
233 | static DWARFDIE GetParentSymbolContextDIE(const DWARFDIE &die); |
234 | |
235 | lldb::ModuleSP GetExternalModule(ConstString name); |
236 | |
237 | typedef std::map<ConstString, lldb::ModuleSP> ExternalTypeModuleMap; |
238 | |
239 | /// Return the list of Clang modules imported by this SymbolFile. |
240 | const ExternalTypeModuleMap &getExternalTypeModules() const { |
241 | return m_external_type_modules; |
242 | } |
243 | |
244 | virtual DWARFDIE GetDIE(const DIERef &die_ref); |
245 | |
246 | DWARFDIE GetDIE(lldb::user_id_t uid); |
247 | |
248 | std::shared_ptr<SymbolFileDWARFDwo> |
249 | GetDwoSymbolFileForCompileUnit(DWARFUnit &dwarf_cu, |
250 | const DWARFDebugInfoEntry &cu_die); |
251 | |
252 | /// If this is a DWARF object with a single CU, return its DW_AT_dwo_id. |
253 | std::optional<uint64_t> GetDWOId(); |
254 | |
255 | /// Given a DWO DWARFUnit, find the corresponding skeleton DWARFUnit |
256 | /// in the main symbol file. DWP files can have their DWARFUnits |
257 | /// parsed without the skeleton compile units having been parsed, so |
258 | /// sometimes we need to find the skeleton compile unit for a DWO |
259 | /// DWARFUnit so we can fill in this link. Currently unless the |
260 | /// skeleton compile unit has been parsed _and_ the Unit DIE has been |
261 | /// parsed, the DWO unit will not have a backward link setup correctly |
262 | /// which was causing crashes due to an assertion that was firing |
263 | /// in SymbolFileDWARF::GetCompUnitForDWARFCompUnit(). |
264 | DWARFUnit *GetSkeletonUnit(DWARFUnit *dwo_unit); |
265 | |
266 | static bool DIEInDeclContext(const CompilerDeclContext &parent_decl_ctx, |
267 | const DWARFDIE &die, |
268 | bool only_root_namespaces = false); |
269 | |
270 | std::vector<std::unique_ptr<CallEdge>> |
271 | ParseCallEdgesInFunction(UserID func_id) override; |
272 | |
273 | void Dump(Stream &s) override; |
274 | |
275 | void DumpClangAST(Stream &s) override; |
276 | |
277 | /// List separate dwo files. |
278 | bool GetSeparateDebugInfo(StructuredData::Dictionary &d, |
279 | bool errors_only) override; |
280 | |
281 | DWARFContext &GetDWARFContext() { return m_context; } |
282 | |
283 | const std::shared_ptr<SymbolFileDWARFDwo> &GetDwpSymbolFile(); |
284 | |
285 | FileSpec GetFile(DWARFUnit &unit, size_t file_idx); |
286 | |
287 | static llvm::Expected<lldb::TypeSystemSP> GetTypeSystem(DWARFUnit &unit); |
288 | |
289 | static DWARFASTParser *GetDWARFParser(DWARFUnit &unit); |
290 | |
291 | // CompilerDecl related functions |
292 | |
293 | static CompilerDecl GetDecl(const DWARFDIE &die); |
294 | |
295 | static CompilerDeclContext GetDeclContext(const DWARFDIE &die); |
296 | |
297 | static CompilerDeclContext GetContainingDeclContext(const DWARFDIE &die); |
298 | |
299 | static DWARFDeclContext GetDWARFDeclContext(const DWARFDIE &die); |
300 | |
301 | static lldb::LanguageType LanguageTypeFromDWARF(uint64_t val); |
302 | |
303 | static lldb::LanguageType GetLanguage(DWARFUnit &unit); |
304 | /// Same as GetLanguage() but reports all C++ versions as C++ (no version). |
305 | static lldb::LanguageType GetLanguageFamily(DWARFUnit &unit); |
306 | |
307 | StatsDuration::Duration GetDebugInfoParseTime() override { |
308 | return m_parse_time; |
309 | } |
310 | StatsDuration::Duration GetDebugInfoIndexTime() override; |
311 | |
312 | StatsDuration &GetDebugInfoParseTimeRef() { return m_parse_time; } |
313 | |
314 | virtual lldb::offset_t |
315 | (const DataExtractor &data, |
316 | const lldb::offset_t data_offset, |
317 | const uint8_t op) const { |
318 | return LLDB_INVALID_OFFSET; |
319 | } |
320 | |
321 | virtual bool (uint8_t op, const DataExtractor &opcodes, |
322 | lldb::offset_t &offset, |
323 | std::vector<Value> &stack) const { |
324 | return false; |
325 | } |
326 | |
327 | ConstString ConstructFunctionDemangledName(const DWARFDIE &die); |
328 | |
329 | std::optional<uint64_t> GetFileIndex() const { return m_file_index; } |
330 | void SetFileIndex(std::optional<uint64_t> file_index) { |
331 | m_file_index = file_index; |
332 | } |
333 | |
334 | typedef llvm::DenseMap<const DWARFDebugInfoEntry *, Type *> DIEToTypePtr; |
335 | |
336 | virtual DIEToTypePtr &GetDIEToType() { return m_die_to_type; } |
337 | |
338 | typedef llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> |
339 | CompilerTypeToDIE; |
340 | |
341 | virtual CompilerTypeToDIE &GetForwardDeclCompilerTypeToDIE() { |
342 | return m_forward_decl_compiler_type_to_die; |
343 | } |
344 | |
345 | typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> |
346 | DIEToVariableSP; |
347 | |
348 | virtual DIEToVariableSP &GetDIEToVariable() { return m_die_to_variable_sp; } |
349 | |
350 | virtual UniqueDWARFASTTypeMap &GetUniqueDWARFASTTypeMap(); |
351 | |
352 | bool ClassOrStructIsVirtual(const DWARFDIE &die); |
353 | |
354 | SymbolFileDWARFDebugMap *GetDebugMapSymfile(); |
355 | |
356 | virtual lldb::TypeSP |
357 | FindDefinitionTypeForDWARFDeclContext(const DWARFDIE &die); |
358 | |
359 | virtual lldb::TypeSP FindCompleteObjCDefinitionTypeForDIE( |
360 | const DWARFDIE &die, ConstString type_name, bool must_be_implementation); |
361 | |
362 | Type *ResolveTypeUID(lldb::user_id_t type_uid) override; |
363 | |
364 | Type *ResolveTypeUID(const DWARFDIE &die, bool assert_not_being_parsed); |
365 | |
366 | Type *ResolveTypeUID(const DIERef &die_ref); |
367 | |
368 | /// Returns the DWARFIndex for this symbol, if it exists. |
369 | DWARFIndex *getIndex() { return m_index.get(); } |
370 | |
371 | protected: |
372 | SymbolFileDWARF(const SymbolFileDWARF &) = delete; |
373 | const SymbolFileDWARF &operator=(const SymbolFileDWARF &) = delete; |
374 | |
375 | virtual void (lldb::SectionType sect_type, |
376 | DWARFDataExtractor &data); |
377 | |
378 | bool DeclContextMatchesThisSymbolFile(const CompilerDeclContext &decl_ctx); |
379 | |
380 | uint32_t CalculateNumCompileUnits() override; |
381 | |
382 | lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t index) override; |
383 | |
384 | TypeList &GetTypeList() override; |
385 | |
386 | lldb::CompUnitSP ParseCompileUnit(DWARFCompileUnit &dwarf_cu); |
387 | |
388 | virtual DWARFCompileUnit *GetDWARFCompileUnit(CompileUnit *comp_unit); |
389 | |
390 | DWARFUnit *GetNextUnparsedDWARFCompileUnit(DWARFUnit *prev_cu); |
391 | |
392 | bool GetFunction(const DWARFDIE &die, SymbolContext &sc); |
393 | |
394 | Function *ParseFunction(CompileUnit &comp_unit, const DWARFDIE &die); |
395 | |
396 | size_t ParseBlocksRecursive(CompileUnit &comp_unit, Block *parent_block, |
397 | const DWARFDIE &die, |
398 | lldb::addr_t subprogram_low_pc, uint32_t depth); |
399 | |
400 | size_t ParseTypes(const SymbolContext &sc, const DWARFDIE &die, |
401 | bool parse_siblings, bool parse_children); |
402 | |
403 | lldb::TypeSP ParseType(const SymbolContext &sc, const DWARFDIE &die, |
404 | bool *type_is_new); |
405 | |
406 | bool ParseSupportFiles(DWARFUnit &dwarf_cu, const lldb::ModuleSP &module, |
407 | SupportFileList &support_files); |
408 | |
409 | lldb::VariableSP ParseVariableDIE(const SymbolContext &sc, |
410 | const DWARFDIE &die, |
411 | const lldb::addr_t func_low_pc); |
412 | lldb::VariableSP ParseVariableDIECached(const SymbolContext &sc, |
413 | const DWARFDIE &die); |
414 | |
415 | void ParseAndAppendGlobalVariable(const SymbolContext &sc, |
416 | const DWARFDIE &die, |
417 | VariableList &cc_variable_list); |
418 | |
419 | size_t ParseVariablesInFunctionContext(const SymbolContext &sc, |
420 | const DWARFDIE &die, |
421 | const lldb::addr_t func_low_pc); |
422 | |
423 | size_t ParseVariablesInFunctionContextRecursive(const SymbolContext &sc, |
424 | const DWARFDIE &die, |
425 | lldb::addr_t func_low_pc, |
426 | DIEArray &accumulator); |
427 | |
428 | size_t PopulateBlockVariableList(VariableList &variable_list, |
429 | const SymbolContext &sc, |
430 | llvm::ArrayRef<DIERef> variable_dies, |
431 | lldb::addr_t func_low_pc); |
432 | |
433 | DIEArray MergeBlockAbstractParameters(const DWARFDIE &block_die, |
434 | DIEArray &&variable_dies); |
435 | |
436 | // Given a die_offset, figure out the symbol context representing that die. |
437 | bool ResolveFunction(const DWARFDIE &die, bool include_inlines, |
438 | SymbolContextList &sc_list); |
439 | |
440 | /// Resolve functions and (possibly) blocks for the given file address and a |
441 | /// compile unit. The compile unit comes from the sc argument and it must be |
442 | /// set. The results of the lookup (if any) are written back to the symbol |
443 | /// context. |
444 | void ResolveFunctionAndBlock(lldb::addr_t file_vm_addr, bool lookup_block, |
445 | SymbolContext &sc); |
446 | |
447 | Symbol *GetObjCClassSymbol(ConstString objc_class_name); |
448 | |
449 | lldb::TypeSP GetTypeForDIE(const DWARFDIE &die, |
450 | bool resolve_function_context = false); |
451 | |
452 | void SetDebugMapModule(const lldb::ModuleSP &module_sp) { |
453 | m_debug_map_module_wp = module_sp; |
454 | } |
455 | |
456 | DWARFDIE |
457 | FindBlockContainingSpecification(const DIERef &func_die_ref, |
458 | dw_offset_t spec_block_die_offset); |
459 | |
460 | DWARFDIE |
461 | FindBlockContainingSpecification(const DWARFDIE &die, |
462 | dw_offset_t spec_block_die_offset); |
463 | |
464 | bool DIEDeclContextsMatch(const DWARFDIE &die1, const DWARFDIE &die2); |
465 | |
466 | bool ClassContainsSelector(const DWARFDIE &class_die, ConstString selector); |
467 | |
468 | /// Parse call site entries (DW_TAG_call_site), including any nested call site |
469 | /// parameters (DW_TAG_call_site_parameter). |
470 | std::vector<std::unique_ptr<CallEdge>> |
471 | CollectCallEdges(lldb::ModuleSP module, DWARFDIE function_die); |
472 | |
473 | /// If this symbol file is linked to by a debug map (see |
474 | /// SymbolFileDWARFDebugMap), and \p file_addr is a file address relative to |
475 | /// an object file, adjust \p file_addr so that it is relative to the main |
476 | /// binary. Returns the adjusted address, or \p file_addr if no adjustment is |
477 | /// needed, on success and LLDB_INVALID_ADDRESS otherwise. |
478 | lldb::addr_t FixupAddress(lldb::addr_t file_addr); |
479 | |
480 | bool FixupAddress(Address &addr); |
481 | |
482 | typedef llvm::SetVector<Type *> TypeSet; |
483 | |
484 | void GetTypes(const DWARFDIE &die, dw_offset_t min_die_offset, |
485 | dw_offset_t max_die_offset, uint32_t type_mask, |
486 | TypeSet &type_set); |
487 | |
488 | typedef RangeDataVector<lldb::addr_t, lldb::addr_t, Variable *> |
489 | GlobalVariableMap; |
490 | |
491 | GlobalVariableMap &GetGlobalAranges(); |
492 | |
493 | void UpdateExternalModuleListIfNeeded(); |
494 | |
495 | void BuildCuTranslationTable(); |
496 | std::optional<uint32_t> GetDWARFUnitIndex(uint32_t cu_idx); |
497 | |
498 | void FindDwpSymbolFile(); |
499 | |
500 | const SupportFileList *GetTypeUnitSupportFiles(DWARFTypeUnit &tu); |
501 | |
502 | void InitializeFirstCodeAddressRecursive(const SectionList §ion_list); |
503 | |
504 | void InitializeFirstCodeAddress(); |
505 | |
506 | void |
507 | GetCompileOptions(std::unordered_map<lldb::CompUnitSP, Args> &args) override; |
508 | |
509 | lldb::ModuleWP m_debug_map_module_wp; |
510 | SymbolFileDWARFDebugMap *m_debug_map_symfile; |
511 | |
512 | llvm::once_flag m_dwp_symfile_once_flag; |
513 | std::shared_ptr<SymbolFileDWARFDwo> m_dwp_symfile; |
514 | |
515 | DWARFContext m_context; |
516 | |
517 | llvm::once_flag m_info_once_flag; |
518 | std::unique_ptr<DWARFDebugInfo> m_info; |
519 | |
520 | std::unique_ptr<llvm::DWARFDebugAbbrev> m_abbr; |
521 | std::unique_ptr<GlobalVariableMap> m_global_aranges_up; |
522 | |
523 | typedef std::unordered_map<lldb::offset_t, DebugMacrosSP> DebugMacrosMap; |
524 | DebugMacrosMap m_debug_macros_map; |
525 | |
526 | ExternalTypeModuleMap m_external_type_modules; |
527 | std::unique_ptr<DWARFIndex> m_index; |
528 | bool m_fetched_external_modules : 1; |
529 | LazyBool m_supports_DW_AT_APPLE_objc_complete_type; |
530 | |
531 | typedef std::set<DIERef> DIERefSet; |
532 | typedef llvm::StringMap<DIERefSet> NameToOffsetMap; |
533 | NameToOffsetMap m_function_scope_qualified_name_map; |
534 | std::unique_ptr<DWARFDebugRanges> m_ranges; |
535 | UniqueDWARFASTTypeMap m_unique_ast_type_map; |
536 | DIEToTypePtr m_die_to_type; |
537 | DIEToVariableSP m_die_to_variable_sp; |
538 | CompilerTypeToDIE m_forward_decl_compiler_type_to_die; |
539 | llvm::DenseMap<dw_offset_t, std::unique_ptr<SupportFileList>> |
540 | m_type_unit_support_files; |
541 | std::vector<uint32_t> m_lldb_cu_to_dwarf_unit; |
542 | /// DWARF does not provide a good way for traditional (concatenating) linkers |
543 | /// to invalidate debug info describing dead-stripped code. These linkers will |
544 | /// keep the debug info but resolve any addresses referring to such code as |
545 | /// zero (BFD) or a small positive integer (zero + relocation addend -- GOLD). |
546 | /// Try to filter out this debug info by comparing it to the lowest code |
547 | /// address in the module. |
548 | lldb::addr_t m_first_code_address = LLDB_INVALID_ADDRESS; |
549 | StatsDuration m_parse_time; |
550 | std::atomic_flag m_dwo_warning_issued = ATOMIC_FLAG_INIT; |
551 | /// If this DWARF file a .DWO file or a DWARF .o file on mac when |
552 | /// no dSYM file is being used, this file index will be set to a |
553 | /// valid value that can be used in DIERef objects which will contain |
554 | /// an index that identifies the .DWO or .o file. |
555 | std::optional<uint64_t> m_file_index; |
556 | }; |
557 | } // namespace dwarf |
558 | } // namespace lldb_private::plugin |
559 | |
560 | #endif // LLDB_SOURCE_PLUGINS_SYMBOLFILE_DWARF_SYMBOLFILEDWARF_H |
561 | |