Skip to content

Commit 3eb38dc

Browse files
kastiglionevar-const
authored andcommitted
[lldb] Add summary for NSIndirectTaggedPointerString (llvm#136025)
rdar://143164164
1 parent 987dbc6 commit 3eb38dc

File tree

6 files changed

+85
-6
lines changed

6 files changed

+85
-6
lines changed

Diff for: lldb/source/Plugins/Language/ObjC/NSString.cpp

+45-6
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,17 @@ bool lldb_private::formatters::NSStringSummaryProvider(
6363
if (class_name.empty())
6464
return false;
6565

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+
}
7277

7378
auto &additionals_map(NSString_Additionals::GetAdditionalSummaries());
7479
auto iter = additionals_map.find(class_name_cs), end = additionals_map.end();
@@ -368,3 +373,37 @@ bool lldb_private::formatters::NSTaggedString_SummaryProvider(
368373
stream << suffix;
369374
return true;
370375
}
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+
}

Diff for: lldb/source/Plugins/Language/ObjC/NSString.h

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ bool NSTaggedString_SummaryProvider(
2525
ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor,
2626
Stream &stream, const TypeSummaryOptions &summary_options);
2727

28+
bool NSIndirectTaggedString_SummaryProvider(
29+
ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor,
30+
Stream &stream, const TypeSummaryOptions &summary_options);
31+
2832
bool NSAttributedStringSummaryProvider(ValueObject &valobj, Stream &stream,
2933
const TypeSummaryOptions &options);
3034

Diff for: lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,10 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
691691
AddCXXSummary(
692692
objc_category_sp, lldb_private::formatters::NSStringSummaryProvider,
693693
"NSString summary provider", "NSTaggedPointerString", appkit_flags);
694+
AddCXXSummary(objc_category_sp,
695+
lldb_private::formatters::NSStringSummaryProvider,
696+
"NSString summary provider", "NSIndirectTaggedPointerString",
697+
appkit_flags);
694698

695699
AddCXXSummary(objc_category_sp,
696700
lldb_private::formatters::NSAttributedStringSummaryProvider,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
OBJC_SOURCES := main.m
2+
LD_EXTRAS := -framework Foundation
3+
include Makefile.rules
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import lldb
2+
from lldbsuite.test.decorators import *
3+
from lldbsuite.test.lldbtest import *
4+
from lldbsuite.test import lldbutil
5+
6+
7+
class TestCase(TestBase):
8+
def test(self):
9+
"""Verify summary formatter for tagged strings."""
10+
self.build()
11+
lldbutil.run_to_source_breakpoint(self, "break here", lldb.SBFileSpec("main.m"))
12+
self.expect("v str1 str2", patterns=['@"nineDigit"', '@"tenDigitXX"'])
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#import <Foundation/Foundation.h>
2+
3+
@interface NSObject (Fake)
4+
// 9 digit selector
5+
- (void)nineDigit;
6+
// 10 digit selector
7+
- (void)tenDigitXX;
8+
@end
9+
10+
int main() {
11+
SEL sel1 = @selector(nineDigit);
12+
NSString *str1 = NSStringFromSelector(sel1);
13+
SEL sel2 = @selector(tenDigitXX);
14+
NSString *str2 = NSStringFromSelector(sel2);
15+
NSLog(@"break here %@, %@", str1, str2);
16+
return 0;
17+
}

0 commit comments

Comments
 (0)