Fix an overflow checking bug uncovered when a 32 bit target is compiled
authorAlan Modra <amodra@gmail.com>
Wed, 28 Jul 1999 23:19:26 +0000 (23:19 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 28 Jul 1999 23:19:26 +0000 (23:19 +0000)
with a 64 bit bfd.

gas/ChangeLog
gas/config/tc-i386.c
gas/write.c

index 3b535ad5e07857fda75f3e9dc3640213e31f46fc..7116952e9c84b27b6253ab2a6ed6df58fa4e8167 100644 (file)
@@ -1,3 +1,10 @@
+1999-07-29  Alan Modra  <alan@spri.levels.unisa.edu.au>
+
+       * write.c (fixup_segment): Fix generic error check overflow test.
+
+       * config/tc-i386.c (pe): Change %d to %ld, %x to %lx, and cast
+       X_add_number to long.
+
 Wed Jul 28 02:04:24 1999  "Jerry Quinn" <jquinn@nortelnetworks.com>
 
        * config/tc-hppa.c (pa_ip):  Add 'J' and 'K' code
index 30c9abf5c21a66bd6158d5ef06d17cb2e0f32b7e..524819e830860aa5f5aadae766e0aa56d1b8cf40 100644 (file)
@@ -777,8 +777,8 @@ pe (e)
      expressionS *e;
 {
   fprintf (stdout, "    operation       %d\n", e->X_op);
-  fprintf (stdout, "    add_number    %d (%x)\n",
-          e->X_add_number, e->X_add_number);
+  fprintf (stdout, "    add_number    %ld (%lx)\n",
+          (long) e->X_add_number, (long) e->X_add_number);
   if (e->X_add_symbol)
     {
       fprintf (stdout, "    add_symbol    ");
index 0c28ac7fd916bb22b253e3f4bea7fa379f528615..536e76d007c7c3e6c50ebf819a8b876cf3439bdf 100644 (file)
@@ -2733,24 +2733,12 @@ fixup_segment (fixP, this_segment_type)
        {
          if ((size_t) size < sizeof (valueT))
            {
-             valueT mask, hibit;
+             valueT mask;
 
-             /* set all bits to one */
              mask = 0;
-             mask--;
-             /* Technically, combining these produces an undefined result
-                if size is sizeof (valueT), though I think these two
-                half-way operations should both be defined.  And the
-                compiler should be able to combine them if it's valid on
-                the host architecture.  */
-             mask <<= size * 4;
-             mask <<= size * 4;
-             hibit = (valueT) 1 << (size * 8 - 1);
-             if (((add_number & mask) != 0
-                  || (fixP->fx_signed
-                      && (add_number & hibit) != 0))
-                 && ((add_number & mask) != mask
-                     || (add_number & hibit) == 0))
+             mask--;           /* set all bits to one */
+             mask <<= size * 8 - (fixP->fx_signed ? 1 : 0);
+             if ((add_number & mask) != 0 && (add_number & mask) != mask)
                {
                  char buf[50], buf2[50];
                  sprint_value (buf, fragP->fr_address + where);