Skip to content

Commit b5f2db9

Browse files
authored
[lldb][libc++] Adds some C++20 calendar data formatters. (#76983)
This adds a subset of the C++20 calendar data formatters: - day, - month, - year, - month_day, - month_day_last, and - year_month_day. A followup patch will add the missing calendar data formatters: - weekday, - weekday_indexed, - weekday_last, - month_weekday, - month_weekday_last, - year_month, - year_month_day_last - year_month_weekday, and - year_month_weekday_last.
1 parent 4ea5c60 commit b5f2db9

File tree

5 files changed

+221
-0
lines changed

5 files changed

+221
-0
lines changed

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,6 +1031,41 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
10311031
"^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
10321032
TypeSummaryImplSP(new StringSummaryFormat(
10331033
eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1034+
1035+
// Chrono calendar types
1036+
1037+
cpp_category_sp->AddTypeSummary(
1038+
"^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1039+
TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1040+
eTypeOptionHideValue,
1041+
"day=${var.__d_%u}")));
1042+
AddCXXSummary(cpp_category_sp,
1043+
lldb_private::formatters::LibcxxChronoMonthSummaryProvider,
1044+
"libc++ std::chrono::month summary provider",
1045+
"^std::__[[:alnum:]]+::chrono::month$",
1046+
eTypeOptionHideChildren | eTypeOptionHideValue, true);
1047+
1048+
cpp_category_sp->AddTypeSummary(
1049+
"^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1050+
TypeSummaryImplSP(new StringSummaryFormat(
1051+
eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1052+
1053+
cpp_category_sp->AddTypeSummary(
1054+
"^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1055+
TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1056+
eTypeOptionHideValue,
1057+
"${var.__m_} ${var.__d_}")));
1058+
cpp_category_sp->AddTypeSummary(
1059+
"^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1060+
TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1061+
eTypeOptionHideValue,
1062+
"${var.__m_} day=last")));
1063+
AddCXXSummary(
1064+
cpp_category_sp,
1065+
lldb_private::formatters::LibcxxChronoYearMonthDaySummaryProvider,
1066+
"libc++ std::chrono::year_month_day summary provider",
1067+
"^std::__[[:alnum:]]+::chrono::year_month_day$",
1068+
eTypeOptionHideChildren | eTypeOptionHideValue, true);
10341069
}
10351070

10361071
static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,3 +1084,60 @@ bool lldb_private::formatters::LibcxxWStringViewSummaryProvider(
10841084
return ::LibcxxWStringSummaryProvider(valobj, stream, summary_options,
10851085
dataobj, size);
10861086
}
1087+
1088+
bool lldb_private::formatters::LibcxxChronoMonthSummaryProvider(
1089+
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1090+
// FIXME: These are the names used in the C++20 ostream operator. Since LLVM
1091+
// uses C++17 it's not possible to use the ostream operator directly.
1092+
static const std::array<std::string_view, 12> months = {
1093+
"January", "February", "March", "April", "May", "June",
1094+
"July", "August", "September", "October", "November", "December"};
1095+
1096+
ValueObjectSP ptr_sp = valobj.GetChildMemberWithName("__m_");
1097+
if (!ptr_sp)
1098+
return false;
1099+
1100+
const unsigned month = ptr_sp->GetValueAsUnsigned(0);
1101+
if (month >= 1 && month <= 12)
1102+
stream << "month=" << months[month - 1];
1103+
else
1104+
stream.Printf("month=%u", month);
1105+
1106+
return true;
1107+
}
1108+
1109+
bool lldb_private::formatters::LibcxxChronoYearMonthDaySummaryProvider(
1110+
ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) {
1111+
ValueObjectSP ptr_sp = valobj.GetChildMemberWithName("__y_");
1112+
if (!ptr_sp)
1113+
return false;
1114+
ptr_sp = ptr_sp->GetChildMemberWithName("__y_");
1115+
if (!ptr_sp)
1116+
return false;
1117+
int year = ptr_sp->GetValueAsSigned(0);
1118+
1119+
ptr_sp = valobj.GetChildMemberWithName("__m_");
1120+
if (!ptr_sp)
1121+
return false;
1122+
ptr_sp = ptr_sp->GetChildMemberWithName("__m_");
1123+
if (!ptr_sp)
1124+
return false;
1125+
const unsigned month = ptr_sp->GetValueAsUnsigned(0);
1126+
1127+
ptr_sp = valobj.GetChildMemberWithName("__d_");
1128+
if (!ptr_sp)
1129+
return false;
1130+
ptr_sp = ptr_sp->GetChildMemberWithName("__d_");
1131+
if (!ptr_sp)
1132+
return false;
1133+
const unsigned day = ptr_sp->GetValueAsUnsigned(0);
1134+
1135+
stream << "date=";
1136+
if (year < 0) {
1137+
stream << '-';
1138+
year = -year;
1139+
}
1140+
stream.Printf("%04d-%02u-%02u", year, month, day);
1141+
1142+
return true;
1143+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,14 @@ SyntheticChildrenFrontEnd *
261261
LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *,
262262
lldb::ValueObjectSP);
263263

