gas: Fix left shift of negative value.
authorDominik Vogt <vogt@linux.vnet.ibm.com>
Mon, 9 Nov 2015 16:12:57 +0000 (17:12 +0100)
committerAndreas Krebbel <krebbel@linux.vnet.ibm.com>
Mon, 9 Nov 2015 16:12:57 +0000 (17:12 +0100)
This patch fixes all occurences of left-shifting negative constants in C cod
which is undefined by the C standard.

gas/ChangeLog:

        * read.c (parse_bitfield_cons): Fix left shift of negative value.
        * config/tc-xstormy16.c (md_section_align): Likewise.
        * config/tc-xgate.c (md_section_align): Likewise.
        * config/tc-visium.c (md_section_align): Likewise.
        * config/tc-v850.c (md_section_align): Likewise.
        * config/tc-tic6x.c (md_section_align): Likewise.
        * config/tc-sh.c (SH64PCREL32_M, SH64PCREL48_M, SH64PCREL32_M)
        (MOVI_32_M, MOVI_48_M, MOVI_32_M, md_section_align): Likewise.
        * config/tc-sh64.c (shmedia_md_estimate_size_before_relax): Likewise.
        * config/tc-score.c (s3_section_align): Likewise.
        * config/tc-score7.c (s7_section_align): Likewise.
        * config/tc-s390.c (md_section_align): Likewise.
        * config/tc-rx.c (md_section_align): Likewise.
        * config/tc-rl78.c (md_section_align): Likewise.
        * config/tc-ppc.c (md_section_align): Likewise.
        * config/tc-or1k.c (md_section_align): Likewise.
        * config/tc-nds32.c (md_section_align): Likewise.
        * config/tc-mt.c (md_section_align): Likewise.
        * config/tc-msp430.c (md_section_align): Likewise.
        * config/tc-mn10300.c (md_section_align): Likewise.
        * config/tc-mn10200.c (md_section_align): Likewise.
        * config/tc-mips.c (md_section_align): Likewise.
        * config/tc-microblaze.c (parse_imm): Likewise.
        * config/tc-mep.c (md_section_align): Likewise.
        * config/tc-m68k.c (md_section_align): Likewise.
        * config/tc-m68hc11.c (md_section_align): Likewise.
        * config/tc-m32r.c (md_section_align): Likewise.
        * config/tc-m32c.c (md_section_align): Likewise.
        * config/tc-lm32.c (md_section_align): Likewise.
        * config/tc-iq2000.c (md_section_align): Likewise.
        * config/tc-ip2k.c (md_section_align): Likewise.
        * config/tc-ia64.c (dot_save, dot_vframe): Likewise.
        * config/tc-i960.c (md_number_to_field, md_section_align): Likewise.
        * config/tc-i386.c (md_section_align): Likewise.
        * config/tc-i370.c (md_section_align): Likewise.
        * config/tc-frv.c (md_section_align): Likewise.
        * config/tc-fr30.c (md_section_align): Likewise.
        * config/tc-epiphany.c (md_section_align): Likewise.
        * config/tc-d30v.c (md_section_align): Likewise.
        * config/tc-d10v.c (md_section_align): Likewise.
        * config/tc-cr16.c (l_cons): Likewise.
        * config/tc-bfin.c (md_section_align): Likewise.
        * config/tc-arm.c (md_section_align): Likewise.
        * config/tc-arc.c (md_section_align): Likewise.
        * config/bfin-parse.y (expr_1): Likewise.

gas/testsuite/ChangeLog:

        * gas/all/test-gen.c (random_order_16s, random_order_24s)
        (random_order_32s): Fix left shift of negative value.

