diff options
author | Jan Beulich <jbeulich@suse.com> | 2021-04-26 10:35:51 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2021-04-26 10:35:51 +0200 |
commit | b818855549013ba43e730e07f790e5cbfd16a757 (patch) | |
tree | ae5d65b7fb1359fbceeca9d6f44dab75065d27ab | |
parent | c290cb01face96fa9c2a4f96f7d57083da3c99f1 (diff) | |
download | gdb-b818855549013ba43e730e07f790e5cbfd16a757.zip gdb-b818855549013ba43e730e07f790e5cbfd16a757.tar.gz gdb-b818855549013ba43e730e07f790e5cbfd16a757.tar.bz2 |
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.
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 13 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/i386.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-addr32-bad.l | 29 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-addr32-bad.s | 15 |
5 files changed, 65 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 696d728..585c98b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -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. diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index dc1ee88..1f9844d 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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)) { diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index e1dab45..a9a2a64 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -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 { diff --git a/gas/testsuite/gas/i386/x86-64-addr32-bad.l b/gas/testsuite/gas/i386/x86-64-addr32-bad.l new file mode 100644 index 0000000..bddf0d1 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-addr32-bad.l @@ -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 diff --git a/gas/testsuite/gas/i386/x86-64-addr32-bad.s b/gas/testsuite/gas/i386/x86-64-addr32-bad.s new file mode 100644 index 0000000..460be20 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-addr32-bad.s @@ -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 |