[PATCH] binutils: Use loops in `byte_get_*_endian` functions instead of switch cases.

Julien Thillard julien.thillard38@gmail.com
Mon Jul 6 16:59:11 GMT 2026


Switch cases are used to read a value with a given size, but
these functions could be rewritten using a small loop instead,
avoiding code repetition.
This is already done in `byte_put_*_endian` functions.

binutils:

        * elfcomm.c: Use loop instead of switch case.
---
 binutils/elfcomm.c | 124 ++++++---------------------------------------
 1 file changed, 16 insertions(+), 108 deletions(-)

diff --git a/binutils/elfcomm.c b/binutils/elfcomm.c
index 4a4f5368220..c8cbf36a5d4 100644
--- a/binutils/elfcomm.c
+++ b/binutils/elfcomm.c
@@ -114,127 +114,35 @@ uint64_t (*byte_get) (const unsigned char *, unsigned int);
 uint64_t
 byte_get_little_endian (const unsigned char *field, unsigned int size)
 {
-  switch (size)
-    {
-    case 1:
-      return *field;
-
-    case 2:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8));
-
-    case 3:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[2] << 16));
-
-    case 4:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[2] << 16)
-	      | ((uint64_t) field[3] << 24));
-
-    case 5:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[2] << 16)
-	      | ((uint64_t) field[3] << 24)
-	      | ((uint64_t) field[4] << 32));
+  unsigned int i;
+  uint64_t read = 0;
 
-    case 6:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[2] << 16)
-	      | ((uint64_t) field[3] << 24)
-	      | ((uint64_t) field[4] << 32)
-	      | ((uint64_t) field[5] << 40));
-
-    case 7:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[2] << 16)
-	      | ((uint64_t) field[3] << 24)
-	      | ((uint64_t) field[4] << 32)
-	      | ((uint64_t) field[5] << 40)
-	      | ((uint64_t) field[6] << 48));
-
-    case 8:
-      return ((uint64_t) field[0]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[2] << 16)
-	      | ((uint64_t) field[3] << 24)
-	      | ((uint64_t) field[4] << 32)
-	      | ((uint64_t) field[5] << 40)
-	      | ((uint64_t) field[6] << 48)
-	      | ((uint64_t) field[7] << 56));
-
-    default:
+  if (size > sizeof (uint64_t))
+    {
       error (_("Unhandled data length: %d\n"), size);
       abort ();
     }
+  for(i = 0; i < size; i++)
+    read |= (uint64_t) field[i] << (i * 8);
+
+  return read;
 }
 
 uint64_t
 byte_get_big_endian (const unsigned char *field, unsigned int size)
 {
-  switch (size)
-    {
-    case 1:
-      return *field;
-
-    case 2:
-      return ((uint64_t) field[1]
-	      | ((uint64_t) field[0] << 8));
-
-    case 3:
-      return ((uint64_t) field[2]
-	      | ((uint64_t) field[1] << 8)
-	      | ((uint64_t) field[0] << 16));
-
-    case 4:
-      return ((uint64_t) field[3]
-	      | ((uint64_t) field[2] << 8)
-	      | ((uint64_t) field[1] << 16)
-	      | ((uint64_t) field[0] << 24));
-
-    case 5:
-      return ((uint64_t) field[4]
-	      | ((uint64_t) field[3] << 8)
-	      | ((uint64_t) field[2] << 16)
-	      | ((uint64_t) field[1] << 24)
-	      | ((uint64_t) field[0] << 32));
+  unsigned int i;
+  uint64_t read = 0;
 
-    case 6:
-      return ((uint64_t) field[5]
-	      | ((uint64_t) field[4] << 8)
-	      | ((uint64_t) field[3] << 16)
-	      | ((uint64_t) field[2] << 24)
-	      | ((uint64_t) field[1] << 32)
-	      | ((uint64_t) field[0] << 40));
-
-    case 7:
-      return ((uint64_t) field[6]
-	      | ((uint64_t) field[5] << 8)
-	      | ((uint64_t) field[4] << 16)
-	      | ((uint64_t) field[3] << 24)
-	      | ((uint64_t) field[2] << 32)
-	      | ((uint64_t) field[1] << 40)
-	      | ((uint64_t) field[0] << 48));
-
-    case 8:
-      return ((uint64_t) field[7]
-	      | ((uint64_t) field[6] << 8)
-	      | ((uint64_t) field[5] << 16)
-	      | ((uint64_t) field[4] << 24)
-	      | ((uint64_t) field[3] << 32)
-	      | ((uint64_t) field[2] << 40)
-	      | ((uint64_t) field[1] << 48)
-	      | ((uint64_t) field[0] << 56));
-
-    default:
+  if (size > sizeof (uint64_t))
+    {
       error (_("Unhandled data length: %d\n"), size);
       abort ();
     }
+  for(i = 0; i < size; i++)
+    read |= (uint64_t) field[size - i - 1] << (i * 8);
+
+  return read;
 }
 
 uint64_t
-- 
2.47.3



More information about the Binutils mailing list