48 files changed:
gas/ChangeLog
gas/config/bfin-parse.y
gas/config/tc-arc.c
gas/config/tc-arm.c
gas/config/tc-bfin.c
gas/config/tc-cr16.c
gas/config/tc-d10v.c
gas/config/tc-d30v.c
gas/config/tc-epiphany.c
gas/config/tc-fr30.c
gas/config/tc-frv.c
gas/config/tc-i370.c
gas/config/tc-i386.c
gas/config/tc-i960.c
gas/config/tc-ia64.c
gas/config/tc-ip2k.c
gas/config/tc-iq2000.c
gas/config/tc-lm32.c
gas/config/tc-m32c.c
gas/config/tc-m32r.c
gas/config/tc-m68hc11.c
gas/config/tc-m68k.c
gas/config/tc-mep.c
gas/config/tc-microblaze.c
gas/config/tc-mips.c
gas/config/tc-mn10200.c
gas/config/tc-mn10300.c
gas/config/tc-msp430.c
gas/config/tc-mt.c
gas/config/tc-nds32.c
gas/config/tc-or1k.c
gas/config/tc-ppc.c
gas/config/tc-rl78.c
gas/config/tc-rx.c
gas/config/tc-s390.c
gas/config/tc-score.c
gas/config/tc-score7.c
gas/config/tc-sh.c
gas/config/tc-sh64.c
gas/config/tc-tic6x.c
gas/config/tc-v850.c
gas/config/tc-visium.c
gas/config/tc-xc16x.c
gas/config/tc-xgate.c
gas/config/tc-xstormy16.c
gas/read.c
gas/testsuite/ChangeLog
gas/testsuite/gas/all/test-gen.c

index 09b81c3777cc25efaf53ebe6dc6d6bfc6b6a27e9..2214ed31ab79d415b17c265d891f91527399dc8f 100644 (file)
@@ -1,3 +1,51 @@
+2015-11-09  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * read.c (parse_bitfield_cons): Fix left shift of negative value.
+       * config/tc-xstormy16.c (md_section_align): Likewise.
+       * config/tc-xgate.c (md_section_align): Likewise.
+       * config/tc-visium.c (md_section_align): Likewise.
+       * config/tc-v850.c (md_section_align): Likewise.
+       * config/tc-tic6x.c (md_section_align): Likewise.
+       * config/tc-sh.c (SH64PCREL32_M, SH64PCREL48_M, SH64PCREL32_M)
+       (MOVI_32_M, MOVI_48_M, MOVI_32_M, md_section_align): Likewise.
+       * config/tc-sh64.c (shmedia_md_estimate_size_before_relax): Likewise.
+       * config/tc-score.c (s3_section_align): Likewise.
+       * config/tc-score7.c (s7_section_align): Likewise.
+       * config/tc-s390.c (md_section_align): Likewise.
+       * config/tc-rx.c (md_section_align): Likewise.
+       * config/tc-rl78.c (md_section_align): Likewise.
+       * config/tc-ppc.c (md_section_align): Likewise.
+       * config/tc-or1k.c (md_section_align): Likewise.
+       * config/tc-nds32.c (md_section_align): Likewise.
+       * config/tc-mt.c (md_section_align): Likewise.
+       * config/tc-msp430.c (md_section_align): Likewise.
+       * config/tc-mn10300.c (md_section_align): Likewise.
+       * config/tc-mn10200.c (md_section_align): Likewise.
+       * config/tc-mips.c (md_section_align): Likewise.
+       * config/tc-microblaze.c (parse_imm): Likewise.
+       * config/tc-mep.c (md_section_align): Likewise.
+       * config/tc-m68k.c (md_section_align): Likewise.
+       * config/tc-m68hc11.c (md_section_align): Likewise.
+       * config/tc-m32r.c (md_section_align): Likewise.
+       * config/tc-m32c.c (md_section_align): Likewise.
+       * config/tc-lm32.c (md_section_align): Likewise.
+       * config/tc-iq2000.c (md_section_align): Likewise.
+       * config/tc-ip2k.c (md_section_align): Likewise.
+       * config/tc-ia64.c (dot_save, dot_vframe): Likewise.
+       * config/tc-i960.c (md_number_to_field, md_section_align): Likewise.
+       * config/tc-i386.c (md_section_align): Likewise.
+       * config/tc-i370.c (md_section_align): Likewise.
+       * config/tc-frv.c (md_section_align): Likewise.
+       * config/tc-fr30.c (md_section_align): Likewise.
+       * config/tc-epiphany.c (md_section_align): Likewise.
+       * config/tc-d30v.c (md_section_align): Likewise.
+       * config/tc-d10v.c (md_section_align): Likewise.
+       * config/tc-cr16.c (l_cons): Likewise.
+       * config/tc-bfin.c (md_section_align): Likewise.
+       * config/tc-arm.c (md_section_align): Likewise.
+       * config/tc-arc.c (md_section_align): Likewise.
+       * config/bfin-parse.y (expr_1): Likewise.
+
 2015-11-02  Nick Clifton  <nickc@redhat.com>
 
        * config/rx-parse.y: Allow zero value for 5-bit displacements.
