Use correct sign in get_mpz

This changes dwarf2/read.c:get_mpz to use the correct sign-extension
function.  Normally a rational constant uses signed values, but a
purely unsigned form also seems fine here.  This adds a new
attribute::form_is_strictly_unsigned, which is more precise than
form_is_unsigned (which accepts a lot of forms that aren't really for
ordinary constants).

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32680
This commit is contained in:
Tom Tromey
2025-03-19 14:04:43 -06:00
parent 6967933c5a
commit 0c03db9081
2 changed files with 11 additions and 2 deletions

View File

@@ -175,6 +175,15 @@ struct attribute
false. */ false. */
bool form_is_strictly_signed () const; bool form_is_strictly_signed () const;
/* Check if the attribute's form is an unsigned constant form. This
only returns true for forms that are strictly unsigned -- that
is, for a context-dependent form like DW_FORM_data1, this returns
false. */
bool form_is_strictly_unsigned () const
{
return form == DW_FORM_udata;
}
/* Check if the attribute's form is a form that requires /* Check if the attribute's form is a form that requires
"reprocessing". */ "reprocessing". */
bool form_requires_reprocessing () const; bool form_requires_reprocessing () const;

View File

@@ -13216,10 +13216,10 @@ get_mpz (struct dwarf2_cu *cu, gdb_mpz *value, struct attribute *attr)
? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE, ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE,
true); true);
} }
else if (attr->form_is_unsigned ()) else if (attr->form_is_strictly_unsigned ())
*value = gdb_mpz (attr->as_unsigned ()); *value = gdb_mpz (attr->as_unsigned ());
else else
*value = gdb_mpz (attr->constant_value (1)); *value = gdb_mpz (attr->signed_constant ().value_or (1));
} }
/* Assuming DIE is a rational DW_TAG_constant, read the DIE's /* Assuming DIE is a rational DW_TAG_constant, read the DIE's