diff options
Diffstat (limited to 'contrib/binutils/bfd/cpu-arm.c')
-rw-r--r-- | contrib/binutils/bfd/cpu-arm.c | 100 |
1 files changed, 44 insertions, 56 deletions
diff --git a/contrib/binutils/bfd/cpu-arm.c b/contrib/binutils/bfd/cpu-arm.c index 17889f3..a28a1f9 100644 --- a/contrib/binutils/bfd/cpu-arm.c +++ b/contrib/binutils/bfd/cpu-arm.c @@ -1,5 +1,6 @@ /* BFD support for the ARM processor - Copyright 1994, 1997, 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright 1994, 1997, 1999, 2000, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org) This file is part of BFD, the Binary File Descriptor library. @@ -16,28 +17,19 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ #include "bfd.h" #include "sysdep.h" #include "libbfd.h" #include "libiberty.h" -static const bfd_arch_info_type * compatible - PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *)); -static bfd_boolean scan - PARAMS ((const struct bfd_arch_info *, const char *)); -static bfd_boolean arm_check_note - PARAMS ((bfd *, char *, bfd_size_type, const char *, char **)); - /* This routine is provided two arch_infos and works out which ARM machine which would be compatible with both and returns a pointer to its info structure. */ static const bfd_arch_info_type * -compatible (a,b) - const bfd_arch_info_type * a; - const bfd_arch_info_type * b; +compatible (const bfd_arch_info_type *a, const bfd_arch_info_type *b) { /* If a & b are for different architecture we can do nothing. */ if (a->arch != b->arch) @@ -104,9 +96,7 @@ processors[] = }; static bfd_boolean -scan (info, string) - const struct bfd_arch_info * info; - const char * string; +scan (const struct bfd_arch_info *info, const char *string) { int i; @@ -161,9 +151,7 @@ const bfd_arch_info_type bfd_arm_arch = Returns TRUE if they were merged successfully or FALSE otherwise. */ bfd_boolean -bfd_arm_merge_machines (ibfd, obfd) - bfd * ibfd; - bfd * obfd; +bfd_arm_merge_machines (bfd *ibfd, bfd *obfd) { unsigned int in = bfd_get_mach (ibfd); unsigned int out = bfd_get_mach (obfd); @@ -194,9 +182,8 @@ bfd_arm_merge_machines (ibfd, obfd) && (out == bfd_mach_arm_XScale || out == bfd_mach_arm_iWMMXt)) { _bfd_error_handler (_("\ -ERROR: %s is compiled for the EP9312, whereas %s is compiled for XScale"), - bfd_archive_filename (ibfd), - bfd_get_filename (obfd)); +ERROR: %B is compiled for the EP9312, whereas %B is compiled for XScale"), + ibfd, obfd); bfd_set_error (bfd_error_wrong_format); return FALSE; } @@ -204,9 +191,8 @@ ERROR: %s is compiled for the EP9312, whereas %s is compiled for XScale"), && (in == bfd_mach_arm_XScale || in == bfd_mach_arm_iWMMXt)) { _bfd_error_handler (_("\ -ERROR: %s is compiled for the EP9312, whereas %s is compiled for XScale"), - bfd_archive_filename (obfd), - bfd_get_filename (ibfd)); +ERROR: %B is compiled for the EP9312, whereas %B is compiled for XScale"), + obfd, ibfd); bfd_set_error (bfd_error_wrong_format); return FALSE; } @@ -227,12 +213,11 @@ typedef struct } arm_Note; static bfd_boolean -arm_check_note (abfd, buffer, buffer_size, expected_name, description_return) - bfd * abfd; - char * buffer; - bfd_size_type buffer_size; - const char * expected_name; - char ** description_return; +arm_check_note (bfd *abfd, + bfd_byte *buffer, + bfd_size_type buffer_size, + const char *expected_name, + char **description_return) { unsigned long namesz; unsigned long descsz; @@ -247,7 +232,7 @@ arm_check_note (abfd, buffer, buffer_size, expected_name, description_return) namesz = bfd_get_32 (abfd, buffer); descsz = bfd_get_32 (abfd, buffer + offsetof (arm_Note, descsz)); type = bfd_get_32 (abfd, buffer + offsetof (arm_Note, type)); - descr = buffer + offsetof (arm_Note, name); + descr = (char *) buffer + offsetof (arm_Note, name); /* Check for buffer overflow. */ if (namesz + descsz + offsetof (arm_Note, name) > buffer_size) @@ -280,13 +265,11 @@ arm_check_note (abfd, buffer, buffer_size, expected_name, description_return) #define NOTE_ARCH_STRING "arch: " bfd_boolean -bfd_arm_update_notes (abfd, note_section) - bfd * abfd; - const char * note_section; +bfd_arm_update_notes (bfd *abfd, const char *note_section) { asection * arm_arch_section; bfd_size_type buffer_size; - char * buffer; + bfd_byte * buffer; char * arch_string; char * expected; @@ -298,16 +281,11 @@ bfd_arm_update_notes (abfd, note_section) if (arm_arch_section == NULL) return TRUE; - buffer_size = arm_arch_section->_raw_size; + buffer_size = arm_arch_section->size; if (buffer_size == 0) return FALSE; - buffer = bfd_malloc (buffer_size); - if (buffer == NULL) - return FALSE; - - if (! bfd_get_section_contents (abfd, arm_arch_section, buffer, - (file_ptr) 0, buffer_size)) + if (!bfd_malloc_and_get_section (abfd, arm_arch_section, &buffer)) goto FAIL; /* Parse the note. */ @@ -335,7 +313,9 @@ bfd_arm_update_notes (abfd, note_section) if (strcmp (arch_string, expected) != 0) { - strcpy (buffer + offsetof (arm_Note, name) + ((strlen (NOTE_ARCH_STRING) + 3) & ~3), expected); + strcpy ((char *) buffer + (offsetof (arm_Note, name) + + ((strlen (NOTE_ARCH_STRING) + 3) & ~3)), + expected); if (! bfd_set_section_contents (abfd, arm_arch_section, buffer, (file_ptr) 0, buffer_size)) @@ -351,7 +331,8 @@ bfd_arm_update_notes (abfd, note_section) return TRUE; FAIL: - free (buffer); + if (buffer != NULL) + free (buffer); return FALSE; } @@ -379,13 +360,11 @@ architectures[] = /* Extract the machine number stored in a note section. */ unsigned int -bfd_arm_get_mach_from_notes (abfd, note_section) - bfd * abfd; - const char * note_section; +bfd_arm_get_mach_from_notes (bfd *abfd, const char *note_section) { asection * arm_arch_section; bfd_size_type buffer_size; - char * buffer; + bfd_byte * buffer; char * arch_string; int i; @@ -397,16 +376,11 @@ bfd_arm_get_mach_from_notes (abfd, note_section) if (arm_arch_section == NULL) return bfd_mach_arm_unknown; - buffer_size = arm_arch_section->_raw_size; + buffer_size = arm_arch_section->size; if (buffer_size == 0) return bfd_mach_arm_unknown; - buffer = bfd_malloc (buffer_size); - if (buffer == NULL) - return bfd_mach_arm_unknown; - - if (! bfd_get_section_contents (abfd, arm_arch_section, buffer, - (file_ptr) 0, buffer_size)) + if (!bfd_malloc_and_get_section (abfd, arm_arch_section, &buffer)) goto FAIL; /* Parse the note. */ @@ -422,6 +396,20 @@ bfd_arm_get_mach_from_notes (abfd, note_section) } FAIL: - free (buffer); + if (buffer != NULL) + free (buffer); return bfd_mach_arm_unknown; } + +bfd_boolean +bfd_is_arm_mapping_symbol_name (const char * name) +{ + /* The ARM compiler outputs several obsolete forms. Recognize them + in addition to the standard $a, $t and $d. */ + return (name != NULL) + && (name[0] == '$') + && ((name[1] == 'a') || (name[1] == 't') || (name[1] == 'd') + || (name[1] == 'm') || (name[1] == 'f') || (name[1] == 'p')) + && (name[2] == 0 || name[2] == '.'); +} + |