augusto2112 created this revision. augusto2112 added a reviewer: clayborg. Herald added a project: All. augusto2112 requested review of this revision. Herald added a project: LLDB. Herald added a subscriber: lldb-commits.
SymbolFiles should be the only point of creation of Types to ensure that they aren't destroyed prematurely by keeping them in the SymbolFile's TypeList. This patch hides the copy constructor of Types, and adds a new CopyType function to SymbolFile, so Types can still be copied safely. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D142052 Files: lldb/include/lldb/Symbol/SymbolFile.h lldb/include/lldb/Symbol/SymbolFileOnDemand.h lldb/include/lldb/Symbol/Type.h Index: lldb/include/lldb/Symbol/Type.h =================================================================== --- lldb/include/lldb/Symbol/Type.h +++ lldb/include/lldb/Symbol/Type.h @@ -241,6 +241,14 @@ // This makes an invalid type. Used for functions that return a Type when // they get an error. Type(); + + Type(Type &t) = default; + + Type(Type &&t) = default; + + Type &operator=(const Type &t) = default; + + Type &operator=(Type &&t) = default; }; // the two classes here are used by the public API as a backend to the SBType Index: lldb/include/lldb/Symbol/SymbolFileOnDemand.h =================================================================== --- lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -241,6 +241,10 @@ compiler_qual_type, compiler_type_resolve_state, opaque_payload); } + lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override { + return m_sym_file_impl->CopyType(other_type); + } + private: Log *GetLog() const { return ::lldb_private::GetLog(LLDBLog::OnDemand); } Index: lldb/include/lldb/Symbol/SymbolFile.h =================================================================== --- lldb/include/lldb/Symbol/SymbolFile.h +++ lldb/include/lldb/Symbol/SymbolFile.h @@ -421,6 +421,8 @@ Type::ResolveState compiler_type_resolve_state, uint32_t opaque_payload = 0) = 0; + virtual lldb::TypeSP CopyType(const lldb::TypeSP &other_type) = 0; + protected: void AssertModuleLock(); @@ -521,6 +523,12 @@ return type_sp; } + lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override { + lldb::TypeSP type_sp (new Type(*other_type)); + m_type_list.Insert(type_sp); + return type_sp; + } + protected: virtual uint32_t CalculateNumCompileUnits() = 0; virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t idx) = 0;
Index: lldb/include/lldb/Symbol/Type.h =================================================================== --- lldb/include/lldb/Symbol/Type.h +++ lldb/include/lldb/Symbol/Type.h @@ -241,6 +241,14 @@ // This makes an invalid type. Used for functions that return a Type when // they get an error. Type(); + + Type(Type &t) = default; + + Type(Type &&t) = default; + + Type &operator=(const Type &t) = default; + + Type &operator=(Type &&t) = default; }; // the two classes here are used by the public API as a backend to the SBType Index: lldb/include/lldb/Symbol/SymbolFileOnDemand.h =================================================================== --- lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -241,6 +241,10 @@ compiler_qual_type, compiler_type_resolve_state, opaque_payload); } + lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override { + return m_sym_file_impl->CopyType(other_type); + } + private: Log *GetLog() const { return ::lldb_private::GetLog(LLDBLog::OnDemand); } Index: lldb/include/lldb/Symbol/SymbolFile.h =================================================================== --- lldb/include/lldb/Symbol/SymbolFile.h +++ lldb/include/lldb/Symbol/SymbolFile.h @@ -421,6 +421,8 @@ Type::ResolveState compiler_type_resolve_state, uint32_t opaque_payload = 0) = 0; + virtual lldb::TypeSP CopyType(const lldb::TypeSP &other_type) = 0; + protected: void AssertModuleLock(); @@ -521,6 +523,12 @@ return type_sp; } + lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override { + lldb::TypeSP type_sp (new Type(*other_type)); + m_type_list.Insert(type_sp); + return type_sp; + } + protected: virtual uint32_t CalculateNumCompileUnits() = 0; virtual lldb::CompUnitSP ParseCompileUnitAtIndex(uint32_t idx) = 0;
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits