SAFE_BYTE_GET64

Functions dealing with lack of a 64-bit integer type can disappear now
that we require C99.  Printing using dwarf_vmatoa is better too.

binutils/
	* dwarf.c (dwarf_vmatoa64, SAFE_BYTE_GET64, add64): Delete.
	(skip_attr_bytes): Replace use of SAFE_BYTE_GET64 with
	SAFE_BYTE_GET_AND_INC.
	(read_and_display_attr_value): Likewise.  Print using dwarf_vmatoa.
	(process_debug_info, process_cu_tu_index): Likewise.
	* elfcomm.c (byte_put, byte_put_little_endian, byte_put_big_endian),
	(byte_get, byte_get_little_endian, byte_get_big_endian),
	(byte_get_signed): Make size param unsigned.  Remove code dealing
	with 4-byte elf_vma.
	(byte_get_64): Delete.
	* elfcomm.h  (byte_put, byte_put_little_endian, byte_put_big_endian),
	(byte_get, byte_get_little_endian, byte_get_big_endian),
	(byte_get_signed): Update prototypes.
	(byte_get_64): Delete.
gas/
	* testsuite/gas/elf/dwarf-5-file0.d: Update.
	* testsuite/gas/i386/dwarf5-line-1.d: Update.
This commit is contained in:
Alan Modra
2021-05-12 17:48:13 +09:30
parent 0d872fca02
commit af2ddf69ab
7 changed files with 92 additions and 276 deletions

View File

@ -63,12 +63,12 @@ warn (const char *message, ...)
va_end (args);
}
void (*byte_put) (unsigned char *, elf_vma, int);
void (*byte_put) (unsigned char *, elf_vma, unsigned int);
void
byte_put_little_endian (unsigned char * field, elf_vma value, int size)
byte_put_little_endian (unsigned char * field, elf_vma value, unsigned int size)
{
if (size <= 0 || size > 8)
if (size > sizeof (elf_vma))
{
error (_("Unhandled data length: %d\n"), size);
abort ();
@ -81,9 +81,9 @@ byte_put_little_endian (unsigned char * field, elf_vma value, int size)
}
void
byte_put_big_endian (unsigned char * field, elf_vma value, int size)
byte_put_big_endian (unsigned char * field, elf_vma value, unsigned int size)
{
if (size <= 0 || size > 8)
if (size > sizeof (elf_vma))
{
error (_("Unhandled data length: %d\n"), size);
abort ();
@ -95,10 +95,10 @@ byte_put_big_endian (unsigned char * field, elf_vma value, int size)
}
}
elf_vma (*byte_get) (const unsigned char *, int);
elf_vma (*byte_get) (const unsigned char *, unsigned int);
elf_vma
byte_get_little_endian (const unsigned char *field, int size)
byte_get_little_endian (const unsigned char *field, unsigned int size)
{
switch (size)
{
@ -121,42 +121,26 @@ byte_get_little_endian (const unsigned char *field, int size)
| (((unsigned long) (field[3])) << 24);
case 5:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[0]))
| (((elf_vma) (field[1])) << 8)
| (((elf_vma) (field[2])) << 16)
| (((elf_vma) (field[3])) << 24)
| (((elf_vma) (field[4])) << 32);
else if (sizeof (elf_vma) == 4)
/* We want to extract data from an 8 byte wide field and
place it into a 4 byte wide field. Since this is a little
endian source we can just use the 4 byte extraction code. */
return ((unsigned long) (field[0]))
| (((unsigned long) (field[1])) << 8)
| (((unsigned long) (field[2])) << 16)
| (((unsigned long) (field[3])) << 24);
/* Fall through. */
case 6:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[0]))
| (((elf_vma) (field[1])) << 8)
| (((elf_vma) (field[2])) << 16)
| (((elf_vma) (field[3])) << 24)
| (((elf_vma) (field[4])) << 32)
| (((elf_vma) (field[5])) << 40);
else if (sizeof (elf_vma) == 4)
/* We want to extract data from an 8 byte wide field and
place it into a 4 byte wide field. Since this is a little
endian source we can just use the 4 byte extraction code. */
return ((unsigned long) (field[0]))
| (((unsigned long) (field[1])) << 8)
| (((unsigned long) (field[2])) << 16)
| (((unsigned long) (field[3])) << 24);
/* Fall through. */
case 7:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[0]))
| (((elf_vma) (field[1])) << 8)
| (((elf_vma) (field[2])) << 16)
@ -164,18 +148,10 @@ byte_get_little_endian (const unsigned char *field, int size)
| (((elf_vma) (field[4])) << 32)
| (((elf_vma) (field[5])) << 40)
| (((elf_vma) (field[6])) << 48);
else if (sizeof (elf_vma) == 4)
/* We want to extract data from an 8 byte wide field and
place it into a 4 byte wide field. Since this is a little
endian source we can just use the 4 byte extraction code. */
return ((unsigned long) (field[0]))
| (((unsigned long) (field[1])) << 8)
| (((unsigned long) (field[2])) << 16)
| (((unsigned long) (field[3])) << 24);
/* Fall through. */
case 8:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[0]))
| (((elf_vma) (field[1])) << 8)
| (((elf_vma) (field[2])) << 16)
@ -184,14 +160,6 @@ byte_get_little_endian (const unsigned char *field, int size)
| (((elf_vma) (field[5])) << 40)
| (((elf_vma) (field[6])) << 48)
| (((elf_vma) (field[7])) << 56);
else if (sizeof (elf_vma) == 4)
/* We want to extract data from an 8 byte wide field and
place it into a 4 byte wide field. Since this is a little
endian source we can just use the 4 byte extraction code. */
return ((unsigned long) (field[0]))
| (((unsigned long) (field[1])) << 8)
| (((unsigned long) (field[2])) << 16)
| (((unsigned long) (field[3])) << 24);
/* Fall through. */
default:
@ -201,7 +169,7 @@ byte_get_little_endian (const unsigned char *field, int size)
}
elf_vma
byte_get_big_endian (const unsigned char *field, int size)
byte_get_big_endian (const unsigned char *field, unsigned int size)
{
switch (size)
{
@ -223,46 +191,26 @@ byte_get_big_endian (const unsigned char *field, int size)
| (((unsigned long) (field[0])) << 24);
case 5:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[4]))
| (((elf_vma) (field[3])) << 8)
| (((elf_vma) (field[2])) << 16)
| (((elf_vma) (field[1])) << 24)
| (((elf_vma) (field[0])) << 32);
else if (sizeof (elf_vma) == 4)
{
/* Although we are extracting data from an 8 byte wide field,
we are returning only 4 bytes of data. */
field += 1;
return ((unsigned long) (field[3]))
| (((unsigned long) (field[2])) << 8)
| (((unsigned long) (field[1])) << 16)
| (((unsigned long) (field[0])) << 24);
}
/* Fall through. */
case 6:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[5]))
| (((elf_vma) (field[4])) << 8)
| (((elf_vma) (field[3])) << 16)
| (((elf_vma) (field[2])) << 24)
| (((elf_vma) (field[1])) << 32)
| (((elf_vma) (field[0])) << 40);
else if (sizeof (elf_vma) == 4)
{
/* Although we are extracting data from an 8 byte wide field,
we are returning only 4 bytes of data. */
field += 2;
return ((unsigned long) (field[3]))
| (((unsigned long) (field[2])) << 8)
| (((unsigned long) (field[1])) << 16)
| (((unsigned long) (field[0])) << 24);
}
/* Fall through. */
case 7:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[6]))
| (((elf_vma) (field[5])) << 8)
| (((elf_vma) (field[4])) << 16)
@ -270,20 +218,10 @@ byte_get_big_endian (const unsigned char *field, int size)
| (((elf_vma) (field[2])) << 32)
| (((elf_vma) (field[1])) << 40)
| (((elf_vma) (field[0])) << 48);
else if (sizeof (elf_vma) == 4)
{
/* Although we are extracting data from an 8 byte wide field,
we are returning only 4 bytes of data. */
field += 3;
return ((unsigned long) (field[3]))
| (((unsigned long) (field[2])) << 8)
| (((unsigned long) (field[1])) << 16)
| (((unsigned long) (field[0])) << 24);
}
/* Fall through. */
case 8:
if (sizeof (elf_vma) == 8)
if (sizeof (elf_vma) >= 8)
return ((elf_vma) (field[7]))
| (((elf_vma) (field[6])) << 8)
| (((elf_vma) (field[5])) << 16)
@ -292,16 +230,6 @@ byte_get_big_endian (const unsigned char *field, int size)
| (((elf_vma) (field[2])) << 40)
| (((elf_vma) (field[1])) << 48)
| (((elf_vma) (field[0])) << 56);
else if (sizeof (elf_vma) == 4)
{
/* Although we are extracting data from an 8 byte wide field,
we are returning only 4 bytes of data. */
field += 4;
return ((unsigned long) (field[3]))
| (((unsigned long) (field[2])) << 8)
| (((unsigned long) (field[1])) << 16)
| (((unsigned long) (field[0])) << 24);
}
/* Fall through. */
default:
@ -311,7 +239,7 @@ byte_get_big_endian (const unsigned char *field, int size)
}
elf_vma
byte_get_signed (const unsigned char *field, int size)
byte_get_signed (const unsigned char *field, unsigned int size)
{
elf_vma x = byte_get (field, size);
@ -339,25 +267,6 @@ byte_get_signed (const unsigned char *field, int size)
}
}
/* Return the high-order 32-bits and the low-order 32-bits
of an 8-byte value separately. */
void
byte_get_64 (const unsigned char *field, elf_vma *high, elf_vma *low)
{
if (byte_get == byte_get_big_endian)
{
*high = byte_get_big_endian (field, 4);
*low = byte_get_big_endian (field + 4, 4);
}
else
{
*high = byte_get_little_endian (field + 4, 4);
*low = byte_get_little_endian (field, 4);
}
return;
}
/* Return the path name for a proxy entry in a thin archive, adjusted
relative to the path name of the thin archive itself if necessary.
Always returns a pointer to malloc'ed memory. */