summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2002-09-30 11:53:56 +0000
committerRichard Sandiford <rsandifo@nildram.co.uk>2002-09-30 11:53:56 +0000
commit5ba4f0caefd51847f8977b861a16c17617c4f7f0 (patch)
tree9ab179688ad6cb049e227bfc67291863c8a0ceaf /bfd
parentfd1bde5de0151465f44873ec58c4497493fac3ad (diff)
downloadbinutils-redhat-5ba4f0caefd51847f8977b861a16c17617c4f7f0.tar.gz
[include/elf]
* mips.h (E_MIPS_MACH_4120, E_MIPS_MACH_5400, E_MIPS_MACH_5500): New. [bfd/] * archures.c (bfd_mach_mips4120, bfd_mach_mips5400): New. (bfd_mach_mips5500): New. * cpu-mips.c (I_mips4120, I_mips5400, I_mips5500): New. (arch_info_struct): Add corresponding entries here. * elfxx-mips.c (_bfd_elf_mips_mach): Handle E_MIPS_MACH_4120, E_MIPS_MACH_5400 and E_MIPS_MACH_5500. (_bfd_mips_elf_final_write_processing): Handle bfd_mach_mips4120, bfd_mach_mips5400 and bfd_mach_mips5500. (_bfd_mips_elf_mach_extends_p): New function. (_bfd_mips_elf_merge_private_bfd_data): Use it to help merge the EF_MIPS_MACH flags. * bfd-in2.h: Regenerate.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog19
-rw-r--r--bfd/archures.c3
-rw-r--r--bfd/bfd-in2.h3
-rw-r--r--bfd/cpu-mips.c6
-rw-r--r--bfd/elfxx-mips.c56
5 files changed, 81 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0a8d1c40c8..f4fb4e00e6 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,22 @@
+2002-09-30 Gavin Romig-Koch <gavin@redhat.com>
+ Ken Raeburn <raeburn@cygnus.com>
+ Aldy Hernandez <aldyh@redhat.com>
+ Eric Christopher <echristo@redhat.com>
+ Richard Sandiford <rsandifo@redhat.com>
+
+ * archures.c (bfd_mach_mips4120, bfd_mach_mips5400): New.
+ (bfd_mach_mips5500): New.
+ * cpu-mips.c (I_mips4120, I_mips5400, I_mips5500): New.
+ (arch_info_struct): Add corresponding entries here.
+ * elfxx-mips.c (_bfd_elf_mips_mach): Handle E_MIPS_MACH_4120,
+ E_MIPS_MACH_5400 and E_MIPS_MACH_5500.
+ (_bfd_mips_elf_final_write_processing): Handle bfd_mach_mips4120,
+ bfd_mach_mips5400 and bfd_mach_mips5500.
+ (_bfd_mips_elf_mach_extends_p): New function.
+ (_bfd_mips_elf_merge_private_bfd_data): Use it to help merge
+ the EF_MIPS_MACH flags.
+ * bfd-in2.h: Regenerate.
+
2002-09-28 Jason Thorpe <thorpej@wasabisystems.com>
* elf32-vax.c (elf_vax_size_dynamic_section): Don't strip
diff --git a/bfd/archures.c b/bfd/archures.c
index 3f0ba7bb65..f84fc136d1 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -129,11 +129,14 @@ DESCRIPTION
.#define bfd_mach_mips4010 4010
.#define bfd_mach_mips4100 4100
.#define bfd_mach_mips4111 4111
+.#define bfd_mach_mips4120 4120
.#define bfd_mach_mips4300 4300
.#define bfd_mach_mips4400 4400
.#define bfd_mach_mips4600 4600
.#define bfd_mach_mips4650 4650
.#define bfd_mach_mips5000 5000
+.#define bfd_mach_mips5400 5400
+.#define bfd_mach_mips5500 5500
.#define bfd_mach_mips6000 6000
.#define bfd_mach_mips8000 8000
.#define bfd_mach_mips10000 10000
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index c7dfe33586..38e5459d20 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1524,11 +1524,14 @@ enum bfd_architecture
#define bfd_mach_mips4010 4010
#define bfd_mach_mips4100 4100
#define bfd_mach_mips4111 4111
+#define bfd_mach_mips4120 4120
#define bfd_mach_mips4300 4300
#define bfd_mach_mips4400 4400
#define bfd_mach_mips4600 4600
#define bfd_mach_mips4650 4650
#define bfd_mach_mips5000 5000
+#define bfd_mach_mips5400 5400
+#define bfd_mach_mips5500 5500
#define bfd_mach_mips6000 6000
#define bfd_mach_mips8000 8000
#define bfd_mach_mips10000 10000
diff --git a/bfd/cpu-mips.c b/bfd/cpu-mips.c
index d5343ff31e..75e84c227c 100644
--- a/bfd/cpu-mips.c
+++ b/bfd/cpu-mips.c
@@ -67,11 +67,14 @@ enum
I_mips4010,
I_mips4100,
I_mips4111,
+ I_mips4120,
I_mips4300,
I_mips4400,
I_mips4600,
I_mips4650,
I_mips5000,
+ I_mips5400,
+ I_mips5500,
I_mips6000,
I_mips8000,
I_mips10000,
@@ -93,11 +96,14 @@ static const bfd_arch_info_type arch_info_struct[] =
N (64, 64, bfd_mach_mips4010, "mips:4010", false, NN(I_mips4010)),
N (64, 64, bfd_mach_mips4100, "mips:4100", false, NN(I_mips4100)),
N (64, 64, bfd_mach_mips4111, "mips:4111", false, NN(I_mips4111)),
+ N (64, 64, bfd_mach_mips4120, "mips:4120", false, NN(I_mips4120)),
N (64, 64, bfd_mach_mips4300, "mips:4300", false, NN(I_mips4300)),
N (64, 64, bfd_mach_mips4400, "mips:4400", false, NN(I_mips4400)),
N (64, 64, bfd_mach_mips4600, "mips:4600", false, NN(I_mips4600)),
N (64, 64, bfd_mach_mips4650, "mips:4650", false, NN(I_mips4650)),
N (64, 64, bfd_mach_mips5000, "mips:5000", false, NN(I_mips5000)),
+ N (64, 64, bfd_mach_mips5400, "mips:5400", false, NN(I_mips5400)),
+ N (64, 64, bfd_mach_mips5500, "mips:5500", false, NN(I_mips5500)),
N (32, 32, bfd_mach_mips6000, "mips:6000", false, NN(I_mips6000)),
N (64, 64, bfd_mach_mips8000, "mips:8000", false, NN(I_mips8000)),
N (64, 64, bfd_mach_mips10000,"mips:10000", false, NN(I_mips10000)),
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 72f9a6bfde..3c8bb5d8be 100644
--- a/bfd/elfxx-mips.c
+++ b/bfd/elfxx-mips.c
@@ -364,6 +364,7 @@ static INLINE int elf_mips_isa PARAMS ((flagword));
static INLINE char* elf_mips_abi_name PARAMS ((bfd *));
static void mips_elf_irix6_finish_dynamic_symbol
PARAMS ((bfd *, const char *, Elf_Internal_Sym *));
+static boolean _bfd_mips_elf_mach_extends_p PARAMS ((flagword, flagword));
/* This will be used when we sort the dynamic relocation records. */
static bfd *reldyn_sorting_bfd;
@@ -3058,9 +3059,18 @@ _bfd_elf_mips_mach (flags)
case E_MIPS_MACH_4111:
return bfd_mach_mips4111;
+ case E_MIPS_MACH_4120:
+ return bfd_mach_mips4120;
+
case E_MIPS_MACH_4650:
return bfd_mach_mips4650;
+ case E_MIPS_MACH_5400:
+ return bfd_mach_mips5400;
+
+ case E_MIPS_MACH_5500:
+ return bfd_mach_mips5500;
+
case E_MIPS_MACH_SB1:
return bfd_mach_mips_sb1;
@@ -5935,10 +5945,22 @@ _bfd_mips_elf_final_write_processing (abfd, linker)
val = E_MIPS_ARCH_3 | E_MIPS_MACH_4111;
break;
+ case bfd_mach_mips4120:
+ val = E_MIPS_ARCH_3 | E_MIPS_MACH_4120;
+ break;
+
case bfd_mach_mips4650:
val = E_MIPS_ARCH_3 | E_MIPS_MACH_4650;
break;
+ case bfd_mach_mips5400:
+ val = E_MIPS_ARCH_4 | E_MIPS_MACH_5400;
+ break;
+
+ case bfd_mach_mips5500:
+ val = E_MIPS_ARCH_4 | E_MIPS_MACH_5500;
+ break;
+
case bfd_mach_mips5000:
case bfd_mach_mips8000:
case bfd_mach_mips10000:
@@ -7637,6 +7659,26 @@ _bfd_mips_elf_final_link (abfd, info)
return true;
}
+/* Return true if machine EXTENSION is an extension of machine BASE,
+ meaning that it should be safe to link code for the two machines
+ and set the output machine to EXTENSION. EXTENSION and BASE are
+ both submasks of EF_MIPS_MACH. */
+
+static boolean
+_bfd_mips_elf_mach_extends_p (base, extension)
+ flagword base, extension;
+{
+ /* The vr5500 ISA is an extension of the core vr5400 ISA, but doesn't
+ include the multimedia stuff. It seems better to allow vr5400
+ and vr5500 code to be merged anyway, since many libraries will
+ just use the core ISA. Perhaps we could add some sort of ASE
+ flag if this ever proves a problem. */
+ return (base == 0
+ || (base == E_MIPS_MACH_5400 && extension == E_MIPS_MACH_5500)
+ || (base == E_MIPS_MACH_4100 && extension == E_MIPS_MACH_4111)
+ || (base == E_MIPS_MACH_4100 && extension == E_MIPS_MACH_4120));
+}
+
/* Merge backend specific data from an object file to the output
object file when linking. */
@@ -7743,10 +7785,9 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
/* If either has no machine specified, just compare the general isa's.
Some combinations of machines are ok, if the isa's match. */
- if (! new_mach
- || ! old_mach
- || new_mach == old_mach
- )
+ if (new_mach == old_mach
+ || _bfd_mips_elf_mach_extends_p (new_mach, old_mach)
+ || _bfd_mips_elf_mach_extends_p (old_mach, new_mach))
{
/* Don't warn about mixing code using 32-bit ISAs, or mixing code
using 64-bit ISAs. They will normally use the same data sizes
@@ -7763,8 +7804,11 @@ _bfd_mips_elf_merge_private_bfd_data (ibfd, obfd)
else
{
/* Do we need to update the mach field? */
- if (old_mach == 0 && new_mach != 0)
- elf_elfheader (obfd)->e_flags |= new_mach;
+ if (_bfd_mips_elf_mach_extends_p (old_mach, new_mach))
+ {
+ elf_elfheader (obfd)->e_flags &= ~EF_MIPS_MACH;
+ elf_elfheader (obfd)->e_flags |= new_mach;
+ }
/* Do we need to update the ISA field? */
if (new_isa > old_isa)