From 2f0ca46a499086b1c438f5b1768f383fa60351e2 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Thu, 27 Jan 2000 20:05:32 +0000 Subject: Apply Thoams de Lellis's patch to fic disassembly of Thumb instructions when bounded by non-function labels. --- opcodes/ChangeLog | 7 +++++++ opcodes/arm-dis.c | 24 ++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) (limited to 'opcodes') diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index b0a526b..9802397 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2000-01-27 Thomas de Lellis + + * arm-dis.c (printf_insn_big_arm): Treat ELF symbols with the + ARM_STT_16BIT flag as Thumb code symbols. + + * arm-dis.c (printf_insn_little_arm): Ditto. + 2000-01-25 Thomas de Lellis * arm-dis.c (printf_insn_thumb): Prevent double dumping diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c index fe662ed..959e023 100644 --- a/opcodes/arm-dis.c +++ b/opcodes/arm-dis.c @@ -871,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; } @@ -889,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 @@ -898,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); } } @@ -953,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; } @@ -971,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 @@ -980,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); } } -- cgit v1.1