Module: wine Branch: master Commit: b116040771d85595f50e3b0eba526fcb3a98c96c URL: http://source.winehq.org/git/wine.git/?a=commit;h=b116040771d85595f50e3b0eba...
Author: Alexandre Julliard julliard@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