index c2a1d53ac639c3fb312a26c8e8b6c5caae4d1d2d..75d1b1e37947fd28b7a165e2fe08f8fd8e02a315 100644 (file)
@@ -4505,7 +4505,7 @@ static int
 value_match (Expr_Node *exp, int sz, int sign, int mul, int issigned)
 {
   int umax = (1 << sz) - 1;
-  int min = -1 << (sz - 1);
+  int min = -(1 << (sz - 1));
   int max = (1 << (sz - 1)) - 1;
 
   int v = (EXPR_VALUE (exp)) & 0xffffffff;
index e0a4b57a54fa2ede635e2e1a4fe43e10927006f1..ca43566403e5b299ab9b33cfd5ca655cbbd121ad 100644 (file)
@@ -1067,7 +1067,7 @@ md_section_align (segT segment,
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 /* The location from which a PC relative jump should be calculated,
index 025e0be7305dd8c81373b8d2ebba0ef39711d203..de99d729103a87b8faa1b8a42369100967fe5a49 100644 (file)
@@ -21019,7 +21019,7 @@ md_section_align (segT   segment ATTRIBUTE_UNUSED,
       int align;
 
       align = bfd_get_section_alignment (stdoutput, segment);
-      size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
+      size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
     }
 #endif
 
index 656e51554173c702f79d552d1402d6e82f5e2632..77b6013cf8c509bba6964ac8e0c277caf984683a 100644 (file)
@@ -796,7 +796,7 @@ md_section_align (segment, size)
      valueT size;
 {
   int boundary = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << boundary) - 1) & (-1 << boundary));
+  return ((size + (1 << boundary) - 1) & -(1 << boundary));
 }
 
 
index 0f2456ec2aa79781b641a8a7a5464616938072fb..b524bb7dc142daf1173d424c71b3e84c3e74b560 100644 (file)
@@ -206,7 +206,7 @@ l_cons (int nbytes)
                   return;
                 }
 
-              value |= ((~(-1 << width) & exp.X_add_number)
+              value |= ((~(-(1 << width)) & exp.X_add_number)
                         << ((BITS_PER_CHAR * nbytes) - bits_available));
 
               if ((bits_available -= width) == 0
index 8b4b4e14dd5f2c2a8d653b7474053e58f613ba23..664fdb6c38dadf52f7b57cde01b725afc31e788f 100644 (file)
@@ -269,7 +269,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index e6174a95a716e48633278e38a754f5f03d5a837c..31875d5825df4867713781b27468fb58e7c6e7ea 100644 (file)
@@ -303,7 +303,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index 276691a5459dd75404b9956f8c640b39777fbb22..fe1a12f609fcaac5e72ce194df39427c58d0dcea 100644 (file)
@@ -173,7 +173,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 \f
index c6e80e32279a7b1276c2b3126b292d2b6f072821..a151c3577761761143c3ff7557883085b23e2075 100644 (file)
@@ -156,7 +156,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 0ca1a6e8b43b199b9e387ab6b6985096d57cb4c2..a7a166582e599505a92bfb8ce4bde389e523c954 100644 (file)
@@ -1227,7 +1227,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index ba82b2ca9fec3f2093f0f93ba354bca21694141b..321cae8b502e0e79811aca9f85796395ab8433d1 100644 (file)
@@ -2375,7 +2375,7 @@ md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
 
-  return (addr + (1 << align) - 1) & (-1 << align);
+  return (addr + (1 << align) - 1) & -(1 << align);
 }
 
 /* We don't have any form of relaxing.  */
index d74e870e8bb81fe266d8c68d8f54116bf2ee4a8b..d341193d290c3236da33bf0c71579fd4b9c5e1b7 100644 (file)
@@ -10317,7 +10317,7 @@ md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
       int align;
 
       align = bfd_get_section_alignment (stdoutput, segment);
-      size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
+      size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
     }
 #endif
 
index e27d816d06bdbcfa20b0b95f427d6c1414625235..35ec138af80885b3f40aa89383f4834cc3415e8b 100644 (file)
@@ -1751,7 +1751,7 @@ md_number_to_field (char *instrP,         /* Pointer to instruction to be fixed.  */
     {
       /* Put bit field into instruction and write back in target
          * byte order.  */
-      val &= ~(-1 << (int) numbits);   /* Clear unused sign bits.  */
+      val &= ~(-(1 << (int) numbits)); /* Clear unused sign bits.  */
       instr |= val;
       md_number_to_chars (instrP, instr, 4);
     }
@@ -2466,7 +2466,7 @@ md_section_align (segT seg,
   int align;
 
   align = bfd_get_section_alignment (stdoutput, seg);
-  return (addr + (1 << align) - 1) & (-1 << align);
+  return (addr + (1 << align) - 1) & -(1 << align);
 }
 
 extern int coff_flags;
index ea7dcc649b81b566e52c29963d9a2e5f57ed498f..8a34feaf956f94664a452907d4fca7da97a4aa30 100644 (file)
@@ -3339,7 +3339,7 @@ dot_vframe (int dummy ATTRIBUTE_UNUSED)
   if (! (unwind.prologue_mask & 2))
     add_unwind_entry (output_psp_gr (reg), NOT_A_CHAR);
   else if (reg != unwind.prologue_gr
-                 + (unsigned) popcount (unwind.prologue_mask & (-2 << 1)))
+                 + (unsigned) popcount (unwind.prologue_mask & -(2 << 1)))
     as_warn (_("Operand of .vframe contradicts .prologue"));
 }
 
