[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