Skip to content

Commit e481f56

Browse files
authored
[lldb][libc++] Adds local_t clock data formatters. (llvm#88178)
1 parent 9931e7e commit e481f56

File tree

5 files changed

+221
-6
lines changed

5 files changed

+221
-6
lines changed

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1050,7 +1050,7 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
10501050
"libc++ std::chrono::sys_seconds summary provider",
10511051
"^std::__[[:alnum:]]+::chrono::time_point<"
10521052
"std::__[[:alnum:]]+::chrono::system_clock, "
1053-
"std::__[[:alnum:]]+::chrono::duration<long long, "
1053+
"std::__[[:alnum:]]+::chrono::duration<.*, "
10541054
"std::__[[:alnum:]]+::ratio<1, 1> "
10551055
"> >$",
10561056
eTypeOptionHideChildren | eTypeOptionHideValue |
@@ -1068,6 +1068,29 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
10681068
eTypeOptionCascade,
10691069
true);
10701070

1071+
AddCXXSummary(
1072+
cpp_category_sp,
1073+
lldb_private::formatters::LibcxxChronoLocalSecondsSummaryProvider,
1074+
"libc++ std::chrono::local_seconds summary provider",
1075+
"^std::__[[:alnum:]]+::chrono::time_point<"
1076+
"std::__[[:alnum:]]+::chrono::local_t, "
1077+
"std::__[[:alnum:]]+::chrono::duration<.*, "
1078+
"std::__[[:alnum:]]+::ratio<1, 1> "
1079+
"> >$",
1080+
eTypeOptionHideChildren | eTypeOptionHideValue | eTypeOptionCascade,
1081+
true);
1082+
AddCXXSummary(cpp_category_sp,
1083+
lldb_private::formatters::LibcxxChronoLocalDaysSummaryProvider,
1084+
"libc++ std::chrono::local_seconds summary provider",
1085+
"^std::__[[:alnum:]]+::chrono::time_point<"
1086+
"std::__[[:alnum:]]+::chrono::local_t, "
1087+
"std::__[[:alnum:]]+::chrono::duration<int, "
1088+
"std::__[[:alnum:]]+::ratio<86400, 1> "
1089+
"> >$",
1090+
eTypeOptionHideChildren | eTypeOptionHideValue |
1091+
eTypeOptionCascade,
1092+
true);
1093+
10711094
// Chrono calendar types
10721095

10731096
cpp_category_sp->AddTypeSummary(

lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,8 +1087,10 @@ bool lldb_private::formatters::LibcxxWStringViewSummaryProvider(
10871087
dataobj, size);
10881088
}
10891089

