* arm-dis.c (print_insn_big_arm): Check for thumb symbol
authorCatherine Moore <clm@redhat.com>
Mon, 10 Aug 1998 01:27:05 +0000 (01:27 +0000)
committerCatherine Moore <clm@redhat.com>
Mon, 10 Aug 1998 01:27:05 +0000 (01:27 +0000)
        attributes.
        (print_insn_little_arm): Likewise.

opcodes/.Sanitize
opcodes/ChangeLog
opcodes/arm-dis.c

index 32fe276b8ab26c4c8d95ad2ec4e5b1f019f57796..72d7aa738dee16a6678af96f9e43482a4c7ab85d 100644 (file)
@@ -186,6 +186,34 @@ else
        done
 fi
 
+armelf_files="ChangeLog arm-dis.c"
+if ( echo $* | grep keep\-armelf > /dev/null ) ; then
+       for i in $armelf_files ; do
+               if test ! -d $i && (grep sanitize-armelf $i > /dev/null) ; then
+                       if [ -n "${verbose}" ] ; then
+                               echo Keeping armelf stuff in $i
+                       fi
+               fi
+       done
+else
+       for i in $armelf_files ; do
+               if test ! -d $i && (grep sanitize-armelf $i > /dev/null) ; then
+                       if [ -n "${verbose}" ] ; then
+                               echo Removing traces of \"armelf\" from $i...
+                       fi
+                       cp $i new
+                       sed '/start\-sanitize\-armelf/,/end-\sanitize\-armelf/d' < $i > new
+                       if [ -n "${safe}" -a ! -f .Recover/$i ] ; then
+                               if [ -n "${verbose}" ] ; then
+                                       echo Caching $i in .Recover...
+                               fi
+                               mv $i .Recover
+                       fi
+                       mv new $i
+               fi
+       done
+fi
+
 v850e_files="ChangeLog Makefile.in Makefile.am configure.in configure disassemble.c v850-opc.c v850-dis.c"
 if ( echo $* | grep keep\-v850e > /dev/null ) ; then
        for i in $v850e_files ; do
index a1ba0d37502d702bd59337e8bb258ebc1b84090a..bb46c587a040b81f467151e061f00b6772c9f5b7 100644 (file)
@@ -1,3 +1,11 @@
+start-sanitize-armelf
+Sun Aug  9 20:17:28 1998  Catherine Moore  <clm@cygnus.com>
+
+        * arm-dis.c (print_insn_big_arm):  Check for thumb symbol
+        attributes.
+        (print_insn_little_arm): Likewise.
+
+end-sanitize-armelf
 Mon Aug  3 12:43:16 1998  Doug Evans  <devans@seba.cygnus.com>
 
        Move all global state data into opcode table struct, and treat