@@ -3421,7 +3421,7 @@ dot_save (int dummy ATTRIBUTE_UNUSED)
       if (! (unwind.prologue_mask & 4))
        add_unwind_entry (output_pfs_gr (reg2), NOT_A_CHAR);
       else if (reg2 != unwind.prologue_gr
-                      + (unsigned) popcount (unwind.prologue_mask & (-4 << 1)))
+                      + (unsigned) popcount (unwind.prologue_mask & -(4 << 1)))
        as_warn (_("Second operand of .save contradicts .prologue"));
       break;
     case REG_AR + AR_LC:
@@ -3440,7 +3440,7 @@ dot_save (int dummy ATTRIBUTE_UNUSED)
       if (! (unwind.prologue_mask & 1))
        add_unwind_entry (output_preds_gr (reg2), NOT_A_CHAR);
       else if (reg2 != unwind.prologue_gr
-                      + (unsigned) popcount (unwind.prologue_mask & (-1 << 1)))
+                      + (unsigned) popcount (unwind.prologue_mask & -(1 << 1)))
        as_warn (_("Second operand of .save contradicts .prologue"));
       break;
     case REG_PRIUNAT:
index 4f4cffe5939da8c22929263d656c1f3a180e7081..d58a85f92f14d9e2c0c42a3a36bd361fc11e10b5 100644 (file)
@@ -231,7 +231,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 
index 2d55da120909b99ff64ff41eda9b5b5fe7b171da..381d627432de2780b8775c139b18f892f2c2fc39 100644 (file)
@@ -432,7 +432,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 3b127fdc36cdcd208deedf15203b1456870c6e1f..032175a5a49992a95ac2edbe9b03efb9d12d313d 100644 (file)
@@ -278,7 +278,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 /* This function assembles the instructions. It emits the frags/bytes to the
index 10eba143e75ba3643a724b8ed27704bc3bf6b895..7644cb2530d9d36ad5c49d36b2b90cafa8fe9d6e 100644 (file)
@@ -410,7 +410,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 4a14bf1dfb43028e02c60d02d6aa26957e5ed8d5..ce68f25fad71f2898aca1f64fa868c37bdd9c371 100644 (file)
@@ -1450,7 +1450,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 43cf6b692981a9c2d6b4f3b1b8bd4afe0c246b4d..fdaf90128658f4689b90baac3ba9c6214dc06bd1 100644 (file)
@@ -584,7 +584,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 static int
index b8f051ee57a26e96820051c6b5ea70b4df7d3d99..d3e22fce91ea0f5a0086ca865e21ec9121c7d650 100644 (file)
@@ -7888,7 +7888,7 @@ md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
   int align;
 
   align = bfd_get_section_alignment (stdoutput, segment);
-  size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
+  size = ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
 #endif
 
   return size;
index 780356f07ff0f8959b64705cb603322e3bc05f14..88d111a38325b438d1a955ac9ec7c3e900fb3462 100644 (file)
@@ -1382,7 +1382,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 
index b43925bea7db103be9af65f6a4b74b21c9b51cb2..ac7c828ccec2c96f9375e90a5c17366eff8dff64 100644 (file)
@@ -739,7 +739,7 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max)
     {
       /* Special case: sign extend negative 32-bit values to 64-bits.  */
       if ((e->X_add_number >> 31) == 1)
