This is the mail archive of the gdb-patches@sourceware.cygnus.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]

RFA: gdbarchify RETURN_VALUE_ON_STACK



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);
  

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