From 6066c3de513998f9c90c14385bf5e1b9ab626cc0 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Fri, 31 Oct 2003 16:37:03 +0000 Subject: [PATCH] 2003-10-31 Andrew Cagney * rs6000-tdep.c (rs6000_gdbarch_init): For 64-bit ABI, set adjust_breakpoint_address. * Makefile.in (ppc-sysv-tdep.o): Add $(target_h). * ppc-tdep.h (ppc64_sysv_abi_adjust_breakpoint_address): Declare. * ppc-sysv-tdep.c: Include "target.h". Update copyright. (ppc64_sysv_abi_adjust_breakpoint_address): New function. --- gdb/ChangeLog | 9 +++++++++ gdb/Makefile.in | 3 ++- gdb/ppc-sysv-tdep.c | 21 ++++++++++++++++++++- gdb/ppc-tdep.h | 2 ++ gdb/rs6000-tdep.c | 9 +++++++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 48f1858..968952d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 2003-10-31 Andrew Cagney + * rs6000-tdep.c (rs6000_gdbarch_init): For 64-bit ABI, set + adjust_breakpoint_address. + * Makefile.in (ppc-sysv-tdep.o): Add $(target_h). + * ppc-tdep.h (ppc64_sysv_abi_adjust_breakpoint_address): Declare. + * ppc-sysv-tdep.c: Include "target.h". Update copyright. + (ppc64_sysv_abi_adjust_breakpoint_address): New function. + +2003-10-31 Andrew Cagney + * target.h (struct target_ops): Replace "to_read_partial" and "to_write_partial" with "to_xfer_partial". Update comments. * target.c (debug_to_write_partial): Delete function. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index d7d8eb6..5ecfeed 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2126,7 +2126,8 @@ ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \ $(target_h) $(breakpoint_h) $(value_h) $(osabi_h) $(ppc_tdep_h) \ $(ppcnbsd_tdep_h) $(nbsd_tdep_h) $(solib_svr4_h) ppc-sysv-tdep.o: ppc-sysv-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \ - $(regcache_h) $(value_h) $(gdb_string_h) $(gdb_assert_h) $(ppc_tdep_h) + $(regcache_h) $(value_h) $(gdb_string_h) $(gdb_assert_h) \ + $(ppc_tdep_h) $(target_h) printcmd.o: printcmd.c $(defs_h) $(gdb_string_h) $(frame_h) $(symtab_h) \ $(gdbtypes_h) $(value_h) $(language_h) $(expression_h) $(gdbcore_h) \ $(gdbcmd_h) $(target_h) $(breakpoint_h) $(demangle_h) $(valprint_h) \ diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c index 0fb0d6a..02f2ea2 100644 --- a/gdb/ppc-sysv-tdep.c +++ b/gdb/ppc-sysv-tdep.c @@ -1,7 +1,7 @@ /* Target-dependent code for PowerPC systems using the SVR4 ABI for GDB, the GNU debugger. - Copyright 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of GDB. @@ -28,6 +28,7 @@ #include "gdb_string.h" #include "gdb_assert.h" #include "ppc-tdep.h" +#include "target.h" /* Pass the arguments in either registers, or in the stack. Using the ppc sysv ABI, the first eight words of the argument list (that might @@ -1013,3 +1014,21 @@ ppc64_sysv_abi_store_return_value (struct type *valtype, if (!ppc64_sysv_abi_return_value (valtype, regbuf, valbuf, NULL)) error ("Function return value location unknown"); } + +CORE_ADDR +ppc64_sysv_abi_adjust_breakpoint_address (struct gdbarch *gdbarch, + CORE_ADDR bpaddr) +{ + /* PPC64 SYSV specifies that the minimal-symbol "FN" should point at + a function-descriptor while the corresponding minimal-symbol + ".FN" should point at the entry point. Consequently, a command + like "break FN" applied to an object file with only minimal + symbols, will insert the breakpoint into the descriptor at "FN" + and not the function at ".FN". Avoid this confusion by adjusting + any attempt to set a descriptor breakpoint into a corresponding + function breakpoint. Note that GDB warns the user when this + adjustment is applied - that's ok as otherwise the user will have + no way of knowing why their breakpoint at "FN" resulted in the + program stopping at ".FN". */ + return gdbarch_convert_from_func_ptr_addr (gdbarch, bpaddr, ¤t_target); +} diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h index eb61582..346ac8e 100644 --- a/gdb/ppc-tdep.h +++ b/gdb/ppc-tdep.h @@ -61,6 +61,8 @@ CORE_ADDR ppc64_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr); +CORE_ADDR ppc64_sysv_abi_adjust_breakpoint_address (struct gdbarch *gdbarch, + CORE_ADDR bpaddr); int ppc_linux_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache); struct link_map_offsets *ppc_linux_svr4_fetch_link_map_offsets (void); void ppc_linux_supply_gregset (char *buf); diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 9cd6120..87ed4dc 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -2895,6 +2895,15 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_function_start_offset (gdbarch, 0); set_gdbarch_breakpoint_from_pc (gdbarch, rs6000_breakpoint_from_pc); + /* Handle the 64-bit SVR4 minimal-symbol convention of using "FN" + for the descriptor and ".FN" for the entry-point -- a user + specifying "break FN" will unexpectedly end up with a breakpoint + on the descriptor and not the function. This architecture method + transforms any breakpoints on descriptors into breakpoints on the + corresponding entry point. */ + if (sysv_abi && wordsize == 8) + set_gdbarch_adjust_breakpoint_address (gdbarch, ppc64_sysv_abi_adjust_breakpoint_address); + /* Not sure on this. FIXMEmgo */ set_gdbarch_frame_args_skip (gdbarch, 8); -- 2.7.4