[Lldb-commits] [lldb] 6385c2a - [AppleObjCRuntimeV2] Force lazily allocated class names to be resolved.

Davidino Italiano via lldb-commits lldb-commits at lists.llvm.org
Fri Mar 20 13:44:33 PDT 2020



> On Mar 20, 2020, at 1:43 PM, Davide Italiano via lldb-commits <lldb-commits at lists.llvm.org> wrote:
> 
> 
> Author: Davide Italiano
> Date: 2020-03-20T13:43:08-07:00
> New Revision: 6385c2ab8ff8304eafa822012c40934690bde124
> 
> URL: https://github.com/llvm/llvm-project/commit/6385c2ab8ff8304eafa822012c40934690bde124
> DIFF: https://github.com/llvm/llvm-project/commit/6385c2ab8ff8304eafa822012c40934690bde124.diff
> 
> LOG: [AppleObjCRuntimeV2] Force lazily allocated class names to be resolved.
> 
> Fixes a couple of tests on new versions of the Obj-C runtime.
> 
> Added: 
> 
> 
> Modified: 
>    lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
>    lldb/test/Shell/ExecControl/StopHook/stop-hook.test
> 
> Removed: 
> 
> 
> 
> ################################################################################
> diff  --git a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
> index 9fea9a217dce..4a07c792eebb 100644
> --- a/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
> +++ b/lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
> @@ -1175,6 +1175,28 @@ AppleObjCRuntimeV2::GetClassDescriptorFromISA(ObjCISA isa) {
>   return class_descriptor_sp;
> }
> 
> +static std::pair<bool, ConstString> ObjCGetClassNameRaw(
> +                                      AppleObjCRuntime::ObjCISA isa,
> +                                      Process *process) {
> +  StreamString expr_string;
> +  std::string input = std::to_string(isa);
> +  expr_string.Printf("(const char *)objc_debug_class_getNameRaw(%s)",
> +                     input.c_str());
> +
> +  ValueObjectSP result_sp;
> +  EvaluateExpressionOptions eval_options;
> +  eval_options.SetLanguage(lldb::eLanguageTypeObjC);
> +  eval_options.SetResultIsInternal(true);
> +  eval_options.SetGenerateDebugInfo(true);
> +  eval_options.SetTimeout(process->GetUtilityExpressionTimeout());
> +  auto eval_result = process->GetTarget().EvaluateExpression(
> +      expr_string.GetData(),
> +      process->GetThreadList().GetSelectedThread()->GetSelectedFrame().get(),
> +      result_sp, eval_options);
> +  ConstString type_name(result_sp->GetSummaryAsCString());
> +  return std::make_pair(eval_result == eExpressionCompleted, type_name);
> +}
> +
> ObjCLanguageRuntime::ClassDescriptorSP
> AppleObjCRuntimeV2::GetClassDescriptor(ValueObject &valobj) {
>   ClassDescriptorSP objc_class_sp;
> @@ -1210,7 +1232,10 @@ AppleObjCRuntimeV2::GetClassDescriptor(ValueObject &valobj) {
>     return objc_class_sp;
> 
>   objc_class_sp = GetClassDescriptorFromISA(isa);
> -  if (isa && !objc_class_sp) {
> +
> +  if (objc_class_sp)
> +    return objc_class_sp;
> +  else {
>     Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS |
>                                       LIBLLDB_LOG_TYPES));
>     LLDB_LOGF(log,
> @@ -1219,6 +1244,13 @@ AppleObjCRuntimeV2::GetClassDescriptor(ValueObject &valobj) {
>               "not in class descriptor cache 0x%" PRIx64,
>               isa_pointer, isa);
>   }
> +
> +  ClassDescriptorSP descriptor_sp(new ClassDescriptorV2(*this, isa, nullptr));
> +  auto resolved = ObjCGetClassNameRaw(isa, process);
> +  if (resolved.first == true) {
> +    AddClass(isa, descriptor_sp, resolved.second.AsCString());
> +    objc_class_sp = descriptor_sp;
> +  }
>   return objc_class_sp;
> }
> 
> 
> diff  --git a/lldb/test/Shell/ExecControl/StopHook/stop-hook.test b/lldb/test/Shell/ExecControl/StopHook/stop-hook.test
> index a06de6634ea1..7e5b37b63854 100644
> --- a/lldb/test/Shell/ExecControl/StopHook/stop-hook.test
> +++ b/lldb/test/Shell/ExecControl/StopHook/stop-hook.test
> @@ -51,7 +51,7 @@ run
> thread step-over
> # Stepping inside of the stop hook range
> # CHECK: (lldb) thread step-over
> -# CHECK-NEXT: (void *) $1 = 0x
> +# CHECK-NEXT: (void *) $2 = 0x
> # CHECK: ->{{.*}} // We should stop here after stepping.

This is an unfortunate side effect of SetResultInternal not working in the expression parser.
Jim Ingham is fixing this, to the best of my knowledge.

—
Davide


More information about the lldb-commits mailing list