amd64-windows: 32 bytes allocated on stack by caller for integer parameter registers
authorJoel Brobecker <brobecker@gnat.com>
Fri, 29 Jan 2010 05:27:36 +0000 (05:27 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Fri, 29 Jan 2010 05:27:36 +0000 (05:27 +0000)
        * i386-tdep.h (struct gdbarch_tdep): Add new field
        integer_param_regs_saved_in_caller_frame.
        * amd64-windows-tdep.c (amd64_windows_init_abi): Set
        tdep->integer_param_regs_saved_in_caller_frame to 1.
        * amd64-tdep.c (amd64_push_dummy_call): Allocate some memory on
        stack if tdep->integer_param_regs_saved_in_caller_frame is set.

gdb/ChangeLog
gdb/amd64-tdep.c
gdb/amd64-windows-tdep.c
gdb/i386-tdep.h

index 8b1caa3f61489fea628615a1247f5f7960315d44..e8577283f41ea15031a430ab1a61f9965212f165 100644 (file)
@@ -1,3 +1,14 @@
+2010-01-29  Joel Brobecker  <brobecker@adacore.com>
+
+       amd64-windows: 32 bytes allocated on stack by caller for integer
+       parameter registers
+       * i386-tdep.h (struct gdbarch_tdep): Add new field
+       integer_param_regs_saved_in_caller_frame.
+       * amd64-windows-tdep.c (amd64_windows_init_abi): Set
+       tdep->integer_param_regs_saved_in_caller_frame to 1.
+       * amd64-tdep.c (amd64_push_dummy_call): Allocate some memory on
+       stack if tdep->integer_param_regs_saved_in_caller_frame is set.
+
 2010-01-29  Joel Brobecker  <brobecker@adacore.com>
 
        amd64-windows: memory args passed by pointer during function calls.
index 058b318277cedf650242d518b0b3f567e60f3988..fc621e0ee2d3d1a43445d7c493f7f44b3c48b360 100644 (file)
@@ -701,6 +701,7 @@ amd64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                       int struct_return, CORE_ADDR struct_addr)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
   gdb_byte buf[8];
 
   /* Pass arguments.  */
@@ -718,6 +719,11 @@ amd64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       regcache_cooked_write (regcache, arg_regnum, buf);
     }
 
+  /* Reserve some memory on the stack for the integer-parameter registers,
+     if required by the ABI.  */
+  if (tdep->integer_param_regs_saved_in_caller_frame)
+    sp -= tdep->call_dummy_num_integer_regs * 8;
+
   /* Store return address.  */
   sp -= 8;
   store_unsigned_integer (buf, 8, byte_order, bp_addr);
index 0ed93680340c169d5d65362fb122d64e57dc95cb..05c4c1edfc0d3dc035992f5267d1cc474d7ac963 100644 (file)
@@ -84,6 +84,7 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->call_dummy_integer_regs = amd64_windows_dummy_call_integer_regs;
   tdep->classify = amd64_windows_classify;
   tdep->memory_args_by_pointer = 1;
+  tdep->integer_param_regs_saved_in_caller_frame = 1;
 
   set_solib_ops (gdbarch, &solib_target_so_ops);
 }
index f79a15de7c58c9877322bd763f51ec33d9d5f154..5915eb91325e33cf7fbdbdfe395511a636089741 100644 (file)
@@ -82,12 +82,12 @@ struct gdbarch_tdep
   int call_dummy_num_integer_regs;
   int *call_dummy_integer_regs;
 
-  /* Classify TYPE according to calling conventions, and store
-     the result in CLASS.  Used on amd64 only.  */
+  /* Used on amd64 only.  Classify TYPE according to calling conventions,
+     and store the result in CLASS.  */
   void (*classify) (struct type *type, enum amd64_reg_class class[2]);
 
-  /* Non-zero if the first few MEMORY arguments should be passed by
-     pointer.
+  /* Used on amd64 only.  Non-zero if the first few MEMORY arguments
+     should be passed by pointer.
 
      More precisely, MEMORY arguments are passed through the stack.
      But certain architectures require that their address be passed
@@ -95,6 +95,16 @@ struct gdbarch_tdep
      available for argument passing.  */
   int memory_args_by_pointer;
 
+  /* Used on amd64 only.
+
+     If non-zero, then the callers of a function are expected to reserve
+     some space in the stack just before the area where the PC is saved
+     so that the callee may save the integer-parameter registers there.
+     The amount of space is dependent on the list of registers used for
+     integer parameter passing (see component call_dummy_num_integer_regs
+     above).  */
+  int integer_param_regs_saved_in_caller_frame;
+
   /* Floating-point registers.  */
   struct regset *fpregset;
   size_t sizeof_fpregset;