diff --git a/lldb/include/lldb/Target/LanguageRuntime.h b/lldb/include/lldb/Target/LanguageRuntime.h index 3521f4642872..73c8dfa3874d 100644 --- a/lldb/include/lldb/Target/LanguageRuntime.h +++ b/lldb/include/lldb/Target/LanguageRuntime.h @@ -156,6 +156,10 @@ public: /// from the user interface. virtual bool IsWhitelistedRuntimeValue(ConstString name) { return false; } + virtual llvm::Optional GetRuntimeType(CompilerType base_type) { + return llvm::None; + } + virtual void ModulesDidLoad(const ModuleList &module_list) {} // Called by the Clang expression evaluation engine to allow runtimes to diff --git a/lldb/include/lldb/Target/ObjCLanguageRuntime.h b/lldb/include/lldb/Target/ObjCLanguageRuntime.h index 1fc8744407a7..1925c78ed342 100644 --- a/lldb/include/lldb/Target/ObjCLanguageRuntime.h +++ b/lldb/include/lldb/Target/ObjCLanguageRuntime.h @@ -250,6 +250,8 @@ public: lldb::TypeSP LookupInCompleteClassCache(ConstString &name); + llvm::Optional GetRuntimeType(CompilerType base_type) override; + virtual UtilityFunction *CreateObjectChecker(const char *) = 0; virtual ObjCRuntimeVersions GetRuntimeVersion() const { diff --git a/lldb/source/Core/ValueObject.cpp b/lldb/source/Core/ValueObject.cpp index 73cd13394330..297365b4ecbd 100644 --- a/lldb/source/Core/ValueObject.cpp +++ b/lldb/source/Core/ValueObject.cpp @@ -35,7 +35,6 @@ #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Language.h" #include "lldb/Target/LanguageRuntime.h" -#include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Process.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/Target.h" @@ -280,51 +279,21 @@ CompilerType ValueObject::MaybeCalculateCompleteType() { return compiler_type; } - CompilerType class_type; - bool is_pointer_type = false; - - if (ClangASTContext::IsObjCObjectPointerType(compiler_type, &class_type)) { - is_pointer_type = true; - } else if (ClangASTContext::IsObjCObjectOrInterfaceType(compiler_type)) { - class_type = compiler_type; - } else { - return compiler_type; - } - m_did_calculate_complete_objc_class_type = true; - if (class_type) { - ConstString class_name(class_type.GetConstTypeName()); + ProcessSP process_sp( + GetUpdatePoint().GetExecutionContextRef().GetProcessSP()); - if (class_name) { - ProcessSP process_sp( - GetUpdatePoint().GetExecutionContextRef().GetProcessSP()); + if (!process_sp) + return compiler_type; - if (process_sp) { - ObjCLanguageRuntime *objc_language_runtime( - ObjCLanguageRuntime::Get(*process_sp)); - - if (objc_language_runtime) { - TypeSP complete_objc_class_type_sp = - objc_language_runtime->LookupInCompleteClassCache(class_name); - - if (complete_objc_class_type_sp) { - CompilerType complete_class( - complete_objc_class_type_sp->GetFullCompilerType()); - - if (complete_class.GetCompleteType()) { - if (is_pointer_type) { - m_override_type = complete_class.GetPointerType(); - } else { - m_override_type = complete_class; - } - - if (m_override_type.IsValid()) - return m_override_type; - } - } - } - } + if (auto *runtime = + process_sp->GetLanguageRuntime(GetObjectRuntimeLanguage())) { + if (llvm::Optional complete_type = + runtime->GetRuntimeType(compiler_type)) { + m_override_type = complete_type.getValue(); + if (m_override_type.IsValid()) + return m_override_type; } } return compiler_type; diff --git a/lldb/source/Target/ObjCLanguageRuntime.cpp b/lldb/source/Target/ObjCLanguageRuntime.cpp index 5e800981740d..8e5d144e0419 100644 --- a/lldb/source/Target/ObjCLanguageRuntime.cpp +++ b/lldb/source/Target/ObjCLanguageRuntime.cpp @@ -398,3 +398,38 @@ Status ObjCLanguageRuntime::ObjCExceptionPrecondition::ConfigurePrecondition( "The ObjC Exception breakpoint doesn't support extra options."); return error; } + +llvm::Optional +ObjCLanguageRuntime::GetRuntimeType(CompilerType base_type) { + CompilerType class_type; + bool is_pointer_type = false; + + if (ClangASTContext::IsObjCObjectPointerType(base_type, &class_type)) + is_pointer_type = true; + else if (ClangASTContext::IsObjCObjectOrInterfaceType(base_type)) + class_type = base_type; + else + return llvm::None; + + if (!class_type) + return llvm::None; + + ConstString class_name(class_type.GetConstTypeName()); + if (!class_name) + return llvm::None; + + TypeSP complete_objc_class_type_sp = LookupInCompleteClassCache(class_name); + if (!complete_objc_class_type_sp) + return llvm::None; + + CompilerType complete_class( + complete_objc_class_type_sp->GetFullCompilerType()); + if (complete_class.GetCompleteType()) { + if (is_pointer_type) + return complete_class.GetPointerType(); + else + return complete_class; + } + + return llvm::None; +}