bfd:
authorNathan Sidwell <nathan@codesourcery.com>
Mon, 6 Mar 2006 13:42:05 +0000 (13:42 +0000)
committerNathan Sidwell <nathan@codesourcery.com>
Mon, 6 Mar 2006 13:42:05 +0000 (13:42 +0000)
* archures.c (bfd_mach_mcf_isa_a_nodiv, bfd_mach_mcf_isa_b_nousp):
New.  Adjust other variants.
(bfd_default_scan): Update.
* bfd-in2.h: Rebuilt.
* cpu-m68k.c: Adjust.
(bfd_m68k_compatible): New. Use it for architectures.
* elf32-m68k.c (elf32_m68k_object_p): Adjust.
(elf32_m68k_merge_private_bfd_data): Adjust.  Correct isa-a/b
mismatch.
(elf32_m68k_print_private_bfd_data): Adjust.
* ieee.c (ieee_write_processor): Adjust.

binutils:
* readelf.c (get_machine_flags): Adjust.

gas:
* config/tc-m68k.c (m68k_extensions): Allow 'float' on both m68k
and cf.
(m68k_ip): <case 'J'> Check we have some control regs.
(md_parse_option): Allow raw arch switch.
(m68k_init_arch): Better detection of arch/cpu mismatch.  Detect
whether 68881 or cfloat was meant by -mfloat.
(md_show_usage): Adjust extension display.
(m68k_elf_final_processing): Adjust.

gas/testsuite:
* gas/m68k/arch-cpu-1.s: Tweak.
* gas/m68k/arch-cpu-1.d: Tweak.

include/elf:
* m68k.h (EF_M68K_ISA_MASK, EF_M68K_ISA_A,
EF_M68K_ISA_A_PLUS, EF_M68K_ISA_B, EF_M68K_ISA_C): Adjust.
(EF_M68K_ISA_A_NODIV, EF_M68K_ISA_B_NOUSP): New.
(EF_M68K_HW_DIV, EF_M68K_USP): Remove.
(EF_M68K_MAC, EF_M68K_EMAC, EF_M68K_FLOAT): Adjust.
(EF_M68K_EMAC_B): New.

ld/testsuite:
* ld-m68k: New tests.

30 files changed:
bfd/ChangeLog
bfd/archures.c
bfd/bfd-in2.h
bfd/cpu-m68k.c
bfd/elf32-m68k.c
bfd/ieee.c
binutils/ChangeLog
binutils/readelf.c
gas/ChangeLog
gas/config/tc-m68k.c
gas/testsuite/ChangeLog
gas/testsuite/gas/m68k/arch-cpu-1.d
gas/testsuite/gas/m68k/arch-cpu-1.s
include/elf/ChangeLog
include/elf/m68k.h
ld/testsuite/ChangeLog
ld/testsuite/ld-m68k/isaa-mac.d [new file with mode: 0644]
ld/testsuite/ld-m68k/isaa-mac.s [new file with mode: 0644]
ld/testsuite/ld-m68k/isaa-nodiv.s [new file with mode: 0644]
ld/testsuite/ld-m68k/isaa.d [new file with mode: 0644]
ld/testsuite/ld-m68k/isaa.s [new file with mode: 0644]
ld/testsuite/ld-m68k/isaaplus.d [new file with mode: 0644]
ld/testsuite/ld-m68k/isaaplus.s [new file with mode: 0644]
ld/testsuite/ld-m68k/isab-float.d [new file with mode: 0644]
ld/testsuite/ld-m68k/isab-float.s [new file with mode: 0644]
ld/testsuite/ld-m68k/isab-nousp.s [new file with mode: 0644]
ld/testsuite/ld-m68k/isab.d [new file with mode: 0644]
ld/testsuite/ld-m68k/isab.s [new file with mode: 0644]
ld/testsuite/ld-m68k/m68k.exp [new file with mode: 0644]
ld/testsuite/ld-m68k/merge.ld [new file with mode: 0644]

index 691d6c4d8cef2baf3087ea1e54f8dc68e629b177..f0c7a8629c405688f01aaad602ee90e771d2fa5d 100644 (file)
@@ -1,3 +1,17 @@
+2006-03-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * archures.c (bfd_mach_mcf_isa_a_nodiv, bfd_mach_mcf_isa_b_nousp):
+       New.  Adjust other variants.
+       (bfd_default_scan): Update.
+       * bfd-in2.h: Rebuilt.
+       * cpu-m68k.c: Adjust.
+       (bfd_m68k_compatible): New. Use it for architectures.
+       * elf32-m68k.c (elf32_m68k_object_p): Adjust.
+       (elf32_m68k_merge_private_bfd_data): Adjust.  Correct isa-a/b
+       mismatch.
+       (elf32_m68k_print_private_bfd_data): Adjust.
+       * ieee.c (ieee_write_processor): Adjust.
+       
 2006-03-06  Alan Modra  <amodra@bigpond.net.au>
 
        * dwarf2.c: Formatting.
index fc2f85ba1c042a0a1c24c33214cb8603acabf6cf..f4080a63a46e10e2b56436d42668d2832327c903 100644 (file)
@@ -80,22 +80,22 @@ DESCRIPTION
 .#define bfd_mach_m68040 6
 .#define bfd_mach_m68060 7
 .#define bfd_mach_cpu32  8
-.#define bfd_mach_mcf_isa_a 9
-.#define bfd_mach_mcf_isa_a_div 10
-.#define bfd_mach_mcf_isa_a_div_mac 11
-.#define bfd_mach_mcf_isa_a_div_emac 12
+.#define bfd_mach_mcf_isa_a_nodiv 9
+.#define bfd_mach_mcf_isa_a 10
+.#define bfd_mach_mcf_isa_a_mac 11
+.#define bfd_mach_mcf_isa_a_emac 12
 .#define bfd_mach_mcf_isa_aplus 13
 .#define bfd_mach_mcf_isa_aplus_mac 14
 .#define bfd_mach_mcf_isa_aplus_emac 15
-.#define bfd_mach_mcf_isa_aplus_usp 16
-.#define bfd_mach_mcf_isa_aplus_usp_mac 17
-.#define bfd_mach_mcf_isa_aplus_usp_emac 18
+.#define bfd_mach_mcf_isa_b_nousp 16
+.#define bfd_mach_mcf_isa_b_nousp_mac 17
+.#define bfd_mach_mcf_isa_b_nousp_emac 18
 .#define bfd_mach_mcf_isa_b 19
 .#define bfd_mach_mcf_isa_b_mac 20
 .#define bfd_mach_mcf_isa_b_emac 21
-.#define bfd_mach_mcf_isa_b_usp_float 22
-.#define bfd_mach_mcf_isa_b_usp_float_mac 23
-.#define bfd_mach_mcf_isa_b_usp_float_emac 24
+.#define bfd_mach_mcf_isa_b_float 22
+.#define bfd_mach_mcf_isa_b_float_mac 23
+.#define bfd_mach_mcf_isa_b_float_emac 24
 .  bfd_arch_vax,       {* DEC Vax *}
 .  bfd_arch_i960,      {* Intel 960 *}
 .    {* The order of the following is important.
@@ -1016,23 +1016,23 @@ bfd_default_scan (const bfd_arch_info_type *info, const char *string)
       break;
     case 5200:
       arch = bfd_arch_m68k;
-      number = bfd_mach_mcf_isa_a;
+      number = bfd_mach_mcf_isa_a_nodiv;
       break;
     case 5206:
       arch = bfd_arch_m68k;
-      number = bfd_mach_mcf_isa_a_div_mac;
+      number = bfd_mach_mcf_isa_a_mac;
       break;
     case 5307:
       arch = bfd_arch_m68k;
-      number = bfd_mach_mcf_isa_a_div_mac;
+      number = bfd_mach_mcf_isa_a_mac;
       break;
     case 5407:
       arch = bfd_arch_m68k;
-      number = bfd_mach_mcf_isa_b_mac;
+      number = bfd_mach_mcf_isa_b_nousp_mac;
       break;
     case 5282:
       arch = bfd_arch_m68k;
-      number = bfd_mach_mcf_isa_b_usp_float_emac;
+      number = bfd_mach_mcf_isa_aplus_emac;
       break;
 
     case 32000:
index cc9eb24344fbb9115e14d691ca246b2735e95a7c..8782bf914cb303a10bee34347cf917a3f4ab9dcd 100644 (file)
@@ -1674,22 +1674,22 @@ enum bfd_architecture
 #define bfd_mach_m68040 6
 #define bfd_mach_m68060 7
 #define bfd_mach_cpu32  8
-#define bfd_mach_mcf_isa_a 9
-#define bfd_mach_mcf_isa_a_div 10
-#define bfd_mach_mcf_isa_a_div_mac 11
-#define bfd_mach_mcf_isa_a_div_emac 12
+#define bfd_mach_mcf_isa_a_nodiv 9
+#define bfd_mach_mcf_isa_a 10
+#define bfd_mach_mcf_isa_a_mac 11
+#define bfd_mach_mcf_isa_a_emac 12
 #define bfd_mach_mcf_isa_aplus 13
 #define bfd_mach_mcf_isa_aplus_mac 14
 #define bfd_mach_mcf_isa_aplus_emac 15
-#define bfd_mach_mcf_isa_aplus_usp 16
-#define bfd_mach_mcf_isa_aplus_usp_mac 17
-#define bfd_mach_mcf_isa_aplus_usp_emac 18
+#define bfd_mach_mcf_isa_b_nousp 16
+#define bfd_mach_mcf_isa_b_nousp_mac 17
+#define bfd_mach_mcf_isa_b_nousp_emac 18
 #define bfd_mach_mcf_isa_b 19
 #define bfd_mach_mcf_isa_b_mac 20
 #define bfd_mach_mcf_isa_b_emac 21
-#define bfd_mach_mcf_isa_b_usp_float 22
-#define bfd_mach_mcf_isa_b_usp_float_mac 23
-#define bfd_mach_mcf_isa_b_usp_float_emac 24
+#define bfd_mach_mcf_isa_b_float 22
+#define bfd_mach_mcf_isa_b_float_mac 23
+#define bfd_mach_mcf_isa_b_float_emac 24
   bfd_arch_vax,       /* DEC Vax */
   bfd_arch_i960,      /* Intel 960 */
     /* The order of the following is important.
index 93b60f969ba2723031aa064ff404fbf5c68d6d79..83aaa254c1fcebce9a2ef4a4c9212d1fafd28758 100644 (file)
 #include "libbfd.h"
 #include "opcode/m68k.h"
 
+static const bfd_arch_info_type *
+bfd_m68k_compatible (const bfd_arch_info_type *a,
+                    const bfd_arch_info_type *b);
+
 #define N(name, print,d,next)  \
-{  32, 32, 8, bfd_arch_m68k, name, "m68k",print,2,d,bfd_default_compatible,bfd_default_scan, next, }
+{  32, 32, 8, bfd_arch_m68k, name, "m68k",print,2,d,bfd_m68k_compatible,bfd_default_scan, next, }
 
 static const bfd_arch_info_type arch_info_struct[] =
   {
@@ -39,25 +43,25 @@ static const bfd_arch_info_type arch_info_struct[] =
     N(bfd_mach_cpu32,   "m68k:cpu32", FALSE, &arch_info_struct[8]),
 
     /* Various combinations of CF architecture features */
-    N(bfd_mach_mcf_isa_a, "m68k:isa-a",
+    N(bfd_mach_mcf_isa_a_nodiv, "m68k:isa-a:nodiv",
       FALSE, &arch_info_struct[9]),
-    N(bfd_mach_mcf_isa_a_div, "m68k:isa-a:div",
+    N(bfd_mach_mcf_isa_a, "m68k:isa-a",
       FALSE, &arch_info_struct[10]),
-    N(bfd_mach_mcf_isa_a_div_mac, "m68k:isa-a:div:mac",
+    N(bfd_mach_mcf_isa_a_mac, "m68k:isa-a:mac",
       FALSE, &arch_info_struct[11]),
-    N(bfd_mach_mcf_isa_a_div_emac, "m68k:isa-a:div:emac",
+    N(bfd_mach_mcf_isa_a_emac, "m68k:isa-a:emac",
       FALSE, &arch_info_struct[12]),
-    N(bfd_mach_mcf_isa_aplus, "m68k:isa-a+",
+    N(bfd_mach_mcf_isa_aplus, "m68k:isa-aplus",
       FALSE, &arch_info_struct[13]),
-    N(bfd_mach_mcf_isa_aplus_mac, "m68k:isa-a+:mac",
+    N(bfd_mach_mcf_isa_aplus_mac, "m68k:isa-aplus:mac",
       FALSE, &arch_info_struct[14]),
-    N(bfd_mach_mcf_isa_aplus_emac, "m68k:isa-a+:emac",
+    N(bfd_mach_mcf_isa_aplus_emac, "m68k:isa-aplus:emac",
       FALSE, &arch_info_struct[15]),
-    N(bfd_mach_mcf_isa_aplus_usp, "m68k:isa-a+:usp",
+    N(bfd_mach_mcf_isa_b_nousp, "m68k:isa-b:nousp",
       FALSE, &arch_info_struct[16]),
-    N(bfd_mach_mcf_isa_aplus_usp_mac, "m68k:isa-a+:usp:mac",
+    N(bfd_mach_mcf_isa_b_nousp_mac, "m68k:isa-b:nousp:mac",
       FALSE, &arch_info_struct[17]),
-    N(bfd_mach_mcf_isa_aplus_usp_emac, "m68k:isa-a+:usp:emac",
+    N(bfd_mach_mcf_isa_b_nousp_emac, "m68k:isa-b:nousp:emac",
       FALSE, &arch_info_struct[18]),
     N(bfd_mach_mcf_isa_b, "m68k:isa-b",
       FALSE, &arch_info_struct[19]),
@@ -65,28 +69,26 @@ static const bfd_arch_info_type arch_info_struct[] =
       FALSE, &arch_info_struct[20]),
     N(bfd_mach_mcf_isa_b_emac, "m68k:isa-b:emac",
       FALSE, &arch_info_struct[21]),
-    N(bfd_mach_mcf_isa_b_usp_float, "m68k:isa-b:usp:float",
+    N(bfd_mach_mcf_isa_b_float, "m68k:isa-b:float",
       FALSE, &arch_info_struct[22]),
-    N(bfd_mach_mcf_isa_b_usp_float_mac, "m68k:isa-b:usp:float:mac",
+    N(bfd_mach_mcf_isa_b_float_mac, "m68k:isa-b:float:mac",
       FALSE, &arch_info_struct[23]),
-    N(bfd_mach_mcf_isa_b_usp_float_emac, "m68k:isa-b:usp:float:emac",
+    N(bfd_mach_mcf_isa_b_float_emac, "m68k:isa-b:float:emac",
       FALSE, &arch_info_struct[24]),
 
     /* Legacy names for CF architectures */
-    N(bfd_mach_mcf_isa_a, "m68k:5200",  FALSE, &arch_info_struct[25]),
-    N(bfd_mach_mcf_isa_a_div_mac,"m68k:5206e", FALSE, &arch_info_struct[26]),
-    N(bfd_mach_mcf_isa_a_div_mac, "m68k:5307",  FALSE, &arch_info_struct[27]),
-    N(bfd_mach_mcf_isa_b_mac, "m68k:5407",  FALSE, &arch_info_struct[28]),
-    N(bfd_mach_mcf_isa_aplus_usp_emac, "m68k:528x",
-      FALSE, &arch_info_struct[29]),
-    N(bfd_mach_mcf_isa_aplus_usp_emac, "m68k:521x",
-      FALSE, &arch_info_struct[30]),
-    N(bfd_mach_mcf_isa_a_div_emac, "m68k:5249",  FALSE, &arch_info_struct[31]),
-    N(bfd_mach_mcf_isa_b_usp_float_emac, "m68k:547x",
+    N(bfd_mach_mcf_isa_a_nodiv, "m68k:5200", FALSE, &arch_info_struct[25]),
+    N(bfd_mach_mcf_isa_a_mac,"m68k:5206e", FALSE, &arch_info_struct[26]),
+    N(bfd_mach_mcf_isa_a_mac, "m68k:5307", FALSE, &arch_info_struct[27]),
+    N(bfd_mach_mcf_isa_b_nousp_mac, "m68k:5407", FALSE, &arch_info_struct[28]),
+    N(bfd_mach_mcf_isa_aplus_emac, "m68k:528x", FALSE, &arch_info_struct[29]),
+    N(bfd_mach_mcf_isa_aplus_emac, "m68k:521x", FALSE, &arch_info_struct[30]),
+    N(bfd_mach_mcf_isa_a_emac, "m68k:5249", FALSE, &arch_info_struct[31]),
+    N(bfd_mach_mcf_isa_b_float_emac, "m68k:547x",
       FALSE, &arch_info_struct[32]),
-    N(bfd_mach_mcf_isa_b_usp_float_emac, "m68k:548x",
+    N(bfd_mach_mcf_isa_b_float_emac, "m68k:548x",
       FALSE, &arch_info_struct[33]),
-    N(bfd_mach_mcf_isa_b_usp_float_emac,  "m68k:cfv4e", FALSE, 0),
+    N(bfd_mach_mcf_isa_b_float_emac, "m68k:cfv4e", FALSE, 0),
   };
 
 const bfd_arch_info_type bfd_m68k_arch =
@@ -109,15 +111,15 @@ static const unsigned m68k_arch_features[] =
   mcfisa_a|mcfhwdiv,
   mcfisa_a|mcfhwdiv|mcfmac,
   mcfisa_a|mcfhwdiv|mcfemac,
-  mcfisa_a|mcfisa_aa|mcfhwdiv,
-  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac,
-  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,
   mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp,
   mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp|mcfmac,
   mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp|mcfemac,
   mcfisa_a|mcfhwdiv|mcfisa_b,
   mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac,
   mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac,
+  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp,
+  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|mcfmac,
+  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|mcfemac,
   mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat,
   mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfmac,
   mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfemac,
@@ -181,3 +183,36 @@ int bfd_m68k_features_to_mach (unsigned features)
     }
   return superset ? superset : subset;
 }
+
+static const bfd_arch_info_type *
+bfd_m68k_compatible (const bfd_arch_info_type *a,
+                    const bfd_arch_info_type *b)
+{
+  if (a->arch != b->arch)
+    return NULL;
+
+  if (a->bits_per_word != b->bits_per_word)
+    return NULL;
+
+  if (!a->mach)
+    return b;
+  if (!b->mach)
+    return a;
+  
+  if (a->mach <= bfd_mach_m68060 && b->mach <= bfd_mach_m68060)
+    /* Merge m68k machine. */
+    return a->mach > b->mach ? a : b;
+  else if (a->mach >= bfd_mach_mcf_isa_a_nodiv
+          && b->mach >= bfd_mach_mcf_isa_a_nodiv)
+    {
+      /* 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);
+    }
+  else
+    /* They are incompatible.  */
+    return NULL;
+}
index 98b0b12229a1aebf0e5fab2bc2707da080b5ac90..978dbd22d94703f2ea36f1b18148b3a0b076ab12 100644 (file)
@@ -390,18 +390,22 @@ elf32_m68k_object_p (bfd *abfd)
     {
       switch (eflags & EF_M68K_ISA_MASK)
        {
-       case EF_M68K_ISA_B:
-         features |= mcfisa_b;
-         /* FALLTHROUGH */
-       case EF_M68K_ISA_A_PLUS:
-         features |= mcfisa_aa;
-         /* FALLTHROUGH */
-       case EF_M68K_ISA_A:
+       case EF_M68K_ISA_A_NODIV:
          features |= mcfisa_a;
          break;
+       case EF_M68K_ISA_A:
+         features |= mcfisa_a|mcfhwdiv;
+         break;
+       case EF_M68K_ISA_A_PLUS:
+         features |= mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp;
+         break;
+       case EF_M68K_ISA_B_NOUSP:
+         features |= mcfisa_a|mcfisa_b|mcfhwdiv;
+         break;
+       case EF_M68K_ISA_B:
+         features |= mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp;
+         break;
        }
-      if (eflags & EF_M68K_HW_DIV)
-       features |= mcfhwdiv;
       switch (eflags & EF_M68K_MAC_MASK)
        {
        case EF_M68K_MAC:
@@ -411,8 +415,6 @@ elf32_m68k_object_p (bfd *abfd)
          features |= mcfemac;
          break;
        }
-      if (eflags & EF_M68K_USP)
-       features |= mcfusp;
       if (eflags & EF_M68K_FLOAT)
        features |= cfloat;
     }
@@ -462,7 +464,8 @@ elf32_m68k_merge_private_bfd_data (ibfd, obfd)
          if (in_mach > out_mach)
            out_mach = in_mach;
        }
-      else if (in_mach >= bfd_mach_mcf_isa_a && out_mach >= bfd_mach_mcf_isa_a)
+      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)
@@ -483,27 +486,37 @@ 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 (((in_flags | out_flags) & EF_M68K_ISA_MASK)
+      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 (in_flags & EF_M68K_ISA_MASK)
+      if (isa_in)
        {
-         if (out_flags & EF_M68K_ISA_MASK)
+         if (isa_out)
            {
-             /* Merge cf specific flags */
-             if ((in_flags & EF_M68K_ISA_MASK)
-                 > (out_flags & EF_M68K_ISA_MASK))
-               {
-                 out_flags ^= out_flags & EF_M68K_ISA_MASK;
-                 out_flags |= in_flags & EF_M68K_ISA_MASK;
-               }
-             out_flags |= in_flags
-               & (EF_M68K_HW_DIV | EF_M68K_USP | EF_M68K_FLOAT);
+             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))
@@ -559,22 +572,31 @@ elf32_m68k_print_private_bfd_data (abfd, ptr)
     {
       char const *isa = _("unknown");
       char const *mac = _("unknown");
+      char const *additional = "";
       
       switch (eflags & EF_M68K_ISA_MASK)
        {
+       case EF_M68K_ISA_A_NODIV:
+         isa = "A";
+         additional = " [nodiv]";
+         break;
        case EF_M68K_ISA_A:
          isa = "A";
          break;
        case EF_M68K_ISA_A_PLUS:
          isa = "A+";
          break;
+       case EF_M68K_ISA_B_NOUSP:
+         isa = "B";
+         additional = " [nousp]";
+         break;
        case EF_M68K_ISA_B:
          isa = "B";
          break;
        }
-      fprintf (file, " [isa %s]", isa);
-      if (eflags & EF_M68K_HW_DIV)
-       fprintf (file, " [hwdiv]");
+      fprintf (file, " [isa %s]%s", isa, additional);
+      if (eflags & EF_M68K_FLOAT)
+       fprintf (file, " [float]");
       switch (eflags & EF_M68K_MAC_MASK)
        {
        case 0:
@@ -589,10 +611,6 @@ elf32_m68k_print_private_bfd_data (abfd, ptr)
        }
       if (mac)
        fprintf (file, " [%s]", mac);
-      if (eflags & EF_M68K_USP)
-       fprintf (file, " [usp");
-      if (eflags & EF_M68K_FLOAT)
-       fprintf (file, " [float]");
     }
   
   fputc ('\n', file);
index 248551f04b34f551b6a4f5bb7530607104904b37..be8455c617f868221a47c392275bdab5ab060a87 100644 (file)
@@ -3466,22 +3466,22 @@ ieee_write_processor (bfd *abfd)
          case bfd_mach_m68040: id = "68040"; break;
          case bfd_mach_m68060: id = "68060"; break;
          case bfd_mach_cpu32:  id = "cpu32"; break;
+         case bfd_mach_mcf_isa_a_nodiv: id = "isa-a:nodiv"; break;
          case bfd_mach_mcf_isa_a: id = "isa-a"; break;
-         case bfd_mach_mcf_isa_a_div: id = "isa-a:div"; break;
-         case bfd_mach_mcf_isa_a_div_mac: id = "isa-a:div:mac"; break;
-         case bfd_mach_mcf_isa_a_div_emac: id = "isa-a:div:emac"; break;
-         case bfd_mach_mcf_isa_aplus: id = "isa-a+"; break;
-         case bfd_mach_mcf_isa_aplus_mac: id = "isa-a+:mac"; break;
-         case bfd_mach_mcf_isa_aplus_emac: id = "isa-a+:mac"; break;
-         case bfd_mach_mcf_isa_aplus_usp: id = "isa-a+:usp"; break;
-         case bfd_mach_mcf_isa_aplus_usp_mac: id = "isa-a+:usp:mac"; break;
-         case bfd_mach_mcf_isa_aplus_usp_emac: id = "isa-a+:usp:emac"; break;
+         case bfd_mach_mcf_isa_a_mac: id = "isa-a:mac"; break;
+         case bfd_mach_mcf_isa_a_emac: id = "isa-a:emac"; break;
+         case bfd_mach_mcf_isa_aplus: id = "isa-aplus"; break;
+         case bfd_mach_mcf_isa_aplus_mac: id = "isa-aplus:mac"; break;
+         case bfd_mach_mcf_isa_aplus_emac: id = "isa-aplus:mac"; break;
+         case bfd_mach_mcf_isa_b_nousp: id = "isa-b:nousp"; break;
+         case bfd_mach_mcf_isa_b_nousp_mac: id = "isa-b:nousp:mac"; break;
+         case bfd_mach_mcf_isa_b_nousp_emac: id = "isa-b:nousp:emac"; break;
          case bfd_mach_mcf_isa_b: id = "isa-b"; break;
          case bfd_mach_mcf_isa_b_mac: id = "isa-b:mac"; break;
          case bfd_mach_mcf_isa_b_emac: id = "isa-b:emac"; break;
-         case bfd_mach_mcf_isa_b_usp_float: id = "isa-b:usp:float"; break;
-         case bfd_mach_mcf_isa_b_usp_float_mac: id = "isa-b:usp:float:mac"; break;
-         case bfd_mach_mcf_isa_b_usp_float_emac: id = "isa-b:usp:float:emac"; break;
+         case bfd_mach_mcf_isa_b_float: id = "isa-b:float"; break;
+         case bfd_mach_mcf_isa_b_float_mac: id = "isa-b:float:mac"; break;
+         case bfd_mach_mcf_isa_b_float_emac: id = "isa-b:float:emac"; break;
          }
 
        if (! ieee_write_id (abfd, id))
index 85c5b667cd5c8b5afc1ccfc574ee719d4a6309f2..34ab9fe790c8f589b8734fd194002bfa060ec1b0 100644 (file)
@@ -1,3 +1,7 @@
+2006-03-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * readelf.c (get_machine_flags): Adjust.
+
 2006-03-03  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf.c (frame_display_row, display_debug_frames): Handle
index 192ddcff9697066e534932e6781eda8f8ae79533..dcd02bca218b0594744e0bb156c064184740cb55 100644 (file)
@@ -1949,23 +1949,34 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
            {
              char const *isa = _("unknown");
              char const *mac = _("unknown mac");
+             char const *additional = NULL;
       
              switch (e_flags & EF_M68K_ISA_MASK)
                {
+               case EF_M68K_ISA_A_NODIV:
+                 isa = "A";
+                 additional = ", nodiv";
+                 break;
                case EF_M68K_ISA_A:
                  isa = "A";
                  break;
                case EF_M68K_ISA_A_PLUS:
                  isa = "A+";
                  break;
+               case EF_M68K_ISA_B_NOUSP:
+                 isa = "B";
+                 additional = ", nousp";
+                 break;
                case EF_M68K_ISA_B:
                  isa = "B";
                  break;
                }
              strcat (buf, ", cf, isa ");
              strcat (buf, isa);
-             if (e_flags & EF_M68K_HW_DIV)
-               strcat (buf, ", hwdiv");
+             if (additional)
+               strcat (buf, additional);
+             if (e_flags & EF_M68K_FLOAT)
+               strcat (buf, ", float");
              switch (e_flags & EF_M68K_MAC_MASK)
                {
                case 0:
@@ -1983,10 +1994,6 @@ get_machine_flags (unsigned e_flags, unsigned e_machine)
                  strcat (buf, ", ");
                  strcat (buf, mac);
                }
-             if (e_flags & EF_M68K_USP)
-               strcat (buf, ", usp");
-             if (e_flags & EF_M68K_FLOAT)
-               strcat (buf, ", float");
            }
          break;
 
index 1347fae069659af6ab7182c963b93c5f13734a07..709e66b0a4d79eef98828a94d3beeaa1166ebf77 100644 (file)
@@ -1,3 +1,14 @@
+2006-03-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * config/tc-m68k.c (m68k_extensions): Allow 'float' on both m68k
+       and cf.
+       (m68k_ip): <case 'J'> Check we have some control regs.
+       (md_parse_option): Allow raw arch switch.
+       (m68k_init_arch): Better detection of arch/cpu mismatch.  Detect
+       whether 68881 or cfloat was meant by -mfloat.
+       (md_show_usage): Adjust extension display.
+       (m68k_elf_final_processing): Adjust.
+
 2006-03-03  Bjoern Haase  <bjoern.m.haase@web.de>
 
        * config/tc-avr.c (avr_mod_hash_value): New function.
index b7fb25c1fd42bcb235168bbe451d6ffec06cd4fa..8b112631bd891e85d24bd63f46d39b0f6fc40874 100644 (file)
@@ -368,7 +368,11 @@ struct m68k_cpu
   unsigned long arch;  /* Architecture features.  */
   unsigned long chip;  /* Specific chip */
   const char *name;    /* Name */
-  unsigned alias;
+  int alias;           /* Alias for a cannonical name.  If 1, then
+                          succeeds canonical name, if -1 then
+                          succeeds canonical name, if <-1 ||>1 this is a
+                          deprecated name, and the next/previous name
+                          should be used. */
 };
 
 /* We hold flags for features explicitly enabled and explicitly
@@ -391,23 +395,25 @@ static const struct m68k_cpu m68k_archs[] =
   {m68060,                                     cpu_m68060, "68060", 0},
   {cpu32|m68881,                               cpu_cpu32, "cpu32", 0},
   {mcfisa_a|mcfhwdiv,                          0, "isaa", 0},
-  {mcfisa_a|mcfhwdiv|mcfisa_aa,                        0, "isaaplus", 0},
-  {mcfisa_a|mcfhwdiv|mcfisa_b,                 0, "isab", 0},
+  {mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp,         0, "isaaplus", 0},
+  {mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp,          0, "isab", 0},
   {mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat,
    cpu_cf547x, "cfv4e", 0},
   {0,0,NULL, 0}
 };
 
-/* Architecture extensions.  */
+/* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
+   for either.  */
 static const struct m68k_cpu m68k_extensions[] =
 {
-  {m68851,                                     0, "68851", 0},
-  {m68881,                                     0, "68881", 0},
-  {m68881,                                     0, "68882", 0},
+  {m68851,                                     0, "68851", -1},
+  {m68881,                                     0, "68881", -1},
+  {m68881,                                     0, "68882", -1},
+  
+  {cfloat|m68881,                              0, "float", 0},
   
   {mcfhwdiv,                                   0, "div", 1},
   {mcfusp,                                     0, "usp", 1},
-  {cfloat,                                     0, "float", 1},
   {mcfmac,                                     0, "mac", 1},
   {mcfemac,                                    0, "emac", 1},
    
@@ -426,13 +432,13 @@ 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,        cpu_cf5208, "5208", 0},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac,        cpu_cf5213, "5213", 0},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|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},
   { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,cpu_cf528x, "528x", 0},
   { mcfisa_a|mcfhwdiv|mcfmac,                  cpu_cf5307, "5307", 0},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,       cpu_cf5329, "5329", 0},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf5329, "5329", 0},
   { mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac, cpu_cf5407, "5407",0},
   { mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat,
     cpu_cf547x, "547x", 0},
@@ -467,16 +473,16 @@ 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,                cpu_cf5208, "5207", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac,                cpu_cf5213, "5211", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac,                cpu_cf5213, "5212", 1},
-  { mcfisa_a|mcfhwdiv|mcfisa_aa|mcfemac,       cpu_cf521x, "5214", 1},
-  { mcfisa_a|mcfhwdiv|mcfisa_aa|mcfemac,       cpu_cf521x, "5216", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,       cpu_cf5329, "5327", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,       cpu_cf5329, "5328", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,       cpu_cf528x, "5280", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,       cpu_cf528x, "5281", 1},
-  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac,       cpu_cf528x, "5282", 1},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|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},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf521x, "5216", 1},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf5329, "5327", 1},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf5329, "5328", 1},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf528x, "5280", 1},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf528x, "5281", 1},
+  { mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,        cpu_cf528x, "5282", 1},
   { mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac, cpu_cf5407,     "cfv4", 1 },
   { mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat,
     cpu_cf547x, "cfv4e", 1 },
@@ -1700,11 +1706,13 @@ m68k_ip (char *instring)
                case 'J':
                  if (opP->mode != CONTROL
                      || opP->reg < USP
-                     || opP->reg > last_movec_reg)
+                     || opP->reg > last_movec_reg
+                     || !control_regs)
                    losing++;
                  else
                    {
                      const enum m68k_register *rp;
+                     
                      for (rp = control_regs; *rp; rp++)
                        if (*rp == opP->reg)
                          break;
@@ -7271,6 +7279,8 @@ md_parse_option (int c, char *arg)
        m68k_set_cpu (arg + 4, 1, 0);
       else if (m68k_set_extension (arg, 0, 1))
        ;
+      else if (m68k_set_arch (arg, 0, 1))
+       ;
       else if (m68k_set_cpu (arg, 0, 1))
        ;
       else
@@ -7289,35 +7299,42 @@ md_parse_option (int c, char *arg)
 static void
 m68k_init_arch (void)
 {
-  unsigned arch_of_chip = 0;
-  
   if (not_current_architecture & current_architecture)
     {
       as_bad (_("architecture features both enabled and disabled"));
       not_current_architecture &= ~current_architecture;
     }
   if (selected_arch)
+    current_architecture |= selected_arch->arch;
+  else
+    current_architecture |= selected_cpu->arch;
+
+  current_architecture &= ~not_current_architecture;
+  
+  if (selected_cpu)
     {
-      arch_of_chip = selected_arch->arch;
-      current_chip = selected_arch->chip;
-      if (selected_cpu && (arch_of_chip & ~selected_cpu->arch))
+      if (current_architecture & ~selected_cpu->arch)
        {
-         as_bad (_("selected processor is not from selected architecture"));
-         arch_of_chip = selected_cpu->arch;
+         as_bad (_("selected processor does not have all features of selected architecture"));
+         current_architecture
+           = selected_cpu->arch & ~not_current_architecture;
        }
     }
-  else
-    arch_of_chip = selected_cpu->arch;
-  if (selected_cpu)
-    current_chip = selected_cpu->chip;
 
-  current_architecture |= arch_of_chip;
-  current_architecture &= ~not_current_architecture;
+  if ((current_architecture & (cfloat | m68881)) == (cfloat | m68881))
+    {
+      /* Determine which float is really meant.  */
+      if (current_architecture & (m68k_mask & ~m68881))
+       current_architecture ^= cfloat;
+      else
+       current_architecture ^= m68881;
+    }
+
   if ((current_architecture & m68k_mask)
       && (current_architecture & ~m68k_mask))
     {
       as_bad (_ ("m68k and cf features both selected"));
-      if (arch_of_chip & m68k_mask)
+      if (current_architecture & m68k_mask)
        current_architecture &= m68k_mask;
       else
        current_architecture &= ~m68k_mask;
@@ -7375,8 +7392,10 @@ md_show_usage (FILE *stream)
 "), default_cpu);
   for (i = 0; m68k_extensions[i].name; i++)
     fprintf (stream, _("\
--m[no-]%-16s enable/disable %s architecture extension\n\
-"), m68k_extensions[i].name, m68k_extensions[i].alias ? "ColdFire" : "m68k");
+-m[no-]%-16s enable/disable%s architecture extension\n\
+"), m68k_extensions[i].name,
+            m68k_extensions[i].alias > 0 ? " ColdFire"
+            : m68k_extensions[i].alias < 0 ? " m68k" : "");
   
   fprintf (stream, _("\
 -l                     use 1 word for refs to undefined symbols [default 2]\n\
@@ -7568,27 +7587,59 @@ m68k_elf_final_processing (void)
   
   if (current_architecture & mcfisa_a)
     {
-      /* Set coldfire specific elf flags */
-      if (current_architecture & mcfisa_b)
-       flags |= EF_M68K_ISA_B;
-      else if (current_architecture & mcfisa_aa)
-       flags |= EF_M68K_ISA_A_PLUS;
-      else
-       flags |= EF_M68K_ISA_A;
-
-      if (current_architecture & mcfhwdiv)
-       flags |= EF_M68K_HW_DIV;
-
-      if (current_architecture & mcfusp)
-       flags |= EF_M68K_USP;
+      static const unsigned isa_features[][2] =
+      {
+       {EF_M68K_ISA_A_NODIV, mcfisa_a},
+       {EF_M68K_ISA_A, mcfisa_a|mcfhwdiv},
+       {EF_M68K_ISA_A_PLUS,mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp},
+       {EF_M68K_ISA_B_NOUSP,mcfisa_a|mcfisa_b|mcfhwdiv},
+       {EF_M68K_ISA_B, mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp},
+       {0,0},
+      };
+      static const unsigned mac_features[][2] =
+      {
+       {EF_M68K_MAC, mcfmac},
+       {EF_M68K_EMAC, mcfemac},
+       {0,0},
+      };
+      unsigned ix;
+      unsigned pattern;
       
-      if (current_architecture & cfloat)
-       flags |= EF_M68K_FLOAT;
+      pattern = (current_architecture
+                & (mcfisa_a|mcfisa_aa|mcfisa_b|mcfhwdiv|mcfusp));
+      for (ix = 0; isa_features[ix][1]; ix++)
+       {
+         if (pattern == isa_features[ix][1])
+           {
+             flags |= isa_features[ix][0];
+             break;
+           }
+       }
+      if (!isa_features[ix][1])
+       {
+       cf_bad:
+         as_warn (_("Not a defined coldfire architecture"));
+       }
+      else
+       {
+         if (current_architecture & cfloat)
+           flags |= EF_M68K_FLOAT | EF_M68K_CFV4E;
 
-      if (current_architecture & mcfmac)
-       flags |= EF_M68K_MAC;
-      else if (current_architecture & mcfemac)
-       flags |= EF_M68K_EMAC;
+         pattern = current_architecture & (mcfmac|mcfemac);
+         if (pattern)
+           {
+             for (ix = 0; mac_features[ix][1]; ix++)
+               {
+                 if (pattern == mac_features[ix][1])
+                   {
+                     flags |= mac_features[ix][0];
+                     break;
+                   }
+               }
+             if (!mac_features[ix][1])
+               goto cf_bad;
+           }
+       }
     }
   elf_elfheader (stdoutput)->e_flags |= flags;
 }
index 7f91b24a99fcaa069f3ea736672f6868788a8696..28adf506561e5af17507cd1e8870332521ed49f5 100644 (file)
@@ -1,3 +1,8 @@
+2006-03-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * gas/m68k/arch-cpu-1.s: Tweak.
+       * gas/m68k/arch-cpu-1.d: Tweak.
+
 2006-02-28  Jan Beulich  <jbeulich@novell.com>
 
        * gas/all/altmacro.s: Adjust.
index 4195926bd7cd47500cbefcc1e9645db387d56735..421010d083921975f46da23bc806a0511642f2d6 100644 (file)
@@ -3,7 +3,7 @@
 
 
 .*:     file format elf32-m68k
-private flags = 22: \[isa A\+\] \[emac\]
+private flags = 21: \[isa A\] \[nodiv\] \[emac\]
 
 Disassembly of section .text:
 
index e0bfead5b17ffdc9e86fa33d581a2a617ba6d6ad..48d621bd69b646c685e892b26ff2cfa1a460ef2e 100644 (file)
@@ -1,4 +1,4 @@
-       .arch  isaaplus,no-div,emac
+       .arch  isaa,no-div,emac
        .cpu 5329
 
        mac.w   %d1l,%a1u,<<,%acc0
index 27665852b0d1fd37ce7381aa517316c50e2535a8..3270871cd29a785d1eaa9bbae61ae1edb0dbcb9d 100644 (file)
@@ -1,3 +1,12 @@
+2006-03-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * m68k.h (EF_M68K_ISA_MASK, EF_M68K_ISA_A,
+       EF_M68K_ISA_A_PLUS, EF_M68K_ISA_B, EF_M68K_ISA_C): Adjust.
+       (EF_M68K_ISA_A_NODIV, EF_M68K_ISA_B_NOUSP): New.
+       (EF_M68K_HW_DIV, EF_M68K_USP): Remove.
+       (EF_M68K_MAC, EF_M68K_EMAC, EF_M68K_FLOAT): Adjust.
+       (EF_M68K_EMAC_B): New.
+
 2006-03-03  Bjoern Haase  <bjoern.m.haase@web.de>
 
        * avr.h (R_AVR_MS8_LDI,R_AVR_MS8_LDI_NEG): Add.
index 929cd60f482d2fe74a39d795b7854837f444c8b4..08d0c441988be7e5f7d3a6322a6440a8cca5a724 100644 (file)
@@ -58,16 +58,18 @@ END_RELOC_NUMBERS (R_68K_max)
 
 /* We use the bottom 8 bits to encode information about the
    coldfire variant.  */
-#define EF_M68K_ISA_MASK       0x07  /* Which ISA */
-#define EF_M68K_ISA_A          0x01
-#define EF_M68K_ISA_A_PLUS     0x02
-#define EF_M68K_ISA_B          0x03
-#define EF_M68K_HW_DIV         0x08  /* Has HW divide */
+#define EF_M68K_ISA_MASK       0x0F  /* Which ISA */
+#define EF_M68K_ISA_A_NODIV    0x01  /* ISA A except for div */
+#define EF_M68K_ISA_A          0x02
+#define EF_M68K_ISA_A_PLUS     0x03
+#define EF_M68K_ISA_B_NOUSP    0x04  /* ISA_B except for USP */
+#define EF_M68K_ISA_B          0x05
+#define EF_M68K_ISA_C          0x06
 #define EF_M68K_MAC_MASK       0x30 
-#define EF_M68K_MAC            0x10  /* Has MAC */
-#define EF_M68K_EMAC           0x20  /* Has EMAC */
-#define EF_M68K_USP            0x40  /* Has USP insns */
-#define EF_M68K_FLOAT          0x80  /* Has float insns */
+#define EF_M68K_MAC            0x10  /* MAC */
+#define EF_M68K_EMAC           0x20  /* EMAC */
+#define EF_M68K_EMAC_B         0x30  /* EMAC_B */
+#define EF_M68K_FLOAT          0x40  /* Has float insns */
 #define EF_M68K_CF_MASK                0xFF
      
 #endif
index a8e2d96041d598a06b42a116a82631dba8bc348d..aacef8feda06fae892fe43a445e74b5fac8f0c4a 100644 (file)
@@ -1,3 +1,7 @@
+2006-03-06  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * ld-m68k: New tests.
+
 2006-03-03  Richard Sandiford  <richard@codesourcery.com>
 
        * ld-i386/vxworks1-static.d, ld-i386/vxworks2.s,
diff --git a/ld/testsuite/ld-m68k/isaa-mac.d b/ld/testsuite/ld-m68k/isaa-mac.d
new file mode 100644 (file)
index 0000000..79b809a
--- /dev/null
@@ -0,0 +1,7 @@
+
+.*:     file format elf32-m68k
+
+Program Header:
+#...
+private flags = 12: \[isa A\] \[mac\]
+
diff --git a/ld/testsuite/ld-m68k/isaa-mac.s b/ld/testsuite/ld-m68k/isaa-mac.s
new file mode 100644 (file)
index 0000000..e3ec277
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isaa,mac
+
+       nop
diff --git a/ld/testsuite/ld-m68k/isaa-nodiv.s b/ld/testsuite/ld-m68k/isaa-nodiv.s
new file mode 100644 (file)
index 0000000..de327f1
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isaa,no-div
+
+       nop
diff --git a/ld/testsuite/ld-m68k/isaa.d b/ld/testsuite/ld-m68k/isaa.d
new file mode 100644 (file)
index 0000000..48e4fa2
--- /dev/null
@@ -0,0 +1,7 @@
+
+.*:     file format elf32-m68k
+
+Program Header:
+#...
+private flags = 2: \[isa A\]
+
diff --git a/ld/testsuite/ld-m68k/isaa.s b/ld/testsuite/ld-m68k/isaa.s
new file mode 100644 (file)
index 0000000..f4675c1
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isaa
+
+       nop
diff --git a/ld/testsuite/ld-m68k/isaaplus.d b/ld/testsuite/ld-m68k/isaaplus.d
new file mode 100644 (file)
index 0000000..88623ce
--- /dev/null
@@ -0,0 +1,7 @@
+
+.*:     file format elf32-m68k
+
+Program Header:
+#...
+private flags = 3: \[isa A\+\]
+
diff --git a/ld/testsuite/ld-m68k/isaaplus.s b/ld/testsuite/ld-m68k/isaaplus.s
new file mode 100644 (file)
index 0000000..5b0a0b8
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isaaplus
+
+       nop
diff --git a/ld/testsuite/ld-m68k/isab-float.d b/ld/testsuite/ld-m68k/isab-float.d
new file mode 100644 (file)
index 0000000..3547ea7
--- /dev/null
@@ -0,0 +1,7 @@
+
+.*:     file format elf32-m68k
+
+Program Header:
+#...
+private flags = 8045: \[cfv4e\] \[isa B\] \[float\]
+
diff --git a/ld/testsuite/ld-m68k/isab-float.s b/ld/testsuite/ld-m68k/isab-float.s
new file mode 100644 (file)
index 0000000..3889d0d
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isab,float
+
+       nop
diff --git a/ld/testsuite/ld-m68k/isab-nousp.s b/ld/testsuite/ld-m68k/isab-nousp.s
new file mode 100644 (file)
index 0000000..1e52357
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isab,no-usp
+
+       nop
diff --git a/ld/testsuite/ld-m68k/isab.d b/ld/testsuite/ld-m68k/isab.d
new file mode 100644 (file)
index 0000000..c5b0134
--- /dev/null
@@ -0,0 +1,7 @@
+
+.*:     file format elf32-m68k
+
+Program Header:
+#...
+private flags = 5: \[isa B\]
+
diff --git a/ld/testsuite/ld-m68k/isab.s b/ld/testsuite/ld-m68k/isab.s
new file mode 100644 (file)
index 0000000..3f93db7
--- /dev/null
@@ -0,0 +1,3 @@
+       .arch isab
+
+       nop
diff --git a/ld/testsuite/ld-m68k/m68k.exp b/ld/testsuite/ld-m68k/m68k.exp
new file mode 100644 (file)
index 0000000..5323317
--- /dev/null
@@ -0,0 +1,47 @@
+# Expect script for run_dump_test based ld-m68k tests.
+#   Copyright 2006 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Test m68k object merging
+
+if { ![is_elf_format] || ![istarget m68k-*-*] } {
+    return
+}
+
+# List contains test-items with 3 items followed by 2 lists:
+# 0:name 1:ld options 2:assembler options
+# 3:filenames of assembler files 4: action and options. 5: name of output file
+
+# Actions:
+# objdump: Apply objdump options on result.  Compare with regex (last arg).
+# nm: Apply nm options on result.  Compare with regex (last arg).
+# readelf: Apply readelf options on result.  Compare with regex (last arg).
+
+set m68k_mergeok_tests {
+    {"merge isa-a isa-a:nodiv" "-T merge.ld" ""
+       {isaa.s isaa-nodiv.s} {{objdump -p isaa.d}} "isaa"}
+    {"merge isa-a isa-b" "-T merge.ld" ""
+       {isaa.s isab.s} {{objdump -p isab.d}} "isab"}
+    {"merge isa-a isa-aplus" "-T merge.ld" ""
+       {isaa.s isaaplus.s} {{objdump -p isaaplus.d}} "isaplus"}
+    {"merge isa-b isa-b:nousp" "-T merge.ld" ""
+       {isab.s isab-nousp.s} {{objdump -p isab.d}} "isab"}
+    {"merge isa-a isa-a:mac" "-T merge.ld" ""
+       {isaa.s isaa-mac.s} {{objdump -p isaa-mac.d}} "isaa-mac"}
+    {"merge isa-b isa-b:float" "-T merge.ld" ""
+       {isab.s isab-float.s} {{objdump -p isab-float.d}} "isab-float"}}
+
+run_ld_link_tests $m68k_mergeok_tests
diff --git a/ld/testsuite/ld-m68k/merge.ld b/ld/testsuite/ld-m68k/merge.ld
new file mode 100644 (file)
index 0000000..ed2acfe
--- /dev/null
@@ -0,0 +1,9 @@
+OUTPUT_FORMAT("elf32-m68k", "elf32-m68k",
+              "elf32-m68k")
+OUTPUT_ARCH(m68k)
+ENTRY(_start)
+
+SECTIONS {
+  .text : {_start = .; *(.text)}
+}