Added vararg argument type so that the relay code can distinguish from
a normal cdecl function. Don't rely on the relay thunk preserving the stack pointer.
This commit is contained in:
parent
1943208eec
commit
e56d9deac4
|
@ -334,6 +334,9 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context )
|
|||
debugstr_a( MapSL(*(SEGPTR *)args16 )) );
|
||||
args16 += sizeof(SEGPTR);
|
||||
break;
|
||||
case ARG_VARARG:
|
||||
DPRINTF( "..." );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -374,6 +377,9 @@ void RELAY_DebugCallFrom16( CONTEXT86 *context )
|
|||
DPRINTF( "%04x:%04x %s", *(WORD *)(args16+2), *(WORD *)args16,
|
||||
debugstr_a( MapSL(*(SEGPTR *)args16 )) );
|
||||
break;
|
||||
case ARG_VARARG:
|
||||
DPRINTF( "..." );
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -213,7 +213,8 @@ enum arg_types
|
|||
ARG_LONG, /* long or segmented pointer */
|
||||
ARG_PTR, /* linear pointer */
|
||||
ARG_STR, /* linear pointer to null-terminated string */
|
||||
ARG_SEGSTR /* segmented pointer to null-terminated string */
|
||||
ARG_SEGSTR, /* segmented pointer to null-terminated string */
|
||||
ARG_VARARG /* start of varargs */
|
||||
};
|
||||
|
||||
/* flags added to arg_types[0] */
|
||||
|
|
|
@ -369,7 +369,8 @@ static void BuildCallFrom16Core( FILE *outfile, int reg_func, int thunk, int sho
|
|||
|
||||
if ( reg_func )
|
||||
{
|
||||
fprintf( outfile, "\tmovl %%esp, %%ebx\n" );
|
||||
fprintf( outfile, "\tleal -%d(%%ebp), %%ebx\n",
|
||||
sizeof(CONTEXT) + STRUCTOFFSET(STACK32FRAME, ebp) );
|
||||
|
||||
/* Switch stack back */
|
||||
fprintf( outfile, "\t.byte 0x64\n\tmovw (%d), %%ss\n", STACKOFFSET+2 );
|
||||
|
|
|
@ -254,7 +254,7 @@ static void BuildCallFrom16Func( FILE *outfile, const char *profile, const char
|
|||
fprintf( outfile, "void" );
|
||||
fprintf( outfile, " );\n" );
|
||||
|
||||
fprintf( outfile, "static %s __stdcall __wine_%s_CallFrom16_%s( proc_%s_t proc, unsigned char *args%s )\n",
|
||||
fprintf( outfile, "static %s __wine_%s_CallFrom16_%s( proc_%s_t proc, unsigned char *args%s )\n",
|
||||
ret_type, make_c_identifier(prefix), profile, profile,
|
||||
reg_func? ", void *context" : "" );
|
||||
|
||||
|
@ -781,6 +781,7 @@ void BuildSpec16File( FILE *outfile, DLLSPEC *spec )
|
|||
}
|
||||
arg_types[j / 10] |= type << (3 * (j % 10));
|
||||
}
|
||||
if (typelist[i]->type == TYPE_VARARGS) arg_types[j / 10] |= ARG_VARARG << (3 * (j % 10));
|
||||
if (typelist[i]->flags & FLAG_REGISTER) arg_types[0] |= ARG_REGISTER;
|
||||
if (typelist[i]->flags & FLAG_RET16) arg_types[0] |= ARG_RET16;
|
||||
|
||||
|
|
Loading…
Reference in New Issue