diff --git a/lldb/include/lldb/Symbol/CompilerType.h b/lldb/include/lldb/Symbol/CompilerType.h index 0d536e090d2097..0d1b00a1b26c72 100644 --- a/lldb/include/lldb/Symbol/CompilerType.h +++ b/lldb/include/lldb/Symbol/CompilerType.h @@ -39,7 +39,9 @@ class CompilerType { /// /// \see lldb_private::TypeSystemClang::GetType(clang::QualType) CompilerType(TypeSystem *type_system, lldb::opaque_compiler_type_t type) - : m_type(type), m_type_system(type_system) {} + : m_type(type), m_type_system(type_system) { + assert(Verify() && "verification failed"); + } CompilerType(const CompilerType &rhs) : m_type(rhs.m_type), m_type_system(rhs.m_type_system) {} @@ -380,6 +382,13 @@ class CompilerType { } private: +#ifndef NDEBUG + /// If the type is valid, ask the TypeSystem to verify the integrity + /// of the type to catch CompilerTypes that mix and match invalid + /// TypeSystem/Opaque type pairs. + bool Verify() const; +#endif + lldb::opaque_compiler_type_t m_type = nullptr; TypeSystem *m_type_system = nullptr; }; diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 37c87a4bd025c7..a84b9a1c441ca1 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -129,6 +129,11 @@ class TypeSystem : public PluginInterface { void *other_opaque_decl_ctx) = 0; // Tests +#ifndef NDEBUG + /// Verify the integrity of the type to catch CompilerTypes that mix + /// and match invalid TypeSystem/Opaque type pairs. + virtual bool Verify(lldb::opaque_compiler_type_t type) = 0; +#endif virtual bool IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size, diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index 47f1a852289a94..42655ad6cc24d2 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -2532,6 +2532,12 @@ ConvertAccessTypeToObjCIvarAccessControl(AccessType access) { // Tests +#ifndef NDEBUG +bool TypeSystemClang::Verify(lldb::opaque_compiler_type_t type) { + return !type || llvm::isa(GetQualType(type).getTypePtr()); +} +#endif + bool TypeSystemClang::IsAggregateType(lldb::opaque_compiler_type_t type) { clang::QualType qual_type(RemoveWrappingTypes(GetCanonicalQualType(type))); diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 75e749f5783fcd..e22635dce9d010 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -495,6 +495,10 @@ class TypeSystemClang : public TypeSystem { // Tests +#ifndef NDEBUG + bool Verify(lldb::opaque_compiler_type_t type) override; +#endif + bool IsArrayType(lldb::opaque_compiler_type_t type, CompilerType *element_type, uint64_t *size, bool *is_incomplete) override; diff --git a/lldb/source/Symbol/CompilerType.cpp b/lldb/source/Symbol/CompilerType.cpp index 1507f2c3121b38..6c150988a0128f 100644 --- a/lldb/source/Symbol/CompilerType.cpp +++ b/lldb/source/Symbol/CompilerType.cpp @@ -865,6 +865,12 @@ bool CompilerType::GetValueAsScalar(const lldb_private::DataExtractor &data, return false; } +#ifndef NDEBUG +bool CompilerType::Verify() const { + return !IsValid() || m_type_system->Verify(m_type); +} +#endif + bool lldb_private::operator==(const lldb_private::CompilerType &lhs, const lldb_private::CompilerType &rhs) { return lhs.GetTypeSystem() == rhs.GetTypeSystem() && diff --git a/lldb/source/Symbol/TypeSystem.cpp b/lldb/source/Symbol/TypeSystem.cpp index b0131e988363cb..fd5b9613f71762 100644 --- a/lldb/source/Symbol/TypeSystem.cpp +++ b/lldb/source/Symbol/TypeSystem.cpp @@ -70,6 +70,10 @@ lldb::TypeSystemSP TypeSystem::CreateInstance(lldb::LanguageType language, return CreateInstanceHelper(language, nullptr, target); } +#ifndef NDEBUG +bool TypeSystem::Verify(lldb::opaque_compiler_type_t type) { return true; } +#endif + bool TypeSystem::IsAnonymousType(lldb::opaque_compiler_type_t type) { return false; }