Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members
       [not found] <20200429134808.3642-1-ssbssa.ref@yahoo.de>
@ 2020-04-29 13:48 ` Hannes Domani
  2020-04-29 16:45   ` Simon Marchi
  0 siblings, 1 reply; 6+ messages in thread
From: Hannes Domani @ 2020-04-29 13:48 UTC (permalink / raw)
  To: gdb-patches

Non-static member functions for Windows 32bit programs need the thiscall
calling convention, so the 'this' pointer needs to be passed in ECX.

gdb/ChangeLog:

2020-04-29  Hannes Domani  <ssbssa@yahoo.de>

	PR gdb/15559
	* i386-tdep.c (i386_push_dummy_call): Call
	i386_thiscall_push_dummy_call.
	(i386_thiscall_push_dummy_call): New function.
	* i386-tdep.h (i386_thiscall_push_dummy_call): Declare.
	* i386-windows-tdep.c (i386_windows_push_dummy_call): New function.
	(i386_windows_init_abi): Call set_gdbarch_push_dummy_call.
---
v2:
- Now only code by me is left.

v3:
- Refactored the OSABI_WINDOWS stuff into a i386-windows-tdep.c
  function, but I'm not 100% sure that I did it how Simon meant it.
---
 gdb/i386-tdep.c         | 35 ++++++++++++++++++++++++++++-------
 gdb/i386-tdep.h         | 13 +++++++++++++
 gdb/i386-windows-tdep.c | 32 ++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+), 7 deletions(-)

diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index 84edb3649e..fc63635317 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -2668,12 +2668,15 @@ i386_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR funaddr,
   return sp - 16;
 }
 
-static CORE_ADDR
-i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
-		      struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
-		      struct value **args, CORE_ADDR sp,
-		      function_call_return_method return_method,
-		      CORE_ADDR struct_addr)
+/* The "push_dummy_call" gdbarch method, optionally with the thiscall
+   calling convention.  */
+
+CORE_ADDR
+i386_thiscall_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
+			       struct regcache *regcache, CORE_ADDR bp_addr,
+			       int nargs, struct value **args, CORE_ADDR sp,
+			       function_call_return_method return_method,
+			       CORE_ADDR struct_addr, bool thiscall)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   gdb_byte buf[4];
@@ -2709,7 +2712,7 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 	    args_space += 4;
 	}
 
-      for (i = 0; i < nargs; i++)
+      for (i = thiscall ? 1 : 0; i < nargs; i++)
 	{
 	  int len = TYPE_LENGTH (value_enclosing_type (args[i]));
 
@@ -2761,6 +2764,10 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   /* ...and fake a frame pointer.  */
   regcache->cooked_write (I386_EBP_REGNUM, buf);
 
+  /* The 'this' pointer needs to be in ECX.  */
+  if (thiscall)
+    regcache->cooked_write (I386_ECX_REGNUM, value_contents_all (args[0]));
+
   /* MarkK wrote: This "+ 8" is all over the place:
      (i386_frame_this_id, i386_sigtramp_frame_this_id,
      i386_dummy_id).  It's there, since all frame unwinders for
@@ -2773,6 +2780,20 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
   return sp + 8;
 }
 
+/* Implement the "push_dummy_call" gdbarch method.  */
+
+static CORE_ADDR
+i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
+		      struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
+		      struct value **args, CORE_ADDR sp,
+		      function_call_return_method return_method,
+		      CORE_ADDR struct_addr)
+{
+  return i386_thiscall_push_dummy_call (gdbarch, function, regcache, bp_addr,
+					nargs, args, sp, return_method,
+					struct_addr, false);
+}
+
 /* These registers are used for returning integers (and on some
    targets also for returning `struct' and `union' values when their
    size and alignment match an integer type).  */
diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h
index fa29e316a1..79b3b1f942 100644
--- a/gdb/i386-tdep.h
+++ b/gdb/i386-tdep.h
@@ -399,6 +399,19 @@ extern CORE_ADDR i386_pe_skip_trampoline_code (struct frame_info *frame,
 extern CORE_ADDR i386_skip_main_prologue (struct gdbarch *gdbarch,
 					  CORE_ADDR pc);
 
+/* The "push_dummy_call" gdbarch method, optionally with the thiscall
+   calling convention.  */
+extern CORE_ADDR i386_thiscall_push_dummy_call (struct gdbarch *gdbarch,
+						struct value *function,
+						struct regcache *regcache,
+						CORE_ADDR bp_addr,
+						int nargs, struct value **args,
+						CORE_ADDR sp,
+						function_call_return_method
+						return_method,
+						CORE_ADDR struct_addr,
+						bool thiscall);
+
 /* Return whether the THIS_FRAME corresponds to a sigtramp routine.  */
 extern int i386_sigtramp_p (struct frame_info *this_frame);
 
diff --git a/gdb/i386-windows-tdep.c b/gdb/i386-windows-tdep.c
index 3a07c862f2..4824a9e552 100644
--- a/gdb/i386-windows-tdep.c
+++ b/gdb/i386-windows-tdep.c
@@ -200,6 +200,36 @@ i386_windows_auto_wide_charset (void)
   return "UTF-16";
 }
 
+/* Implement the "push_dummy_call" gdbarch method.  */
+
+static CORE_ADDR
+i386_windows_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
+			      struct regcache *regcache, CORE_ADDR bp_addr,
+			      int nargs, struct value **args, CORE_ADDR sp,
+			      function_call_return_method return_method,
+			      CORE_ADDR struct_addr)
+{
+  /* For non-static member functions of 32bit Windows programs, the thiscall
+     calling convention is used, so the 'this' pointer is passed in ECX.  */
+  bool thiscall = false;
+
+  struct type *type = check_typedef (value_type (function));
+  if (TYPE_CODE (type) == TYPE_CODE_PTR)
+    type = check_typedef (TYPE_TARGET_TYPE (type));
+
+  /* read_subroutine_type sets for non-static member functions the
+     artificial flag of the first parameter ('this' pointer).  */
+  if (TYPE_CODE (type) == TYPE_CODE_METHOD
+      && TYPE_NFIELDS (type) > 0
+      && TYPE_FIELD_ARTIFICIAL (type, 0)
+      && TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_PTR)
+    thiscall = 1;
+
+  return i386_thiscall_push_dummy_call (gdbarch, function, regcache, bp_addr,
+					nargs, args, sp, return_method,
+					struct_addr, thiscall);
+}
+
 /* Common parts for gdbarch initialization for Windows and Cygwin on i386.  */
 
 static void
@@ -234,6 +264,8 @@ i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
   i386_windows_init_abi_common (info, gdbarch);
   windows_init_abi (info, gdbarch);
+
+  set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
 }
 
 /* gdbarch initialization for Cygwin on i386.  */
-- 
2.26.2



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members
  2020-04-29 13:48 ` [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members Hannes Domani
@ 2020-04-29 16:45   ` Simon Marchi
  2020-04-29 16:49     ` Hannes Domani
  0 siblings, 1 reply; 6+ messages in thread
From: Simon Marchi @ 2020-04-29 16:45 UTC (permalink / raw)
  To: Hannes Domani, gdb-patches

> @@ -234,6 +264,8 @@ i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>  {
>    i386_windows_init_abi_common (info, gdbarch);
>    windows_init_abi (info, gdbarch);
> +
> +  set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
>  }

Just to be sure, this call convention does not apply to Cygwin programs?

Simon


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members
  2020-04-29 16:45   ` Simon Marchi
@ 2020-04-29 16:49     ` Hannes Domani
  2020-04-29 17:19       ` Hannes Domani
  0 siblings, 1 reply; 6+ messages in thread
From: Hannes Domani @ 2020-04-29 16:49 UTC (permalink / raw)
  To: Gdb-patches

 Am Mittwoch, 29. April 2020, 18:45:35 MESZ hat Simon Marchi <simark@simark.ca> Folgendes geschrieben:

> > @@ -234,6 +264,8 @@ i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
> >  {
> >    i386_windows_init_abi_common (info, gdbarch);
> >    windows_init_abi (info, gdbarch);
> > +
> > +  set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
> >  }
>
> Just to be sure, this call convention does not apply to Cygwin programs?

I don't really know, but you're right, I should find out.
I will install & test with a cygwin compiler tomorrow.


Hannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members
  2020-04-29 16:49     ` Hannes Domani
@ 2020-04-29 17:19       ` Hannes Domani
  2020-04-29 18:26         ` Simon Marchi
  0 siblings, 1 reply; 6+ messages in thread
From: Hannes Domani @ 2020-04-29 17:19 UTC (permalink / raw)
  To: Gdb-patches

 Am Mittwoch, 29. April 2020, 18:49:32 MESZ hat Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> Folgendes geschrieben:

> Am Mittwoch, 29. April 2020, 18:45:35 MESZ hat Simon Marchi <simark@simark.ca> Folgendes geschrieben:
>
> > > @@ -234,6 +264,8 @@ i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
> > >  {
> > >    i386_windows_init_abi_common (info, gdbarch);
> > >    windows_init_abi (info, gdbarch);
> > > +
> > > +  set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
> > >  }
> >
> > Just to be sure, this call convention does not apply to Cygwin programs?
>
>
> I don't really know, but you're right, I should find out.
> I will install & test with a cygwin compiler tomorrow.

Installing cygwin went faster than I expected.

And yes, cygwin does NOT use thiscall calling convention.
That just makes me more glad that now there exists a distinction between
cygwin & non-cygwin programs in gdb.


Hannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members
  2020-04-29 17:19       ` Hannes Domani
@ 2020-04-29 18:26         ` Simon Marchi
  2020-04-30 12:42           ` Hannes Domani
  0 siblings, 1 reply; 6+ messages in thread
From: Simon Marchi @ 2020-04-29 18:26 UTC (permalink / raw)
  To: Hannes Domani, Gdb-patches

On 2020-04-29 1:19 p.m., Hannes Domani via Gdb-patches wrote:
>  Am Mittwoch, 29. April 2020, 18:49:32 MESZ hat Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> Folgendes geschrieben:
> 
>> Am Mittwoch, 29. April 2020, 18:45:35 MESZ hat Simon Marchi <simark@simark.ca> Folgendes geschrieben:
>>
>>>> @@ -234,6 +264,8 @@ i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
>>>>   {
>>>>     i386_windows_init_abi_common (info, gdbarch);
>>>>     windows_init_abi (info, gdbarch);
>>>> +
>>>> +  set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
>>>>   }
>>>
>>> Just to be sure, this call convention does not apply to Cygwin programs?
>>
>>
>> I don't really know, but you're right, I should find out.
>> I will install & test with a cygwin compiler tomorrow.
> 
> Installing cygwin went faster than I expected.
> 
> And yes, cygwin does NOT use thiscall calling convention.
> That just makes me more glad that now there exists a distinction between
> cygwin & non-cygwin programs in gdb.

Ok, the patch LGTM then.

Thanks,

Simon


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members
  2020-04-29 18:26         ` Simon Marchi
@ 2020-04-30 12:42           ` Hannes Domani
  0 siblings, 0 replies; 6+ messages in thread
From: Hannes Domani @ 2020-04-30 12:42 UTC (permalink / raw)
  To: Gdb-patches

 Am Mittwoch, 29. April 2020, 20:27:02 MESZ hat Simon Marchi <simark@simark.ca> Folgendes geschrieben:

> On 2020-04-29 1:19 p.m., Hannes Domani via Gdb-patches wrote:
> >  Am Mittwoch, 29. April 2020, 18:49:32 MESZ hat Hannes Domani via Gdb-patches <gdb-patches@sourceware.org> Folgendes geschrieben:
> >
> >> Am Mittwoch, 29. April 2020, 18:45:35 MESZ hat Simon Marchi <simark@simark.ca> Folgendes geschrieben:
> >>
> >>>> @@ -234,6 +264,8 @@ i386_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
> >>>>   {
> >>>>     i386_windows_init_abi_common (info, gdbarch);
> >>>>     windows_init_abi (info, gdbarch);
> >>>> +
> >>>> +  set_gdbarch_push_dummy_call (gdbarch, i386_windows_push_dummy_call);
> >>>>   }
> >>>
> >>> Just to be sure, this call convention does not apply to Cygwin programs?
> >>
> >>
> >> I don't really know, but you're right, I should find out.
> >> I will install & test with a cygwin compiler tomorrow.
> >
> > Installing cygwin went faster than I expected.
> >
> > And yes, cygwin does NOT use thiscall calling convention.
> > That just makes me more glad that now there exists a distinction between
> > cygwin & non-cygwin programs in gdb.
>
> Ok, the patch LGTM then.

Pushed, thanks.


Hannes


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-04-30 12:42 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20200429134808.3642-1-ssbssa.ref@yahoo.de>
2020-04-29 13:48 ` [PATCH v3][PR gdb/15559] Use thiscall calling convention for class members Hannes Domani
2020-04-29 16:45   ` Simon Marchi
2020-04-29 16:49     ` Hannes Domani
2020-04-29 17:19       ` Hannes Domani
2020-04-29 18:26         ` Simon Marchi
2020-04-30 12:42           ` Hannes Domani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox