Skip to content

Commit 390bdb8

Browse files
mordanteMichael137
authored andcommitted
[lldb][libc++] Adds some C++20 calendar data formatters. (llvm#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. (cherry picked from commit b5f2db9)
1 parent 6c49618 commit 390bdb8

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
@@ -1046,6 +1046,41 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
10461046
"^std::__[[:alnum:]]+::chrono::seconds", eFormatterMatchRegex,
10471047
TypeSummaryImplSP(new StringSummaryFormat(
10481048
eTypeOptionHideChildren | eTypeOptionHideValue, "${var.__rep_} s")));
1049+
1050+
// Chrono calendar types
1051+
1052+
cpp_category_sp->AddTypeSummary(
1053+
"^std::__[[:alnum:]]+::chrono::day$", eFormatterMatchRegex,
1054+
TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1055+
eTypeOptionHideValue,
1056+
"day=${var.__d_%u}")));
1057+
AddCXXSummary(cpp_category_sp,
1058+
lldb_private::formatters::LibcxxChronoMonthSummaryProvider,
1059+
"libc++ std::chrono::month summary provider",
1060+
"^std::__[[:alnum:]]+::chrono::month$",
1061+
eTypeOptionHideChildren | eTypeOptionHideValue, true);
1062+
1063+
cpp_category_sp->AddTypeSummary(
1064+
"^std::__[[:alnum:]]+::chrono::year$", eFormatterMatchRegex,
1065+
TypeSummaryImplSP(new StringSummaryFormat(
1066+
eTypeOptionHideChildren | eTypeOptionHideValue, "year=${var.__y_}")));
1067+
1068+
cpp_category_sp->AddTypeSummary(
1069+
"^std::__[[:alnum:]]+::chrono::month_day$", eFormatterMatchRegex,
1070+
TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1071+
eTypeOptionHideValue,
1072+
"${var.__m_} ${var.__d_}")));
1073+
cpp_category_sp->AddTypeSummary(
1074+
"^std::__[[:alnum:]]+::chrono::month_day_last$", eFormatterMatchRegex,
1075+
TypeSummaryImplSP(new StringSummaryFormat(eTypeOptionHideChildren |
1076+
eTypeOptionHideValue,
1077+
"${var.__m_} day=last")));
1078+
AddCXXSummary(
1079+
cpp_category_sp,
1080+
lldb_private::formatters::LibcxxChronoYearMonthDaySummaryProvider,
1081+
"libc++ std::chrono::year_month_day summary provider",
1082+
"^std::__[[:alnum:]]+::chrono::year_month_day$",
1083+
eTypeOptionHideChildren | eTypeOptionHideValue, true);
10491084
}
10501085

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

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,14 @@ SyntheticChildrenFrontEnd *
265265
LibcxxStdRangesRefViewSyntheticFrontEndCreator(CXXSyntheticChildren *,
266266
lldb::ValueObjectSP);
267267

268+
bool LibcxxChronoMonthSummaryProvider(
269+
ValueObject &valobj, Stream &stream,
270+
const TypeSummaryOptions &options); // libc++ std::chrono::month
271+
272+
bool LibcxxChronoYearMonthDaySummaryProvider(
273+
ValueObject &valobj, Stream &stream,
274+
const TypeSummaryOptions &options); // libc++ std::chrono::year_month_day
275+
268276
} // namespace formatters
269277
} // namespace lldb_private
270278

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
@@ -31,3 +31,70 @@ def test_with_run_command(self):
3131
self.expect("frame variable m", substrs=["m = 4321 months"])
3232
self.expect("frame variable y", substrs=["y = 321 years"])
3333

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

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)