https://github.com/kastiglione updated https://github.com/llvm/llvm-project/pull/136025
>From 1f9c152dbb7a1e2d70cdf924a8109c8cdb7d0a6f Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Wed, 16 Apr 2025 13:03:23 -0700 Subject: [PATCH 1/3] [lldb] Add summary for NSIndirectTaggedPointerString --- .../source/Plugins/Language/ObjC/NSString.cpp | 51 ++++++++++++++++--- lldb/source/Plugins/Language/ObjC/NSString.h | 4 ++ .../Plugins/Language/ObjC/ObjCLanguage.cpp | 4 ++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/lldb/source/Plugins/Language/ObjC/NSString.cpp b/lldb/source/Plugins/Language/ObjC/NSString.cpp index a99d042572bfe..11b4c6c5df8af 100644 --- a/lldb/source/Plugins/Language/ObjC/NSString.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSString.cpp @@ -63,12 +63,17 @@ bool lldb_private::formatters::NSStringSummaryProvider( if (class_name.empty()) return false; - bool is_tagged_ptr = class_name == "NSTaggedPointerString" && - descriptor->GetTaggedPointerInfo(); - // for a tagged pointer, the descriptor has everything we need - if (is_tagged_ptr) - return NSTaggedString_SummaryProvider(valobj, descriptor, stream, - summary_options); + // for tagged pointers, the descriptor has everything needed. + bool is_tagged = descriptor->GetTaggedPointerInfo(); + if (is_tagged) { + if (class_name == "NSTaggedPointerString") + return NSTaggedString_SummaryProvider(valobj, descriptor, stream, + summary_options); + + if (class_name == "NSIndirectTaggedPointerString") + return NSIndirectTaggedString_SummaryProvider(valobj, descriptor, stream, + summary_options); + } auto &additionals_map(NSString_Additionals::GetAdditionalSummaries()); auto iter = additionals_map.find(class_name_cs), end = additionals_map.end(); @@ -368,3 +373,37 @@ bool lldb_private::formatters::NSTaggedString_SummaryProvider( stream << suffix; return true; } + +bool lldb_private::formatters::NSIndirectTaggedString_SummaryProvider( + ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, + Stream &stream, const TypeSummaryOptions &summary_options) { + if (!descriptor) + return false; + + uint64_t payload = 0; + if (!descriptor->GetTaggedPointerInfo(nullptr, nullptr, &payload)) + return false; + + // First 47 bits are the address of the contents. + addr_t ptr = payload & 0x7fffffffffffULL; + // Next 13 bits are the string's length. + size_t size = (payload >> 47) & 0x1fff; + + Status status; + char buf[8192]; + if (auto process_sp = valobj.GetProcessSP()) + if (process_sp->ReadMemory(ptr, buf, size, status)) { + llvm::StringRef prefix, suffix; + if (auto *language = Language::FindPlugin(summary_options.GetLanguage())) + std::tie(prefix, suffix) = + language->GetFormatterPrefixSuffix("NSString"); + stream << prefix << '"'; + stream.PutCString({buf, size}); + stream << '"' << suffix; + return true; + } + + if (status.Fail()) + stream.Format("<{0}>", status); + return false; +} diff --git a/lldb/source/Plugins/Language/ObjC/NSString.h b/lldb/source/Plugins/Language/ObjC/NSString.h index 8c9fcf955f1f8..5d405b30b6817 100644 --- a/lldb/source/Plugins/Language/ObjC/NSString.h +++ b/lldb/source/Plugins/Language/ObjC/NSString.h @@ -25,6 +25,10 @@ bool NSTaggedString_SummaryProvider( ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, Stream &stream, const TypeSummaryOptions &summary_options); +bool NSIndirectTaggedString_SummaryProvider( + ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, + Stream &stream, const TypeSummaryOptions &summary_options); + bool NSAttributedStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp index c835b439a64dd..3b8e21cbb9269 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -691,6 +691,10 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) { AddCXXSummary( objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", "NSTaggedPointerString", appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", "NSIndirectTaggedPointerString", + appkit_flags); AddCXXSummary(objc_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, >From e50e40d2de5a24525457da9a2185b3e8358520cf Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Wed, 16 Apr 2025 15:24:06 -0700 Subject: [PATCH 2/3] Add test --- .../objc/foundation/tagged/strings/Makefile | 3 +++ .../tagged/strings/TestObjCTaggedStrings.py | 12 ++++++++++++ .../lang/objc/foundation/tagged/strings/main.m | 17 +++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 lldb/test/API/lang/objc/foundation/tagged/strings/Makefile create mode 100644 lldb/test/API/lang/objc/foundation/tagged/strings/TestObjCTaggedStrings.py create mode 100644 lldb/test/API/lang/objc/foundation/tagged/strings/main.m diff --git a/lldb/test/API/lang/objc/foundation/tagged/strings/Makefile b/lldb/test/API/lang/objc/foundation/tagged/strings/Makefile new file mode 100644 index 0000000000000..a3198db9e8e88 --- /dev/null +++ b/lldb/test/API/lang/objc/foundation/tagged/strings/Makefile @@ -0,0 +1,3 @@ +OBJC_SOURCES := main.m +LD_EXTRAS := -framework Foundation +include Makefile.rules diff --git a/lldb/test/API/lang/objc/foundation/tagged/strings/TestObjCTaggedStrings.py b/lldb/test/API/lang/objc/foundation/tagged/strings/TestObjCTaggedStrings.py new file mode 100644 index 0000000000000..66dc895b6a9ed --- /dev/null +++ b/lldb/test/API/lang/objc/foundation/tagged/strings/TestObjCTaggedStrings.py @@ -0,0 +1,12 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestCase(TestBase): + def test(self): + """Verify summary formatter for tagged strings.""" + self.build() + lldbutil.run_to_source_breakpoint(self, "break here", lldb.SBFileSpec("main.m")) + self.expect("v str1 str2", patterns=['@"nineDigit"', '@"tenDigitXX"']) diff --git a/lldb/test/API/lang/objc/foundation/tagged/strings/main.m b/lldb/test/API/lang/objc/foundation/tagged/strings/main.m new file mode 100644 index 0000000000000..c2b5575986a99 --- /dev/null +++ b/lldb/test/API/lang/objc/foundation/tagged/strings/main.m @@ -0,0 +1,17 @@ +#import <Foundation/Foundation.h> + +@interface NSObject (Fake) +// 9 digit selector +- (void)nineDigit; +// 10 digit selector +- (void)tenDigitXX; +@end + +int main() { + SEL sel1 = @selector(nineDigit); + NSString *str1 = NSStringFromSelector(sel1); + SEL sel2 = @selector(tenDigitXX); + NSString *str2 = NSStringFromSelector(sel2); + NSLog(@"break here %@, %@", str1, str2); + return 0; +} >From 2e9ccb7be7b9489bb373b78197cc83eebbbb713e Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Wed, 16 Apr 2025 15:46:15 -0700 Subject: [PATCH 3/3] Use a heap allocated buffer (vector) --- lldb/source/Plugins/Language/ObjC/NSString.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/Language/ObjC/NSString.cpp b/lldb/source/Plugins/Language/ObjC/NSString.cpp index 11b4c6c5df8af..2626b9a3f7b8a 100644 --- a/lldb/source/Plugins/Language/ObjC/NSString.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSString.cpp @@ -63,7 +63,7 @@ bool lldb_private::formatters::NSStringSummaryProvider( if (class_name.empty()) return false; - // for tagged pointers, the descriptor has everything needed. + // For tagged pointers, the descriptor has everything needed. bool is_tagged = descriptor->GetTaggedPointerInfo(); if (is_tagged) { if (class_name == "NSTaggedPointerString") @@ -390,15 +390,15 @@ bool lldb_private::formatters::NSIndirectTaggedString_SummaryProvider( size_t size = (payload >> 47) & 0x1fff; Status status; - char buf[8192]; + std::vector<char> buf(size); if (auto process_sp = valobj.GetProcessSP()) - if (process_sp->ReadMemory(ptr, buf, size, status)) { + if (process_sp->ReadMemory(ptr, buf.data(), size, status)) { llvm::StringRef prefix, suffix; if (auto *language = Language::FindPlugin(summary_options.GetLanguage())) std::tie(prefix, suffix) = language->GetFormatterPrefixSuffix("NSString"); stream << prefix << '"'; - stream.PutCString({buf, size}); + stream.PutCString({buf.data(), size}); stream << '"' << suffix; return true; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits