Skip to content

Commit a2f57b8

Browse files
committed
[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 (cherry picked from commit d84117d)
1 parent 993d39c commit a2f57b8

File tree

2 files changed

+24
-44
lines changed

2 files changed

+24
-44
lines changed

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -3018,28 +3018,11 @@ bool TypeSystemClang::IsCStringType(lldb::opaque_compiler_type_t type,
30183018
}
30193019

30203020
bool TypeSystemClang::IsFunctionType(lldb::opaque_compiler_type_t type) {
3021-
if (type) {
3022-
clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
3023-
3024-
if (qual_type->isFunctionType()) {
3025-
return true;
3026-
}
3021+
auto isFunctionType = [&](clang::QualType qual_type) {
3022+
return qual_type->isFunctionType();
3023+
};
30273024

3028-
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3029-
switch (type_class) {
3030-
default:
3031-
break;
3032-
case clang::Type::LValueReference:
3033-
case clang::Type::RValueReference: {
3034-
const clang::ReferenceType *reference_type =
3035-
llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3036-
if (reference_type)
3037-
return IsFunctionType(
3038-
reference_type->getPointeeType().getAsOpaquePtr());
3039-
} break;
3040-
}
3041-
}
3042-
return false;
3025+
return IsTypeImpl(type, isFunctionType);
30433026
}
30443027

30453028
// Used to detect "Homogeneous Floating-point Aggregates"
@@ -3153,11 +3136,13 @@ TypeSystemClang::GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
31533136
return CompilerType();
31543137
}
31553138

3156-
bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
3139+
bool TypeSystemClang::IsTypeImpl(
3140+
lldb::opaque_compiler_type_t type,
3141+
llvm::function_ref<bool(clang::QualType)> predicate) const {
31573142
if (type) {
31583143
clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
31593144

3160-
if (qual_type->isFunctionPointerType())
3145+
if (predicate(qual_type))
31613146
return true;
31623147

31633148
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
@@ -3170,20 +3155,25 @@ bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
31703155
const clang::ReferenceType *reference_type =
31713156
llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
31723157
if (reference_type)
3173-
return IsFunctionPointerType(
3174-
reference_type->getPointeeType().getAsOpaquePtr());
3158+
return IsTypeImpl(reference_type->getPointeeType().getAsOpaquePtr(), predicate);
31753159
} break;
31763160
}
31773161
}
31783162
return false;
31793163
}
31803164

3165+
bool TypeSystemClang::IsFunctionPointerType(lldb::opaque_compiler_type_t type) {
3166+
auto isFunctionPointerType = [](clang::QualType qual_type) {
3167+
return qual_type->isFunctionPointerType();
3168+
};
3169+
3170+
return IsTypeImpl(type, isFunctionPointerType);
3171+
}
3172+
31813173
bool TypeSystemClang::IsBlockPointerType(
31823174
lldb::opaque_compiler_type_t type,
31833175
CompilerType *function_pointer_type_ptr) {
3184-
if (type) {
3185-
clang::QualType qual_type = RemoveWrappingTypes(GetCanonicalQualType(type));
3186-
3176+
auto isBlockPointerType = [&](clang::QualType qual_type) {
31873177
if (qual_type->isBlockPointerType()) {
31883178
if (function_pointer_type_ptr) {
31893179
const clang::BlockPointerType *block_pointer_type =
@@ -3196,23 +3186,10 @@ bool TypeSystemClang::IsBlockPointerType(
31963186
return true;
31973187
}
31983188

3199-
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3200-
switch (type_class) {
3201-
default:
3202-
break;
3189+
return false;
3190+
};
32033191

3204-
case clang::Type::LValueReference:
3205-
case clang::Type::RValueReference: {
3206-
const clang::ReferenceType *reference_type =
3207-
llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3208-
if (reference_type)
3209-
return IsBlockPointerType(
3210-
reference_type->getPointeeType().getAsOpaquePtr(),
3211-
function_pointer_type_ptr);
3212-
} break;
3213-
}
3214-
}
3215-
return false;
3192+
return IsTypeImpl(type, isBlockPointerType);
32163193
}
32173194

32183195
bool TypeSystemClang::IsIntegerType(lldb::opaque_compiler_type_t type,

lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,9 @@ class TypeSystemClang : public TypeSystem {
11371137
const clang::ClassTemplateSpecializationDecl *
11381138
GetAsTemplateSpecialization(lldb::opaque_compiler_type_t type);
11391139

1140+
bool IsTypeImpl(lldb::opaque_compiler_type_t type,
1141+
llvm::function_ref<bool(clang::QualType)> predicate) const;
1142+
11401143
// Classes that inherit from TypeSystemClang can see and modify these
11411144
std::string m_target_triple;
11421145
std::unique_ptr<clang::ASTContext> m_ast_up;

0 commit comments

Comments
 (0)