mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-06 05:00:30 +00:00
winebuild: Add support for specifying thiscall calling convention.
This commit is contained in:
parent
d8cb2a0c38
commit
b116040771
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue