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 | |
parent | 82a9b2d95c42689b94274a8ffa1bbfd01dbfb30f (diff) | |
download | binutils-00707a0e8939f67d5287bcc91c951006337e7e15.zip binutils-00707a0e8939f67d5287bcc91c951006337e7e15.tar.gz binutils-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')
-rw-r--r-- | bfd/ChangeLog | 19 | ||||
-rw-r--r-- | bfd/archures.c | 3 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 3 | ||||
-rw-r--r-- | bfd/cpu-mips.c | 6 | ||||
-rw-r--r-- | bfd/elfxx-mips.c | 56 |
5 files changed, 81 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0a8d1c4..f4fb4e0 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 3f0ba7b..f84fc13 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 c7dfe33..38e5459 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 d5343ff..75e84c2 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 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) |