diff options
-rw-r--r-- | bfd/.Sanitize | 2 | ||||
-rw-r--r-- | bfd/ChangeLog | 27 | ||||
-rw-r--r-- | bfd/archures.c | 427 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 9 | ||||
-rwxr-xr-x | bfd/config.bfd | 12 | ||||
-rw-r--r-- | bfd/cpu-sparc.c | 100 | ||||
-rw-r--r-- | bfd/elf32-sparc.c | 165 |
7 files changed, 499 insertions, 243 deletions
diff --git a/bfd/.Sanitize b/bfd/.Sanitize index 9c1d043..1bb18d2 100644 --- a/bfd/.Sanitize +++ b/bfd/.Sanitize @@ -356,7 +356,7 @@ else done fi -v8plus_files="ChangeLog elf32-sparc.c" +v8plus_files="ChangeLog archures.c bfd-in2.h cpu-sparc.c elf32-sparc.c" if ( echo $* | grep keep\-v8plus > /dev/null ) ; then for i in $v8plus_files ; do if test ! -d $i && (grep sanitize-v8plus $i > /dev/null) ; then diff --git a/bfd/ChangeLog b/bfd/ChangeLog index d41085c..67c8c29 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,30 @@ +Mon Jan 22 08:52:04 1996 Doug Evans <dje@charmed.cygnus.com> + + * archures.c (bfd_mach_sparc_v9): Renamed from bfd_mach_sparc64. +start-sanitize-v8plus + (bfd_mach_sparc_{v8plus,v8plusa}): Define. +end-sanitize-v8plus + (bfd_mach_sparc_v9a): Define. + * bfd-in2.h: Regenerated. + * aoutx.h (aout,machine_type): bfd_mach_sparc64 renamed to + bfd_mach_sparc_v9. + * config.bfd (sparc64-*-sysv4*,sparc64-*-solaris2*): Set targ_defvec + to bfd_elf32_sparc_vec. + * cpu-sparc.c (arch_info_struct): Renamed from sparc_arch_info. +start-sanitize-v8plus + Add v8plus{,a} support. +end-sanitize-v8plus + Add v9a support. +start-sanitize-v8plus + * elf32-sparc.h: #include "elf/sparc.h". + (elf32_sparc_set_private_flags, elf32_sparc_copy_private_bfd_data, + elf32_sparc_merge_private_bfd_data, elf32_sparc_object_p, + elf32_sparc_final_write_processing): New functions. + (bfd_elf32_bfd_set_private_flags, bfd_elf32_bfd_copy_private_bfd_data, + bfd_elf32_bfd_merge_private_bfd_data, elf_backend_object_p, + elf_backend_final_write_processing): Define. +end-sanitize-v8plus + Mon Jan 22 11:21:51 1996 Michael Meissner <meissner@tiktok.cygnus.com> * elf-bfd.h (struct elf_link_hash_entry): Add diff --git a/bfd/archures.c b/bfd/archures.c index c045061..96b08e3 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -1,5 +1,5 @@ /* BFD library support routines for architectures. - Copyright (C) 1990, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. + Copyright (C) 1990, 91-95, 1996 Free Software Foundation, Inc. Hacked by John Gilmore and Steve Chamberlain of Cygnus Support. This file is part of BFD, the Binary File Descriptor library. @@ -18,6 +18,11 @@ 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. */ +#include "bfd.h" +#include "sysdep.h" +#include "libbfd.h" +#include <ctype.h> + /* SECTION @@ -87,8 +92,13 @@ DESCRIPTION . . bfd_arch_a29k, {* AMD 29000 *} . bfd_arch_sparc, {* SPARC *} -.#define bfd_mach_sparc 1 -.#define bfd_mach_sparc64 2 +.#define bfd_mach_sparc 1 +. {* start-sanitize-v8plus *} +.#define bfd_mach_sparc_v8plus 2 +.#define bfd_mach_sparc_v8plusa 3 +. {* end-sanitize-v8plus *} +.#define bfd_mach_sparc_v9 4 +.#define bfd_mach_sparc_v9a 5 {* v9 with ultrasparc add'ns *} . bfd_arch_mips, {* MIPS Rxxxx *} . bfd_arch_i386, {* Intel 386 *} . bfd_arch_we32k, {* AT&T WE32xxx *} @@ -130,11 +140,6 @@ DESCRIPTION */ -#include "bfd.h" -#include "sysdep.h" -#include "libbfd.h" -#include <ctype.h> - /* SUBSECTION @@ -152,37 +157,91 @@ DESCRIPTION . int bits_per_byte; . enum bfd_architecture arch; . unsigned long mach; -. char *arch_name; -. CONST char *printable_name; +. const char *arch_name; +. const char *printable_name; . unsigned int section_align_power; . {* true if this is the default machine for the architecture *} . boolean the_default; -. CONST struct bfd_arch_info * (*compatible) -. PARAMS ((CONST struct bfd_arch_info *a, -. CONST struct bfd_arch_info *b)); +. const struct bfd_arch_info * (*compatible) +. PARAMS ((const struct bfd_arch_info *a, +. const struct bfd_arch_info *b)); . -. boolean (*scan) PARAMS ((CONST struct bfd_arch_info *, CONST char *)); -. {* How to disassemble an instruction, producing a printable -. representation on a specified stdio stream. This isn't -. defined for most processors at present, because of the size -. of the additional tables it would drag in, and because gdb -. wants to use a different interface. *} -. unsigned int (*disassemble) PARAMS ((bfd_vma addr, CONST char *data, -. PTR stream)); +. boolean (*scan) PARAMS ((const struct bfd_arch_info *, const char *)); . -. struct bfd_arch_info *next; +. const struct bfd_arch_info *next; .} bfd_arch_info_type; */ -bfd_arch_info_type *bfd_arch_info_list; - +extern const bfd_arch_info_type bfd_a29k_arch; +extern const bfd_arch_info_type bfd_alpha_arch; +/* start-sanitize-arc */ +extern const bfd_arch_info_type bfd_arc_arch; +/* end-sanitize-arc */ +extern const bfd_arch_info_type bfd_arm_arch; +extern const bfd_arch_info_type bfd_h8300_arch; +extern const bfd_arch_info_type bfd_h8500_arch; +extern const bfd_arch_info_type bfd_hppa_arch; +extern const bfd_arch_info_type bfd_i386_arch; +extern const bfd_arch_info_type bfd_i860_arch; +extern const bfd_arch_info_type bfd_i960_arch; +extern const bfd_arch_info_type bfd_m68k_arch; +extern const bfd_arch_info_type bfd_m88k_arch; +extern const bfd_arch_info_type bfd_mips_arch; +extern const bfd_arch_info_type bfd_powerpc_arch; +extern const bfd_arch_info_type bfd_rs6000_arch; +extern const bfd_arch_info_type bfd_sh_arch; +/* start-sanitize-rce */ +extern const bfd_arch_info_type bfd_rce_arch; +/* end-sanitize-rce */ +extern const bfd_arch_info_type bfd_sparc_arch; +extern const bfd_arch_info_type bfd_vax_arch; +extern const bfd_arch_info_type bfd_we32k_arch; +extern const bfd_arch_info_type bfd_z8k_arch; +extern const bfd_arch_info_type bfd_ns32k_arch; +extern const bfd_arch_info_type bfd_w65_arch; + +static const bfd_arch_info_type * const bfd_archures_list[] = +{ +#ifdef SELECT_ARCHITECTURES + SELECT_ARCHITECTURES, +#else + &bfd_a29k_arch, + &bfd_alpha_arch, +/* start-sanitize-arc */ + &bfd_arc_arch, +/* end-sanitize-arc */ + &bfd_arm_arch, + &bfd_h8300_arch, + &bfd_h8500_arch, + &bfd_hppa_arch, + &bfd_i386_arch, + &bfd_i860_arch, + &bfd_i960_arch, + &bfd_m68k_arch, + &bfd_m88k_arch, + &bfd_mips_arch, + &bfd_powerpc_arch, + &bfd_rs6000_arch, + &bfd_sh_arch, +/* start-sanitize-rce */ + &bfd_rce_arch, +/* end-sanitize-rce */ + &bfd_sparc_arch, + &bfd_vax_arch, + &bfd_we32k_arch, + &bfd_z8k_arch, + &bfd_ns32k_arch, + &bfd_w65_arch, +#endif + 0 +}; /* FUNCTION bfd_printable_name SYNOPSIS - CONST char *bfd_printable_name(bfd *abfd); + const char *bfd_printable_name(bfd *abfd); DESCRIPTION Return a printable string representing the architecture and machine @@ -190,7 +249,7 @@ DESCRIPTION */ -CONST char * +const char * bfd_printable_name (abfd) bfd *abfd; { @@ -204,7 +263,7 @@ FUNCTION bfd_scan_arch SYNOPSIS - bfd_arch_info_type *bfd_scan_arch(CONST char *string); + const bfd_arch_info_type *bfd_scan_arch(const char *string); DESCRIPTION Figure out if BFD supports any cpu which could be described with @@ -213,21 +272,23 @@ DESCRIPTION */ -bfd_arch_info_type * +const bfd_arch_info_type * bfd_scan_arch (string) - CONST char *string; + const char *string; { - struct bfd_arch_info *ap; + const bfd_arch_info_type * const *app, *ap; /* Look through all the installed architectures */ - for (ap = bfd_arch_info_list; - ap != (bfd_arch_info_type *)NULL; - ap = ap->next) { - - if (ap->scan(ap, string)) - return ap; - } - return (bfd_arch_info_type *)NULL; + for (app = bfd_archures_list; *app != NULL; app++) + { + for (ap = *app; ap != NULL; ap = ap->next) + { + if (ap->scan (ap, string)) + return ap; + } + } + + return NULL; } @@ -237,9 +298,9 @@ FUNCTION bfd_arch_get_compatible SYNOPSIS - CONST bfd_arch_info_type *bfd_arch_get_compatible( - CONST bfd *abfd, - CONST bfd *bbfd); + const bfd_arch_info_type *bfd_arch_get_compatible( + const bfd *abfd, + const bfd *bbfd); DESCRIPTION Determine whether two BFDs' @@ -249,10 +310,10 @@ DESCRIPTION an <<arch_info>> structure describing the compatible machine. */ -CONST bfd_arch_info_type * +const bfd_arch_info_type * bfd_arch_get_compatible (abfd, bbfd) - CONST bfd *abfd; - CONST bfd *bbfd; + const bfd *abfd; + const bfd *bbfd; { /* If either architecture is unknown, then all we can do is assume the user knows what he's doing. */ @@ -262,7 +323,7 @@ bfd_arch_get_compatible (abfd, bbfd) return abfd->arch_info; /* Otherwise architecture-specific code has to decide. */ - return abfd->arch_info->compatible(abfd->arch_info,bbfd->arch_info); + return abfd->arch_info->compatible (abfd->arch_info, bbfd->arch_info); } @@ -277,11 +338,11 @@ DESCRIPTION structure, until the correct back end has determined the real architecture of the file. -.extern bfd_arch_info_type bfd_default_arch_struct; +.extern const bfd_arch_info_type bfd_default_arch_struct; */ -bfd_arch_info_type bfd_default_arch_struct = +const bfd_arch_info_type bfd_default_arch_struct = { 32,32,8,bfd_arch_unknown,0,"unknown","unknown",2,true, bfd_default_compatible, @@ -294,7 +355,7 @@ FUNCTION bfd_set_arch_info SYNOPSIS - void bfd_set_arch_info(bfd *abfd, bfd_arch_info_type *arg); + void bfd_set_arch_info(bfd *abfd, const bfd_arch_info_type *arg); DESCRIPTION Set the architecture info of @var{abfd} to @var{arg}. @@ -303,7 +364,7 @@ DESCRIPTION void bfd_set_arch_info (abfd, arg) bfd *abfd; - bfd_arch_info_type *arg; + const bfd_arch_info_type *arg; { abfd->arch_info = arg; } @@ -328,39 +389,27 @@ boolean bfd_default_set_arch_mach (abfd, arch, mach) bfd *abfd; enum bfd_architecture arch; - unsigned long mach; + unsigned long mach; { - static struct bfd_arch_info *old_ptr = &bfd_default_arch_struct; - boolean found = false; - /* run through the table to find the one we want, we keep a little - cache to speed things up */ - if (old_ptr == 0 || arch != old_ptr->arch || mach != old_ptr->mach) { - bfd_arch_info_type *ptr; - old_ptr = (bfd_arch_info_type *)NULL; - for (ptr = bfd_arch_info_list; - ptr != (bfd_arch_info_type *)NULL; - ptr= ptr->next) { - if (ptr->arch == arch && - ((ptr->mach == mach) || (ptr->the_default && mach == 0))) { - old_ptr = ptr; - found = true; - break; - } - } - if (found==false) { - /*looked for it and it wasn't there, so put in the default */ - old_ptr = &bfd_default_arch_struct; - bfd_set_error (bfd_error_bad_value); - } - } - else { - /* it was in the cache */ - found = true; - } + const bfd_arch_info_type * const *app, *ap; - abfd->arch_info = old_ptr; + for (app = bfd_archures_list; *app != NULL; app++) + { + for (ap = *app; ap != NULL; ap = ap->next) + { + if (ap->arch == arch + && (ap->mach == mach + || (mach == 0 && ap->the_default))) + { + abfd->arch_info = ap; + return true; + } + } + } - return found; + abfd->arch_info = &bfd_default_arch_struct; + bfd_set_error (bfd_error_bad_value); + return false; } @@ -443,138 +492,33 @@ bfd_arch_bits_per_address (abfd) } -extern void bfd_a29k_arch PARAMS ((void)); -extern void bfd_alpha_arch PARAMS ((void)); -/* start-sanitize-arc */ -extern void bfd_arc_arch PARAMS ((void)); -/* end-sanitize-arc */ -extern void bfd_arm_arch PARAMS ((void)); -extern void bfd_h8300_arch PARAMS ((void)); -extern void bfd_h8500_arch PARAMS ((void)); -extern void bfd_hppa_arch PARAMS ((void)); -extern void bfd_i386_arch PARAMS ((void)); -extern void bfd_i960_arch PARAMS ((void)); -extern void bfd_m68k_arch PARAMS ((void)); -extern void bfd_m88k_arch PARAMS ((void)); -extern void bfd_mips_arch PARAMS ((void)); -extern void bfd_powerpc_arch PARAMS ((void)); -extern void bfd_rs6000_arch PARAMS ((void)); -extern void bfd_sh_arch PARAMS ((void)); -/* start-sanitize-rce */ -extern void bfd_rce_arch PARAMS ((void)); -/* end-sanitize-rce */ -extern void bfd_sparc_arch PARAMS ((void)); -extern void bfd_vax_arch PARAMS ((void)); -extern void bfd_we32k_arch PARAMS ((void)); -extern void bfd_z8k_arch PARAMS ((void)); -extern void bfd_ns32k_arch PARAMS ((void)); -extern void bfd_w65_arch PARAMS ((void)); - -static void (*const archures_init_table[]) PARAMS ((void)) = -{ -#ifdef SELECT_ARCHITECTURES - SELECT_ARCHITECTURES, -#else - bfd_a29k_arch, - bfd_alpha_arch, -/* start-sanitize-arc */ - bfd_arc_arch, -/* end-sanitize-arc */ - bfd_arm_arch, - bfd_h8300_arch, - bfd_h8500_arch, - bfd_hppa_arch, - bfd_i386_arch, - bfd_i960_arch, - bfd_m68k_arch, - bfd_m88k_arch, - bfd_mips_arch, - bfd_powerpc_arch, - bfd_rs6000_arch, - bfd_sh_arch, -/* start-sanitize-rce */ - bfd_rce_arch, -/* end-sanitize-rce */ - bfd_sparc_arch, - bfd_vax_arch, - bfd_we32k_arch, - bfd_z8k_arch, - bfd_ns32k_arch, - bfd_w65_arch, -#endif - 0 - }; - - - -/* -INTERNAL_FUNCTION - bfd_arch_init - -SYNOPSIS - void bfd_arch_init(void); - -DESCRIPTION - Initialize the architecture dispatch table by - calling all installed architecture packages and getting them - to poke around. -*/ - -void -bfd_arch_init () -{ - void (*const *ptable) PARAMS ((void)); - for (ptable = archures_init_table; *ptable ; ptable++) - (*ptable)(); -} - - -/* -INTERNAL_FUNCTION - bfd_arch_linkin - -SYNOPSIS - void bfd_arch_linkin(bfd_arch_info_type *ptr); - -DESCRIPTION - Link the architecture info structure @var{ptr} into the list. -*/ - -void -bfd_arch_linkin (ptr) - bfd_arch_info_type *ptr; -{ - ptr->next = bfd_arch_info_list; - bfd_arch_info_list = ptr; -} - - /* INTERNAL_FUNCTION bfd_default_compatible SYNOPSIS - CONST bfd_arch_info_type *bfd_default_compatible - (CONST bfd_arch_info_type *a, - CONST bfd_arch_info_type *b); + const bfd_arch_info_type *bfd_default_compatible + (const bfd_arch_info_type *a, + const bfd_arch_info_type *b); DESCRIPTION The default function for testing for compatibility. */ -CONST bfd_arch_info_type * +const bfd_arch_info_type * bfd_default_compatible (a,b) - CONST bfd_arch_info_type *a; - CONST bfd_arch_info_type *b; + const bfd_arch_info_type *a; + const bfd_arch_info_type *b; { - if(a->arch != b->arch) return NULL; + if (a->arch != b->arch) + return NULL; - if (a->mach > b->mach) { + if (a->mach > b->mach) return a; - } - if (b->mach > a->mach) { + + if (b->mach > a->mach) return b; - } + return a; } @@ -584,7 +528,7 @@ INTERNAL_FUNCTION bfd_default_scan SYNOPSIS - boolean bfd_default_scan(CONST struct bfd_arch_info *info, CONST char *string); + boolean bfd_default_scan(const struct bfd_arch_info *info, const char *string); DESCRIPTION The default function for working out whether this is an @@ -593,43 +537,47 @@ DESCRIPTION boolean bfd_default_scan (info, string) - CONST struct bfd_arch_info *info; - CONST char *string; + const struct bfd_arch_info *info; + const char *string; { - CONST char *ptr_src; - CONST char *ptr_tst; + const char *ptr_src; + const char *ptr_tst; unsigned long number; enum bfd_architecture arch; + /* First test for an exact match */ - if (strcmp(string, info->printable_name) == 0) return true; + if (strcmp (string, info->printable_name) == 0) + return true; /* See how much of the supplied string matches with the architecture, eg the string m68k:68020 would match the 68k entry up to the :, then we get left with the machine number */ - for (ptr_src = string, - ptr_tst = info->arch_name; + for (ptr_src = string, ptr_tst = info->arch_name; *ptr_src && *ptr_tst; - ptr_src++, - ptr_tst++) + ptr_src++, ptr_tst++) { if (*ptr_src != *ptr_tst) break; } /* Chewed up as much of the architecture as will match, skip any colons */ - if (*ptr_src == ':') ptr_src++; + if (*ptr_src == ':') + ptr_src++; - if (*ptr_src == 0) { - /* nothing more, then only keep this one if it is the default - machine for this architecture */ - return info->the_default; - } + if (*ptr_src == 0) + { + /* nothing more, then only keep this one if it is the default + machine for this architecture */ + return info->the_default; + } + number = 0; - while (isdigit(*ptr_src)) { - number = number * 10 + *ptr_src - '0'; - ptr_src++; - } + while (isdigit(*ptr_src)) + { + number = number * 10 + *ptr_src - '0'; + ptr_src++; + } switch (number) { @@ -654,12 +602,14 @@ bfd_default_scan (info, string) case 68000: arch = bfd_arch_m68k; break; + case 386: case 80386: case 486: case 80486: arch = bfd_arch_i386; break; + case 29000: arch = bfd_arch_a29k; break; @@ -695,6 +645,7 @@ bfd_default_scan (info, string) default: return false; } + if (arch != info->arch) return false; @@ -710,17 +661,17 @@ FUNCTION bfd_get_arch_info SYNOPSIS - bfd_arch_info_type * bfd_get_arch_info(bfd *abfd); + const bfd_arch_info_type * bfd_get_arch_info(bfd *abfd); DESCRIPTION Return the architecture info struct in @var{abfd}. */ -bfd_arch_info_type * +const bfd_arch_info_type * bfd_get_arch_info (abfd) bfd *abfd; { - return abfd->arch_info; + return abfd->arch_info; } @@ -729,7 +680,7 @@ FUNCTION bfd_lookup_arch SYNOPSIS - bfd_arch_info_type *bfd_lookup_arch + const bfd_arch_info_type *bfd_lookup_arch (enum bfd_architecture arch, unsigned long machine); @@ -741,23 +692,25 @@ DESCRIPTION default. */ -bfd_arch_info_type * +const bfd_arch_info_type * bfd_lookup_arch (arch, machine) enum bfd_architecture arch; unsigned long machine; { - bfd_arch_info_type *ap; - bfd_check_init(); - for (ap = bfd_arch_info_list; - ap != (bfd_arch_info_type *)NULL; - ap = ap->next) { - if (ap->arch == arch && - ((ap->mach == machine) - || (ap->the_default && machine == 0))) { - return ap; - } + const bfd_arch_info_type * const *app, *ap; + + for (app = bfd_archures_list; *app != NULL; app++) + { + for (ap = *app; ap != NULL; ap = ap->next) + { + if (ap->arch == arch + && (ap->mach == machine + || (machine == 0 && ap->the_default))) + return ap; } - return (bfd_arch_info_type *)NULL; + } + + return NULL; } @@ -766,7 +719,7 @@ FUNCTION bfd_printable_arch_mach SYNOPSIS - CONST char *bfd_printable_arch_mach + const char *bfd_printable_arch_mach (enum bfd_architecture arch, unsigned long machine); DESCRIPTION @@ -776,12 +729,14 @@ DESCRIPTION This routine is depreciated. */ -CONST char * +const char * bfd_printable_arch_mach (arch, machine) enum bfd_architecture arch; unsigned long machine; { - bfd_arch_info_type *ap = bfd_lookup_arch(arch, machine); - if(ap) return ap->printable_name; + const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine); + + if (ap) + return ap->printable_name; return "UNKNOWN!"; } diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index f3d1633..9ffab26 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1109,8 +1109,13 @@ enum bfd_architecture bfd_arch_a29k, /* AMD 29000 */ bfd_arch_sparc, /* SPARC */ -#define bfd_mach_sparc 1 -#define bfd_mach_sparc64 2 +#define bfd_mach_sparc 1 + /* start-sanitize-v8plus */ +#define bfd_mach_sparc_v8plus 2 +#define bfd_mach_sparc_v8plusa 3 + /* end-sanitize-v8plus */ +#define bfd_mach_sparc_v9 4 +#define bfd_mach_sparc_v9a 5 /* v9 with ultrasparc add'ns */ bfd_arch_mips, /* MIPS Rxxxx */ bfd_arch_i386, /* Intel 386 */ bfd_arch_we32k, /* AT&T WE32xxx */ diff --git a/bfd/config.bfd b/bfd/config.bfd index d86c49c..3bdcf10 100755 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -416,14 +416,18 @@ case "${targ}" in targ_defvec=bfd_elf32_sparc_vec targ_selvecs=sunos_big_vec ;; - sparc64-*-elf* | sparc64-*-sysv4* | sparc64-*-solaris2*) - targ_defvec=bfd_elf64_sparc_vec - targ_selvecs=bfd_elf32_sparc_vec - ;; sparc64-*-aout*) targ_defvec=sunos_big_vec targ_underscore=yes ;; + sparc64-*-elf*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs=bfd_elf32_sparc_vec + ;; + sparc64-*-solaris2* | sparc64-*-sysv4*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs=bfd_elf64_sparc_vec + ;; sparc-*-netware*) targ_defvec=bfd_elf32_sparc_vec targ_selvecs="nlm32_sparc_vec sunos_big_vec" diff --git a/bfd/cpu-sparc.c b/bfd/cpu-sparc.c new file mode 100644 index 0000000..46d6292 --- /dev/null +++ b/bfd/cpu-sparc.c @@ -0,0 +1,100 @@ +/* BFD support for the SPARC architecture. + Copyright (C) 1992, 1995, 1996 Free Software Foundation, Inc. + +This file is part of BFD, the Binary File Descriptor library. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +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. */ + +#include "bfd.h" +#include "sysdep.h" +#include "libbfd.h" + +static const bfd_arch_info_type arch_info_struct[] = +{ + /* start-sanitize-v8plus */ + { + 32, /* bits in a word */ + 32, /* bits in an address */ + 8, /* bits in a byte */ + bfd_arch_sparc, + bfd_mach_sparc_v8plus, + "sparc", + "sparc:v8plus", + 3, + false, + bfd_default_compatible, + bfd_default_scan, + &arch_info_struct[1], + }, + { + 32, /* bits in a word */ + 32, /* bits in an address */ + 8, /* bits in a byte */ + bfd_arch_sparc, + bfd_mach_sparc_v8plusa, + "sparc", + "sparc:v8plusa", + 3, + false, + bfd_default_compatible, + bfd_default_scan, + &arch_info_struct[2], + }, + /* end-sanitize-v8plus */ + { + 64, /* bits in a word */ + 64, /* bits in an address */ + 8, /* bits in a byte */ + bfd_arch_sparc, + bfd_mach_sparc_v9, + "sparc", + "sparc:v9", + 3, + false, + bfd_default_compatible, + bfd_default_scan, + &arch_info_struct[3], + }, + { + 64, /* bits in a word */ + 64, /* bits in an address */ + 8, /* bits in a byte */ + bfd_arch_sparc, + bfd_mach_sparc_v9a, + "sparc", + "sparc:v9a", + 3, + false, + bfd_default_compatible, + bfd_default_scan, + 0, + } +}; + +const bfd_arch_info_type bfd_sparc_arch = + { + 32, /* bits in a word */ + 32, /* bits in an address */ + 8, /* bits in a byte */ + bfd_arch_sparc, + bfd_mach_sparc, + "sparc", + "sparc", + 3, + true, /* the default */ + bfd_default_compatible, + bfd_default_scan, + &arch_info_struct[0], + }; diff --git a/bfd/elf32-sparc.c b/bfd/elf32-sparc.c index 313dae9..f759881 100644 --- a/bfd/elf32-sparc.c +++ b/bfd/elf32-sparc.c @@ -22,6 +22,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "bfdlink.h" #include "libbfd.h" #include "elf-bfd.h" +/* start-sanitize-v8plus */ +#include "elf/sparc.h" +/* end-sanitize-v8plus */ static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup PARAMS ((bfd *, bfd_reloc_code_real_type)); @@ -44,6 +47,15 @@ static boolean elf32_sparc_finish_dynamic_symbol Elf_Internal_Sym *)); static boolean elf32_sparc_finish_dynamic_sections PARAMS ((bfd *, struct bfd_link_info *)); +/* start-sanitize-v8plus */ +static boolean elf32_sparc_set_private_flags PARAMS ((bfd *, flagword)); +static boolean elf32_sparc_copy_private_bfd_data PARAMS ((bfd *, bfd *)); +static boolean elf32_sparc_merge_private_bfd_data PARAMS ((bfd *, bfd *)); +static boolean elf32_sparc_object_p + PARAMS ((bfd *)); +static void elf32_sparc_final_write_processing + PARAMS ((bfd *, boolean)); +/* end-sanitize-v8plus */ enum reloc_type { @@ -1479,7 +1491,150 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info) return true; } +/* start-sanitize-v8plus */ + +/* Function to set e_flags. */ + +static boolean +elf32_sparc_set_private_flags (abfd, flags) + bfd *abfd; + flagword flags; +{ + /* Once the flags have been set, you (apparently) can't change them. */ + BFD_ASSERT (!elf_flags_init (abfd) + || elf_elfheader (abfd)->e_flags == flags); + + elf_elfheader (abfd)->e_flags = flags; + elf_flags_init (abfd) = true; + return true; +} + +/* Copy backend specific data from one object module to another. */ + +static boolean +elf32_sparc_copy_private_bfd_data (ibfd, obfd) + bfd *ibfd; + bfd *obfd; +{ + /* This function is selected based on the input vector. We only + want to copy information over if the output BFD also uses Elf + format. */ + if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) + return true; + + /* Once the flags have been set, you (apparently) can't change them. */ + BFD_ASSERT (!elf_flags_init (obfd) + || elf_elfheader (obfd)->e_flags == elf_elfheader (ibfd)->e_flags); + + elf_elfheader (obfd)->e_flags = elf_elfheader (ibfd)->e_flags; + elf_flags_init (obfd) = true; + return true; +} + +/* Merge backend specific data from an object file to the output + object file when linking. */ + +static boolean +elf32_sparc_merge_private_bfd_data (ibfd, obfd) + bfd *ibfd; + bfd *obfd; +{ + flagword old_flags; + flagword new_flags; + boolean error; + + /* This function is selected based on the input vector. We only + want to copy information over if the output BFD also uses Elf + format. */ + if (bfd_get_flavour (obfd) != bfd_target_elf_flavour) + return true; + + error = false; + + /* If the output machine is normal sparc, we can't allow v9 input files. */ + if (bfd_get_mach (obfd) == bfd_mach_sparc + && (bfd_get_mach (ibfd) == bfd_mach_sparc_v8plus + || bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa)) + { + error = true; + (*_bfd_error_handler) + ("%s: compiled for a v8plus system and target is v8", + bfd_get_filename (ibfd)); + } + /* If the output machine is v9, we can't allow v9+vis input files. */ + if (bfd_get_mach (obfd) == bfd_mach_sparc_v8plus + && bfd_get_mach (ibfd) == bfd_mach_sparc_v8plusa) + { + error = true; + (*_bfd_error_handler) + ("%s: compiled for a v8plusa system and target is v8plus", + bfd_get_filename (ibfd)); + } + + new_flags = elf_elfheader (ibfd)->e_flags; + old_flags = elf_elfheader (obfd)->e_flags; + if (!elf_flags_init (obfd)) /* First call, no flags set */ + { + elf_flags_init (obfd) = true; + elf_elfheader (obfd)->e_flags = new_flags; + } + else if (new_flags == old_flags) /* Compatible flags are ok */ + ; + else /* Potentially incompatible flags */ + { + new_flags &= ~ (EF_SPARC_32PLUS | EF_SPARC_SUN_US1); + old_flags &= ~ (EF_SPARC_32PLUS | EF_SPARC_SUN_US1); + + /* Warn about any other mismatches */ + if (new_flags != old_flags) + { + error = true; + (*_bfd_error_handler) + ("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)", + bfd_get_filename (ibfd), (long) new_flags, (long) old_flags); + } + } + + if (error) + { + bfd_set_error (bfd_error_bad_value); + return false; + } + + return true; +} + +/* Set the right machine number. */ +static boolean +elf32_sparc_object_p (abfd) + bfd *abfd; +{ + if (elf_elfheader (abfd)->e_machine == EM_SPARC32PLUS) + return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc_v8plus); + else + return bfd_default_set_arch_mach (abfd, bfd_arch_sparc, bfd_mach_sparc); +} + +/* The final processing done just before writing out the object file. + We need to set the e_machine field appropriately. */ + +static void +elf32_sparc_final_write_processing (abfd, linker) + bfd *abfd; + boolean linker; +{ + if (bfd_get_mach (abfd) == bfd_mach_sparc_v8plus) + { + elf_elfheader (abfd)->e_machine = EM_SPARC32PLUS; +#if 0 /* FIXME: Not sure how to handle EF_SPARC_32PLUS_US1 */ + elf_elfheader (abfd)->e_flags &=~ EF_SPARC_32PLUS_MASK; +#endif + elf_elfheader (abfd)->e_flags |= EF_SPARC_32PLUS; + } +} +/* end-sanitize-v8plus */ + #define TARGET_BIG_SYM bfd_elf32_sparc_vec #define TARGET_BIG_NAME "elf32-sparc" #define ELF_ARCH bfd_arch_sparc @@ -1500,6 +1655,16 @@ elf32_sparc_finish_dynamic_sections (output_bfd, info) elf32_sparc_finish_dynamic_symbol #define elf_backend_finish_dynamic_sections \ elf32_sparc_finish_dynamic_sections +/* start-sanitize-v8plus */ +#define bfd_elf32_bfd_set_private_flags elf32_sparc_set_private_flags +#define bfd_elf32_bfd_copy_private_bfd_data \ + elf32_sparc_copy_private_bfd_data +#define bfd_elf32_bfd_merge_private_bfd_data \ + elf32_sparc_merge_private_bfd_data +#define elf_backend_object_p elf32_sparc_object_p +#define elf_backend_final_write_processing \ + elf32_sparc_final_write_processing +/* end-sanitize-v8plus */ #define elf_backend_want_got_plt 0 #define elf_backend_plt_readonly 0 #define elf_backend_want_plt_sym 1 |