* libbfd.c: Add signed versions of bfd_{h_,}{get,put}_signed_<size>.

libbfd.c, libbfd-in.h: Add _do*signed*.
	targets.c, all targets: Add bfd*signed*.
	bfd-in.h: Add bfd_signed_vma.  Add comments.
This commit is contained in:
Jim Kingdon
1993-04-17 00:39:36 +00:00
parent 5aefc1ca23
commit 14e3c2e47d
11 changed files with 380 additions and 187 deletions

View File

@@ -400,24 +400,38 @@ DESCRIPTION
sections; each access (except for bytes) is vectored through
the target format of the BFD and mangled accordingly. The
mangling performs any necessary endian translations and
removes alignment restrictions.
removes alignment restrictions. Note that types accepted and
returned by these macros are identical so they can be swapped
around in macros--for example libaout.h defines GET_WORD to
either bfd_get_32 or bfd_get_64.
.#define bfd_put_8(abfd, val, ptr) \
. (*((char *)ptr) = (char)val)
. (*((unsigned char *)ptr) = (unsigned char)val)
.#define bfd_put_signed_8(abfd, val, ptr) (*((char *)(ptr)) = (char)(val))
.#define bfd_get_8(abfd, ptr) \
. (*((char *)ptr))
. (*((unsigned char *)(ptr)))
.#define bfd_get_signed_8(abfd, ptr) (((*(char *)(ptr) ^ 0x80) & 0xff) - 0x80)
.#define bfd_put_16(abfd, val, ptr) \
. BFD_SEND(abfd, bfd_putx16, (val,ptr))
. BFD_SEND(abfd, bfd_putx16, ((bfd_vma)(val),(ptr)))
.#define bfd_put_signed_16 bfd_put_16
.#define bfd_get_16(abfd, ptr) \
. BFD_SEND(abfd, bfd_getx16, (ptr))
.#define bfd_get_signed_16(abfd, ptr) \
. BFD_SEND (abfd, bfd_getx_signed_16, (ptr))
.#define bfd_put_32(abfd, val, ptr) \
. BFD_SEND(abfd, bfd_putx32, (val,ptr))
. BFD_SEND(abfd, bfd_putx32, ((bfd_vma)(val),(ptr)))
.#define bfd_put_signed_32 bfd_put_32
.#define bfd_get_32(abfd, ptr) \
. BFD_SEND(abfd, bfd_getx32, (ptr))
.#define bfd_get_signed_32(abfd, ptr) \
. BFD_SEND(abfd, bfd_getx_signed_32, (ptr))
.#define bfd_put_64(abfd, val, ptr) \
. BFD_SEND(abfd, bfd_putx64, (val, ptr))
. BFD_SEND(abfd, bfd_putx64, ((bfd_vma)(val), (ptr)))
.#define bfd_put_signed_64 bfd_put_64
.#define bfd_get_64(abfd, ptr) \
. BFD_SEND(abfd, bfd_getx64, (ptr))
.#define bfd_get_signed_64(abfd, ptr) \
. BFD_SEND(abfd, bfd_getx_signed_64, (ptr))
*/
@@ -435,24 +449,41 @@ DESCRIPTION
order, and their data in little endan order.
.#define bfd_h_put_8(abfd, val, ptr) \
. (*((char *)ptr) = (char)val)
. (*((unsigned char *)ptr) = (unsigned char)val)
.#define bfd_h_put_signed_8(abfd, val, ptr) (*((char *)(ptr)) = (char)(val))
.#define bfd_h_get_8(abfd, ptr) \
. (*((char *)ptr))
. (*((unsigned char *)(ptr)))
.#define bfd_h_get_signed_8 bfd_get_signed_8
.#define bfd_h_put_16(abfd, val, ptr) \
. BFD_SEND(abfd, bfd_h_putx16,(val,ptr))
.#define bfd_h_put_signed_16 bfd_h_put_16
.#define bfd_h_get_16(abfd, ptr) \
. BFD_SEND(abfd, bfd_h_getx16,(ptr))
.#define bfd_h_get_signed_16(abfd, ptr) \
. BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr))
.#define bfd_h_put_32(abfd, val, ptr) \
. BFD_SEND(abfd, bfd_h_putx32,(val,ptr))
.#define bfd_h_put_signed_32 bfd_h_put_32
.#define bfd_h_get_32(abfd, ptr) \
. BFD_SEND(abfd, bfd_h_getx32,(ptr))
.#define bfd_h_get_signed_32(abfd, ptr) \
. BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr))
.#define bfd_h_put_64(abfd, val, ptr) \
. BFD_SEND(abfd, bfd_h_putx64,(val, ptr))
.#define bfd_h_put_signed_64 bfd_h_put_64
.#define bfd_h_get_64(abfd, ptr) \
. BFD_SEND(abfd, bfd_h_getx64,(ptr))
.#define bfd_h_get_signed_64(abfd, ptr) \
. BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr))
*/
/* Sign extension to bfd_signed_vma. */
#define COERCE16(x) ((bfd_signed_vma) (((x) ^ 0x8000) - 0x8000))
#define COERCE32(x) ((bfd_signed_vma) (((x) ^ 0x80000000) - 0x80000000))
#define COERCE64(x) ((bfd_signed_vma)\
(((x) ^ 0x8000000000000000) - 0x8000000000000000))
bfd_vma
DEFUN(_do_getb16,(addr),
register bfd_byte *addr)
@@ -467,6 +498,20 @@ DEFUN(_do_getl16,(addr),
return (addr[1] << 8) | addr[0];
}
bfd_signed_vma
DEFUN(_do_getb_signed_16,(addr),
register bfd_byte *addr)
{
return COERCE16((addr[0] << 8) | addr[1]);
}
bfd_signed_vma
DEFUN(_do_getl_signed_16,(addr),
register bfd_byte *addr)
{
return COERCE16((addr[1] << 8) | addr[0]);
}
void
DEFUN(_do_putb16,(data, addr),
bfd_vma data AND
@@ -486,8 +531,8 @@ DEFUN(_do_putl16,(data, addr),
}
bfd_vma
DEFUN(_do_getb32,(addr),
register bfd_byte *addr)
_do_getb32 (addr)
register bfd_byte *addr;
{
return ((((addr[0] << 8) | addr[1]) << 8) | addr[2]) << 8 | addr[3];
}
@@ -499,6 +544,22 @@ _do_getl32 (addr)
return ((((addr[3] << 8) | addr[2]) << 8) | addr[1]) << 8 | addr[0];
}
bfd_signed_vma
_do_getb_signed_32 (addr)
register bfd_byte *addr;
{
return COERCE32(((((addr[0] << 8) | addr[1]) << 8)
| addr[2]) << 8 | addr[3]);
}
bfd_signed_vma
_do_getl_signed_32 (addr)
register bfd_byte *addr;
{
return COERCE32(((((addr[3] << 8) | addr[2]) << 8)
| addr[1]) << 8 | addr[0]);
}
bfd_vma
DEFUN(_do_getb64,(addr),
register bfd_byte *addr)
@@ -549,6 +610,56 @@ DEFUN(_do_getl64,(addr),
}
bfd_signed_vma
DEFUN(_do_getb_signed_64,(addr),
register bfd_byte *addr)
{
#ifdef HOST_64_BIT
bfd_vma low, high;
high= ((((((((addr[0]) << 8) |
addr[1]) << 8) |
addr[2]) << 8) |
addr[3]) );
low = ((((((((addr[4]) << 8) |
addr[5]) << 8) |
addr[6]) << 8) |
addr[7]));
return COERCE64(high << 32 | low);
#else
BFD_FAIL();
return 0;
#endif
}
bfd_signed_vma
DEFUN(_do_getl_signed_64,(addr),
register bfd_byte *addr)
{
#ifdef HOST_64_BIT
bfd_vma low, high;
high= (((((((addr[7] << 8) |
addr[6]) << 8) |
addr[5]) << 8) |
addr[4]));
low = (((((((addr[3] << 8) |
addr[2]) << 8) |
addr[1]) << 8) |
addr[0]) );
return COERCE64(high << 32 | low);
#else
BFD_FAIL();
return 0;
#endif
}
void
DEFUN(_do_putb32,(data, addr),
bfd_vma data AND