mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
x86-64: have value properly checked when resolving fixup
Constants not known at the time an individual insn gets assembled and going into a sign-extended field still shouldn't be silently truncated at the time the respective fixup gets resolved.
This commit is contained in:
@ -1,3 +1,11 @@
|
||||
2021-04-26 Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
* config/tc-i386.c (md_apply_fix): Mark BFD_RELOC_X86_64_32S as
|
||||
signed.
|
||||
* testsuite/gas/i386/x86-64-addr32-bad.s,
|
||||
testsuite/gas/i386/x86-64-addr32-bad.l: New.
|
||||
* testsuite/gas/i386/i386.exp: Run new test.
|
||||
|
||||
2021-04-23 Eric Botcazou<ebotcazou@adacore.com>
|
||||
|
||||
* testsuite/gas/elf/section25.d: Run it everywhere.
|
||||
|
@ -12576,7 +12576,18 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
|
||||
|
||||
/* Are we finished with this relocation now? */
|
||||
if (fixP->fx_addsy == NULL)
|
||||
fixP->fx_done = 1;
|
||||
{
|
||||
fixP->fx_done = 1;
|
||||
switch (fixP->fx_r_type)
|
||||
{
|
||||
case BFD_RELOC_X86_64_32S:
|
||||
fixP->fx_signed = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if defined (OBJ_COFF) && defined (TE_PE)
|
||||
else if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
|
||||
{
|
||||
|
@ -750,6 +750,7 @@ if [gas_64_check] then {
|
||||
run_dump_test "x86_64-intel"
|
||||
run_dump_test "x86-64-addr32"
|
||||
run_dump_test "x86-64-addr32-intel"
|
||||
run_list_test "x86-64-addr32-bad" "-al"
|
||||
run_dump_test "x86-64-opcode"
|
||||
run_dump_test "x86-64-intel64"
|
||||
if { ! [istarget "*-*-*cygwin*"] && ![istarget "*-*-mingw*"] } then {
|
||||
|
29
gas/testsuite/gas/i386/x86-64-addr32-bad.l
Normal file
29
gas/testsuite/gas/i386/x86-64-addr32-bad.l
Normal file
@ -0,0 +1,29 @@
|
||||
.*: Assembler messages:
|
||||
.*:3: Error:.* [0x]*88888888 .*
|
||||
.*:7: Error:.* [0x]*99999999 .*
|
||||
.*:11: Error:.* [0x]*99999999 .*
|
||||
GAS LISTING .*
|
||||
|
||||
|
||||
[ ]*[0-9]+[ ]+\.text
|
||||
[ ]*[0-9]+[ ]+addr32:
|
||||
[ ]*[0-9]+[ ]+lea 0x88888888\(%rax\), %rax
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? 8D808888[ ]+lea 0x88888888\(%rax\), %eax
|
||||
[ ]*[0-9]+[ ]+8888
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? 67488D80[ ]+lea 0x88888888\(%eax\), %rax
|
||||
[ ]*[0-9]+[ ]+88888888 *
|
||||
[ ]*[0-9]+[ ]*
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? 488D8099[ ]+lea value\(%rax\), %rax
|
||||
[ ]*[0-9]+[ ]+999999
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? 8D809999[ ]+lea value\(%rax\), %eax
|
||||
[ ]*[0-9]+[ ]+9999
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? 67488D80[ ]+lea value\(%eax\), %rax
|
||||
[ ]*[0-9]+[ ]+99999999 *
|
||||
[ ]*[0-9]+[ ]*
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? 48C7C099[ ]+mov \$value, %rax
|
||||
[ ]*[0-9]+[ ]+999999
|
||||
[ ]*[0-9]+[ ]+\?\?\?\? B8999999[ ]+mov \$value, %eax
|
||||
[ ]*[0-9]+[ ]+99
|
||||
[ ]*[0-9]+[ ]*
|
||||
[ ]*[0-9]+[ ]+\.equ value, 0x99999999
|
||||
#pass
|
15
gas/testsuite/gas/i386/x86-64-addr32-bad.s
Normal file
15
gas/testsuite/gas/i386/x86-64-addr32-bad.s
Normal file
@ -0,0 +1,15 @@
|
||||
.text
|
||||
addr32:
|
||||
lea 0x88888888(%rax), %rax
|
||||
lea 0x88888888(%rax), %eax
|
||||
lea 0x88888888(%eax), %rax
|
||||
|
||||
lea value(%rax), %rax
|
||||
lea value(%rax), %eax
|
||||
lea value(%eax), %rax
|
||||
|
||||
mov $value, %rax
|
||||
mov $value, %eax
|
||||
|
||||
.equ value, 0x99999999
|
||||
.end
|
Reference in New Issue
Block a user