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