Sourceware Bugzilla – Attachment 11182 Details for
Bug 15559
Method call and calling convention
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
new patch against gdb git
0001-inferior-call-change-use-thiscall-calling-convention.patch (text/plain), 4.33 KB, created by
asmwarrior
on 2018-08-12 07:06:18 UTC
(
hide
)
Description:
new patch against gdb git
Filename:
MIME Type:
Creator:
asmwarrior
Created:
2018-08-12 07:06:18 UTC
Size:
4.33 KB
patch
obsolete
>From 0934cfd16bdec6ae71e2aa34e301bef64db62b13 Mon Sep 17 00:00:00 2001 >From: asmwarrior <asmwarrior@gmail.com> >Date: Thu, 5 Oct 2017 19:38:06 +0800 >Subject: [PATCH 1/3] inferior call change: use thiscall calling convention for > x86 mingw gcc 4.7.0 and above in C++ class method, borrow some code from > sh-tdep.c to handling function typedef and pointers for thiscall calling > convention, a hack to tell i386_push_dummy_call() function that whether it is > a static member function. > >--- > gdb/eval.c | 7 +++++++ > gdb/i386-tdep.c | 44 +++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 50 insertions(+), 1 deletion(-) > >diff --git a/gdb/eval.c b/gdb/eval.c >index 9db6e7c69d..3186783d24 100644 >--- a/gdb/eval.c >+++ b/gdb/eval.c >@@ -45,6 +45,10 @@ > /* This is defined in valops.c */ > extern int overload_resolution; > >+/* this variable is to notify i386_push_dummy_call that an >+ function is static member function, it is a hack */ >+extern int i386_windows_static_memfun; >+ > /* Prototypes for local functions. */ > > static struct value *evaluate_subexp_for_sizeof (struct expression *, int *, >@@ -1174,7 +1178,10 @@ evaluate_funcall (type *expect_type, expression *exp, int *pos, > argvec[1] = argvec[0]; > nargs--; > argvec++; >+ i386_windows_static_memfun = 1; > } >+ else >+ i386_windows_static_memfun = 0; > } > else if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR) > { >diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c >index b1d502f482..c70d0e80fb 100644 >--- a/gdb/i386-tdep.c >+++ b/gdb/i386-tdep.c >@@ -44,6 +44,8 @@ > #include "dis-asm.h" > #include "disasm.h" > #include "remote.h" >+#include "utils.h" >+#include "infcall.h" > #include "i386-tdep.h" > #include "i387-tdep.h" > #include "x86-xstate.h" >@@ -65,6 +67,8 @@ > #include <ctype.h> > #include <algorithm> > >+#include "producer.h" >+ > /* Register names. */ > > static const char *i386_register_names[] = >@@ -2667,6 +2671,10 @@ i386_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, CORE_ADDR funaddr, > /* Keep the stack aligned. */ > return sp - 16; > } >+/* This is the hack to handle the non-static member function to thiscall >+ calling convention mode, this variable is updated in eval.c of the >+ static member function check */ >+int i386_windows_static_memfun = 0; > > static CORE_ADDR > i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function, >@@ -2679,6 +2687,34 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function, > int i; > int write_pass; > int args_space = 0; >+ struct type *func_type = value_type (function); >+ int i386_windows_thiscall = 0; >+ struct compunit_symtab *sym; >+ int gcc_minor; >+ >+ if (func_type) >+ { >+ func_type = check_typedef (func_type); >+ >+ if (TYPE_CODE (func_type) == TYPE_CODE_PTR) >+ func_type = check_typedef (TYPE_TARGET_TYPE (func_type)); >+ >+ if( (TYPE_CODE (func_type) == TYPE_CODE_METHOD) >+ && (nargs > 0) >+ && i386_windows_static_memfun == 0 ) >+ { >+ sym = find_pc_compunit_symtab(find_function_addr(function,NULL)); >+ if (sym != NULL && sym->producer != NULL) >+ { >+ /* if function is build from gcc 4.7 and later, we should use thiscall >+ for non static member function. */ >+ >+ gcc_minor = producer_is_gcc_ge_4(sym->producer); >+ if (gcc_minor > 6) >+ i386_windows_thiscall = 1; >+ } >+ } >+ } > > /* BND registers can be in arbitrary values at the moment of the > inferior call. This can cause boundary violations that are not >@@ -2708,7 +2744,7 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function, > args_space += 4; > } > >- for (i = 0; i < nargs; i++) >+ for (i = i386_windows_thiscall; i < nargs; i++) > { > int len = TYPE_LENGTH (value_enclosing_type (args[i])); > >@@ -2760,6 +2796,12 @@ i386_push_dummy_call (struct gdbarch *gdbarch, struct value *function, > /* ...and fake a frame pointer. */ > regcache->cooked_write (I386_EBP_REGNUM, buf); > >+ if (i386_windows_thiscall) >+ { >+ /* args[0] refer to the last argument which is the this pointer */ >+ 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 >-- >2.14.2.windows.2 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 15559
:
7225
|
7227
|
7438
|
7443
|
7448
| 11182