From a9d34880555ed60254118c80850a4e4a6f62104f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Sat, 25 Mar 2006 10:24:27 +0000 Subject: [PATCH] bfd/ * cpu-m68k.c (bfd_m68k_compatible): Treat ISA A+ and ISA B code as incompatible. Likewise MAC and EMAC code. * elf32-m68k.c (elf32_m68k_merge_private_bfd_data): Use bfd_get_compatible to set the new bfd architecture. Rely on it to detect incompatibilities. gas/ * config/tc-m68k.c (m68k_cpus): Change cpu_cf5208 entries to use mcfemac instead of mcfmac. ld/testsuite/ * ld-m68k/merge-error-1a.s, ld-m68k/merge-error-1b.s, * ld-m68k/merge-error-1a.d, ld-m68k/merge-error-1b.d, * ld-m68k/merge-error-1c.d, ld-m68k/merge-error-1d.d, * ld-m68k/merge-error-1e.d, ld-m68k/merge-ok-1a.d, * ld-m68k/merge-ok-1b.d: New tests. * ld-m68k/m68k.exp: Run them. --- bfd/ChangeLog | 8 +++ bfd/cpu-m68k.c | 11 +++- bfd/elf32-m68k.c | 94 +++++---------------------- gas/ChangeLog | 5 ++ gas/config/tc-m68k.c | 4 +- ld/testsuite/ChangeLog | 9 +++ ld/testsuite/ld-m68k/m68k.exp | 8 +++ ld/testsuite/ld-m68k/merge-error-1a.d | 4 ++ ld/testsuite/ld-m68k/merge-error-1a.s | 1 + ld/testsuite/ld-m68k/merge-error-1b.d | 4 ++ ld/testsuite/ld-m68k/merge-error-1b.s | 1 + ld/testsuite/ld-m68k/merge-error-1c.d | 4 ++ ld/testsuite/ld-m68k/merge-error-1d.d | 4 ++ ld/testsuite/ld-m68k/merge-error-1e.d | 4 ++ ld/testsuite/ld-m68k/merge-ok-1a.d | 6 ++ ld/testsuite/ld-m68k/merge-ok-1b.d | 6 ++ 16 files changed, 93 insertions(+), 80 deletions(-) create mode 100644 ld/testsuite/ld-m68k/merge-error-1a.d create mode 100644 ld/testsuite/ld-m68k/merge-error-1a.s create mode 100644 ld/testsuite/ld-m68k/merge-error-1b.d create mode 100644 ld/testsuite/ld-m68k/merge-error-1b.s create mode 100644 ld/testsuite/ld-m68k/merge-error-1c.d create mode 100644 ld/testsuite/ld-m68k/merge-error-1d.d create mode 100644 ld/testsuite/ld-m68k/merge-error-1e.d create mode 100644 ld/testsuite/ld-m68k/merge-ok-1a.d create mode 100644 ld/testsuite/ld-m68k/merge-ok-1b.d diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 8f77cc3e416..f8c8590bbb0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,11 @@ +2006-03-25 Richard Sandiford + + * cpu-m68k.c (bfd_m68k_compatible): Treat ISA A+ and ISA B code as + incompatible. Likewise MAC and EMAC code. + * elf32-m68k.c (elf32_m68k_merge_private_bfd_data): Use + bfd_get_compatible to set the new bfd architecture. Rely on it + to detect incompatibilities. + 2006-03-22 Bob Wilson * elf32-xtensa.c (xtensa_read_table_entries): Remove assertion that diff --git a/bfd/cpu-m68k.c b/bfd/cpu-m68k.c index 83aaa254c1f..366278960a6 100644 --- a/bfd/cpu-m68k.c +++ b/bfd/cpu-m68k.c @@ -208,9 +208,16 @@ bfd_m68k_compatible (const bfd_arch_info_type *a, /* Merge cf machine. */ unsigned features = (bfd_m68k_mach_to_features (a->mach) | bfd_m68k_mach_to_features (b->mach)); - unsigned machine = bfd_m68k_features_to_mach (features); - return bfd_lookup_arch (a->arch, machine); + /* ISA A+ and ISA B are incompatible. */ + if ((~features & (mcfisa_aa | mcfisa_b)) == 0) + return NULL; + + /* MAC and EMAC code cannot be merged. */ + if ((~features & (mcfmac | mcfemac)) == 0) + return NULL; + + return bfd_lookup_arch (a->arch, bfd_m68k_features_to_mach (features)); } else /* They are incompatible. */ diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c index 5e69df5c9b0..df988a84966 100644 --- a/bfd/elf32-m68k.c +++ b/bfd/elf32-m68k.c @@ -446,40 +446,24 @@ elf32_m68k_merge_private_bfd_data (ibfd, obfd) { flagword out_flags; flagword in_flags; - unsigned in_mach, out_mach; + flagword out_isa; + flagword in_isa; + const bfd_arch_info_type *arch_info; if ( bfd_get_flavour (ibfd) != bfd_target_elf_flavour || bfd_get_flavour (obfd) != bfd_target_elf_flavour) return FALSE; - in_mach = bfd_get_mach (ibfd); - out_mach = bfd_get_mach (obfd); - if (!out_mach || !in_mach) - /* One is unknown, copy the input machine. */ - out_mach = in_mach; - else if (in_mach != out_mach) - { - if (in_mach <= bfd_mach_m68060 && out_mach <= bfd_mach_m68060) - { - /* Merge m68k machine. */ - if (in_mach > out_mach) - out_mach = in_mach; - } - else if (in_mach >= bfd_mach_mcf_isa_a_nodiv - && out_mach >= bfd_mach_mcf_isa_a_nodiv) - /* Merge cf machine. */ - out_mach = bfd_m68k_features_to_mach - (bfd_m68k_mach_to_features (in_mach) - | bfd_m68k_mach_to_features (out_mach)); - else - /* They are incompatible. */ - return FALSE; - } - bfd_set_arch_mach (obfd, bfd_arch_m68k, out_mach); - - in_flags = elf_elfheader (ibfd)->e_flags; - out_flags = elf_elfheader (obfd)->e_flags; + /* Get the merged machine. This checks for incompatibility between + Coldfire & non-Coldfire flags, incompability between different + Coldfire ISAs, and incompability between different MAC types. */ + arch_info = bfd_arch_get_compatible (ibfd, obfd, FALSE); + if (!arch_info) + return FALSE; + bfd_set_arch_mach (obfd, bfd_arch_m68k, arch_info->mach); + + in_flags = elf_elfheader (ibfd)->e_flags; if (!elf_flags_init (obfd)) { elf_flags_init (obfd) = TRUE; @@ -487,54 +471,12 @@ elf32_m68k_merge_private_bfd_data (ibfd, obfd) } else { - flagword isa_in = in_flags & EF_M68K_ISA_MASK; - flagword isa_out = out_flags & EF_M68K_ISA_MASK; - - - /* Copy legacy flags. */ - out_flags |= in_flags & (EF_M68K_CPU32 | EF_M68K_M68000 | EF_M68K_CFV4E); - - if ((isa_in | isa_out) - && ((in_flags | out_flags) & (EF_M68K_CPU32 | EF_M68K_M68000))) - /* Mixing m68k and cf is not allowed */ - return FALSE; - - if (isa_in) - { - if (isa_out) - { - if (isa_out == EF_M68K_ISA_A_PLUS - && (isa_in == EF_M68K_ISA_B_NOUSP - || isa_in == EF_M68K_ISA_B)) - /* Cannot mix A+ and B */ - return FALSE; - if (isa_in == EF_M68K_ISA_A_PLUS - && (isa_out == EF_M68K_ISA_B_NOUSP - || isa_out == EF_M68K_ISA_B)) - /* Cannot mix B and A+ */ - return FALSE; - - if (isa_in > isa_out) - out_flags ^= isa_in ^ isa_out; - - out_flags |= in_flags & EF_M68K_FLOAT; - if (in_flags & EF_M68K_MAC_MASK) - { - if (!(out_flags & EF_M68K_MAC_MASK)) - out_flags |= in_flags & EF_M68K_MAC_MASK; - else if ((out_flags & EF_M68K_MAC_MASK) - != (in_flags & EF_M68K_MAC_MASK)) - /* Cannot mix MACs */ - return FALSE; - } - } - else - { - /* Copy the coldfire bits. */ - out_flags &= ~EF_M68K_CF_MASK; - out_flags |= in_flags & EF_M68K_CF_MASK; - } - } + out_flags = elf_elfheader (obfd)->e_flags; + in_isa = (in_flags & EF_M68K_ISA_MASK); + out_isa = (out_flags & EF_M68K_ISA_MASK); + if (in_isa > out_isa) + out_flags ^= in_isa ^ out_isa; + out_flags |= in_flags ^ in_isa; } elf_elfheader (obfd)->e_flags = out_flags; diff --git a/gas/ChangeLog b/gas/ChangeLog index 4b5091f4cb1..b12c4400f5f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2006-03-25 Richard Sandiford + + * config/tc-m68k.c (m68k_cpus): Change cpu_cf5208 entries to use + mcfemac instead of mcfmac. + 2006-03-22 Richard Sandiford Daniel Jacobowitz Phil Edwards diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c index 8b112631bd8..f5646cdc10f 100644 --- a/gas/config/tc-m68k.c +++ b/gas/config/tc-m68k.c @@ -432,7 +432,7 @@ static const struct m68k_cpu m68k_cpus[] = { cpu32|m68881, cpu_cpu32, "cpu32", 0}, { mcfisa_a, cpu_cf5200, "5200", 0}, { mcfisa_a|mcfhwdiv|mcfmac, cpu_cf5206e, "5206e", 0}, - { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5208, "5208", 0}, + { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, cpu_cf5208, "5208", 0}, { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5213, "5213", 0}, { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,cpu_cf521x, "521x", 0}, { mcfisa_a|mcfhwdiv|mcfemac, cpu_cf5249, "5249", 0}, @@ -473,7 +473,7 @@ static const struct m68k_cpu m68k_cpus[] = { mcfisa_a, cpu_cf5200, "5202", 1}, { mcfisa_a, cpu_cf5200, "5204", 1}, { mcfisa_a, cpu_cf5200, "5206", 1}, - { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5208, "5207", 1}, + { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, cpu_cf5208, "5207", 1}, { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5213, "5211", 1}, { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, cpu_cf5213, "5212", 1}, { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, cpu_cf521x, "5214", 1}, diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 763c325786d..4be03b845aa 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2006-03-25 Richard Sandiford + + * ld-m68k/merge-error-1a.s, ld-m68k/merge-error-1b.s, + * ld-m68k/merge-error-1a.d, ld-m68k/merge-error-1b.d, + * ld-m68k/merge-error-1c.d, ld-m68k/merge-error-1d.d, + * ld-m68k/merge-error-1e.d, ld-m68k/merge-ok-1a.d, + * ld-m68k/merge-ok-1b.d: New tests. + * ld-m68k/m68k.exp: Run them. + 2006-03-22 Richard Sandiford * ld-mips/vxworks1.dd, ld-mips/vxworks1.ld, ld-mips/vxworks1-lib.dd, diff --git a/ld/testsuite/ld-m68k/m68k.exp b/ld/testsuite/ld-m68k/m68k.exp index 5323317486c..a1096a816ba 100644 --- a/ld/testsuite/ld-m68k/m68k.exp +++ b/ld/testsuite/ld-m68k/m68k.exp @@ -45,3 +45,11 @@ set m68k_mergeok_tests { {isab.s isab-float.s} {{objdump -p isab-float.d}} "isab-float"}} run_ld_link_tests $m68k_mergeok_tests + +run_dump_test "merge-error-1a" +run_dump_test "merge-error-1b" +run_dump_test "merge-error-1c" +run_dump_test "merge-error-1d" +run_dump_test "merge-error-1e" +run_dump_test "merge-ok-1a" +run_dump_test "merge-ok-1b" diff --git a/ld/testsuite/ld-m68k/merge-error-1a.d b/ld/testsuite/ld-m68k/merge-error-1a.d new file mode 100644 index 00000000000..ab3ef6e8306 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1a.d @@ -0,0 +1,4 @@ +#source: merge-error-1a.s -mcpu=cpu32 +#source: merge-error-1b.s -mcpu=68000 +#ld: -r +#warning: .* diff --git a/ld/testsuite/ld-m68k/merge-error-1a.s b/ld/testsuite/ld-m68k/merge-error-1a.s new file mode 100644 index 00000000000..ee4894265f2 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1a.s @@ -0,0 +1 @@ + rts diff --git a/ld/testsuite/ld-m68k/merge-error-1b.d b/ld/testsuite/ld-m68k/merge-error-1b.d new file mode 100644 index 00000000000..291d42ff042 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1b.d @@ -0,0 +1,4 @@ +#source: merge-error-1a.s -mcpu=cpu32 +#source: merge-error-1b.s -mcpu=5207 +#ld: -r +#warning: .* diff --git a/ld/testsuite/ld-m68k/merge-error-1b.s b/ld/testsuite/ld-m68k/merge-error-1b.s new file mode 100644 index 00000000000..ee4894265f2 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1b.s @@ -0,0 +1 @@ + rts diff --git a/ld/testsuite/ld-m68k/merge-error-1c.d b/ld/testsuite/ld-m68k/merge-error-1c.d new file mode 100644 index 00000000000..e74528097c3 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1c.d @@ -0,0 +1,4 @@ +#source: merge-error-1a.s -march=isaaplus +#source: merge-error-1b.s -march=isab +#ld: -r +#warning: .* diff --git a/ld/testsuite/ld-m68k/merge-error-1d.d b/ld/testsuite/ld-m68k/merge-error-1d.d new file mode 100644 index 00000000000..310bf4326bd --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1d.d @@ -0,0 +1,4 @@ +#source: merge-error-1a.s -march=isaa -mmac +#source: merge-error-1b.s -march=isaa -memac +#ld: -r +#warning: .* diff --git a/ld/testsuite/ld-m68k/merge-error-1e.d b/ld/testsuite/ld-m68k/merge-error-1e.d new file mode 100644 index 00000000000..87a2bf93f3c --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-error-1e.d @@ -0,0 +1,4 @@ +#source: merge-error-1a.s -march=isaa -mno-div -mmac +#source: merge-error-1b.s -march=isaa -mno-div -memac +#ld: -r +#warning: .* diff --git a/ld/testsuite/ld-m68k/merge-ok-1a.d b/ld/testsuite/ld-m68k/merge-ok-1a.d new file mode 100644 index 00000000000..96da5563d69 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-ok-1a.d @@ -0,0 +1,6 @@ +#source: merge-error-1a.s -mcpu=5207 +#source: merge-error-1b.s -mcpu=528x +#ld: -r +#objdump: -p +#... +private flags = 23: \[isa A\+\] \[emac\] diff --git a/ld/testsuite/ld-m68k/merge-ok-1b.d b/ld/testsuite/ld-m68k/merge-ok-1b.d new file mode 100644 index 00000000000..03ae2587234 --- /dev/null +++ b/ld/testsuite/ld-m68k/merge-ok-1b.d @@ -0,0 +1,6 @@ +#source: merge-error-1a.s -march=isaa -mno-div -mmac +#source: merge-error-1b.s -march=isaa -mno-div -mfloat +#ld: -r +#objdump: -p +#... +private flags = 8051: \[cfv4e\] \[isa A\] \[nodiv\] \[float\] \[mac\] -- 2.30.2