From be35144c14485585c71690e6f8e01aab4e483002 Mon Sep 17 00:00:00 2001 From: Charles Zablit Date: Tue, 9 Dec 2025 15:39:56 +0000 Subject: [PATCH 1/2] [lldb][windows] add NSDate and FoundationEssentials.Date dataformatters (cherry picked from commit 0eb033809ddc3eef339bf43b4684a5d68d774c9c) --- lldb/source/Plugins/Language/ObjC/Cocoa.cpp | 8 ++++- .../Language/Swift/FoundationValueTypes.cpp | 6 ++++ .../Plugins/Language/Swift/SwiftLanguage.cpp | 5 +-- .../data-formatter/swift/date/Makefile | 3 ++ .../swift/date/TestSwiftDateFormatters.py | 35 +++++++++++++++++++ .../data-formatter/swift/date/main.swift | 16 +++++++++ 6 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 lldb/test/API/functionalities/data-formatter/swift/date/Makefile create mode 100644 lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py create mode 100644 lldb/test/API/functionalities/data-formatter/swift/date/main.swift diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp index 27ca10c164263..af325ec4d8a94 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp @@ -1256,9 +1256,11 @@ bool lldb_private::formatters::ObjCSELSummaryProvider( // this call gives the POSIX equivalent of the Cocoa epoch time_t lldb_private::formatters::GetOSXEpoch() { static time_t epoch = 0; +#ifndef _AIX if (!epoch) { -#if !defined(_WIN32) && !defined(_AIX) +#ifndef _WIN32 tzset(); +#endif tm tm_epoch; tm_epoch.tm_sec = 0; tm_epoch.tm_hour = 0; @@ -1267,11 +1269,15 @@ time_t lldb_private::formatters::GetOSXEpoch() { tm_epoch.tm_mday = 1; tm_epoch.tm_year = 2001 - 1900; tm_epoch.tm_isdst = -1; +#ifdef _WIN32 + epoch = _mkgmtime(&tm_epoch); +#else tm_epoch.tm_gmtoff = 0; tm_epoch.tm_zone = nullptr; epoch = timegm(&tm_epoch); #endif } +#endif return epoch; } diff --git a/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp b/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp index 4b1511bf1b87e..9aa4ff99af95d 100644 --- a/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp +++ b/lldb/source/Plugins/Language/Swift/FoundationValueTypes.cpp @@ -34,9 +34,15 @@ using namespace lldb_private::formatters::swift; bool lldb_private::formatters::swift::Date_SummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { static ConstString g__time("_time"); + static ConstString g__timeIntervalSinceReferenceDate( + "_timeIntervalSinceReferenceDate"); ValueObjectSP time_sp(valobj.GetChildAtNamePath({g__time})); + if (!time_sp) + time_sp = valobj.GetChildAtNamePath( + {g__timeIntervalSinceReferenceDate, "_value"}); + if (!time_sp) return false; diff --git a/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp b/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp index 9cf61d771efe5..6ae8ccc075362 100644 --- a/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp +++ b/lldb/source/Plugins/Language/Swift/SwiftLanguage.cpp @@ -670,8 +670,9 @@ LoadFoundationValueTypesFormatters(lldb::TypeCategoryImplSP swift_category_sp) { lldb_private::formatters::AddCXXSummary( swift_category_sp, lldb_private::formatters::swift::Date_SummaryProvider, - "Foundation.Date summary provider", ConstString("Foundation.Date"), - TypeSummaryImpl::Flags(summary_flags).SetDontShowChildren(true)); + "Foundation.Date summary provider", + ConstString("Foundation(Essentials)?\\.(NS)?Date"), + TypeSummaryImpl::Flags(summary_flags).SetDontShowChildren(true), true); lldb_private::formatters::AddCXXSummary( swift_category_sp, diff --git a/lldb/test/API/functionalities/data-formatter/swift/date/Makefile b/lldb/test/API/functionalities/data-formatter/swift/date/Makefile new file mode 100644 index 0000000000000..2a69023633b34 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/swift/date/Makefile @@ -0,0 +1,3 @@ +SWIFT_SOURCES := main.swift + +include Makefile.rules diff --git a/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py b/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py new file mode 100644 index 0000000000000..eb5ac445d7129 --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py @@ -0,0 +1,35 @@ +""" +Test Foundation.Date summary strings. +""" + +import lldb +from lldbsuite.test.lldbtest import * +from lldbsuite.test.decorators import * +import lldbsuite.test.lldbutil as lldbutil + +import sys + + +class TestCase(TestBase): + @skipUnlessFoundation + @swiftTest + def test_swift_date_formatters(self): + """Test Date summary strings.""" + self.build() + + _ = lldbutil.run_to_source_breakpoint( + self, "break here", lldb.SBFileSpec("main.swift") + ) + + self.expect( + "v date", + startstr="(Foundation.Date) date = 2001-01-15 13:12:00 UTC", + ) + + if sys.platform != "win32": + return + + self.expect( + "v nsdate", + startstr="(Foundation.NSDate) date = 2001-01-15 13:12:00 UTC", + ) diff --git a/lldb/test/API/functionalities/data-formatter/swift/date/main.swift b/lldb/test/API/functionalities/data-formatter/swift/date/main.swift new file mode 100644 index 0000000000000..7f6f60f30970d --- /dev/null +++ b/lldb/test/API/functionalities/data-formatter/swift/date/main.swift @@ -0,0 +1,16 @@ +import Foundation + +let paris = TimeZone(identifier: "Europe/Paris")! + +var comps = DateComponents() +comps.year = 2001 +comps.month = 1 +comps.day = 15 +comps.hour = 14 +comps.minute = 12 +comps.timeZone = paris + +let date = Calendar(identifier: .gregorian).date(from: comps)! +let nsdate = date as NSDate + +print("break here") From 91fa5b831728d83b55b8a4a6a6e8615c04d3898c Mon Sep 17 00:00:00 2001 From: Charles Zablit Date: Mon, 15 Dec 2025 17:43:26 +0000 Subject: [PATCH 2/2] [lldb][windows] refactor NSDate dataformatter tests (cherry picked from commit 9b13afc944e703f9a567f927abf7af90ba5a6ce7) --- .../swift/date/TestSwiftDateFormatters.py | 4 +-- .../data-formatter/swift/date/main.swift | 26 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py b/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py index eb5ac445d7129..3193fff86b936 100644 --- a/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py +++ b/lldb/test/API/functionalities/data-formatter/swift/date/TestSwiftDateFormatters.py @@ -22,7 +22,7 @@ def test_swift_date_formatters(self): ) self.expect( - "v date", + "frame var date", startstr="(Foundation.Date) date = 2001-01-15 13:12:00 UTC", ) @@ -30,6 +30,6 @@ def test_swift_date_formatters(self): return self.expect( - "v nsdate", + "frame var nsdate", startstr="(Foundation.NSDate) date = 2001-01-15 13:12:00 UTC", ) diff --git a/lldb/test/API/functionalities/data-formatter/swift/date/main.swift b/lldb/test/API/functionalities/data-formatter/swift/date/main.swift index 7f6f60f30970d..5a2a4c19248b3 100644 --- a/lldb/test/API/functionalities/data-formatter/swift/date/main.swift +++ b/lldb/test/API/functionalities/data-formatter/swift/date/main.swift @@ -1,16 +1,20 @@ import Foundation -let paris = TimeZone(identifier: "Europe/Paris")! +func main() { + let paris = TimeZone(identifier: "Europe/Paris")! -var comps = DateComponents() -comps.year = 2001 -comps.month = 1 -comps.day = 15 -comps.hour = 14 -comps.minute = 12 -comps.timeZone = paris + var comps = DateComponents() + comps.year = 2001 + comps.month = 1 + comps.day = 15 + comps.hour = 14 + comps.minute = 12 + comps.timeZone = paris -let date = Calendar(identifier: .gregorian).date(from: comps)! -let nsdate = date as NSDate + let date = Calendar(identifier: .gregorian).date(from: comps)! + let nsdate = date as NSDate -print("break here") + print("break here") +} + +main()