* x86-64-tdep.c (amd64_push_arguments): Add struct_return
authorMark Kettenis <kettenis@gnu.org>
Sat, 10 Jan 2004 17:48:15 +0000 (17:48 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 10 Jan 2004 17:48:15 +0000 (17:48 +0000)
argument.  Use it to reserve a register if necessary.
(amd64_push_dummy_call): Pass STRUCT_RETURN in call to
amd64_push_arguments.

gdb/ChangeLog
gdb/x86-64-tdep.c

index f9d48bddcd985b869b593cdc0517d7ffab902b60..bdf88b91303ea815fcfe394f939a83da40d82d74 100644 (file)
@@ -1,5 +1,10 @@
 2004-01-10  Mark Kettenis  <kettenis@gnu.org>
 
+       * x86-64-tdep.c (amd64_push_arguments): Add struct_return
+       argument.  Use it to reserve a register if necessary.
+       (amd64_push_dummy_call): Pass STRUCT_RETURN in call to
+       amd64_push_arguments.
+
        * x86-64-tdep.c (amd64_classify_aggregate): Ignore static fields.
 
        * x86-64-tdep.c (amd64_register_info): Add %cs and %ss.  Adjust
index c3bb166bb54d4ad6aa94aba87f82e0b51265b531..242d597ace07c948171e346bf0e8ece2921fa451 100644 (file)
@@ -481,7 +481,7 @@ amd64_return_value (struct gdbarch *gdbarch, struct type *type,
 
 static CORE_ADDR
 amd64_push_arguments (struct regcache *regcache, int nargs,
-                     struct value **args, CORE_ADDR sp)
+                     struct value **args, CORE_ADDR sp, int struct_return)
 {
   static int integer_regnum[] =
   {
@@ -505,6 +505,10 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
   int sse_reg = 0;
   int i;
 
+  /* Reserve a register for the "hidden" argument.  */
+  if (struct_return)
+    integer_reg++;
+
   for (i = 0; i < nargs; i++)
     {
       struct type *type = VALUE_TYPE (args[i]);
@@ -613,7 +617,7 @@ amd64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
   char buf[8];
 
   /* Pass arguments.  */
-  sp = amd64_push_arguments (regcache, nargs, args, sp);
+  sp = amd64_push_arguments (regcache, nargs, args, sp, struct_return);
 
   /* Pass "hidden" argument".  */
   if (struct_return)