bitfields
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user