This is the mail archive of the
gdb-patches@sourceware.cygnus.com
mailing list for the GDB project.
RFA: gdbarchify RETURN_VALUE_ON_STACK
- To: Andrew Cagney <cagney at cygnus dot com>
- Subject: RFA: gdbarchify RETURN_VALUE_ON_STACK
- From: Jim Blandy <jimb at zwingli dot cygnus dot com>
- Date: Tue, 18 Apr 2000 18:27:34 -0500 (EST)
- CC: gdb-patches at sourceware dot cygnus dot com
I did this one just like IEEE_FLOAT, so if that one was screwed up,
this one is too.
2000-04-17 Jim Blandy <jimb@redhat.com>
Bring RETURN_VALUE_ON_STACK under gdbarch's control.
* gdbarch.sh (RETURN_VALUE_ON_STACK): New entry.
* gdbarch.c, gdbarch.h: Regenerated.
* arch-utils.c (default_return_value_on_stack): New function.
* arch-utils.h (default_return_value_on_stack): New declaration.
Index: gdb/gdbarch.sh
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/gdbarch.sh,v
retrieving revision 2.52
diff -c -r2.52 gdbarch.sh
*** gdb/gdbarch.sh 2000/04/17 08:28:36 2.52
--- gdb/gdbarch.sh 2000/04/18 19:19:24
***************
*** 241,246 ****
--- 241,247 ----
f:2:POINTER_TO_ADDRESS:CORE_ADDR:pointer_to_address:struct type *type, char *buf:type, buf:::generic_pointer_to_address:0
f:2:ADDRESS_TO_POINTER:void:address_to_pointer:struct type *type, char *buf, CORE_ADDR addr:type, buf, addr:::generic_address_to_pointer:0
#
+ f:2:RETURN_VALUE_ON_STACK:int:return_value_on_stack:struct type *type:type:::default_return_value_on_stack
f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf::0:0
f:1:PUSH_ARGUMENTS:CORE_ADDR:push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr::0:0
f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-:::0
Index: gdb/gdbarch.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/gdbarch.c,v
retrieving revision 2.69
diff -c -r2.69 gdbarch.c
*** gdb/gdbarch.c 2000/04/17 08:28:36 2.69
--- gdb/gdbarch.c 2000/04/18 19:19:25
***************
*** 178,183 ****
--- 178,184 ----
gdbarch_register_convert_to_raw_ftype *register_convert_to_raw;
gdbarch_pointer_to_address_ftype *pointer_to_address;
gdbarch_address_to_pointer_ftype *address_to_pointer;
+ gdbarch_return_value_on_stack_ftype *return_value_on_stack;
gdbarch_extract_return_value_ftype *extract_return_value;
gdbarch_push_arguments_ftype *push_arguments;
gdbarch_push_dummy_frame_ftype *push_dummy_frame;
***************
*** 315,320 ****
--- 316,322 ----
0,
0,
0,
+ 0,
/* startup_gdbarch() */
};
struct gdbarch *current_gdbarch = &startup_gdbarch;
***************
*** 360,365 ****
--- 362,368 ----
gdbarch->register_convertible = generic_register_convertible_not;
gdbarch->pointer_to_address = generic_pointer_to_address;
gdbarch->address_to_pointer = generic_address_to_pointer;
+ gdbarch->return_value_on_stack = default_return_value_on_stack;
gdbarch->breakpoint_from_pc = legacy_breakpoint_from_pc;
gdbarch->memory_insert_breakpoint = default_memory_insert_breakpoint;
gdbarch->memory_remove_breakpoint = default_memory_remove_breakpoint;
***************
*** 530,535 ****
--- 533,541 ----
/* Skip verify of pointer_to_address, invalid_p == 0 */
/* Skip verify of address_to_pointer, invalid_p == 0 */
if ((GDB_MULTI_ARCH >= 2)
+ && (gdbarch->return_value_on_stack == default_return_value_on_stack))
+ internal_error ("gdbarch: verify_gdbarch: return_value_on_stack invalid");
+ if ((GDB_MULTI_ARCH >= 2)
&& (gdbarch->extract_return_value == 0))
internal_error ("gdbarch: verify_gdbarch: extract_return_value invalid");
if ((GDB_MULTI_ARCH >= 1)
***************
*** 816,821 ****
--- 822,831 ----
(long) current_gdbarch->address_to_pointer
/*ADDRESS_TO_POINTER ()*/);
fprintf_unfiltered (gdb_stdlog,
+ "gdbarch_update: RETURN_VALUE_ON_STACK = 0x%08lx\n",
+ (long) current_gdbarch->return_value_on_stack
+ /*RETURN_VALUE_ON_STACK ()*/);
+ fprintf_unfiltered (gdb_stdlog,
"gdbarch_update: EXTRACT_RETURN_VALUE = 0x%08lx\n",
(long) current_gdbarch->extract_return_value
/*EXTRACT_RETURN_VALUE ()*/);
***************
*** 1862,1867 ****
--- 1872,1894 ----
gdbarch_address_to_pointer_ftype address_to_pointer)
{
gdbarch->address_to_pointer = address_to_pointer;
+ }
+
+ int
+ gdbarch_return_value_on_stack (struct gdbarch *gdbarch, struct type *type)
+ {
+ if (gdbarch->return_value_on_stack == 0)
+ internal_error ("gdbarch: gdbarch_return_value_on_stack invalid");
+ if (gdbarch_debug >= 2)
+ fprintf_unfiltered (gdb_stdlog, "gdbarch_return_value_on_stack called\n");
+ return gdbarch->return_value_on_stack (type);
+ }
+
+ void
+ set_gdbarch_return_value_on_stack (struct gdbarch *gdbarch,
+ gdbarch_return_value_on_stack_ftype return_value_on_stack)
+ {
+ gdbarch->return_value_on_stack = return_value_on_stack;
}
void
Index: gdb/gdbarch.h
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/gdbarch.h,v
retrieving revision 2.69
diff -c -r2.69 gdbarch.h
*** gdb/gdbarch.h 2000/04/17 08:28:36 2.69
--- gdb/gdbarch.h 2000/04/18 19:19:26
***************
*** 510,515 ****
--- 510,524 ----
#define ADDRESS_TO_POINTER(type, buf, addr) (gdbarch_address_to_pointer (current_gdbarch, type, buf, addr))
#endif
+ typedef int (gdbarch_return_value_on_stack_ftype) (struct type *type);
+ extern int gdbarch_return_value_on_stack (struct gdbarch *gdbarch, struct type *type);
+ extern void set_gdbarch_return_value_on_stack (struct gdbarch *gdbarch, gdbarch_return_value_on_stack_ftype *return_value_on_stack);
+ #if GDB_MULTI_ARCH
+ #if (GDB_MULTI_ARCH > 1) || !defined (RETURN_VALUE_ON_STACK)
+ #define RETURN_VALUE_ON_STACK(type) (gdbarch_return_value_on_stack (current_gdbarch, type))
+ #endif
+ #endif
+
typedef void (gdbarch_extract_return_value_ftype) (struct type *type, char *regbuf, char *valbuf);
extern void gdbarch_extract_return_value (struct gdbarch *gdbarch, struct type *type, char *regbuf, char *valbuf);
extern void set_gdbarch_extract_return_value (struct gdbarch *gdbarch, gdbarch_extract_return_value_ftype *extract_return_value);
Index: gdb/arch-utils.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/arch-utils.c,v
retrieving revision 2.1
diff -c -r2.1 arch-utils.c
*** gdb/arch-utils.c 2000/04/10 07:47:24 2.1
--- gdb/arch-utils.c 2000/04/18 19:19:26
***************
*** 97,102 ****
--- 97,108 ----
return 0;
}
+ int
+ default_return_value_on_stack (struct type *type)
+ {
+ return 0;
+ }
+
char *
legacy_register_name (int i)
{
Index: gdb/arch-utils.h
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/arch-utils.h,v
retrieving revision 2.1
diff -c -r2.1 arch-utils.h
*** gdb/arch-utils.h 2000/04/10 07:47:24 2.1
--- gdb/arch-utils.h 2000/04/18 19:19:26
***************
*** 39,44 ****
--- 39,49 ----
/* Frameless functions not identifable. */
extern gdbarch_frameless_function_invocation_ftype generic_frameless_function_invocation_not;
+ /* Only structures, unions, and arrays are returned using the struct
+ convention. Note that arrays are never passed by value in the C
+ language family, so that case is irrelevant for C. */
+ extern int default_return_value_on_stack (struct type *type);
+
/* Map onto old REGISTER_NAMES. */
extern char *legacy_register_name (int i);