summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@nildram.co.uk>2006-03-25 10:24:27 +0000
committerRichard Sandiford <rsandifo@nildram.co.uk>2006-03-25 10:24:27 +0000
commitcb69142fe06303f058f854170c6cd3fad4649c6f (patch)
treea199159482d2fc05b8248e629f5d89833a15239a
parentfa6a603699ffc3422f69b9f8ab155cba17aaf159 (diff)
downloadbinutils-redhat-cb69142fe06303f058f854170c6cd3fad4649c6f.tar.gz
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.
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/cpu-m68k.c11
-rw-r--r--bfd/elf32-m68k.c94
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-m68k.c4
-rw-r--r--ld/testsuite/ChangeLog9
-rw-r--r--ld/testsuite/ld-m68k/m68k.exp8
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1a.d4
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1a.s1
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1b.d4
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1b.s1
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1c.d4
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1d.d4
-rw-r--r--ld/testsuite/ld-m68k/merge-error-1e.d4
-rw-r--r--ld/testsuite/ld-m68k/merge-ok-1a.d6
-rw-r--r--ld/testsuite/ld-m68k/merge-ok-1b.d6
16 files changed, 93 insertions, 80 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 8f77cc3e41..f8c8590bbb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2006-03-25 Richard Sandiford <richard@codesourcery.com>
+
+ * 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 <bob.wilson@acm.org>
* elf32-xtensa.c (xtensa_read_table_entries): Remove assertion that
diff --git a/bfd/cpu-m68k.c b/bfd/cpu-m68k.c
index 83aaa254c1..366278960a 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 5e69df5c9b..df988a8496 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 4b5091f4cb..b12c4400f5 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2006-03-25 Richard Sandiford <richard@codesourcery.com>
+
+ * config/tc-m68k.c (m68k_cpus): Change cpu_cf5208 entries to use
+ mcfemac instead of mcfmac.
+
2006-03-22 Richard Sandiford <richard@codesourcery.com>
Daniel Jacobowitz <dan@codesourcery.com>
Phil Edwards <phil@codesourcery.com>
diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c
index 8b112631bd..f5646cdc10 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 763c325786..4be03b845a 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2006-03-25 Richard Sandiford <richard@codesourcery.com>
+
+ * 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 <richard@codesourcery.com>
* 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 5323317486..a1096a816b 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 0000000000..ab3ef6e830
--- /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 0000000000..ee4894265f
--- /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 0000000000..291d42ff04
--- /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 0000000000..ee4894265f
--- /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 0000000000..e74528097c
--- /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 0000000000..310bf4326b
--- /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 0000000000..87a2bf93f3
--- /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 0000000000..96da5563d6
--- /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 0000000000..03ae258723
--- /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\]