From 6fb5d69e47dcd6b75ff23da20efb2f27ac7c0d34 Mon Sep 17 00:00:00 2001 From: T0b1 Date: Mon, 19 Jun 2023 18:44:42 +0200 Subject: [PATCH] bitfields --- src/data.h | 8 ++++++ src/frontend/window.cpp | 56 +++++++++++++++++++++++++++++++++++++--- tmp/main | Bin 82584 -> 82584 bytes tmp/sec.cpp | 2 +- 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/data.h b/src/data.h index ebf90a0..49aa5d5 100644 --- a/src/data.h +++ b/src/data.h @@ -174,6 +174,14 @@ namespace dbgui::data // TODO: move this to target as its target dependent? size_t byte_size(const std::vector &) const; + bool is_integral() const + { + return type == Type::u8 || type == Type::u16 || type == Type::u32 + || type == Type::u64 || type == Type::u128 || type == Type::i8 + || type == Type::i16 || type == Type::i32 || type == Type::i64 + || type == Type::i128; + } + bool is_basic() const { return type != Type::none && type != Type::custom && type != Type::array diff --git a/src/frontend/window.cpp b/src/frontend/window.cpp index d1acc9b..1de9c23 100644 --- a/src/frontend/window.cpp +++ b/src/frontend/window.cpp @@ -1015,7 +1015,7 @@ bool WatchWindow::draw(Frontend &frontend) } // ImGuiTableFlags_SizingFixedFit - if (ImGui::BeginTable("##Variables", 2)) + if (ImGui::BeginTable("##Variables", 2, ImGuiTableFlags_RowBg)) { ImGui::TableSetupColumn("Name"); ImGui::TableSetupColumn("Value"); @@ -1105,14 +1105,64 @@ void WatchWindow::draw_value(Frontend &frontend, for (size_t i = 0; i < members.size(); ++i) { const auto &member = members[i]; - // Skip bitfield if (member.bitfield_size) { ImGui::TableNextRow(); ImGui::TableSetColumnIndex(0); ImGui::Text("%s", member.name.c_str()); ImGui::TableNextColumn(); - ImGui::TextDisabled(""); + + auto member_type = member.type_id; + while (member_type.type == Type::alias) + { + member_type = std::get( + frontend.target->types[member_type.idx].member_types); + } + + // TODO: handle u128/i128 + assert(member_type.type != Type::i128 + && member_type.type != Type::u128); + assert(member_type.is_integral() + || member_type.type == Type::_enum); + assert(member.bitfield_size <= 8 * 8); + auto byte_off = member.offset / 8; + auto bit_off = member.offset % 8; + auto byte_size = (member.bitfield_size + 7) / 8; + uint64_t value = 0; + uint8_t arr[8] = {}; + const auto &data = node.vec_data(); + std::copy(data.begin() + off + byte_off, + data.begin() + off + byte_off + byte_size, arr); + value = *reinterpret_cast(arr); + + assert(bit_off + member.bitfield_size <= 64); + value = value >> bit_off; + value = + value & (0xFFFFFFFF'FFFFFFFF >> (64 - member.bitfield_size)); + + if (member_type.type == Type::_enum) + { + const auto &members = + frontend.target->types[type_id.idx].member_vec(); + auto printed = false; + for (const auto &member : members) + { + if (value == member.enum_val) + { + ImGui::Text("%s", member.name.c_str()); + printed = true; + break; + } + } + if (!printed) + { + ImGui::Text("", value); + } + } else + { + ImGui::Text("%ld", value); + } + continue; } diff --git a/tmp/main b/tmp/main index 5c35f55b20aa10718fc83a03abd5c9f6c9ee50a7..5b76443afc1e533d8fd2043cd9fd6abc2b4a1d70 100755 GIT binary patch delta 1404 zcmZ8geN0>p3D4B^LX-8s+E*dfOBe={d z-IjICSa-%A2phC!W;2Gunt(By2{S_yKlo$mro%9k8Oy-v*!-Z|e4bYy&EiYm`Q6{S zzkBYv=iJ+~U)Qr=H@pH2COyl1CVe6wUgIpgFaPFkJ$X%@7lS8jX3ei3dhyviiGGci z9(+t#6bQU?+##0d`FlS z!;`619AlA5VWE&Vn-o%Zf-Yg2CPr`|-?90mx zOew<5R7P8tp_!R)ku$FcC*EhSu$n0Ryix2D{#Mp}a9frmQ|Is%a~HH8u~_UckV6dZ znP#sV&N`ibmRh4YC?7>_#A?e%XvKERF8BtoTH3tFZYg_Ckl+(BoK!Rx#nZL@(p|2% zvE6Eg%Xq-*SUsOs7L1eP6e%dt^J4hB)X!=B+*$}vB`#Wxh9l0yk4-Pi@*th<7U60_ z{S8^JC9Ea)Pa* zqdI7P#eUY5x9R}5$*31X8g4e1UqSwR>9#WXe+J93`T4FTKjnF97@qNaGsz-euX>WXrWL2L6A@k3fo>KGv#YB`!kr6v2=EoSF1dt@+~S)s=P$yX_fb> zyxZc>j9e-oRrzxKiT}8p6{&(5RZy;Sz15!?{evT1!I_8lJg&Tpy?wa=6L`3P1I*xf zehYMOx$FqC505%T^8m=Bt8hW1ggZKlKL2cYiIR)eOlwV)m zNx6O&FQQ{zjIX6*{SmKFj_Mh1cxlH`j$hs&htIZz&o+b4wt>$!0QhX}`E1pBwcf0V z&lZ~3TcvRac(GZh9b0g~Z7qySb0rX@?WKo35P%u!vxHe*BK_or0!T_r3QI~&rNkoAlcn%3q@}r1a*j$>KBzG%k4E`!(4EMq zI6kSvN4uq^(>@Xfr0WXIjMbGvqZzJB9Su-<*Nq-K(*RqvkRvVmp$2-SswQZJZPLpM LJSvSe!7u*;P+YWz delta 1463 zcmZ8gZA@Eb6n@X8*UMTUqqJi~)-Ry2g@K^b)v?ez%kI<>H13Dd4CjvpO^ngulFlFo z+(Ly##xc1Jia=v-4;K9DSYnwW$S*~cF^oS}R(^~jLv-$XZnBi4-%f#8vnPP|U zPczaj>HQbQh7EgeVZA2RimDQ@00_!bEl)xhj)bO8wuM9yYYst z557ge-3lXk-hQBHhHB826nL07YwH>AK;|R9wlr=kLr5okKK)IkZa{EY;U%=wdJ4U? zet^du#oWpYe(bPtcUSOBhXoe!I(g=C$x%T2%mS;y&7T8ywCEzRFJxE2hMtR=<;t?% zY5JJiL(+`hF{7m-4?nCZOqpT{)Bh+gQ^XxDY0WI>RhDgQSx-nXR+ZyP> zeHj45*cp5RB6u}e4q3PoETz@bZwD)S`YWMXK0zz=;_zp0f*-R7TB(np4)|a@{yOjx zOk%^J17@*xupOGvFjNBud~V1EGuSpHLI`JucENGHH)NwVH)N+5?xuAPUkO>ji>E?+ zph~_Fs?$TiyngX1uqOMKrkH^*t>@ET;k;Ns>f_RIEVda;O26c}@`EasQoPH3R0^G-MjRnl)x$c0I1LuHeax0qOy^l~wL0t?boF&TTMiV|>T ztDlbgTcwv_Bprj~FQL;Gq>&N|@=7ZzL?+z3pe6^VC4V)PKlH9A#;c)L2YPA411^xH S3NO^aVd)(eo|i6r;nu&qDCuwj diff --git a/tmp/sec.cpp b/tmp/sec.cpp index 023fb04..a8a6011 100644 --- a/tmp/sec.cpp +++ b/tmp/sec.cpp @@ -20,7 +20,7 @@ namespace test { } void helper_fn() { - test::MyType tmp = test::MyType{1}; + test::MyType tmp = test::MyType{1, 22, 4000}; std::string test = "Hello World"; uint32_t x = 25; unsigned int y = 30;