gdb/poke: Support non 8-bits targets

Some targets might have non 8-bits bytes.

TYPE_CHECK (type) gives a number of host bytes. So to get the type
length in bits we should use TYPE_CHECK (type) * HOST_CHAR_BITS.  As far
as I know, GDB does not support any non-8bits bytes hosts, but it does
not hurt to make this change.  It also underline that a GDB type’s
length is given in host bytes, not target byte.

When dealing with target bytes, we should use
gdbarch_addressable_memory_unit_size to get the size of a memory unit
(in multiple of 8 bits).

I have no idea how libpoke would behave if the target has a non 8bits
byte.  Whatever libpoke does, this patch have GDB do the right thing.
This commit is contained in:
Lancelot SIX
2022-09-19 12:38:13 +01:00
committed by Lancelot SIX
parent 9d13358a13
commit 21c2659b8e

View File

@@ -313,9 +313,12 @@ poke_alien_token_handler (const char *id, char **errmsg)
alien_token.kind = PK_ALIEN_TOKEN_OFFSET; alien_token.kind = PK_ALIEN_TOKEN_OFFSET;
alien_token.value.offset.magnitude = addr; alien_token.value.offset.magnitude = addr;
alien_token.value.offset.width = 64; alien_token.value.offset.width
= HOST_CHAR_BIT * sizeof (decltype (addr));
alien_token.value.offset.signed_p = 0; alien_token.value.offset.signed_p = 0;
alien_token.value.offset.unit = 8; alien_token.value.offset.unit
= (gdbarch_addressable_memory_unit_size (target_gdbarch ())
* 8);
} }
else else
{ {
@@ -338,9 +341,10 @@ poke_alien_token_handler (const char *id, char **errmsg)
alien_token.value.offset.magnitude alien_token.value.offset.magnitude
= value_as_address (value); = value_as_address (value);
alien_token.value.offset.width alien_token.value.offset.width
= TYPE_LENGTH (type) * 8; = TYPE_LENGTH (type) * HOST_CHAR_BIT;
alien_token.value.offset.signed_p = 0; alien_token.value.offset.signed_p = 0;
alien_token.value.offset.unit = 8; alien_token.value.offset.unit
= gdbarch_addressable_memory_unit_size (target_gdbarch ()) * 8;
} }
else if (is_integral_type (type)) else if (is_integral_type (type))
{ {
@@ -348,7 +352,7 @@ poke_alien_token_handler (const char *id, char **errmsg)
alien_token.value.integer.magnitude alien_token.value.integer.magnitude
= value_as_long (value); = value_as_long (value);
alien_token.value.integer.width alien_token.value.integer.width
= TYPE_LENGTH (type) * 8; = TYPE_LENGTH (type) * HOST_CHAR_BIT;
alien_token.value.integer.signed_p alien_token.value.integer.signed_p
= !type->is_unsigned (); = !type->is_unsigned ();
} }
@@ -444,7 +448,7 @@ poke_add_type (struct type *type)
case TYPE_CODE_PTR: case TYPE_CODE_PTR:
{ {
str = ("offset<uint<" str = ("offset<uint<"
+ (std::to_string (TYPE_LENGTH (type) * 8)) + (std::to_string (TYPE_LENGTH (type) * HOST_CHAR_BIT))
+ ">,B>"); + ">,B>");
break; break;
} }
@@ -464,7 +468,7 @@ poke_add_type (struct type *type)
} }
case TYPE_CODE_INT: case TYPE_CODE_INT:
{ {
size_t type_length = TYPE_LENGTH (type) * 8; size_t type_length = TYPE_LENGTH (type) * HOST_CHAR_BIT;
if (type_length > 64) if (type_length > 64)
goto skip; goto skip;
@@ -530,12 +534,19 @@ poke_add_type (struct type *type)
if (field_name != "") if (field_name != "")
str += field_name; str += field_name;
if (field_bitpos != natural_bitpos) if (field_bitpos != natural_bitpos)
str += " @ " + (field_bitpos % 8 == 0 {
? std::to_string (field_bitpos / 8) + "#B" const size_t target_byte_size
: std::to_string (field_bitpos) + "#b"); = (gdbarch_addressable_memory_unit_size (target_gdbarch ())
* 8);
str += " @ " + (field_bitpos % target_byte_size == 0
? std::to_string (field_bitpos
/ target_byte_size) + "#B"
: std::to_string (field_bitpos) + "#b");
}
str += ";"; str += ";";
natural_bitpos = field_bitpos + TYPE_LENGTH (field_type) * 8; natural_bitpos
= field_bitpos + TYPE_LENGTH (field_type) * HOST_CHAR_BIT;
} }
str += "}"; str += "}";