This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] sparc-tdep.c: Fix `return' and `finish' from stop in call dummy
- To: gdb-patches at sourceware dot cygnus dot com
- Subject: [RFA] sparc-tdep.c: Fix `return' and `finish' from stop in call dummy
- From: "Peter.Schauer" <Peter dot Schauer at regent dot e-technik dot tu-muenchen dot de>
- Date: Sat, 23 Sep 2000 12:32:15 MET DST
`return' and `finish' after a stop in a call dummy are currently not
handled correctly in sparc-tdep.c.
Here is a fix, it will be needed for the upcoming additional callfuncs
testcases:
* sparc-tdep.c (sparc_fix_call_dummy): Improve comments.
Adjust call_dummy_breakpoint_offset, so that `finish' after a stop
in a call dummy works.
(sparc_gdbarch_init): Fix setting of pc_in_call_dummy, it depends
on SPARC32/64_CALL_DUMMY_ON_STACK, not DO_CALL_DUMMY_ON_STACK.
*** ./sparc-tdep.c.orig Fri Sep 15 21:27:31 2000
--- ./sparc-tdep.c Fri Sep 22 22:16:59 2000
***************
*** 2136,2149 ****
| (((fun - (pc + CALL_DUMMY_CALL_OFFSET)) >> 2)
& 0x3fffffff)));
! /* Comply with strange Sun cc calling convention for struct-returning
! functions. */
! if (!using_gcc
! && (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
! || TYPE_CODE (value_type) == TYPE_CODE_UNION))
! store_unsigned_integer (dummy + CALL_DUMMY_CALL_OFFSET + 8, 4,
! TYPE_LENGTH (value_type) & 0x1fff);
if (!(GDB_TARGET_IS_SPARC64))
{
/* If this is not a simulator target, change the first four
--- 2136,2163 ----
| (((fun - (pc + CALL_DUMMY_CALL_OFFSET)) >> 2)
& 0x3fffffff)));
! /* If the called function returns an aggregate value, fill in the UNIMP
! instruction containing the size of the returned aggregate return value,
! which follows the call instruction.
! For details see the SPARC Architecture Manual Version 8, Appendix D.3.
+ Adjust the call_dummy_breakpoint_offset for the bp_call_dummy breakpoint
+ to the proper address in the call dummy, so that `finish' after a stop
+ in a call dummy works.
+ Tweeking current_gdbarch is not an optimal solution, but the call to
+ sparc_fix_call_dummy is immediately followed by a call to run_stack_dummy,
+ which is the only function where dummy_breakpoint_offset is actually
+ used, if it is non-zero. */
+ if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
+ || TYPE_CODE (value_type) == TYPE_CODE_UNION)
+ {
+ store_unsigned_integer (dummy + CALL_DUMMY_CALL_OFFSET + 8, 4,
+ TYPE_LENGTH (value_type) & 0x1fff);
+ set_gdbarch_call_dummy_breakpoint_offset (current_gdbarch, 0x30);
+ }
+ else
+ set_gdbarch_call_dummy_breakpoint_offset (current_gdbarch, 0x2c);
+
if (!(GDB_TARGET_IS_SPARC64))
{
/* If this is not a simulator target, change the first four
***************
*** 2961,2971 ****
set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
set_gdbarch_max_register_raw_size (gdbarch, 8);
set_gdbarch_max_register_virtual_size (gdbarch, 8);
- #ifdef DO_CALL_DUMMY_ON_STACK
- set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_on_stack);
- #else
- set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point);
- #endif
set_gdbarch_pop_frame (gdbarch, sparc_pop_frame);
set_gdbarch_push_return_address (gdbarch, sparc_push_return_address);
set_gdbarch_push_dummy_frame (gdbarch, sparc_push_dummy_frame);
--- 2975,2980 ----
***************
*** 2999,3004 ****
--- 3008,3014 ----
/* 32-bit machine types: */
#ifdef SPARC32_CALL_DUMMY_ON_STACK
+ set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_on_stack);
set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0x30);
set_gdbarch_call_dummy_length (gdbarch, 0x38);
***************
*** 3005,3010 ****
--- 3015,3021 ----
set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
set_gdbarch_call_dummy_words (gdbarch, call_dummy_32);
#else
+ set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point);
set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
set_gdbarch_call_dummy_length (gdbarch, 0);
***************
*** 3053,3058 ****
--- 3064,3070 ----
default: /* Any new machine type is likely to be 64-bit. */
#ifdef SPARC64_CALL_DUMMY_ON_STACK
+ set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_on_stack);
set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 8 * 4);
set_gdbarch_call_dummy_length (gdbarch, 192);
***************
*** 3060,3065 ****
--- 3072,3078 ----
set_gdbarch_call_dummy_start_offset (gdbarch, 148);
set_gdbarch_call_dummy_words (gdbarch, call_dummy_64);
#else
+ set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point);
set_gdbarch_call_dummy_address (gdbarch, entry_point_address);
set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0);
set_gdbarch_call_dummy_length (gdbarch, 0);
--
Peter Schauer pes@regent.e-technik.tu-muenchen.de