264+
bool LibcxxChronoMonthSummaryProvider(
265+
ValueObject &valobj, Stream &stream,
266+
const TypeSummaryOptions &options); // libc++ std::chrono::month
267+
268+
bool LibcxxChronoYearMonthDaySummaryProvider(
269+
ValueObject &valobj, Stream &stream,
270+
const TypeSummaryOptions &options); // libc++ std::chrono::year_month_day
271+
264272
} // namespace formatters
265273
} // namespace lldb_private
266274

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

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,70 @@ def test_with_run_command(self):
3232
self.expect("frame variable m", substrs=["m = 4321 months"])
3333
self.expect("frame variable y", substrs=["y = 321 years"])
3434

35+
self.expect("frame variable d_0", substrs=["d_0 = day=0"])
36+
self.expect("frame variable d_1", substrs=["d_1 = day=1"])
37+
self.expect("frame variable d_31", substrs=["d_31 = day=31"])
38+
self.expect("frame variable d_255", substrs=["d_255 = day=255"])
39+
40+
self.expect("frame variable jan", substrs=["jan = month=January"])
41+
self.expect("frame variable feb", substrs=["feb = month=February"])
42+
self.expect("frame variable mar", substrs=["mar = month=March"])
43+
self.expect("frame variable apr", substrs=["apr = month=April"])
44+
self.expect("frame variable may", substrs=["may = month=May"])
45+
self.expect("frame variable jun", substrs=["jun = month=June"])
46+
self.expect("frame variable jul", substrs=["jul = month=July"])
47+
self.expect("frame variable aug", substrs=["aug = month=August"])
48+
self.expect("frame variable sep", substrs=["sep = month=September"])
49+
self.expect("frame variable oct", substrs=["oct = month=October"])
50+
self.expect("frame variable nov", substrs=["nov = month=November"])
51+
self.expect("frame variable dec", substrs=["dec = month=December"])
52+
53+
self.expect("frame variable month_0", substrs=["month_0 = month=0"])
54+
self.expect("frame variable month_1", substrs=["month_1 = month=January"])
55+
self.expect("frame variable month_2", substrs=["month_2 = month=February"])
56+
self.expect("frame variable month_3", substrs=["month_3 = month=March"])
57+
self.expect("frame variable month_4", substrs=["month_4 = month=April"])
58+
self.expect("frame variable month_5", substrs=["month_5 = month=May"])
59+
self.expect("frame variable month_6", substrs=["month_6 = month=June"])
60+
self.expect("frame variable month_7", substrs=["month_7 = month=July"])
61+
self.expect("frame variable month_8", substrs=["month_8 = month=August"])
62+
self.expect("frame variable month_9", substrs=["month_9 = month=September"])
63+
self.expect("frame variable month_10", substrs=["month_10 = month=October"])
64+
self.expect("frame variable month_11", substrs=["month_11 = month=November"])
65+
self.expect("frame variable month_12", substrs=["month_12 = month=December"])
66+
self.expect("frame variable month_13", substrs=["month_13 = month=13"])
67+
self.expect("frame variable month_255", substrs=["month_255 = month=255"])
68+
69+
self.expect("frame variable y_min", substrs=["y_min = year=-32767"])
70+
self.expect("frame variable y_0", substrs=["y_0 = year=0"])
71+
self.expect("frame variable y_1970", substrs=["y_1970 = year=1970"])
72+
self.expect("frame variable y_2038", substrs=["y_2038 = year=2038"])
73+
self.expect("frame variable y_max", substrs=["y_max = year=32767"])
74+
75+
self.expect(
76+
"frame variable md_new_years_eve",
77+
substrs=["md_new_years_eve = month=December day=31"],
78+
)
79+
self.expect(
80+
"frame variable md_new_year", substrs=["md_new_year = month=January day=1"]
81+
)
82+
self.expect(
83+
"frame variable md_invalid", substrs=["md_invalid = month=255 day=255"]
84+
)
85+
86+
self.expect(
87+
"frame variable mdl_jan", substrs=["mdl_jan = month=January day=last"]
88+
)
89+
self.expect(
90+
"frame variable mdl_new_years_eve",
91+
substrs=["mdl_new_years_eve = month=December day=last"],
92+
)
93+
94+
self.expect("frame variable ymd_bc", substrs=["ymd_bc = date=-0001-03-255"])
95+
self.expect(
96+
"frame variable ymd_year_zero", substrs=["ymd_year_zero = date=0000-255-25"]
97+
)
98+
self.expect(
99+
"frame variable ymd_unix_epoch",
100+
substrs=["ymd_unix_epoch = date=1970-01-01"],
101+
)

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

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,59 @@ int main() {
1515
std::chrono::months m{4321};
1616
std::chrono::years y{321};
1717

18+
std::chrono::day d_0{0};
19+
std::chrono::day d_1{1};
20+
std::chrono::day d_31{31};
21+
std::chrono::day d_255{255};
22+
23+
std::chrono::month jan = std::chrono::January;
24+
std::chrono::month feb = std::chrono::February;
25+
std::chrono::month mar = std::chrono::March;
26+
std::chrono::month apr = std::chrono::April;
27+
std::chrono::month may = std::chrono::May;
28+
std::chrono::month jun = std::chrono::June;
29+
std::chrono::month jul = std::chrono::July;
30+
std::chrono::month aug = std::chrono::August;
31+
std::chrono::month sep = std::chrono::September;
32+
std::chrono::month oct = std::chrono::October;
33+
std::chrono::month nov = std::chrono::November;
34+
std::chrono::month dec = std::chrono::December;
35+
36+
std::chrono::month month_0{0};
37+
std::chrono::month month_1{1};
38+
std::chrono::month month_2{2};
39+
std::chrono::month month_3{3};
40+
std::chrono::month month_4{4};
41+
std::chrono::month month_5{5};
42+
std::chrono::month month_6{6};
43+
std::chrono::month month_7{7};
44+
std::chrono::month month_8{8};
45+
std::chrono::month month_9{9};
46+
std::chrono::month month_10{10};
47+
std::chrono::month month_11{11};
48+
std::chrono::month month_12{12};
49+
std::chrono::month month_13{13};
50+
std::chrono::month month_255{255};
51+
52+
std::chrono::year y_min{std::chrono::year::min()};
53+
std::chrono::year y_0{0};
54+
std::chrono::year y_1970{1970};
55+
std::chrono::year y_2038{2038};
56+
std::chrono::year y_max{std::chrono::year::max()};
57+
58+
std::chrono::month_day md_new_years_eve{std::chrono::December / 31};
59+
std::chrono::month_day md_new_year{std::chrono::January / 1};
60+
std::chrono::month_day md_invalid{std::chrono::month{255} / 255};
61+
62+
std::chrono::month_day_last mdl_jan{std::chrono::January};
63+
std::chrono::month_day_last mdl_new_years_eve{std::chrono::December};
64+
65+
std::chrono::year_month_day ymd_bc{std::chrono::year{-1}, std::chrono::March,
66+
std::chrono::day{255}};
67+
std::chrono::year_month_day ymd_year_zero{
68+
std::chrono::year{0}, std::chrono::month{255}, std::chrono::day{25}};
69+
std::chrono::year_month_day ymd_unix_epoch{
70+
std::chrono::year{1970}, std::chrono::January, std::chrono::day{1}};
71+
1872
std::cout << "break here\n";
1973
}

0 commit comments

Comments
 (0)