diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -503,7 +503,6 @@ // file) llvm::Optional> m_compile_units; TypeList m_type_list; - Symtab *m_symtab = nullptr; uint32_t m_abilities = 0; bool m_calculated_abilities = false; bool m_index_was_loaded_from_cache = false; @@ -516,6 +515,10 @@ private: SymbolFileCommon(const SymbolFileCommon &) = delete; const SymbolFileCommon &operator=(const SymbolFileCommon &) = delete; + + /// Do not use m_symtab directly, as it may be freed. Use GetSymtab() + /// to access it instead. + Symtab *m_symtab = nullptr; }; } // namespace lldb_private diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp --- a/lldb/source/Symbol/SymbolFile.cpp +++ b/lldb/source/Symbol/SymbolFile.cpp @@ -164,16 +164,15 @@ Symtab *SymbolFileCommon::GetSymtab() { std::lock_guard guard(GetModuleMutex()); - if (m_symtab) - return m_symtab; - // Fetch the symtab from the main object file. - m_symtab = GetMainObjectFile()->GetSymtab(); - - // Then add our symbols to it. - if (m_symtab) - AddSymbols(*m_symtab); + auto *symtab = GetMainObjectFile()->GetSymtab(); + if (m_symtab != symtab) { + m_symtab = symtab; + // Then add our symbols to it. + if (m_symtab) + AddSymbols(*m_symtab); + } return m_symtab; } @@ -186,8 +185,9 @@ ObjectFile *symfile_objfile = GetObjectFile(); if (symfile_objfile != module_objfile) symfile_objfile->SectionFileAddressesChanged(); - if (m_symtab) - m_symtab->SectionFileAddressesChanged(); + auto *symtab = GetSymtab(); + if (symtab) + symtab->SectionFileAddressesChanged(); } uint32_t SymbolFileCommon::GetNumCompileUnits() {