This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFA] fix disassembly function for ppc


If you do 

set architecture rs6000
set architecture powerpc:common
set architecture rs6000

The disassembly function gets set to the rs6000 one, then changes to the
powerpc one, but it doesn't get changed back to the rs6000 one with
the last architecture switch.  This is because the rs6000 architecture
was saved, and instead of being recreated, it is reused.
The variable print_insn doesn't get to change.

This change creates a new function, gdb_print_insn_powerpc, that is used
for the powerpc case and deals with the endianness. Note that
the endiannes is determined by the endiannes of the target at the moment
the function is called. This keeps into accound the possibility of a user
doing the 'set endian' command.

Elena

2002-06-18  Elena Zannoni  <ezannoni@redhat.com>

        * rs6000-tdep.c (rs6000_gdbarch_init): Remove variable print_insn
        and its setting.  Set gdbarch instruction printing functions
        directly.  For non-rs6000 case use new function
        gdb_print_insn_powerpc.
        (gdb_print_insn_powerpc): New function.

Index: rs6000-tdep.c
===================================================================
RCS file: /cvs/uberbaum/gdb/rs6000-tdep.c,v
retrieving revision 1.68
diff -u -p -r1.68 rs6000-tdep.c
--- rs6000-tdep.c       17 Jun 2002 23:32:33 -0000      1.68
+++ rs6000-tdep.c       18 Jun 2002 19:40:25 -0000
@@ -2402,6 +2402,15 @@ find_variant_by_arch (enum bfd_architect
 
   return NULL;
 }
+
+static int
+gdb_print_insn_powerpc (bfd_vma memaddr, disassemble_info *info)
+{
+  if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
+    return print_insn_big_powerpc (memaddr, info);
+  else
+    return print_insn_little_powerpc (memaddr, info);
+}
 ^L
 /* Initialize the current architecture based on INFO.  If possible, re-use an
    architecture from ARCHES, which is a list of architectures already created
@@ -2423,7 +2432,6 @@ rs6000_gdbarch_init (struct gdbarch_info
   bfd abfd;
   int sysv_abi;
   enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
-  gdbarch_print_insn_ftype *print_insn;
 
   from_xcoff_exec = info.abfd && info.abfd->format == bfd_object &&
     bfd_get_flavour (info.abfd) == bfd_target_xcoff_flavour;
@@ -2558,12 +2566,9 @@ rs6000_gdbarch_init (struct gdbarch_info
 
   /* Select instruction printer.  */
   if (arch == power)
-    print_insn = print_insn_rs6000;
-  else if (info.byte_order == BFD_ENDIAN_BIG)
-    print_insn = print_insn_big_powerpc;
+    set_gdbarch_print_insn (gdbarch, print_insn_rs6000);
   else
-    print_insn = print_insn_little_powerpc;
-  set_gdbarch_print_insn (gdbarch, print_insn);
+    set_gdbarch_print_insn (gdbarch, gdb_print_insn_powerpc);
 
   set_gdbarch_read_pc (gdbarch, generic_target_read_pc);
   set_gdbarch_write_pc (gdbarch, generic_target_write_pc);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]