* 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
This commit is contained in:
David Edelsohn 1996-01-22 17:15:49 +00:00
parent 07ce72c9bb
commit 5bc513b4fb
7 changed files with 498 additions and 242 deletions

View File

@ -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

View File

@ -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

View File

@ -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) {
for (app = bfd_archures_list; *app != NULL; app++)
{
for (ap = *app; ap != NULL; ap = ap->next)
{
if (ap->scan (ap, string))
return ap;
}
}
if (ap->scan(ap, string))
return ap;
}
return (bfd_arch_info_type *)NULL;
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 == 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';
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;
}
number = 0;
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!";
}

View File

@ -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 */

View File

@ -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"

100
bfd/cpu-sparc.c Normal file
View File

@ -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],
};

View File

@ -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