Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Joel Brobecker <brobecker@adacore.com>
To: gdb-patches@sourceware.org
Cc: kettenis@gnu.org,	Joel Brobecker <brobecker@adacore.com>
Subject: [RFA 1/2] Revert "amd64-windows: memory args passed by pointer during function calls."
Date: Wed, 24 Oct 2012 17:24:00 -0000	[thread overview]
Message-ID: <1351099417-18960-2-git-send-email-brobecker@adacore.com> (raw)
In-Reply-To: <1351099417-18960-1-git-send-email-brobecker@adacore.com>

A more correct implementation of parameters passed by pointer will
follow.

gdb/ChangeLog:

	Revert the following change:
	* i386-tdep.h (gdbarch_tdep): Add field memory_args_by_pointer.
	* amd64-tdep.c (amd64_push_arguments): Add handling of architectures
	where tdep->memory_args_by_pointer is non-zero.
	* amd64-windows-tdep.c (amd64_windows_init_abi): Set
	tdep->memory_args_by_pointer to 1.

Tested on both amd64-windows and amd64-linux.
OK to commit?

Thanks,
-- 
Joel

---
 gdb/amd64-tdep.c         |   40 ++++++----------------------------------
 gdb/amd64-windows-tdep.c |    1 -
 gdb/i386-tdep.h          |    9 ---------
 3 files changed, 6 insertions(+), 44 deletions(-)

diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c
index a4172fc..c6ee493 100644
--- a/gdb/amd64-tdep.c
+++ b/gdb/amd64-tdep.c
@@ -749,8 +749,7 @@ static CORE_ADDR
 amd64_push_arguments (struct regcache *regcache, int nargs,
 		      struct value **args, CORE_ADDR sp, int struct_return)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (get_regcache_arch (regcache));
   int *integer_regs = tdep->call_dummy_integer_regs;
   int num_integer_regs = tdep->call_dummy_num_integer_regs;
 
@@ -763,11 +762,6 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
     AMD64_XMM0_REGNUM + 6, AMD64_XMM0_REGNUM + 7,
   };
   struct value **stack_args = alloca (nargs * sizeof (struct value *));
-  /* An array that mirrors the stack_args array.  For all arguments
-     that are passed by MEMORY, if that argument's address also needs
-     to be stored in a register, the ARG_ADDR_REGNO array will contain
-     that register number (or a negative value otherwise).  */
-  int *arg_addr_regno = alloca (nargs * sizeof (int));
   int num_stack_args = 0;
   int num_elements = 0;
   int element = 0;
@@ -811,19 +805,7 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
 	{
 	  /* The argument will be passed on the stack.  */
 	  num_elements += ((len + 7) / 8);
-	  stack_args[num_stack_args] = args[i];
-          /* If this is an AMD64_MEMORY argument whose address must also
-             be passed in one of the integer registers, reserve that
-             register and associate this value to that register so that
-             we can store the argument address as soon as we know it.  */
-          if (class[0] == AMD64_MEMORY
-              && tdep->memory_args_by_pointer
-              && integer_reg < tdep->call_dummy_num_integer_regs)
-            arg_addr_regno[num_stack_args] =
-              tdep->call_dummy_integer_regs[integer_reg++];
-          else
-            arg_addr_regno[num_stack_args] = -1;
-          num_stack_args++;
+	  stack_args[num_stack_args++] = args[i];
 	}
       else
 	{
@@ -878,20 +860,10 @@ amd64_push_arguments (struct regcache *regcache, int nargs,
     {
       struct type *type = value_type (stack_args[i]);
       const gdb_byte *valbuf = value_contents (stack_args[i]);
-      CORE_ADDR arg_addr = sp + element * 8;
-
-      write_memory (arg_addr, valbuf, TYPE_LENGTH (type));
-      if (arg_addr_regno[i] >= 0)
-        {
-          /* We also need to store the address of that argument in
-             the given register.  */
-          gdb_byte buf[8];
-          enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-
-          store_unsigned_integer (buf, 8, byte_order, arg_addr);
-          regcache_cooked_write (regcache, arg_addr_regno[i], buf);
-        }
-      element += ((TYPE_LENGTH (type) + 7) / 8);
+      int len = TYPE_LENGTH (type);
+
+      write_memory (sp + element * 8, valbuf, len);
+      element += ((len + 7) / 8);
     }
 
   /* The psABI says that "For calls that may call functions that use
diff --git a/gdb/amd64-windows-tdep.c b/gdb/amd64-windows-tdep.c
index 142e141..3e8a830 100644
--- a/gdb/amd64-windows-tdep.c
+++ b/gdb/amd64-windows-tdep.c
@@ -213,7 +213,6 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
     ARRAY_SIZE (amd64_windows_dummy_call_integer_regs);
   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_gdbarch_return_value (gdbarch, amd64_windows_return_value);
   set_gdbarch_skip_main_prologue (gdbarch, amd64_skip_main_prologue);
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index 5f233f5..01b0936 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -85,15 +85,6 @@ struct gdbarch_tdep
      and store the result in CLASS.  */
   void (*classify) (struct type *type, enum amd64_reg_class class[2]);
 
-  /* 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
-     by register as well, if there are still some integer registers
-     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
-- 
1.7.9.5


  parent reply	other threads:[~2012-10-24 17:24 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-24 17:23 amd64-windows: Fix funcall with by-pointer arguments Joel Brobecker
2012-10-24 17:23 ` [RFA 2/2] amd64-windows: Arguments passed by pointer Joel Brobecker
2012-10-24 17:24 ` Joel Brobecker [this message]
2012-10-25 13:18 ` amd64-windows: Fix funcall with by-pointer arguments Mark Kettenis
2013-01-16 11:59   ` Joel Brobecker
2013-09-13 22:11     ` [RFC-v2] " Pierre Muller
2013-09-16 20:57       ` Joel Brobecker
2013-09-17 13:50         ` Joel Brobecker
2013-09-20 23:20           ` Joel Brobecker
2013-09-24 16:33             ` Joel Brobecker
2013-09-24 16:33               ` [commit 1/4] Reimplement function calls on amd64-windows Joel Brobecker
2013-09-24 17:26                 ` fixed ChangeLog: " Joel Brobecker
2013-09-24 16:33               ` [commit 4/4] Revert use of classify callback in i386 gdbarch_tdep Joel Brobecker
2013-09-24 16:33               ` [commit 2/4] Revert use of integer_param_regs_saved_in_caller_frame " Joel Brobecker
2013-09-24 16:33               ` [commit 3/4] Revert use of memory_args_by_pointer " Joel Brobecker
2013-09-24 16:53               ` [RFC-v2] amd64-windows: Fix funcall with by-pointer arguments Mark Kettenis
2013-09-24 22:02               ` Pierre Muller
2013-09-26  0:34                 ` Joel Brobecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1351099417-18960-2-git-send-email-brobecker@adacore.com \
    --to=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=kettenis@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox