[binutils-gdb] gas standardise md_section_align

Alan Modra amodra@sourceware.org
Wed Jul 9 00:07:29 GMT 2025


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=a093ef7af443b36d57f4aa0cb76eca677208d7bf

commit a093ef7af443b36d57f4aa0cb76eca677208d7bf
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Jul 9 09:13:14 2025 +0930

    gas standardise md_section_align
    
    The point here is that when valueT is 64 bits and int is 32 bits,
    1 << align doesn't work for shifts larger than the size of int.  (Not
    that anyone is likely to use such large alignments in real code.)

Diff:
---
 gas/config/tc-avr.c      | 2 +-
 gas/config/tc-epiphany.c | 2 +-
 gas/config/tc-fr30.c     | 2 +-
 gas/config/tc-frv.c      | 2 +-
 gas/config/tc-h8300.c    | 2 +-
 gas/config/tc-hppa.c     | 2 +-
 gas/config/tc-i386.c     | 2 +-
 gas/config/tc-iq2000.c   | 2 +-
 gas/config/tc-lm32.c     | 2 +-
 gas/config/tc-m32c.c     | 2 +-
 gas/config/tc-m32r.c     | 2 +-
 gas/config/tc-m68hc11.c  | 2 +-
 gas/config/tc-mep.c      | 2 +-
 gas/config/tc-mips.c     | 2 +-
 gas/config/tc-mn10300.c  | 2 +-
 gas/config/tc-msp430.c   | 2 +-
 gas/config/tc-mt.c       | 2 +-
 gas/config/tc-nds32.c    | 2 +-
 gas/config/tc-or1k.c     | 2 +-
 gas/config/tc-ppc.c      | 2 +-
 gas/config/tc-rl78.c     | 2 +-
 gas/config/tc-s12z.c     | 2 +-
 gas/config/tc-visium.c   | 2 +-
 gas/config/tc-wasm32.c   | 2 +-
 gas/config/tc-xgate.c    | 2 +-
 25 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c