-       e->X_add_number |= (-1 << 31);
+       e->X_add_number |= -(1 << 31);
 
       if (e->X_add_number < min || e->X_add_number > max)
        {
index d951dfc2bc43fa3d9cca935a47e785a0d67be057..a2d45a46b5fdd520023c88c6dbf6eee9406a2cde 100644 (file)
@@ -16500,7 +16500,7 @@ md_section_align (asection *seg, valueT addr)
   if (align > 4)
     align = 4;
 
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 /* Utility routine, called from above as well.  If called while the
index cabbcc106537cee667cd420f99cf6d59a0b7bea0..7e3e83570e9da7dad4f2561ec282ebd01006ad58 100644 (file)
@@ -676,7 +676,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index da05cac972ee5be7d8ae681d2d1535e1c5bf9adc..8a265aa943d69598dd38f998c1d646bcaedf2d30 100644 (file)
@@ -905,7 +905,7 @@ md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
 
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index 8e32189ef8e0a1574a38915becc9213339a3cc65..ef7c5ee2ec261b3e3a6ce8020d2d18588028d0d2 100644 (file)
@@ -3955,7 +3955,7 @@ md_section_align (asection * seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
 
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 /* If you define this macro, it should return the offset between the
index b90ee607dd440f1e1c692dc031caee791b171a4a..1d514659e4f0b24e6ddc867e68c88c3a3ca232c9 100644 (file)
@@ -333,7 +333,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 06e419dd2d197ed15558b38116b9d046807873b3..18462564a9b32ae1946ac87e433e124226b286b4 100644 (file)
@@ -5380,7 +5380,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 /* GAS will call this function when a symbol table lookup fails, before it
index dba2dde581bd9267e8754b3dd9e285cfc3acac4c..18db23095bd7103e8df88cb74fe94a2edd07e3c7 100644 (file)
@@ -166,7 +166,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index b6b4412f2861b7304ba83c1e08861ae1a4208aea..b4c00c4446535f8b2b5f1111f137f4abf15188dd 100644 (file)
@@ -6090,7 +6090,7 @@ md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT addr)
 #else
   int align = bfd_get_section_alignment (stdoutput, seg);
 
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 #endif
 }
 
index a74703ebf5373538f01353b00e96c4bd17bae84f..9fbaa42b5a7bcbe259ac5d649b1f9c55999c85bd 100644 (file)
@@ -1469,5 +1469,5 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
index 8e99fa3ec7c52ab1278e895d968fab5e342a56df..4697e95c4f1989a897a66b37fe84d7c4367151fc 100644 (file)
@@ -1248,7 +1248,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
                                /* NOP - 1 cycle */
index e217e56db3b2ddc46431049281bdc360d9a2c310..d597ee6df984f54132f8cc0365ddc531cbd40c7f 100644 (file)
@@ -2047,7 +2047,7 @@ md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
 
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 /* We don't have any form of relaxing.  */
index 49ed5f21d0cdb66f699ad423066c8c9e4dc94987..15b4ed7e55dc613b851ac3624277058ef244ea94 100644 (file)
@@ -7089,7 +7089,7 @@ static valueT
 s3_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 static void
index e8af0559e215e05828f94caa1de8b372a77440e3..2b1eb5d4caf4e81cbe1a4d610cb56497db85174b 100644 (file)
@@ -6634,7 +6634,7 @@ s7_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 static void
index 1b5beb2302a5a851fbed231758dad0e1b2019f76..125f0736374328802b91bddc5943fee92cef0253 100644 (file)
@@ -281,15 +281,15 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 #if BFD_HOST_64BIT_LONG
 /* The "reach" type is long, so we can only do this for a 64-bit-long
    host.  */
-#define SH64PCREL32_M (((long) -1 << 30) * 2 - 4)
+#define SH64PCREL32_M ((-((long) 1 << 30)) * 2 - 4)
 #define SH64PCREL48_F ((((long) 1 << 47) - 1) - 4)
-#define SH64PCREL48_M (((long) -1 << 47) - 4)
+#define SH64PCREL48_M ((-((long) 1 << 47)) - 4)
 #define SH64PCREL48_LENGTH (3 * 4)
 #else
 /* If the host does not have 64-bit longs, just make this state identical
    in reach to the 32-bit state.  Note that we have a slightly incorrect
    reach, but the correct one above will overflow a 32-bit number.  */
-#define SH64PCREL32_M (((long) -1 << 30) * 2)
+#define SH64PCREL32_M ((-((long) 1 << 30)) * 2)
 #define SH64PCREL48_F SH64PCREL32_F
 #define SH64PCREL48_M SH64PCREL32_M
 #define SH64PCREL48_LENGTH (3 * 4)
@@ -313,14 +313,14 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 #if BFD_HOST_64BIT_LONG
 /* The "reach" type is long, so we can only do this for a 64-bit-long
    host.  */
-#define MOVI_32_M (((long) -1 << 30) * 2 - 4)
+#define MOVI_32_M ((-((long) 1 << 30)) * 2 - 4)
 #define MOVI_48_F ((((long) 1 << 47) - 1) - 4)
-#define MOVI_48_M (((long) -1 << 47) - 4)
+#define MOVI_48_M ((-((long) 1 << 47)) - 4)
 #else
 /* If the host does not have 64-bit longs, just make this state identical
    in reach to the 32-bit state.  Note that we have a slightly incorrect
    reach, but the correct one above will overflow a 32-bit number.  */
-#define MOVI_32_M (((long) -1 << 30) * 2)
+#define MOVI_32_M ((-((long) 1 << 30)) * 2)
 #define MOVI_48_F MOVI_32_F
 #define MOVI_48_M MOVI_32_M
 #endif /* BFD_HOST_64BIT_LONG */
@@ -3692,7 +3692,7 @@ md_section_align (segT seg ATTRIBUTE_UNUSED, valueT size)
   return size;
 #else /* ! OBJ_ELF */
   return ((size + (1 << bfd_get_section_alignment (stdoutput, seg)) - 1)
-         & (-1 << bfd_get_section_alignment (stdoutput, seg)));
+         & -(1 << bfd_get_section_alignment (stdoutput, seg)));
 #endif /* ! OBJ_ELF */
 }
 