index 32112c17f4992b42c5a5c0861db6845d3e5eefac..cd8c0ba3d98e3b214f1b2d14b8f4ac5ff79890d9 100644 (file)
@@ -1,5 +1,5 @@
 /* Instruction printing code for the ARM
-   Copyright (C) 1994, 95, 96, 1997 Free Software Foundation, Inc. 
+   Copyright (C) 1994, 95, 96, 97, 1998 Free Software Foundation, Inc. 
    Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
    Modification by James G. Smith (jsmith@cygnus.co.uk)
 
@@ -24,6 +24,13 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "arm-opc.h"
 #include "coff/internal.h"
 #include "libcoff.h"
+#include "opintl.h"
+
+/* start-sanitize-armelf */
+/* FIXME: This shouldn't be done here */
+#include "elf-bfd.h"
+#include "elf/internal.h"
+/* end-sanitize-armelf */
 
 static char *arm_conditional[] =
 {"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
@@ -308,9 +315,12 @@ print_insn_arm (pc, info, given)
                    case 'C':
                      switch (given & 0x00090000)
                        {
-                       case 0:
+                       default:
                          func (stream, "_???");
                          break;
+                       case 0x90000:
+                         func (stream, "_all");
+                         break;
                        case 0x10000:
                          func (stream, "_ctl");
                          break;
@@ -350,7 +360,7 @@ print_insn_arm (pc, info, given)
                          func (stream, "e");
                          break;
                        default:
-                         func (stream, "<illegal precision>");
+                         func (stream, _("<illegal precision>"));
                          break;
                        }
                      break;
@@ -639,7 +649,11 @@ print_insn_thumb (pc, info, given)
                                       break;
 
                                     case 'a':
-                                      info->print_address_func (((pc + 4) & ~1) + (reg << 2), info);
+                                     /* PC-relative address -- the bottom two
+                                        bits of the address are dropped before
+                                        the calculation.  */
+                                      info->print_address_func
+                                       (((pc + 4) & ~3) + (reg << 2), info);
                                       break;
 
                                     case 'x':
@@ -709,16 +723,37 @@ print_insn_big_arm (pc, info)
   unsigned char      b[4];
   long               given;
   int                status;
-  coff_symbol_type * cs;
+  coff_symbol_type   *cs;
+/* start-sanitize-armelf */
+  elf_symbol_type    *es;
+/* end-sanitize-armelf */
   int                is_thumb;
   
-  cs = coffsymbol (*info->symbols);
-  is_thumb = (cs != NULL) &&
-     (   cs->native->u.syment.n_sclass == C_THUMBEXT
-      || cs->native->u.syment.n_sclass == C_THUMBSTAT
-      || cs->native->u.syment.n_sclass == C_THUMBLABEL
-      || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
-      || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
+  is_thumb = false;
+  if (info->symbols != NULL)
+    {
+    if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
+     {
+     cs = coffsymbol (*info->symbols);
+     is_thumb = (cs->native->u.syment.n_sclass == C_THUMBEXT
+                || cs->native->u.syment.n_sclass == C_THUMBSTAT
+                || cs->native->u.syment.n_sclass == C_THUMBLABEL
+                || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
+                || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
+  
+     }
+/* start-sanitize-armelf */
+    else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
+     {
+     es = *(elf_symbol_type **)(info->symbols);
+     is_thumb = (es->internal_elf_sym.st_other == C_THUMBEXT
+                 || es->internal_elf_sym.st_other == C_THUMBSTAT
+                 || es->internal_elf_sym.st_other == C_THUMBLABEL
+                 || es->internal_elf_sym.st_other == C_THUMBEXTFUNC
+                 || es->internal_elf_sym.st_other == C_THUMBSTATFUNC);
+      }
+/* end-sanitize-armelf */
+   }
 
   info->bytes_per_chunk = 4;
   info->display_endian = BFD_ENDIAN_BIG;
@@ -777,16 +812,38 @@ print_insn_little_arm (pc, info)
   unsigned char      b[4];
   long               given;
   int                status;
-  coff_symbol_type * cs;
+  coff_symbol_type   *cs;
+/* start-sanitize-armelf */
+  elf_symbol_type    *es;
+/* end-sanitize-armelf */
   int                is_thumb;
+
+  is_thumb = false;
+  if (info->symbols != NULL)
+    {
+    if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
+     {
+     cs = coffsymbol (*info->symbols);
+     is_thumb = (cs->native->u.syment.n_sclass == C_THUMBEXT
+                || cs->native->u.syment.n_sclass == C_THUMBSTAT
+                || cs->native->u.syment.n_sclass == C_THUMBLABEL
+                || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
+                || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
+  
+     }
+/* start-sanitize-armelf */
+    else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
+     {
+     es = *(elf_symbol_type **)(info->symbols);
+     is_thumb = (es->internal_elf_sym.st_other == C_THUMBEXT
+                 || es->internal_elf_sym.st_other == C_THUMBSTAT
+                 || es->internal_elf_sym.st_other == C_THUMBLABEL
+                 || es->internal_elf_sym.st_other == C_THUMBEXTFUNC
+                 || es->internal_elf_sym.st_other == C_THUMBSTATFUNC);
+      }
+/* end-sanitize-armelf */
+   }
   
-  cs = coffsymbol (*info->symbols);
-  is_thumb = (cs != NULL) && 
-     (   cs->native->u.syment.n_sclass == C_THUMBEXT
-      || cs->native->u.syment.n_sclass == C_THUMBSTAT
-      || cs->native->u.syment.n_sclass == C_THUMBLABEL
-      || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
-      || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
 
   info->bytes_per_chunk = 4;
   info->display_endian = BFD_ENDIAN_LITTLE;