1090-
bool lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider(
1091-
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1090+
static bool
1091+
LibcxxChronoTimePointSecondsSummaryProvider(ValueObject &valobj, Stream &stream,
1092+
const TypeSummaryOptions &options,
1093+
const char *fmt) {
10921094
ValueObjectSP ptr_sp = valobj.GetChildMemberWithName("__d_");
10931095
if (!ptr_sp)
10941096
return false;
@@ -1112,7 +1114,7 @@ bool lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider(
11121114
else {
11131115
std::array<char, 128> str;
11141116
std::size_t size =
1115-
std::strftime(str.data(), str.size(), "%FT%H:%M:%SZ", gmtime(&seconds));
1117+
std::strftime(str.data(), str.size(), fmt, gmtime(&seconds));
11161118
if (size == 0)
11171119
return false;
11181120

@@ -1123,8 +1125,22 @@ bool lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider(
11231125
return true;
11241126
}
11251127

1126-
bool lldb_private::formatters::LibcxxChronoSysDaysSummaryProvider(
1128+
bool lldb_private::formatters::LibcxxChronoSysSecondsSummaryProvider(
11271129
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1130+
return LibcxxChronoTimePointSecondsSummaryProvider(valobj, stream, options,
1131+
"%FT%H:%M:%SZ");
1132+
}
1133+
1134+
bool lldb_private::formatters::LibcxxChronoLocalSecondsSummaryProvider(
1135+
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1136+
return LibcxxChronoTimePointSecondsSummaryProvider(valobj, stream, options,
1137+
"%FT%H:%M:%S");
1138+
}
1139+
1140+
static bool
1141+
LibcxxChronoTimepointDaysSummaryProvider(ValueObject &valobj, Stream &stream,
1142+
const TypeSummaryOptions &options,
1143+
const char *fmt) {
11281144
ValueObjectSP ptr_sp = valobj.GetChildMemberWithName("__d_");
11291145
if (!ptr_sp)
11301146
return false;
@@ -1148,7 +1164,7 @@ bool lldb_private::formatters::LibcxxChronoSysDaysSummaryProvider(
11481164

11491165
std::array<char, 128> str;
11501166
std::size_t size =
1151-
std::strftime(str.data(), str.size(), "%FZ", gmtime(&seconds));
1167+
std::strftime(str.data(), str.size(), fmt, gmtime(&seconds));
11521168
if (size == 0)
11531169
return false;
11541170

@@ -1158,6 +1174,18 @@ bool lldb_private::formatters::LibcxxChronoSysDaysSummaryProvider(
11581174
return true;
11591175
}
11601176

1177+
bool lldb_private::formatters::LibcxxChronoSysDaysSummaryProvider(
1178+
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1179+
return LibcxxChronoTimepointDaysSummaryProvider(valobj, stream, options,
1180+
"%FZ");
1181+
}
1182+
1183+
bool lldb_private::formatters::LibcxxChronoLocalDaysSummaryProvider(
1184+
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1185+
return LibcxxChronoTimepointDaysSummaryProvider(valobj, stream, options,
1186+
"%F");
1187+
}
1188+
11611189
bool lldb_private::formatters::LibcxxChronoMonthSummaryProvider(
11621190
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
11631191
// FIXME: These are the names used in the C++20 ostream operator. Since LLVM

lldb/source/Plugins/Language/CPlusPlus/LibCxx.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,14 @@ bool LibcxxChronoSysDaysSummaryProvider(
281281
ValueObject &valobj, Stream &stream,
282282
const TypeSummaryOptions &options); // libc++ std::chrono::sys_days
283283

284+
bool LibcxxChronoLocalSecondsSummaryProvider(
285+
ValueObject &valobj, Stream &stream,
286+
const TypeSummaryOptions &options); // libc++ std::chrono::local_seconds
287+
288+
bool LibcxxChronoLocalDaysSummaryProvider(
289+
ValueObject &valobj, Stream &stream,
290+
const TypeSummaryOptions &options); // libc++ std::chrono::local_days
291+
284292
bool LibcxxChronoMonthSummaryProvider(
285293
ValueObject &valobj, Stream &stream,
286294
const TypeSummaryOptions &options); // libc++ std::chrono::month

lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/chrono/TestDataFormatterLibcxxChrono.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,110 @@ def test_with_run_command(self):
128128
substrs=["sd_max = timestamp=2147483647 days"],
129129
)
130130

131+
# local_seconds aliasses
132+
133+
self.expect(
134+
"frame variable ls_tp",
135+
substrs=["ls_tp = date/time=1970-01-01T00:00:00 timestamp=0 s"],
136+
)
137+
self.expect(
138+
"frame variable ls_tp_d",
139+
substrs=["ls_tp_d = date/time=1970-01-01T00:00:00 timestamp=0 s"],
140+
)
141+
self.expect(
142+
"frame variable ls_tp_d_r",
143+
substrs=["ls_tp_d_r = date/time=1970-01-01T00:00:00 timestamp=0 s"],
144+
)
145+
self.expect(
146+
"frame variable ls_tp_d_r2",
147+
substrs=["ls_tp_d_r2 = date/time=1970-01-01T00:00:00 timestamp=0 s"],
148+
)
149+
150+
# local_seconds
151+
152+
self.expect(
153+
"frame variable ls_0",
154+
substrs=["ls_0 = date/time=1970-01-01T00:00:00 timestamp=0 s"],
155+
)
156+
157+
self.expect(
158+
"frame variable ls_neg_date_time",
159+
substrs=[
160+
"ls_neg_date_time = date/time=-32767-01-01T00:00:00 timestamp=-1096193779200 s"
161+
],
162+
)
163+
self.expect(
164+
"frame variable ls_neg_seconds",
165+
substrs=["ls_neg_seconds = timestamp=-1096193779201 s"],
166+
)
167+
168+
self.expect(
169+
"frame variable ls_pos_date_time",
170+
substrs=[
171+
"ls_pos_date_time = date/time=32767-12-31T23:59:59 timestamp=971890963199 s"
172+
],
173+
)
174+
self.expect(
175+
"frame variable ls_pos_seconds",
176+
substrs=["ls_pos_seconds = timestamp=971890963200 s"],
177+
)
178+
179+
self.expect(
180+
"frame variable ls_min",
181+
substrs=["ls_min = timestamp=-9223372036854775808 s"],
182+
)
183+
self.expect(
184+
"frame variable ls_max",
185+
substrs=["ls_max = timestamp=9223372036854775807 s"],
186+
)
187+
188+
# local_days aliasses
189+
190+
self.expect(
191+
"frame variable ld_tp",
192+
substrs=["ld_tp = date=1970-01-01 timestamp=0 days"],
193+
)
194+
self.expect(
195+
"frame variable ld_tp_d_r",
196+
substrs=["ld_tp_d_r = date=1970-01-01 timestamp=0 days"],
197+
)
198+
self.expect(
199+
"frame variable ld_tp_d_r2",
200+
substrs=["ld_tp_d_r2 = date=1970-01-01 timestamp=0 days"],
201+
)
202+
203+
# local_days
204+
205+
self.expect(
206+
"frame variable ld_0", substrs=["ld_0 = date=1970-01-01 timestamp=0 days"]
207+
)
208+
self.expect(
209+
"frame variable ld_neg_date",
210+
substrs=["ld_neg_date = date=-32767-01-01 timestamp=-12687428 days"],
211+
)
212+
self.expect(
213+
"frame variable ld_neg_days",
214+
substrs=["ld_neg_days = timestamp=-12687429 days"],
215+
)
216+
217+
self.expect(
218+
"frame variable ld_pos_date",
219+
substrs=["ld_pos_date = date=32767-12-31 timestamp=11248737 days"],
220+
)
221+
self.expect(
222+
"frame variable ld_pos_days",
223+
substrs=["ld_pos_days = timestamp=11248738 days"],
224+
)
225+
226+
self.expect(
227+
"frame variable ld_min",
228+
substrs=["ld_min = timestamp=-2147483648 days"],
229+
)
230+
self.expect(
231+
"frame variable ld_max",
232+
substrs=["ld_max = timestamp=2147483647 days"],
233+
)
234+
131235
self.expect("frame variable d_0", substrs=["d_0 = day=0"])
132236
self.expect("frame variable d_1", substrs=["d_1 = day=1"])
133237
self.expect("frame variable d_31", substrs=["d_31 = day=31"])

lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/chrono/main.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,58 @@ int main() {
6767
std::chrono::sys_days sd_max{
6868
std::chrono::days{std::numeric_limits<int>::max()}};
6969

70+
// local_seconds aliasses
71+
std::chrono::time_point<std::chrono::local_t, std::chrono::seconds> ls_tp{
72+
std::chrono::seconds{0}};
73+
std::chrono::time_point<std::chrono::local_t,
74+
std::chrono::duration<long long>>
75+
ls_tp_d{std::chrono::seconds{0}};
76+
std::chrono::time_point<std::chrono::local_t,
77+
std::chrono::duration<long long, std::ratio<1>>>
78+
ls_tp_d_r{std::chrono::seconds{0}};
79+
std::chrono::time_point<std::chrono::local_t,
80+
std::chrono::duration<long long, std::ratio<1>>>
81+
ls_tp_d_r2{std::chrono::seconds{0}};
82+
83+
// local_seconds
84+
std::chrono::local_seconds ls_0{std::chrono::seconds{0}};
85+
std::chrono::local_seconds ls_neg_date_time{
86+
std::chrono::seconds{-1'096'193'779'200}};
87+
std::chrono::local_seconds ls_neg_seconds{
88+
std::chrono::seconds{-1'096'193'779'201}};
89+
std::chrono::local_seconds ls_pos_date_time{
90+
std::chrono::seconds{971'890'963'199}};
91+
std::chrono::local_seconds ls_pos_seconds{
92+
std::chrono::seconds{971'890'963'200}};
93+
std::chrono::local_seconds ls_min{
94+
std::chrono::seconds{std::numeric_limits<long long>::min()}};
95+
std::chrono::local_seconds ls_max{
96+
std::chrono::seconds{std::numeric_limits<long long>::max()}};
97+
98+
// local_days aliasses
99+
std::chrono::time_point<std::chrono::local_t, std::chrono::days> ld_tp{
100+
std::chrono::days{0}};
101+
std::chrono::time_point<std::chrono::local_t,
102+
std::chrono::duration<int, std::ratio<86400>>>
103+
ld_tp_d_r{std::chrono::days{0}};
104+
std::chrono::time_point<std::chrono::local_t,
105+
std::chrono::duration<int, std::ratio<86400, 1>>>
106+
ld_tp_d_r2{std::chrono::days{0}};
107+
108+
// local_days
109+
std::chrono::local_days ld_0{std::chrono::days{0}};
110+
111+
std::chrono::local_days ld_neg_date{std::chrono::days{-12'687'428}};
112+
std::chrono::local_days ld_neg_days{std::chrono::days{-12'687'429}};
113+
114+
std::chrono::local_days ld_pos_date{std::chrono::days{11'248'737}};
115+
std::chrono::local_days ld_pos_days{std::chrono::days{11'248'738}};
116+
117+
std::chrono::local_days ld_min{
118+
std::chrono::days{std::numeric_limits<int>::min()}};
119+
std::chrono::local_days ld_max{
120+
std::chrono::days{std::numeric_limits<int>::max()}};
121+
70122
std::chrono::day d_0{0};
71123
std::chrono::day d_1{1};
72124
std::chrono::day d_31{31};

0 commit comments

Comments
 (0)