PATCH: fix up fake BFD functions in cgen-cpu/tracedis.cxx
Jim Blandy <[email protected]>
| Newsgroups | gmane.comp.emulators.sid.devel |
|---|---|
| Message-ID | <[email protected]> |
In trying to build SID with --disable-shared, I found that linking 'sid' died because the references to these functions in libopcodes weren't being satisfied. As it turns out: $ nm tracedis.o | grep bfd_get_bits 000024de T _Z12bfd_get_bitsPhii $ But when I added the 'extern "C"' thingies, the compiler was suddenly able to check the definitions against the declarations in bfd/bfd.h again. Those changed recently; see Alan Modra's 2004-03-15 change in bfd/ChangeLog. 2004-03-23 Jim Blandy <[email protected]> * tracedis.cxx (bfd_get_arch, bfd_getb16, bfd_getl16, bfd_getb32) (bfd_getl32, bfd_put_bits, bfd_get_bits, bfd_lookup_arch): These definitions are meant to satisfy references in libopcodes, which is C code, so declare these with 'extern "C"'. Adjust types to match those declared in the BFD header file. Index: sid/component/cgen-cpu/tracedis.cxx =================================================================== RCS file: /cvs/src/src/sid/component/cgen-cpu/tracedis.cxx,v retrieving revision 1.2 diff -c -r1.2 tracedis.cxx *** sid/component/cgen-cpu/tracedis.cxx 9 Jan 2003 18:14:56 -0000 1.2 --- sid/component/cgen-cpu/tracedis.cxx 23 Mar 2004 22:57:56 -0000 *************** *** 74,80 **** // // so that only really leaves bfd_lookup_arch() as an issue...we can hack it. ! enum bfd_architecture bfd_get_arch(bfd *abfd) { return static_cast<enum bfd_architecture> (0); --- 74,80 ---- // // so that only really leaves bfd_lookup_arch() as an issue...we can hack it. ! extern "C" enum bfd_architecture bfd_get_arch(bfd *abfd) { return static_cast<enum bfd_architecture> (0); *************** *** 82,126 **** /* Stolen from libbfd. */ ! bfd_vma ! bfd_getb16 (register const bfd_byte *addr) { ! return (addr[0] << 8) | addr[1]; } ! bfd_vma ! bfd_getl16 (register const bfd_byte *addr) { ! return (addr[1] << 8) | addr[0]; } ! bfd_vma ! bfd_getb32 (register const bfd_byte *addr) { unsigned long v; ! v = (unsigned long) addr[0] << 24; ! v |= (unsigned long) addr[1] << 16; ! v |= (unsigned long) addr[2] << 8; ! v |= (unsigned long) addr[3]; return (bfd_vma) v; } ! bfd_vma ! bfd_getl32 (register const bfd_byte *addr) { unsigned long v; ! v = (unsigned long) addr[0]; ! v |= (unsigned long) addr[1] << 8; ! v |= (unsigned long) addr[2] << 16; ! v |= (unsigned long) addr[3] << 24; return (bfd_vma) v; } ! void ! bfd_put_bits (bfd_vma data, bfd_byte* addr, int bits, int big_p) { int i; int bytes; --- 82,131 ---- /* Stolen from libbfd. */ ! extern "C" bfd_vma ! bfd_getb16 (register const void *addr) { ! const bfd_byte *byteaddr = static_cast <const bfd_byte *> (addr); ! return (byteaddr[0] << 8) | byteaddr[1]; } ! extern "C" bfd_vma ! bfd_getl16 (register const void *addr) { ! const bfd_byte *byteaddr = static_cast <const bfd_byte *> (addr); ! return (byteaddr[1] << 8) | byteaddr[0]; } ! extern "C" bfd_vma ! bfd_getb32 (register const void *addr) { + const bfd_byte *byteaddr = static_cast <const bfd_byte *> (addr); unsigned long v; ! v = (unsigned long) byteaddr[0] << 24; ! v |= (unsigned long) byteaddr[1] << 16; ! v |= (unsigned long) byteaddr[2] << 8; ! v |= (unsigned long) byteaddr[3]; return (bfd_vma) v; } ! extern "C" bfd_vma ! bfd_getl32 (register const void *addr) { + const bfd_byte *byteaddr = static_cast <const bfd_byte *> (addr); unsigned long v; ! v = (unsigned long) byteaddr[0]; ! v |= (unsigned long) byteaddr[1] << 8; ! v |= (unsigned long) byteaddr[2] << 16; ! v |= (unsigned long) byteaddr[3] << 24; return (bfd_vma) v; } ! extern "C" void ! bfd_put_bits (bfd_uint64_t data, void* addr, int bits, bfd_boolean big_p) { + bfd_byte *byteaddr = static_cast <bfd_byte *> (addr); int i; int bytes; *************** *** 132,147 **** { int index = big_p ? bytes - i - 1 : i; ! addr[index] = (bfd_byte) data; data >>= 8; } } /* Stolen from libbfd. */ ! bfd_vma ! bfd_get_bits (bfd_byte* addr, int bits, int big_p) { ! bfd_vma data; int i; int bytes; --- 137,153 ---- { int index = big_p ? bytes - i - 1 : i; ! byteaddr[index] = (bfd_byte) data; data >>= 8; } } /* Stolen from libbfd. */ ! extern "C" bfd_uint64_t ! bfd_get_bits (const void* addr, int bits, int big_p) { ! const bfd_byte *byteaddr = static_cast <const bfd_byte *> (addr); ! bfd_uint64_t data; int i; int bytes; *************** *** 154,160 **** { int index = big_p ? i : bytes - i - 1; ! data = (data << 8) | addr[index]; } return data; --- 160,166 ---- { int index = big_p ? i : bytes - i - 1; ! data = (data << 8) | byteaddr[index]; } return data; *************** *** 199,205 **** p->name = name; } ! const bfd_arch_info_type * bfd_lookup_arch (enum bfd_architecture arch, unsigned long machine) { static bfd_arch_info_type info; --- 205,211 ---- p->name = name; } ! extern "C" const bfd_arch_info_type * bfd_lookup_arch (enum bfd_architecture arch, unsigned long machine) { static bfd_arch_info_type info;