[Lldb-commits] [lldb] 901ba0f - [lldb] Implement SymbolFile::CopyType

Augusto Noronha via lldb-commits lldb-commits at lists.llvm.org
Fri Jan 20 13:02:14 PST 2023


Author: Augusto Noronha
Date: 2023-01-20T13:02:04-08:00
New Revision: 901ba0fcae3651c81051fd8da2695bbc2bcb3c91

URL: https://github.com/llvm/llvm-project/commit/901ba0fcae3651c81051fd8da2695bbc2bcb3c91
DIFF: https://github.com/llvm/llvm-project/commit/901ba0fcae3651c81051fd8da2695bbc2bcb3c91.diff

LOG: [lldb] Implement SymbolFile::CopyType

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.

Differential Revision: https://reviews.llvm.org/D142052

Added: 
    

Modified: 
    lldb/include/lldb/Symbol/SymbolFile.h
    lldb/include/lldb/Symbol/SymbolFileOnDemand.h
    lldb/include/lldb/Symbol/Type.h

Removed: 
    


################################################################################
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<Type>, 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


        


More information about the lldb-commits mailing list