diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index 1be3323f715be..8548973bad3ff 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -421,6 +421,8 @@ class SymbolFile : public PluginInterface { 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 @@ class SymbolFileCommon : public SymbolFile { 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 index b615356246c64..825fba755e990 100644 --- a/lldb/include/lldb/Symbol/SymbolFileOnDemand.h +++ b/lldb/include/lldb/Symbol/SymbolFileOnDemand.h @@ -241,6 +241,10 @@ class SymbolFileOnDemand : public lldb_private::SymbolFile { 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 index fa494172219c9..046501931d211 100644 --- a/lldb/include/lldb/Symbol/Type.h +++ b/lldb/include/lldb/Symbol/Type.h @@ -241,6 +241,14 @@ class Type : public std::enable_shared_from_this, public UserID { // 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