diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2002-09-30 11:53:56 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2002-09-30 11:53:56 +0000 |
commit | 00707a0e8939f67d5287bcc91c951006337e7e15 (patch) | |
tree | 0a8a70705ca136fba15de829c16e031f957b40b8 /bfd/elfxx-mips.c | |
parent | 82a9b2d95c42689b94274a8ffa1bbfd01dbfb30f (diff) | |
download | gdb-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.c | 56 |
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) |