Author: Michael Buch Date: 2023-03-03T17:44:35Z New Revision: d84117d0ef5fe818990ec2a5199f4b8ceee927b5
URL: https://github.com/llvm/llvm-project/commit/d84117d0ef5fe818990ec2a5199f4b8ceee927b5 DIFF: https://github.com/llvm/llvm-project/commit/d84117d0ef5fe818990ec2a5199f4b8ceee927b5.diff LOG: [lldb][TypeSystemClang][NFC] Factor out l/r-value reference logic for IsXXXType APIs This will be useful as we add more `IsXXXType` APIs for different function types. Differential Revision: https://reviews.llvm.org/D145240 Added: Modified: lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h Removed: ################################################################################ diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index bf0dcc3a92576..388c3675dacc5 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -3050,28 +3050,11 @@ bool TypeSystemClang::IsCStringType(lldb::opaque_compiler_type_t type, } bool TypeSystemClang::IsFunctionType(lldb::opaque_compiler_type_t type) { - if (type) { - clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); - - if (qual_type->isFunctionType()) { - return true; - } + auto isFunctionType = [&](clang::QualType qual_type) { + return qual_type->isFunctionType(); + }; - const clang::Type::TypeClass type_class = qual_type->getTypeClass(); - switch (type_class) { - default: - break; - case clang::Type::LValueReference: - case clang::Type::RValueReference: { - const clang::ReferenceType *reference_type = - llvm::cast<clang::ReferenceType>(qual_type.getTypePtr()); - if (reference_type) - return IsFunctionType( - reference_type->getPointeeType().getAsOpaquePtr()); - } break; - } - } - return false; + return IsTypeImpl(type, isFunctionType); } // Used to detect "Homogeneous Floating-point Aggregates" @@ -3185,11 +3168,13 @@ TypeSystemClang::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type, return CompilerType(); } -bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) { +bool TypeSystemClang::IsTypeImpl( + lldb::opaque_compiler_type_t type, + llvm::function_ref<bool(clang::QualType)> predicate) const { if (type) { clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); - if (qual_type->isFunctionPointerType()) + if (predicate(qual_type)) return true; const clang::Type::TypeClass type_class = qual_type->getTypeClass(); @@ -3202,20 +3187,25 @@ bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) { const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr()); if (reference_type) - return IsFunctionPointerType( - reference_type->getPointeeType().getAsOpaquePtr()); + return IsTypeImpl(reference_type->getPointeeType().getAsOpaquePtr(), predicate); } break; } } return false; } +bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) { + auto isFunctionPointerType = [](clang::QualType qual_type) { + return qual_type->isFunctionPointerType(); + }; + + return IsTypeImpl(type, isFunctionPointerType); +} + bool TypeSystemClang::IsBlockPointerType( lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr) { - if (type) { - clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type)); - + auto isBlockPointerType = [&](clang::QualType qual_type) { if (qual_type->isBlockPointerType()) { if (function_pointer_type_ptr) { const clang::BlockPointerType *block_pointer_type = @@ -3228,23 +3218,10 @@ bool TypeSystemClang::IsBlockPointerType( return true; } - const clang::Type::TypeClass type_class = qual_type->getTypeClass(); - switch (type_class) { - default: - break; + return false; + }; - case clang::Type::LValueReference: - case clang::Type::RValueReference: { - const clang::ReferenceType *reference_type = - llvm::cast<clang::ReferenceType>(qual_type.getTypePtr()); - if (reference_type) - return IsBlockPointerType( - reference_type->getPointeeType().getAsOpaquePtr(), - function_pointer_type_ptr); - } break; - } - } - return false; + return IsTypeImpl(type, isBlockPointerType); } bool TypeSystemClang::IsIntegerType(lldb::opaque_compiler_type_t type, diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h index 14c4a2f864bcf..9751c0de3a50d 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h @@ -1147,6 +1147,9 @@ class TypeSystemClang : public TypeSystem { const clang::ClassTemplateSpecializationDecl * GetAsTemplateSpecialization(lldb::opaque_compiler_type_t type); + bool IsTypeImpl(lldb::opaque_compiler_type_t type, + llvm::function_ref<bool(clang::QualType)> predicate) const; + // Classes that inherit from TypeSystemClang can see and modify these std::string m_target_triple; std::unique_ptr<clang::ASTContext> m_ast_up; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits