Allow cast of 128-bit integer to pointer
PR rust/31082 points out that casting a 128-bit integer to a pointer will fail. This happens because a case in value_cast was not converted to use GMP. This patch fixes the problem. I am not really sure that testing against the negative value here makes sense, but I opted to just preserve the existing behavior rather than change it. Regression tested on x86-64 Fedora 38. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31082
This commit is contained in:
parent
703adbb1f9
commit
44671f3f7f
3 changed files with 25 additions and 9 deletions
|
@ -251,19 +251,32 @@ struct gdb_mpz
|
|||
return result;
|
||||
}
|
||||
|
||||
gdb_mpz operator- () const
|
||||
{
|
||||
gdb_mpz result;
|
||||
mpz_neg (result.m_val, m_val);
|
||||
return result;
|
||||
}
|
||||
|
||||
gdb_mpz &operator<<= (unsigned long nbits)
|
||||
{
|
||||
mpz_mul_2exp (m_val, m_val, nbits);
|
||||
return *this;
|
||||
}
|
||||
|
||||
gdb_mpz operator<< (unsigned long nbits) const
|
||||
gdb_mpz operator<< (unsigned long nbits) const &
|
||||
{
|
||||
gdb_mpz result;
|
||||
mpz_mul_2exp (result.m_val, m_val, nbits);
|
||||
return result;
|
||||
}
|
||||
|
||||
gdb_mpz operator<< (unsigned long nbits) &&
|
||||
{
|
||||
mpz_mul_2exp (m_val, m_val, nbits);
|
||||
return *this;
|
||||
}
|
||||
|
||||
gdb_mpz operator>> (unsigned long nbits) const
|
||||
{
|
||||
gdb_mpz result;
|
||||
|
|
|
@ -169,3 +169,8 @@ gdb_test "with debug expression 1 -- print \"foo\"" \
|
|||
" Constant: 0" \
|
||||
"evaluation of this expression requires the target program to be active"] \
|
||||
"print a string with expression debug turned on"
|
||||
|
||||
# PR rust/31082 - truncating to a pointer would fail. Depending on
|
||||
# the default host architecture, this may or may not print a warning.
|
||||
gdb_test "print (0xffffffd00000009a as *mut u64)" \
|
||||
"(warning: value truncated\[\r\n\]+)?.* = \\(\\*mut u64\\) $hex"
|
||||
|
|
14
gdb/valops.c
14
gdb/valops.c
|
@ -603,15 +603,13 @@ value_cast (struct type *type, struct value *arg2)
|
|||
pointers and four byte addresses. */
|
||||
|
||||
int addr_bit = gdbarch_addr_bit (type2->arch ());
|
||||
LONGEST longest = value_as_long (arg2);
|
||||
gdb_mpz longest = value_as_mpz (arg2);
|
||||
|
||||
if (addr_bit < sizeof (LONGEST) * HOST_CHAR_BIT)
|
||||
{
|
||||
if (longest >= ((LONGEST) 1 << addr_bit)
|
||||
|| longest <= -((LONGEST) 1 << addr_bit))
|
||||
warning (_("value truncated"));
|
||||
}
|
||||
return value_from_longest (to_type, longest);
|
||||
gdb_mpz addr_val = gdb_mpz (1) << addr_bit;
|
||||
if (longest >= addr_val || longest <= -addr_val)
|
||||
warning (_("value truncated"));
|
||||
|
||||
return value_from_mpz (to_type, longest);
|
||||
}
|
||||
else if (code1 == TYPE_CODE_METHODPTR && code2 == TYPE_CODE_INT
|
||||
&& value_as_long (arg2) == 0)
|
||||
|
|
Loading…
Add table
Reference in a new issue