[PATCH] gdb: Make the builtin "boolean" type an unsigned type

Shahab Vahedi shahab.vahedi@gmail.com
Mon Jul 19 16:31:36 GMT 2021


From: Shahab Vahedi <shahab@synopsys.com>

When printing the fields of a register that is of a custom struct type,
the "unpack_bits_as_long ()" function is used:

  do_val_print (...)
    cp_print_value_fields (...)
      value_field_bitfield (...)
        unpack_value_bitfield (...)
          unpack_bits_as_long (...)

This function may sign-extend the extracted field while returning it:
------------------ 8< ------------------
  val >>= lsbcount;

  if (...)
    {
      valmask = (((ULONGEST) 1) << bitsize) - 1;
      val &= valmask;
      if (!field_type->is_unsigned ())
	  if (val & (valmask ^ (valmask >> 1)))
	      val |= ~valmask;
    }

  return val;
------------------ >8 ------------------

lsbcount:   Number of lower bits to get rid of.
bitsize:    The bit length of the field to be extracted.
val:        The register value.
field_type: The type of field that is being handled.

While the logic here is correct, there is a problem when it is
handling "field_type"s of "boolean".  Those types are NOT marked
as "unsigned" and therefore they end up being sign extended.
Although this is not a problem for "false" (0), it definitely
causes trouble for "true".

This patch constructs the builtin boolean type as such that it is
marked as an "unsigned" entity.

gdb/ChangeLog:

	PR gdb/28104
	* gdbtypes.c (gdbtypes_post_init): Use
	"arch_boolean_type (..., unsigned=1, ...) to construct
	"boolean".
---
 gdb/gdbtypes.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 1a261719422..9a8ac896fca 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -6087,7 +6087,7 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
   builtin_type->builtin_string
     = arch_type (gdbarch, TYPE_CODE_STRING, TARGET_CHAR_BIT, "string");
   builtin_type->builtin_bool
-    = arch_type (gdbarch, TYPE_CODE_BOOL, TARGET_CHAR_BIT, "bool");
+    = arch_boolean_type (gdbarch, TARGET_CHAR_BIT, 1, "bool");
 
   /* The following three are about decimal floating point types, which
      are 32-bits, 64-bits and 128-bits respectively.  */
-- 
2.32.0



More information about the Gdb-patches mailing list