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 @@ -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,15 @@ return type_sp; } + lldb::TypeSP CopyType(const lldb::TypeSP &other_type) override { + // Make sure the real symbol file matches when copying types. + if (GetBackingSymbolFile() != other_type->GetSymbolFile()) + return lldb::TypeSP(); + 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; diff --git a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/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); } diff --git a/lldb/include/lldb/Symbol/Type.h b/lldb/include/lldb/Symbol/Type.h --- a/lldb/include/lldb/Symbol/Type.h +++ b/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