x86: don't suppress overflow diagnostics in x32 mode
authorJan Beulich <jbeulich@suse.com>
Mon, 21 Mar 2022 14:13:35 +0000 (15:13 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 21 Mar 2022 14:13:35 +0000 (15:13 +0100)
Unlike in 64-bit mode, where values wrap at the 64-bit boundary anyway,
there's no wrapping at the 32-bit boundary here, and hence overflow
detection shouldn't be suppressed just because rela relocations are
going to be used.

The extra check against NO_RELOC is actually a result of an ilp32 test
otherwise failing. But thinking about it, reporting overflows for
not-really-relocations (typically because of earlier errors) makes
little sense in general. Perhaps this should even be extended to non-
64-bit modes.

gas/config/tc-i386.c
gas/testsuite/gas/i386/ilp32/reloc64.l
gas/testsuite/gas/i386/ilp32/reloc64.s

index 83975c3f99fcfc7980d71f7ff10795b223ae1cec..afb8b706bda3fcd14f80abf077225bf8a44a28be 100644 (file)
@@ -12769,7 +12769,8 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
 #endif
   else if (use_rela_relocations)
     {
-      fixP->fx_no_overflow = 1;
+      if (!disallow_64bit_reloc || fixP->fx_r_type == NO_RELOC)
+       fixP->fx_no_overflow = 1;
       /* Remember value for tc_gen_reloc.  */
       fixP->fx_addnumber = value;
       value = 0;
index 7a1808e4e96c1901dcc5d673434e595a6f20e21d..9643e677782fd04745009e8dec63c8fba9c85beb 100644 (file)
 .*:176: Error: .*
 .*:177: Error: .*
 .*:189: Error: .*
+.*:192: Error: .* too large for field of 4 bytes at .*
+.*:193: Error: .* too large for field of 4 bytes at .*
+.*:194: Error: .* too large for field of 4 bytes at .*
+.*:195: Error: .* too large for field of 4 bytes at .*
+.*:196: Error: .* too large for field of 2 bytes at .*
+.*:196: Error: .* too large for field of 1 byte at .*
+.*:197: Error: .* too large for field of 2 bytes at .*
+.*:197: Error: .* too large for field of 1 byte at .*
+.*:200: Error: .* too large for field of 4 bytes at .*
+.*:201: Error: .* too large for field of 2 bytes at .*
+.*:202: Error: .* too large for field of 2 bytes at .*
+.*:203: Error: .* too large for field of 1 byte at .*
+.*:204: Error: .* too large for field of 1 byte at .*
index 3ab25eff6c001ab88d0284393063f4b2205bc214..9f5990a300a57b5d1a65eadc5c3ef34c1336dce9 100644 (file)
@@ -187,3 +187,18 @@ bad        .byte   xtrn@tpoff
        .long   xtrn@got - 4
        .long   xtrn@got + 4
 bad    .long   xtrn@plt - .
+
+       .text
+bad    add     $x+0x123456789, %rax
+bad    add     $x+0x123456789, %eax
+bad    add     x+0x123456789, %eax
+bad    add     x+0x123456789(%eax), %eax
+bad    enter   $x+0x123456789, $x+0x123456789
+bad    enter   $x+0x12345, $x+0x123
+
+       .data
+bad    .long x+0x123456789
+bad    .word x+0x123456789
+bad    .word x+0x12345
+bad    .byte x+0x123456789
+bad    .byte x+0x123