index 780052bb77a82a6f0d363b85d17ee3c6d5c2e2ea..2c0bcde94243d53d29fab9d8913bc78a8c9bd249 100644 (file)
@@ -2020,7 +2020,7 @@ shmedia_md_estimate_size_before_relax (fragS *fragP,
          offsetT value = fragP->fr_offset
            + (fragP->fr_symbol == NULL ? 0 : S_GET_VALUE (fragP->fr_symbol));
 
-         if (value >= ((offsetT) -1 << 15) && value < ((offsetT) 1 << 15))
+         if (value >= (-((offsetT) 1 << 15)) && value < ((offsetT) 1 << 15))
            {
              /* Fits in 16-bit signed number.  */
              int what = GET_WHAT (fragP->fr_subtype);
index 64d39beecc9723f79b1d5f7cd6af78492e8dbf41..1a8ddde70c232124dc9e91791107d463e9ac4483 100644 (file)
@@ -4484,7 +4484,7 @@ md_section_align (segT segment ATTRIBUTE_UNUSED,
   /* Round up section sizes to ensure that text sections consist of
      whole fetch packets.  */
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & ((valueT) -1 << align));
+  return ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
 }
 
 /* No special undefined symbol handling needed for now.  */
index f42e767dcf6907e9f2b51b10791ab70a8e647693..109131636f3db471fd0732fe398ca68a2ed5bc7f 100644 (file)
@@ -1879,7 +1879,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index 3cc434ec841f8d350024ccac83bd323c337aee2f..2b656fe100b23df7abe9a9dabb4cf2297705b684 100644 (file)
@@ -224,7 +224,7 @@ md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
 
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index bcfc84517517362face2c77b9cee29c7cd0f96fa..d5fc3d50e123635d662193fb6609dd3e1e27007c 100644 (file)
@@ -235,7 +235,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 3c00b01d0747f197f20772eac54528c5fb63e0cf..afb25787bf6468727807b03dd2402d4144fe7fc2 100644 (file)
@@ -469,7 +469,7 @@ valueT
 md_section_align (asection * seg, valueT addr)
 {
   int align = bfd_get_section_alignment (stdoutput, seg);
-  return ((addr + (1 << align) - 1) & (-1 << align));
+  return ((addr + (1 << align) - 1) & -(1 << align));
 }
 
 void
index 981dc950b72bd751cad84c679a8aab16e42140e7..3f0613cdc0cf58a227239f26aace4932b81d008c 100644 (file)
@@ -279,7 +279,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_get_section_alignment (stdoutput, segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 symbolS *
index 53440de8c539b5055bdd1791f3fcd2ab1c7c938b..5f8bb40005e0df63b622543ad8330d80f09dec9e 100644 (file)
@@ -4602,7 +4602,7 @@ parse_bitfield_cons (exp, nbytes)
              return;
            }                   /* Too complex.  */
 
-         value |= ((~(-1 << width) & exp->X_add_number)
+         value |= ((~(-(1 << width)) & exp->X_add_number)
                    << ((BITS_PER_CHAR * nbytes) - bits_available));
 
          if ((bits_available -= width) == 0
index 5e1e88f4a734270ef65ed286b4d2589fec2d6c06..b125ba6c4a620faa654925acec4857686d3a2ad2 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-09  Dominik Vogt  <vogt@linux.vnet.ibm.com>
+
+       * gas/all/test-gen.c (random_order_16s, random_order_24s)
+       (random_order_32s): Fix left shift of negative value.
+
 2015-11-02  Nick Clifton  <nickc@redhat.com>
 
        * gas/rx/max.d: Update expected disassembly.
index abd7b9e734cfa361dc107ca617d2a4a07439170b..97c4d4bbc07aeb88ad425d5569876cf674bc8543 100644 (file)
@@ -404,12 +404,12 @@ int random_order_16s[] =
        generated often enough.  */
     -32768,
     32767,
-    (-1 << 15) | (64 << 8) | 32,
+    (-(1 << 15)) | (64 << 8) | 32,
     (64 << 8) | 32,
     0x1234,
-    (-1 << 15) | 0x8765,
+    (-(1 << 15)) | 0x8765,
     0x0180,
-    (-1 << 15) | 0x8001
+    (-(1 << 15)) | 0x8001
 };
 
 /* Use `24s' to generate 24-bit signed values.  Good for selecting
@@ -420,14 +420,14 @@ int random_order_24s[] =
        intermediate values selected by chance.  Keep the number of
        intermediate values low, to ensure that the limit values are
        generated often enough.  */
-    -1 << 23,
+    -(1 << 23),
     1 << 23 -1,
-    (-1 << 23) | (((64 << 8) | 32) << 8) | 16,
+    (-(1 << 23)) | (((64 << 8) | 32) << 8) | 16,
     (((64 << 8) | 32) << 8) | 16,
     0x123456,
-    (-1 << 23) | 0x876543,
+    (-(1 << 23)) | 0x876543,
     0x01ff80,
-    (-1 << 23) | 0x80ff01
+    (-(1 << 23)) | 0x80ff01
 };
 
 /* Use `32s' to generate 32-bit signed values.  Good for selecting
@@ -438,14 +438,14 @@ int random_order_32s[] =
        intermediate values selected by chance.  Keep the number of
        intermediate values low, to ensure that the limit values are
        generated often enough.  */
-    -1 << 31,
+    -(1 << 31),
     1 << 31 - 1,
-    (-1 << 31) | (((((64 << 8) | 32) << 8) | 16) << 8) | 8,
+    (-(1 << 31)) | (((((64 << 8) | 32) << 8) | 16) << 8) | 8,
     (((((64 << 8) | 32) << 8) | 16) << 8) | 8,
     0x12345678,
-    (-1 << 31) | 0x87654321,
+    (-(1 << 31)) | 0x87654321,
     0x01ffff80,
-    (-1 << 31) | 0x80ffff01
+    (-(1 << 31)) | 0x80ffff01
   };
 
 /* This function computes the number of digits needed to represent a