* m68k-dis.c (print_insn_m68k): Restore info->fprintf_func and
info->print_address_func if longjmp is called.
This commit is contained in:
parent
9150673628
commit
56dc1f8ac3
2 changed files with 31 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2007-04-09 Kazu Hirata <kazu@codesourcery.com>
|
||||||
|
|
||||||
|
* m68k-dis.c (print_insn_m68k): Restore info->fprintf_func and
|
||||||
|
info->print_address_func if longjmp is called.
|
||||||
|
|
||||||
2007-03-29 DJ Delorie <dj@redhat.com>
|
2007-03-29 DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
* m32c-desc.c: Regenerate.
|
* m32c-desc.c: Regenerate.
|
||||||
|
|
|
@ -1475,6 +1475,12 @@ print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
|
||||||
|
|
||||||
bfd_byte *buffer = priv.the_buffer;
|
bfd_byte *buffer = priv.the_buffer;
|
||||||
|
|
||||||
|
/* Save these printing functions in case we need to restore them
|
||||||
|
later. */
|
||||||
|
fprintf_ftype save_printer = info->fprintf_func;
|
||||||
|
void (* save_print_address) (bfd_vma, struct disassemble_info *)
|
||||||
|
= info->print_address_func;
|
||||||
|
|
||||||
info->private_data = (PTR) &priv;
|
info->private_data = (PTR) &priv;
|
||||||
/* Tell objdump to use two bytes per chunk
|
/* Tell objdump to use two bytes per chunk
|
||||||
and six bytes per line for displaying raw data. */
|
and six bytes per line for displaying raw data. */
|
||||||
|
@ -1485,8 +1491,26 @@ print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
|
||||||
priv.insn_start = memaddr;
|
priv.insn_start = memaddr;
|
||||||
|
|
||||||
if (setjmp (priv.bailout) != 0)
|
if (setjmp (priv.bailout) != 0)
|
||||||
/* Error return. */
|
{
|
||||||
return -1;
|
/* longjmp may be called while these printing functions are
|
||||||
|
temporarily replaced with dummy functions. Restore them
|
||||||
|
before we leave.
|
||||||
|
|
||||||
|
Admittedly, this save-and-restore operation is somewhat ugly
|
||||||
|
in that we are exposing the fact that match_insn_m68k
|
||||||
|
temporarily replaces insn->fprintf_func and
|
||||||
|
insn->print_address_func. Perhaps, a real fix is to report a
|
||||||
|
FETCH_DATA failure with a return value of some sort, without
|
||||||
|
using setjmp/longjmp. A better fix may be to teach the m68k
|
||||||
|
disassembler do its job without temporarily replacing
|
||||||
|
insn->fprintf_func and insn->print_address_func, but that's a
|
||||||
|
task for another day. */
|
||||||
|
info->fprintf_func = save_printer;
|
||||||
|
info->print_address_func = save_print_address;
|
||||||
|
|
||||||
|
/* Error return. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
arch_mask = bfd_m68k_mach_to_features (info->mach);
|
arch_mask = bfd_m68k_mach_to_features (info->mach);
|
||||||
if (!arch_mask)
|
if (!arch_mask)
|
||||||
|
|
Loading…
Reference in a new issue