mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-06 15:43:09 +00:00
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:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user