/* 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)
#include "arm-opc.h"
#include "coff/internal.h"
#include "libcoff.h"
+#include "opintl.h"
+
+/* FIXME: This shouldn't be done here */
+#include "elf-bfd.h"
+#include "elf/internal.h"
static char *arm_conditional[] =
{"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
case 'C':
switch (given & 0x00090000)
{
- case 0:
+ default:
func (stream, "_???");
break;
+ case 0x90000:
+ func (stream, "_all");
+ break;
case 0x10000:
func (stream, "_ctl");
break;
func (stream, "e");
break;
default:
- func (stream, "<illegal precision>");
+ func (stream, _("<illegal precision>"));
break;
}
break;
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':
unsigned char b[4];
long given;
int status;
- asymbol * saved_symbol;
- coff_symbol_type * cs;
+ coff_symbol_type *cs;
+ elf_symbol_type *es;
int is_thumb;
- cs = coffsymbol (info->symbol);
- 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);
+
+ }
+ else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
+ {
+ es = *(elf_symbol_type **)(info->symbols);
+ is_thumb = ELF_ST_TYPE (es->internal_elf_sym.st_info) ==
+ STT_ARM_TFUNC;
+ }
+ }
info->bytes_per_chunk = 4;
info->display_endian = BFD_ENDIAN_BIG;
given = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]);
}
- saved_symbol = info->symbol;
-
if (is_thumb)
{
status = print_insn_thumb (pc, info, given);
status = print_insn_arm (pc, info, given);
}
- info->symbol = saved_symbol; /* Stop displayed symbols from resetting the stored symbol */
-
return status;
}
unsigned char b[4];
long given;
int status;
- asymbol * saved_symbol;
- coff_symbol_type * cs;
+ coff_symbol_type *cs;
+ elf_symbol_type *es;
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);
- cs = coffsymbol (info->symbol);
- 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);
+ }
+ else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour)
+ {
+ es = *(elf_symbol_type **)(info->symbols);
+ is_thumb = ELF_ST_TYPE (es->internal_elf_sym.st_info) ==
+ STT_ARM_TFUNC;
+ }
+ }
info->bytes_per_chunk = 4;
info->display_endian = BFD_ENDIAN_LITTLE;
given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
- saved_symbol = info->symbol;
-
if (is_thumb)
{
status = print_insn_thumb (pc, info, given);
status = print_insn_arm (pc, info, given);
}
- info->symbol = saved_symbol; /* Stop displayed symbols from resetting the stored symbol */
-
return status;
}