aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfxx-mips.c
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2002-09-30 11:53:56 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2002-09-30 11:53:56 +0000
commit00707a0e8939f67d5287bcc91c951006337e7e15 (patch)
tree0a8a70705ca136fba15de829c16e031f957b40b8 /bfd/elfxx-mips.c
parent82a9b2d95c42689b94274a8ffa1bbfd01dbfb30f (diff)
downloadgdb-00707a0e8939f67d5287bcc91c951006337e7e15.zip
gdb-00707a0e8939f67d5287bcc91c951006337e7e15.tar.gz
gdb-00707a0e8939f67d5287bcc91c951006337e7e15.tar.bz2
[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/elfxx-mips.c')
-rw-r--r--bfd/elfxx-mips.c56
1 files changed, 50 insertions, 6 deletions
diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c
index 72f9a6b..3c8bb5d 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)