@@ -63,12 +63,17 @@ bool lldb_private::formatters::NSStringSummaryProvider(
63
63
if (class_name.empty ())
64
64
return false ;
65
65
66
- bool is_tagged_ptr = class_name == " NSTaggedPointerString" &&
67
- descriptor->GetTaggedPointerInfo ();
68
- // for a tagged pointer, the descriptor has everything we need
69
- if (is_tagged_ptr)
70
- return NSTaggedString_SummaryProvider(valobj, descriptor, stream,
71
- summary_options);
66
+ // For tagged pointers, the descriptor has everything needed.
67
+ bool is_tagged = descriptor->GetTaggedPointerInfo ();
68
+ if (is_tagged) {
69
+ if (class_name == " NSTaggedPointerString" )
70
+ return NSTaggedString_SummaryProvider(valobj, descriptor, stream,
71
+ summary_options);
72
+
73
+ if (class_name == " NSIndirectTaggedPointerString" )
74
+ return NSIndirectTaggedString_SummaryProvider(valobj, descriptor, stream,
75
+ summary_options);
76
+ }
72
77
73
78
auto &additionals_map (NSString_Additionals::GetAdditionalSummaries ());
74
79
auto iter = additionals_map.find (class_name_cs), end = additionals_map.end ();
@@ -368,3 +373,37 @@ bool lldb_private::formatters::NSTaggedString_SummaryProvider(
368
373
stream << suffix;
369
374
return true ;
370
375
}
376
+
377
+ bool lldb_private::formatters::NSIndirectTaggedString_SummaryProvider (
378
+ ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor,
379
+ Stream &stream, const TypeSummaryOptions &summary_options) {
380
+ if (!descriptor)
381
+ return false ;
382
+
383
+ uint64_t payload = 0 ;
384
+ if (!descriptor->GetTaggedPointerInfo (nullptr , nullptr , &payload))
385
+ return false ;
386
+
387
+ // First 47 bits are the address of the contents.
388
+ addr_t ptr = payload & 0x7fffffffffffULL ;
389
+ // Next 13 bits are the string's length.
390
+ size_t size = (payload >> 47 ) & 0x1fff ;
391
+
392
+ Status status;
393
+ std::vector<char > buf (size);
394
+ if (auto process_sp = valobj.GetProcessSP ())
395
+ if (process_sp->ReadMemory (ptr, buf.data (), size, status)) {
396
+ llvm::StringRef prefix, suffix;
397
+ if (auto *language = Language::FindPlugin (summary_options.GetLanguage ()))
398
+ std::tie (prefix, suffix) =
399
+ language->GetFormatterPrefixSuffix (" NSString" );
400
+ stream << prefix << ' "' ;
401
+ stream.PutCString ({buf.data (), size});
402
+ stream << ' "' << suffix;
403
+ return true ;
404
+ }
405
+
406
+ if (status.Fail ())
407
+ stream.Format (" <{0}>" , status);
408
+ return false ;
409
+ }
0 commit comments