Apply Thoams de Lellis's patch to fic disassembly of Thumb instructions when
[deliverable/binutils-gdb.git] / opcodes / arm-dis.c
index 4a1dc237856355b1e9885374e93709e30ad94f88..959e023cd3658615b44b1b78068ba9e1bd89d0a1 100644 (file)
@@ -590,7 +590,7 @@ print_insn_thumb (pc, info, given)
              info->bytes_per_chunk = 4;
              info->bytes_per_line  = 4;
              
-              func (stream, "%04x\tbl\t", given & 0xffff);
+              func (stream, "bl\t");
               (*info->print_address_func)
                 (BDISP23 (given) * 2 + pc + 4, info);
               return 4;
@@ -601,8 +601,7 @@ print_insn_thumb (pc, info, given)
              info->bytes_per_line  = 4;
                      
               given &= 0xffff;
-              func (stream, "%04x\t", given);
-             
+
               for (; *c; c++)
                 {
                   if (*c == '%')
@@ -872,15 +871,13 @@ print_insn_big_arm (pc, info)
   unsigned char      b[4];
   long               given;
   int                status;
-  coff_symbol_type * cs;
-  elf_symbol_type *  es;
   int                is_thumb;
   
   if (info->disassembler_options)
     {
       parse_disassembler_options (info->disassembler_options);
       
-      /* To avoid repeated parsing of this option, we remove it here.  */
+      /* To avoid repeated parsing of the options, we remove it here.  */
       info->disassembler_options = NULL;
     }
   
@@ -890,6 +887,8 @@ print_insn_big_arm (pc, info)
     {
       if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
        {
+         coff_symbol_type * cs;
+         
          cs = coffsymbol (*info->symbols);
          is_thumb = (   cs->native->u.syment.n_sclass == C_THUMBEXT
                      || cs->native->u.syment.n_sclass == C_THUMBSTAT
@@ -899,9 +898,11 @@ print_insn_big_arm (pc, info)
        }
       else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
        {
+         elf_symbol_type *  es;
+         
          es = *(elf_symbol_type **)(info->symbols);
-         is_thumb = ELF_ST_TYPE (es->internal_elf_sym.st_info) ==
-           STT_ARM_TFUNC;
+         is_thumb = (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_TFUNC)
+                 || (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_16BIT);
        }
     }
 
@@ -954,15 +955,13 @@ print_insn_little_arm (pc, info)
   unsigned char      b[4];
   long               given;
   int                status;
-  coff_symbol_type * cs;
-  elf_symbol_type *  es;
   int                is_thumb;
 
   if (info->disassembler_options)
     {
       parse_disassembler_options (info->disassembler_options);
       
-      /* To avoid repeated parsing of this option, we remove it here.  */
+      /* To avoid repeated parsing of the options, we remove it here.  */
       info->disassembler_options = NULL;
     }
 
@@ -972,6 +971,8 @@ print_insn_little_arm (pc, info)
     {
       if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
        {
+         coff_symbol_type * cs;
+         
          cs = coffsymbol (*info->symbols);
          is_thumb = (   cs->native->u.syment.n_sclass == C_THUMBEXT
                      || cs->native->u.syment.n_sclass == C_THUMBSTAT
@@ -981,9 +982,11 @@ print_insn_little_arm (pc, info)
        }
       else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
        {
+         elf_symbol_type *  es;
+         
          es = *(elf_symbol_type **)(info->symbols);
-         is_thumb = ELF_ST_TYPE (es->internal_elf_sym.st_info) ==
-           STT_ARM_TFUNC;
+         is_thumb = (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_TFUNC)
+                 || (ELF_ST_TYPE (es->internal_elf_sym.st_info) == STT_ARM_16BIT);
        }
     }
   
This page took 0.025404 seconds and 4 git commands to generate.