bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Sat, 25 Mar 2006 10:24:27 +0000 (10:24 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Sat, 25 Mar 2006 10:24:27 +0000 (10:24 +0000)
* 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.

16 files changed:
bfd/ChangeLog
bfd/cpu-m68k.c
bfd/elf32-m68k.c
gas/ChangeLog
gas/config/tc-m68k.c
ld/testsuite/ChangeLog
ld/testsuite/ld-m68k/m68k.exp
ld/testsuite/ld-m68k/merge-error-1a.d [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-error-1a.s [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-error-1b.d [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-error-1b.s [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-error-1c.d [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-error-1d.d [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-error-1e.d [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-ok-1a.d [new file with mode: 0644]
ld/testsuite/ld-m68k/merge-ok-1b.d [new file with mode: 0644]

index 8f77cc3..f8c8590 100644 (file)
@@ -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
index 83aaa25..3662789 100644 (file)
@@ -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.  */
index 5e69df5..df988a8 100644 (file)
@@ -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;
 
index 4b5091f..b12c440 100644 (file)
@@ -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>
index 8b11263..f5646cd 100644 (file)
@@ -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},
index 763c325..4be03b8 100644 (file)
@@ -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,
index 5323317..a1096a8 100644 (file)
@@ -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 (file)
index 0000000..ab3ef6e
--- /dev/null
@@ -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 (file)
index 0000000..ee48942
--- /dev/null
@@ -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 (file)
index 0000000..291d42f
--- /dev/null
@@ -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 (file)
index 0000000..ee48942
--- /dev/null
@@ -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 (file)
index 0000000..e745280
--- /dev/null
@@ -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 (file)
index 0000000..310bf43
--- /dev/null
@@ -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 (file)
index 0000000..87a2bf9
--- /dev/null
@@ -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 (file)
index 0000000..96da556
--- /dev/null
@@ -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 (file)
index 0000000..03ae258
--- /dev/null
@@ -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\]