bitfields

This commit is contained in:
T0b1
2023-06-19 18:44:42 +02:00
parent 679e38e711
commit 6fb5d69e47
4 changed files with 62 additions and 4 deletions

View File

@@ -174,6 +174,14 @@ namespace dbgui::data
// TODO: move this to target as its target dependent?
size_t byte_size(const std::vector<TypeInfo> &) 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

View File

@@ -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("<bitfield not supported>");
auto member_type = member.type_id;
while (member_type.type == Type::alias)
{
member_type = std::get<TypeID>(
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<uint64_t *>(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("<invalid: %lu>", value);
}
} else
{
ImGui::Text("%ld", value);
}
continue;
}

BIN
tmp/main

Binary file not shown.

View File

@@ -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;