bitfields
This commit is contained in:
@@ -174,6 +174,14 @@ namespace dbgui::data
|
|||||||
// TODO: move this to target as its target dependent?
|
// TODO: move this to target as its target dependent?
|
||||||
size_t byte_size(const std::vector<TypeInfo> &) const;
|
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
|
bool is_basic() const
|
||||||
{
|
{
|
||||||
return type != Type::none && type != Type::custom && type != Type::array
|
return type != Type::none && type != Type::custom && type != Type::array
|
||||||
|
|||||||
@@ -1015,7 +1015,7 @@ bool WatchWindow::draw(Frontend &frontend)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ImGuiTableFlags_SizingFixedFit
|
// ImGuiTableFlags_SizingFixedFit
|
||||||
if (ImGui::BeginTable("##Variables", 2))
|
if (ImGui::BeginTable("##Variables", 2, ImGuiTableFlags_RowBg))
|
||||||
{
|
{
|
||||||
ImGui::TableSetupColumn("Name");
|
ImGui::TableSetupColumn("Name");
|
||||||
ImGui::TableSetupColumn("Value");
|
ImGui::TableSetupColumn("Value");
|
||||||
@@ -1105,14 +1105,64 @@ void WatchWindow::draw_value(Frontend &frontend,
|
|||||||
for (size_t i = 0; i < members.size(); ++i)
|
for (size_t i = 0; i < members.size(); ++i)
|
||||||
{
|
{
|
||||||
const auto &member = members[i];
|
const auto &member = members[i];
|
||||||
// Skip bitfield
|
|
||||||
if (member.bitfield_size)
|
if (member.bitfield_size)
|
||||||
{
|
{
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::TableSetColumnIndex(0);
|
ImGui::TableSetColumnIndex(0);
|
||||||
ImGui::Text("%s", member.name.c_str());
|
ImGui::Text("%s", member.name.c_str());
|
||||||
ImGui::TableNextColumn();
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ namespace test {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void helper_fn() {
|
void helper_fn() {
|
||||||
test::MyType tmp = test::MyType{1};
|
test::MyType tmp = test::MyType{1, 22, 4000};
|
||||||
std::string test = "Hello World";
|
std::string test = "Hello World";
|
||||||
uint32_t x = 25;
|
uint32_t x = 25;
|
||||||
unsigned int y = 30;
|
unsigned int y = 30;
|
||||||
|
|||||||
Reference in New Issue
Block a user