diff options
author | Ken Raeburn <raeburn@cygnus> | 1992-05-26 03:45:31 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1992-05-26 03:45:31 +0000 |
commit | 8070f29df5b169072265c0a50710f38850d4206c (patch) | |
tree | c216b6384991b67e23b488852bb4638131614519 /bfd/coff-i960.c | |
parent | 20edaa8e7791b9c33fa1a6abbca7bec3df4564ca (diff) | |
download | fsf-binutils-gdb-8070f29df5b169072265c0a50710f38850d4206c.zip fsf-binutils-gdb-8070f29df5b169072265c0a50710f38850d4206c.tar.gz fsf-binutils-gdb-8070f29df5b169072265c0a50710f38850d4206c.tar.bz2 |
Lots of changes from gas-bfd work. Includes:
* working reloc lookup support
* better support for creation of COFF files from scratch
* misc doc changes, macro tweaks, "const" additions, typo fixes, etc.
* one or two ugly kludges that should get cleaned up (but what's one
or two more, in BFD?)
See ChangeLog for details.
Diffstat (limited to 'bfd/coff-i960.c')
-rw-r--r-- | bfd/coff-i960.c | 101 |
1 files changed, 51 insertions, 50 deletions
diff --git a/bfd/coff-i960.c b/bfd/coff-i960.c index b0a4b9d..e0727db 100644 --- a/bfd/coff-i960.c +++ b/bfd/coff-i960.c @@ -27,8 +27,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "sysdep.h" #include "libbfd.h" #include "obstack.h" -#include "coff-i960.h" -#include "internalcoff.h" +#include "coff/i960.h" +#include "coff/internal.h" #include "libcoff.h" /* to allow easier abstraction-breaking */ @@ -37,12 +37,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define BAL_MASK 0x00ffffff static bfd_reloc_status_type -optcall_callback(abfd, reloc_entry, symbol_in, data, ignore_input_section) -bfd *abfd; -arelent *reloc_entry; -asymbol *symbol_in; -unsigned char *data; -asection *ignore_input_section; +DEFUN (optcall_callback, (abfd, reloc_entry, symbol_in, data, ignore_input_section), + bfd *abfd AND + arelent *reloc_entry AND + asymbol *symbol_in AND + PTR data AND + asection *ignore_input_section) { /* This item has already been relocated correctly, but we may be * able to patch in yet better code - done by digging out the @@ -70,7 +70,7 @@ asection *ignore_input_section; to the correct location */ { union internal_auxent *aux = &((cs->native+2)->u.auxent); - int word = bfd_get_32(abfd, data + reloc_entry->address); + int word = bfd_get_32(abfd, (bfd_byte *)data + reloc_entry->address); int olf = (aux->x_bal.x_balntry - cs->native->u.syment.n_value); BFD_ASSERT(cs->native->u.syment.n_numaux==2); /* We replace the original call instruction with a bal to */ @@ -80,7 +80,7 @@ asection *ignore_input_section; /* offset of the bal entry point */ word = ((word + olf) & BAL_MASK) | BAL; - bfd_put_32(abfd, word, data+reloc_entry->address); + bfd_put_32(abfd, word, (bfd_byte *) data + reloc_entry->address); } result = bfd_reloc_ok; break; @@ -97,51 +97,47 @@ asection *ignore_input_section; return result; } - - -static reloc_howto_type howto_table[] = -{ - {0}, - {1}, - {2}, - {3}, - {4}, - {5}, - {6}, - {7}, - {8}, - {9}, - {10}, - {11}, - {12}, - {13}, - {14}, - {15}, - {16}, - +static reloc_howto_type howto_rellong = { (unsigned int) R_RELLONG, 0, 2, 32,false, 0, true, true, - 0,"rellong", true, 0xffffffff, 0xffffffff}, - {18}, - {19}, - {20}, - {21}, - {22}, - {23}, - {24}, - + 0,"rellong", true, 0xffffffff, 0xffffffff}; +static reloc_howto_type howto_iprmed = { R_IPRMED, 0, 2, 24,true,0, true, true,0,"iprmed ", true, - 0x00ffffff, 0x00ffffff}, - {26}, - + 0x00ffffff, 0x00ffffff}; +static reloc_howto_type howto_optcall = { R_OPTCALL, 0,2,24,true,0, true, true, optcall_callback, - "optcall", true, 0x00ffffff, 0x00ffffff}, + "optcall", true, 0x00ffffff, 0x00ffffff}; -}; +static reloc_howto_type * +DEFUN (coff_i960_reloc_type_lookup, (abfd, code), + bfd *abfd AND + bfd_reloc_code_type code) +{ + switch (code) + { + default: + return 0; + case BFD_RELOC_I960_CALLJ: + return &howto_optcall; + case BFD_RELOC_32: + return &howto_rellong; + case BFD_RELOC_24_PCREL: + return &howto_iprmed; + } +} /* The real code is in coffcode.h */ #define RTYPE2HOWTO(cache_ptr, dst) \ - cache_ptr->howto = howto_table + dst.r_type; +{ \ + reloc_howto_type *howto_ptr; \ + switch ((dst)->r_type) { \ + case 17: howto_ptr = &howto_rellong; break; \ + case 25: howto_ptr = &howto_iprmed; break; \ + case 27: howto_ptr = &howto_optcall; break; \ + default: howto_ptr = 0; break; \ + } \ + cache_ptr->howto = howto_ptr; \ + } #include "coffcode.h" @@ -170,8 +166,11 @@ bfd_target icoff_little_vec = _bfd_generic_mkarchive, bfd_false}, {bfd_false, coff_write_object_contents, /* bfd_write_contents */ _bfd_write_archive_contents, bfd_false}, - JUMP_TABLE(coff) - }; + JUMP_TABLE(coff), + COFF_SWAP_TABLE, + coff_i960_reloc_type_lookup, + coff_make_debug_symbol, +}; bfd_target icoff_big_vec = @@ -200,5 +199,7 @@ _do_getb64, _do_putb64, _do_getb32, _do_putb32, _do_getb16, _do_putb16, /* hdrs {bfd_false, coff_write_object_contents, /* bfd_write_contents */ _bfd_write_archive_contents, bfd_false}, JUMP_TABLE(coff), -COFF_SWAP_TABLE + COFF_SWAP_TABLE, + coff_i960_reloc_type_lookup, + coff_make_debug_symbol, }; |