Commit b1160407 authored by Alexandre Julliard's avatar Alexandre Julliard

winebuild: Add support for specifying thiscall calling convention.

parent d8cb2a0c
......@@ -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;
......
......@@ -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;
......
......@@ -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:
......
......@@ -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 );
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment