* dlltool.c (interwork): Remove.
authorCatherine Moore <clm@redhat.com>
Wed, 5 May 1999 19:02:14 +0000 (19:02 +0000)
committerCatherine Moore <clm@redhat.com>
Wed, 5 May 1999 19:02:14 +0000 (19:02 +0000)
        (arm_interwork_jtab): Use bx insn.
        (thumb_jtab): Likewise.
        (MARM_INTERWORK): New machine type.
        (rvaafter): Handle it.
        (rvabefore) Likewise.
        (asm_prefix): Likewise.
        (gen_exp_type): Check machine type instead of
        interwork flag.
        (make_one_lib_file): Likewise.
        (make_head): Likewise.
        (make_tail): Likewise.
        (usage): Update machine types.
        (main): Remove -interwork support.

binutils/ChangeLog
binutils/dlltool.c

index 36b7963..2b9fa66 100644 (file)
@@ -1,4 +1,21 @@
 1999-05-05  Catherine Moore  <clm@cygnus.com>
+
+       * dlltool.c (interwork): Remove.
+       (arm_interwork_jtab): Use bx insn.
+       (thumb_jtab): Likewise.
+       (MARM_INTERWORK): New machine type.
+       (rvaafter): Handle it.
+       (rvabefore) Likewise.
+       (asm_prefix): Likewise.
+       (gen_exp_type): Check machine type instead of
+       interwork flag.
+       (make_one_lib_file): Likewise.
+       (make_head): Likewise.
+       (make_tail): Likewise.
+       (usage): Update machine types.
+       (main): Remove -interwork support.
+
+1999-05-05  Catherine Moore  <clm@cygnus.com>
  
         * readelf.c (get_machine_flags):  Check for EF_CPU32.
         (get_data_encoding): Fix typo.
index ed5cf5e..7f419a7 100644 (file)
@@ -319,10 +319,6 @@ static int add_indirect = 0;
 static int add_underscore = 0;
 static int dontdeltemps = 0;
 
-#ifdef DLLTOOL_ARM
-static int interwork = 0;
-#endif 
-
 /* True if we should export all symbols.  Otherwise, we only export
    symbols listed in .drectve sections or in the def file.  */
 static boolean export_all_symbols;
@@ -379,19 +375,27 @@ static const unsigned char i386_jtab[] =
 
 static const unsigned char arm_jtab[] =
 {
-  0x00, 0xc0, 0x9f, 0xe5,
-  0x00, 0xf0, 0x9c, 0xe5,
+  0x00, 0xc0, 0x9f, 0xe5,      /* ldr  ip, [pc] */
+  0x00, 0xf0, 0x9c, 0xe5,      /* ldr  pc, [ip] */
+  0,    0,    0,    0
+};
+
+static const unsigned char arm_interwork_jtab[] =
+{
+  0x04, 0xc0, 0x9f, 0xe5,      /* ldr  ip, [pc] */
+  0x00, 0xc0, 0x9c, 0xe5,      /* ldr  ip, [ip] */
+  0x1c, 0xff, 0x2f, 0xe1,      /* bx   ip       */
   0,    0,    0,    0
 };
 
 static const unsigned char thumb_jtab[] =
 {
-  0xc0, 0xb4,
-  0x02, 0x4e,
-  0x36, 0x68,
-  0x01, 0x96,
-  0x40, 0xbd,
-  0xc0, 0x46,
+  0x40, 0xb4,           /* push {r6}         */
+  0x02, 0x4e,           /* ldr  r6, [pc, #8] */
+  0x36, 0x68,           /* ldr  r6, [r6]     */
+  0xb4, 0x46,           /* mov  ip, r6       */
+  0x40, 0xbc,           /* pop  {r6}         */
+  0x60, 0x47,           /* bx   ip           */
   0,    0,    0,    0
 };
 
@@ -469,11 +473,19 @@ mtable[] =
   {
 #define MTHUMB 3
     "thumb", ".byte", ".short", ".long", ".asciz", "@",
-    "push\t{r6, r7}\n\tldr\tr6, [pc, #8]\n\tldr\tr6, [r6]\n\tstr\tr6, [sp, #4]\n\tpop\t{r6, pc}\n\tnop",
+    "push\t{r6}\n\tldr\tr6, [pc, #8]\n\tldr\tr6, [r6]\n\tmov\tip, r6\n\tpop\t{r6}\n\tbx\tip",
     ".global", ".space", ".align\t2",".align\t4","pe-arm-little", bfd_arch_arm,
     thumb_jtab, sizeof (thumb_jtab), 12
   }
   ,
+#define MARM_INTERWORK 4
+  {
+    "arm_interwork", ".byte", ".short", ".long", ".asciz", "@",
+    "ldr\tip,[pc]\n\tldr\tip,[ip]\n\tbx\tip\n\t.long",
+    ".global", ".space", ".align\t2",".align\t4","pe-arm-little", bfd_arch_arm,
+    arm_interwork_jtab, sizeof (arm_interwork_jtab), 12
+  }
+  ,
 {    0}
 };
 
@@ -621,6 +633,7 @@ rvaafter (machine)
     case M386:
     case MPPC:
     case MTHUMB:
+    case MARM_INTERWORK:
       break;
     default:
       /* xgettext:c-format */
@@ -640,6 +653,7 @@ rvabefore (machine)
     case M386:
     case MPPC:
     case MTHUMB:
+    case MARM_INTERWORK:
       return ".rva\t";
     default:
       /* xgettext:c-format */
@@ -658,6 +672,7 @@ asm_prefix (machine)
     case MARM:
     case MPPC:
     case MTHUMB:
+    case MARM_INTERWORK:
       break;
     case M386:
       return "_";
@@ -1647,8 +1662,8 @@ gen_exp_file ()
                }
            }
          fprintf (f, "\t%s%s%s%s\t%s %d\n", ASM_RVA_BEFORE,
-                  ASM_PREFIX,
-                  exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
+                   ASM_PREFIX,
+                   exp->internal_name, ASM_RVA_AFTER, ASM_C, exp->ordinal);
          i++;
        }
 
@@ -1816,7 +1831,7 @@ gen_exp_file ()
   sprintf (outfile, "%s -o %s %s", as_flags, exp_name, TMP_ASM);
 
 #ifdef DLLTOOL_ARM
-  if (interwork)
+  if (machine == MARM_INTERWORK || machine == MTHUMB)
     strcat (outfile, " -mthumb-interwork");
 #endif
   
@@ -2043,7 +2058,7 @@ make_one_lib_file (exp, i)
               as_flags, prefix, i, prefix, i);
 
 #ifdef DLLTOOL_ARM
-      if (interwork)
+      if (machine == MARM_INTERWORK || machine == MTHUMB)
        strcat (outfile, " -mthumb-interwork");
 #endif
   
@@ -2087,7 +2102,7 @@ make_one_lib_file (exp, i)
       bfd_set_arch_mach (abfd, HOW_BFD_ARCH, 0);
 
 #ifdef DLLTOOL_ARM
-      if (interwork)
+      if (machine == MARM_INTERWORK || machine == MTHUMB)
        bfd_set_private_flags (abfd, F_INTERWORK);
 #endif
       
@@ -2506,7 +2521,7 @@ make_head ()
   sprintf (outfile, "%s -o %s %s", as_flags, TMP_HEAD_O, TMP_HEAD_S);
   
 #ifdef DLLTOOL_ARM
-  if (interwork)
+  if (machine == MARM_INTERWORK || machine == MTHUMB)
     strcat (outfile, " -mthumb-interwork");
 #endif
   
@@ -2565,7 +2580,7 @@ make_tail ()
   sprintf (outfile, "%s -o %s %s", as_flags, TMP_TAIL_O, TMP_TAIL_S);
   
 #ifdef DLLTOOL_ARM
-  if (interwork)
+  if (machine == MARM_INTERWORK || MTHUMB)
     strcat (outfile, " -mthumb-interwork");
 #endif
   
@@ -2938,7 +2953,7 @@ usage (file, status)
   /* xgetext:c-format */
   fprintf (file, _("Usage %s <options> <object-files>\n"), program_name);
   /* xgetext:c-format */
-  fprintf (file, _("   -m --machine <machine>    Create {arm, i386, ppc, thumb} DLL. [default: %s]\n"), mname);
+  fprintf (file, _("   -m --machine <machine>    Create {arm, arm_interwork, i386, ppc, thumb} DLL. [default: %s]\n"), mname);
   fprintf (file, _("   -e --output-exp <outname> Generate an export file.\n"));
   fprintf (file, _("   -l --output-lib <outname> Generate an interface library.\n"));
   fprintf (file, _("   -a --add-indirect         Add dll indirects to export file.\n"));
@@ -2957,9 +2972,6 @@ usage (file, status)
   fprintf (file, _("   -A --add-stdcall-alias    Add aliases without @<n>.\n"));
   fprintf (file, _("   -S --as <name>            Use <name> for assembler.\n"));
   fprintf (file, _("   -f --as-flags <flags>     Pass <flags> to the assembler.\n"));
-#ifdef DLLTOOL_ARM
-  fprintf (file, _("   -i --interwork            Support ARM/Thumb interworking.\n"));
-#endif
   fprintf (file, _("   -n --no-delete            Keep temp files (repeat for extra preservation).\n"));
   fprintf (file, _("   -v --verbose              Be verbose.\n"));
   fprintf (file, _("   -V --version              Display the program version.\n"));
@@ -3001,9 +3013,6 @@ static const struct option long_options[] =
   {"base-file", required_argument, NULL, 'b'},
   {"as", required_argument, NULL, 'S'},
   {"as-flags", required_argument, NULL, 'f'},
-#ifdef DLLTOOL_ARM
-  {"interwork", no_argument, NULL, 'i'},
-#endif
   {0}
 };
 
@@ -3085,11 +3094,6 @@ main (ac, av)
        case 'V':
          print_version (program_name);
          break;
-#ifdef DLLTOOL_ARM
-       case 'i':
-         interwork = 1;
-         break;
-#endif
        case 'y':
 #if 0
          /* We don't currently define YYDEBUG when building
@@ -3138,12 +3142,6 @@ main (ac, av)
 
   machine = i;
 
-#ifdef DLLTOOL_ARM
-  /* Always enable interworking for Thumb targets.  */
-  if (machine == MTHUMB && (! interwork))
-    interwork = 1;
-#endif
-  
   if (!dll_name && exp_name)
     {
       int len = strlen (exp_name) + 5;