Alexandre Julliard : winebuild: Add support for specifying thiscall calling convention.

Alexandre Julliard julliard at winehq.org
Tue Aug 24 11:09:26 CDT 2010


Module: wine
Branch: master
Commit: b116040771d85595f50e3b0eba526fcb3a98c96c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b116040771d85595f50e3b0eba526fcb3a98c96c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Aug 24 15:20:00 2010 +0200

winebuild: Add support for specifying thiscall calling convention.

---

 tools/winebuild/build.h          |    1 +
 tools/winebuild/import.c         |    1 +
 tools/winebuild/parser.c         |   13 +++++++++++++
 tools/winebuild/spec32.c         |    2 ++
 tools/winebuild/winebuild.man.in |    5 +++++
 5 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h
index 85b8427..ef91961 100644
--- a/tools/winebuild/build.h
+++ b/tools/winebuild/build.h
@@ -47,6 +47,7 @@ typedef enum
     TYPE_STDCALL,      /* stdcall function (Win32) */
     TYPE_CDECL,        /* cdecl function (Win32) */
     TYPE_VARARGS,      /* varargs function (Win32) */
+    TYPE_THISCALL,     /* thiscall function (Win32 on i386) */
     TYPE_EXTERN,       /* external symbol (Win32) */
     TYPE_NBTYPES
 } ORD_TYPE;
diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c
index a221a9d..6a77a3f 100644
--- a/tools/winebuild/import.c
+++ b/tools/winebuild/import.c
@@ -457,6 +457,7 @@ static void check_undefined_exports( DLLSPEC *spec )
             case TYPE_STDCALL:
             case TYPE_CDECL:
             case TYPE_VARARGS:
+            case TYPE_THISCALL:
                 if (link_ext_symbols)
                 {
                     odp->flags |= FLAG_EXT_LINK;
diff --git a/tools/winebuild/parser.c b/tools/winebuild/parser.c
index f48471c..459bf97 100644
--- a/tools/winebuild/parser.c
+++ b/tools/winebuild/parser.c
@@ -56,6 +56,7 @@ static const char * const TypeNames[TYPE_NBTYPES] =
     "stdcall",      /* TYPE_STDCALL */
     "cdecl",        /* TYPE_CDECL */
     "varargs",      /* TYPE_VARARGS */
+    "thiscall",     /* TYPE_THISCALL */
     "extern"        /* TYPE_EXTERN */
 };
 
@@ -235,6 +236,11 @@ static int parse_spec_export( ORDDEF *odp, DLLSPEC *spec )
         error( "'stdcall' not supported for Win16\n" );
         return 0;
     }
+    if (!is_win32 && odp->type == TYPE_THISCALL)
+    {
+        error( "'thiscall' not supported for Win16\n" );
+        return 0;
+    }
     if (is_win32 && odp->type == TYPE_PASCAL)
     {
         error( "'pascal' not supported for Win32\n" );
@@ -325,6 +331,12 @@ static int parse_spec_export( ORDDEF *odp, DLLSPEC *spec )
             odp->flags |= FLAG_FORWARD;
         }
     }
+    if (target_cpu == CPU_x86 && odp->type == TYPE_THISCALL && !(odp->flags & FLAG_FORWARD))
+    {
+        char *link_name = strmake( "__thiscall_%s", odp->link_name );
+        free( odp->link_name );
+        odp->link_name = link_name;
+    }
     return 1;
 }
 
@@ -524,6 +536,7 @@ static int parse_spec_ordinal( int ordinal, DLLSPEC *spec )
     case TYPE_STDCALL:
     case TYPE_VARARGS:
     case TYPE_CDECL:
+    case TYPE_THISCALL:
         if (!parse_spec_export( odp, spec )) goto error;
         break;
     case TYPE_ABS:
diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c
index 3152660..cf0b76e 100644
--- a/tools/winebuild/spec32.c
+++ b/tools/winebuild/spec32.c
@@ -246,6 +246,7 @@ void output_exports( DLLSPEC *spec )
         case TYPE_STDCALL:
         case TYPE_VARARGS:
         case TYPE_CDECL:
+        case TYPE_THISCALL:
             if (odp->flags & FLAG_FORWARD)
             {
                 output( "\t%s .L__wine_spec_forwards+%u\n", get_asm_ptr_keyword(), fwd_size );
@@ -816,6 +817,7 @@ void output_def_file( DLLSPEC *spec, int include_private )
             /* fall through */
         case TYPE_VARARGS:
         case TYPE_CDECL:
+        case TYPE_THISCALL:
             /* try to reduce output */
             if(strcmp(name, odp->link_name) || (odp->flags & FLAG_FORWARD))
                 output( "=%s", odp->link_name );
diff --git a/tools/winebuild/winebuild.man.in b/tools/winebuild/winebuild.man.in
index 5ea9465..fb554f7 100644
--- a/tools/winebuild/winebuild.man.in
+++ b/tools/winebuild/winebuild.man.in
@@ -325,6 +325,11 @@ for a Win16 or Win32 function using the C calling convention
 .B varargs
 for a Win16 or Win32 function using the C calling convention with a
 variable number of arguments
+.TP
+.B thiscall
+for a Win32 function using the
+.I thiscall
+calling convention (first parameter in %ecx register on i386)
 .RE
 .PP
 .I args




More information about the wine-cvs mailing list