+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>
* m32c-desc.c: Regenerate.
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;
/* Tell objdump to use two bytes per chunk
and six bytes per line for displaying raw data. */
priv.insn_start = memaddr;
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);
if (!arch_mask)