index 6b78966d80a..671df820ede 100644
--- a/gas/config/tc-avr.c
+++ b/gas/config/tc-avr.c
@@ -1440,7 +1440,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
-  return ((addr + (1 << align) - 1) & (-1UL << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 /* If you define this macro, it should return the offset between the
diff --git a/gas/config/tc-epiphany.c b/gas/config/tc-epiphany.c
index 55b74277cd1..be23d15c7d2 100644
--- a/gas/config/tc-epiphany.c
+++ b/gas/config/tc-epiphany.c
@@ -154,7 +154,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 

diff --git a/gas/config/tc-fr30.c b/gas/config/tc-fr30.c
index 8246113582c..e120ca595f6 100644
--- a/gas/config/tc-fr30.c
+++ b/gas/config/tc-fr30.c
@@ -156,7 +156,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-frv.c b/gas/config/tc-frv.c
index 86d8277041e..900fb4aa8bb 100644
--- a/gas/config/tc-frv.c
+++ b/gas/config/tc-frv.c
@@ -1226,7 +1226,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-h8300.c b/gas/config/tc-h8300.c
index 12456b2d0c3..d7bb3295465 100644
--- a/gas/config/tc-h8300.c
+++ b/gas/config/tc-h8300.c
@@ -2223,7 +2223,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & (-1U << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 void
diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c
index f1175e0d4e3..a22d094dd19 100644
--- a/gas/config/tc-hppa.c
+++ b/gas/config/tc-hppa.c
@@ -1589,7 +1589,7 @@ valueT
 md_section_align (asection *segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  int align2 = (1 << align) - 1;
+  valueT align2 = ((valueT) 1 << align) - 1;
 
   return (size + align2) & ~align2;
 }
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 9292cfa2f9b..8fb8a7ee372 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -18126,7 +18126,7 @@ md_section_align (segT segment, valueT size)
      work.  */
   int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 #endif
 
diff --git a/gas/config/tc-iq2000.c b/gas/config/tc-iq2000.c
index 45976e7bebb..1a31e8e8a85 100644
--- a/gas/config/tc-iq2000.c
+++ b/gas/config/tc-iq2000.c
@@ -425,7 +425,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-lm32.c b/gas/config/tc-lm32.c
index 241b5bee7a3..2a4bbd35b10 100644
--- a/gas/config/tc-lm32.c
+++ b/gas/config/tc-lm32.c
@@ -276,7 +276,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 /* This function assembles the instructions. It emits the frags/bytes to the
diff --git a/gas/config/tc-m32c.c b/gas/config/tc-m32c.c
index a65daae1e5b..ff91d479363 100644
--- a/gas/config/tc-m32c.c
+++ b/gas/config/tc-m32c.c
@@ -380,7 +380,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-m32r.c b/gas/config/tc-m32r.c
index 410b6a81d65..2368c9a8b29 100644
--- a/gas/config/tc-m32r.c
+++ b/gas/config/tc-m32r.c
@@ -1451,7 +1451,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-m68hc11.c b/gas/config/tc-m68hc11.c
index 6dd8120cc35..a9ac9c7ef5c 100644
--- a/gas/config/tc-m68hc11.c
+++ b/gas/config/tc-m68hc11.c
@@ -583,7 +583,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 static int
diff --git a/gas/config/tc-mep.c b/gas/config/tc-mep.c
index e1327676272..14691861bcf 100644
--- a/gas/config/tc-mep.c
+++ b/gas/config/tc-mep.c
@@ -1381,7 +1381,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index a1b56d73fdc..8b648ae89ce 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -17630,7 +17630,7 @@ md_section_align (asection *seg, valueT addr)
   if (align > 4)
     align = 4;
 
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 /* Utility routine, called from above as well.  If called while the
diff --git a/gas/config/tc-mn10300.c b/gas/config/tc-mn10300.c
index 4e0072d0826..537c2cb4e7c 100644
--- a/gas/config/tc-mn10300.c
+++ b/gas/config/tc-mn10300.c
@@ -902,7 +902,7 @@ md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
 
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 void
diff --git a/gas/config/tc-msp430.c b/gas/config/tc-msp430.c
index 4b37c310c19..0127a2a1416 100644
--- a/gas/config/tc-msp430.c
+++ b/gas/config/tc-msp430.c
@@ -4384,7 +4384,7 @@ md_section_align (asection * seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
 
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 /* If you define this macro, it should return the offset between the
diff --git a/gas/config/tc-mt.c b/gas/config/tc-mt.c
index e5e9d5ca1f3..a795bdc81c7 100644
--- a/gas/config/tc-mt.c
+++ b/gas/config/tc-mt.c
@@ -335,7 +335,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-nds32.c b/gas/config/tc-nds32.c
index 53fb2c1af48..f5c021ddbbc 100644
--- a/gas/config/tc-nds32.c
+++ b/gas/config/tc-nds32.c
@@ -6608,7 +6608,7 @@ md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & ((valueT) -1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 /* GAS will call this function when a symbol table lookup fails, before it
diff --git a/gas/config/tc-or1k.c b/gas/config/tc-or1k.c
index 87a2ac0e3cd..33975fea6dc 100644
--- a/gas/config/tc-or1k.c
+++ b/gas/config/tc-or1k.c
@@ -164,7 +164,7 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 symbolS *
diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
index 08c3b7b8ef6..9b3aaabfa0a 100644
--- a/gas/config/tc-ppc.c
+++ b/gas/config/tc-ppc.c
@@ -6493,7 +6493,7 @@ md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT addr)
 #else
   int align = bfd_section_alignment (seg);
 
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 #endif
 }
 
diff --git a/gas/config/tc-rl78.c b/gas/config/tc-rl78.c
index a20e8b17247..36ccacd0570 100644
--- a/gas/config/tc-rl78.c
+++ b/gas/config/tc-rl78.c
@@ -1508,5 +1508,5 @@ valueT
 md_section_align (segT segment, valueT size)
 {
   int align = bfd_section_alignment (segment);
-  return ((size + (1 << align) - 1) & -(1 << align));
+  return (size + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c
index 0299f97f223..438418a0c1d 100644
--- a/gas/config/tc-s12z.c
+++ b/gas/config/tc-s12z.c
@@ -186,7 +186,7 @@ valueT
 md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 void
diff --git a/gas/config/tc-visium.c b/gas/config/tc-visium.c
index c1a6d75f4fe..1e3e3a847be 100644
--- a/gas/config/tc-visium.c
+++ b/gas/config/tc-visium.c
@@ -201,7 +201,7 @@ md_section_align (asection *seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
 
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 void
diff --git a/gas/config/tc-wasm32.c b/gas/config/tc-wasm32.c
index 066255f8994..23d2b434823 100644
--- a/gas/config/tc-wasm32.c
+++ b/gas/config/tc-wasm32.c
@@ -178,7 +178,7 @@ valueT
 md_section_align (asection * seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 /* Apply a fixup, return TRUE if done (and no relocation is
diff --git a/gas/config/tc-xgate.c b/gas/config/tc-xgate.c
index 8d1f4740523..0823ecd93a4 100644
--- a/gas/config/tc-xgate.c
+++ b/gas/config/tc-xgate.c
@@ -466,7 +466,7 @@ valueT
 md_section_align (asection * seg, valueT addr)
 {
   int align = bfd_section_alignment (seg);
-  return ((addr + (1 << align) - 1) & -(1 << align));
+  return (addr + ((valueT) 1 << align) - 1) & -((valueT) 1 << align);
 }
 
 void


More information about the Binutils-cvs mailing list