@@ -3579,129 +3579,108 @@ bool TypeSystemClang::IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
35793579 CompilerType *dynamic_pointee_type,
35803580 bool check_cplusplus,
35813581 bool check_objc) {
3582+ if (dynamic_pointee_type)
3583+ dynamic_pointee_type->Clear ();
3584+ if (!type)
3585+ return false ;
3586+
3587+ auto set_dynamic_pointee_type = [&](clang::QualType type) {
3588+ if (dynamic_pointee_type)
3589+ dynamic_pointee_type->SetCompilerType (weak_from_this (),
3590+ type.getAsOpaquePtr ());
3591+ };
3592+
35823593 clang::QualType pointee_qual_type;
3583- if (type) {
3584- clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3585- bool success = false ;
3586- const clang::Type::TypeClass type_class = qual_type->getTypeClass ();
3587- switch (type_class) {
3588- case clang::Type::Builtin:
3589- if (check_objc &&
3590- llvm::cast<clang::BuiltinType>(qual_type)->getKind () ==
3591- clang::BuiltinType::ObjCId) {
3592- if (dynamic_pointee_type)
3593- dynamic_pointee_type->SetCompilerType (weak_from_this (), type);
3594- return true ;
3595- }
3596- break ;
3594+ clang::QualType qual_type = RemoveWrappingTypes (GetCanonicalQualType (type));
3595+ switch (qual_type->getTypeClass ()) {
3596+ case clang::Type::Builtin:
3597+ if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind () ==
3598+ clang::BuiltinType::ObjCId) {
3599+ set_dynamic_pointee_type (qual_type);
3600+ return true ;
3601+ }
3602+ return false ;
35973603
3598- case clang::Type::ObjCObjectPointer:
3599- if (check_objc) {
3600- if (const auto *objc_pointee_type =
3601- qual_type->getPointeeType ().getTypePtrOrNull ()) {
3602- if (const auto *objc_object_type =
3603- llvm::dyn_cast_or_null<clang::ObjCObjectType>(
3604- objc_pointee_type)) {
3605- if (objc_object_type->isObjCClass ())
3606- return false ;
3607- }
3608- }
3609- if (dynamic_pointee_type)
3610- dynamic_pointee_type->SetCompilerType (
3611- weak_from_this (),
3612- llvm::cast<clang::ObjCObjectPointerType>(qual_type)
3613- ->getPointeeType ()
3614- .getAsOpaquePtr ());
3615- return true ;
3604+ case clang::Type::ObjCObjectPointer:
3605+ if (!check_objc)
3606+ return false ;
3607+ if (const auto *objc_pointee_type =
3608+ qual_type->getPointeeType ().getTypePtrOrNull ()) {
3609+ if (const auto *objc_object_type =
3610+ llvm::dyn_cast_or_null<clang::ObjCObjectType>(
3611+ objc_pointee_type)) {
3612+ if (objc_object_type->isObjCClass ())
3613+ return false ;
36163614 }
3617- break ;
3615+ }
3616+ set_dynamic_pointee_type (
3617+ llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType ());
3618+ return true ;
36183619
3619- case clang::Type::Pointer:
3620- pointee_qual_type =
3621- llvm::cast<clang::PointerType>(qual_type)->getPointeeType ();
3622- success = true ;
3623- break ;
3620+ case clang::Type::Pointer:
3621+ pointee_qual_type =
3622+ llvm::cast<clang::PointerType>(qual_type)->getPointeeType ();
3623+ break ;
36243624
3625- case clang::Type::LValueReference:
3626- case clang::Type::RValueReference:
3627- pointee_qual_type =
3628- llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType ();
3629- success = true ;
3630- break ;
3625+ case clang::Type::LValueReference:
3626+ case clang::Type::RValueReference:
3627+ pointee_qual_type =
3628+ llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType ();
3629+ break ;
36313630
3631+ default :
3632+ return false ;
3633+ }
3634+
3635+ // Check to make sure what we are pointing to is a possible dynamic C++ type
3636+ // We currently accept any "void *" (in case we have a class that has been
3637+ // watered down to an opaque pointer) and virtual C++ classes.
3638+ switch (pointee_qual_type.getCanonicalType ()->getTypeClass ()) {
3639+ case clang::Type::Builtin:
3640+ switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind ()) {
3641+ case clang::BuiltinType::UnknownAny:
3642+ case clang::BuiltinType::Void:
3643+ set_dynamic_pointee_type (pointee_qual_type);
3644+ return true ;
36323645 default :
3633- break ;
3646+ return false ;
36343647 }
36353648
3636- if (success) {
3637- // Check to make sure what we are pointing too is a possible dynamic C++
3638- // type We currently accept any "void *" (in case we have a class that
3639- // has been watered down to an opaque pointer) and virtual C++ classes.
3640- const clang::Type::TypeClass pointee_type_class =
3641- pointee_qual_type.getCanonicalType ()->getTypeClass ();
3642- switch (pointee_type_class) {
3643- case clang::Type::Builtin:
3644- switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind ()) {
3645- case clang::BuiltinType::UnknownAny:
3646- case clang::BuiltinType::Void:
3647- if (dynamic_pointee_type)
3648- dynamic_pointee_type->SetCompilerType (
3649- weak_from_this (), pointee_qual_type.getAsOpaquePtr ());
3650- return true ;
3651- default :
3652- break ;
3653- }
3654- break ;
3655-
3656- case clang::Type::Record:
3657- if (check_cplusplus) {
3658- clang::CXXRecordDecl *cxx_record_decl =
3659- pointee_qual_type->getAsCXXRecordDecl ();
3660- if (cxx_record_decl) {
3661- bool is_complete = cxx_record_decl->isCompleteDefinition ();
3662-
3663- if (is_complete)
3664- success = cxx_record_decl->isDynamicClass ();
3665- else {
3666- if (std::optional<ClangASTMetadata> metadata =
3667- GetMetadata (cxx_record_decl))
3668- success = metadata->GetIsDynamicCXXType ();
3669- else {
3670- is_complete = GetType (pointee_qual_type).GetCompleteType ();
3671- if (is_complete)
3672- success = cxx_record_decl->isDynamicClass ();
3673- else
3674- success = false ;
3675- }
3676- }
3649+ case clang::Type::Record: {
3650+ if (!check_cplusplus)
3651+ return false ;
3652+ clang::CXXRecordDecl *cxx_record_decl =
3653+ pointee_qual_type->getAsCXXRecordDecl ();
3654+ if (!cxx_record_decl)
3655+ return false ;
36773656
3678- if (success) {
3679- if (dynamic_pointee_type)
3680- dynamic_pointee_type->SetCompilerType (
3681- weak_from_this (), pointee_qual_type.getAsOpaquePtr ());
3682- return true ;
3683- }
3684- }
3685- }
3686- break ;
3657+ bool success;
3658+ if (cxx_record_decl->isCompleteDefinition ())
3659+ success = cxx_record_decl->isDynamicClass ();
3660+ else if (std::optional<ClangASTMetadata> metadata =
3661+ GetMetadata (cxx_record_decl))
3662+ success = metadata->GetIsDynamicCXXType ();
3663+ else if (GetType (pointee_qual_type).GetCompleteType ())
3664+ success = cxx_record_decl->isDynamicClass ();
3665+ else
3666+ success = false ;
36873667
3688- case clang::Type::ObjCObject:
3689- case clang::Type::ObjCInterface:
3690- if (check_objc) {
3691- if (dynamic_pointee_type)
3692- dynamic_pointee_type->SetCompilerType (
3693- weak_from_this (), pointee_qual_type.getAsOpaquePtr ());
3694- return true ;
3695- }
3696- break ;
3668+ if (success)
3669+ set_dynamic_pointee_type (pointee_qual_type);
3670+ return success;
3671+ }
36973672
3698- default :
3699- break ;
3700- }
3673+ case clang::Type::ObjCObject:
3674+ case clang::Type::ObjCInterface:
3675+ if (check_objc) {
3676+ set_dynamic_pointee_type (pointee_qual_type);
3677+ return true ;
37013678 }
3679+ break ;
3680+
3681+ default :
3682+ break ;
37023683 }
3703- if (dynamic_pointee_type)
3704- dynamic_pointee_type->Clear ();
37053684 return false ;
37063685}
37073686
0 commit comments