mirror of
git://source.winehq.org/git/wine.git
synced 2024-07-25 13:16:24 +00:00
winebuild: Add a separate helper for .seh annotations.
This commit is contained in:
parent
38a7e68af1
commit
6828fc8b3a
|
@ -246,6 +246,8 @@ extern int output( const char *format, ... )
|
|||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
extern void output_cfi( const char *format, ... )
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
extern void output_seh( const char *format, ... )
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
extern void output_rva( const char *format, ... )
|
||||
__attribute__ ((__format__ (__printf__, 1, 2)));
|
||||
extern void output_thunk_rva( int ordinal, const char *format, ... )
|
||||
|
|
|
@ -1698,11 +1698,11 @@ static void build_windows_import_lib( const char *lib_name, DLLSPEC *spec, struc
|
|||
output( "\tjmp *%%eax\n" );
|
||||
break;
|
||||
case CPU_x86_64:
|
||||
output_cfi( ".seh_proc %s", asm_name( delay_load ) );
|
||||
output_seh( ".seh_proc %s", asm_name( delay_load ) );
|
||||
output( "\tsubq $0x48, %%rsp\n" );
|
||||
output_cfi( ".cfi_adjust_cfa_offset 0x48" );
|
||||
output_cfi( ".seh_stackalloc 0x48" );
|
||||
output_cfi( ".seh_endprologue" );
|
||||
output_seh( ".seh_stackalloc 0x48" );
|
||||
output_seh( ".seh_endprologue" );
|
||||
output( "\tmovq %%rcx, 0x40(%%rsp)\n" );
|
||||
output( "\tmovq %%rdx, 0x38(%%rsp)\n" );
|
||||
output( "\tmovq %%r8, 0x30(%%rsp)\n" );
|
||||
|
@ -1717,7 +1717,7 @@ static void build_windows_import_lib( const char *lib_name, DLLSPEC *spec, struc
|
|||
output( "\taddq $0x48, %%rsp\n" );
|
||||
output_cfi( ".cfi_adjust_cfa_offset -0x48" );
|
||||
output( "\tjmp *%%rax\n" );
|
||||
output_cfi( ".seh_endproc" );
|
||||
output_seh( ".seh_endproc" );
|
||||
break;
|
||||
case CPU_ARM:
|
||||
output( "\tpush {r0-r3, FP, LR}\n" );
|
||||
|
|
|
@ -334,12 +334,12 @@ static void output_relay_debug( DLLSPEC *spec )
|
|||
|
||||
output( "\t.align %d\n", get_alignment(4) );
|
||||
output( "__wine_spec_relay_entry_point_%d:\n", i );
|
||||
output_cfi( ".seh_proc __wine_spec_relay_entry_point_%d", i );
|
||||
output_seh( ".seh_proc __wine_spec_relay_entry_point_%d", i );
|
||||
output( "\tstp x29, x30, [sp, #-%u]!\n", stack_size + 16 );
|
||||
output_cfi( ".seh_save_fplr_x %u", stack_size + 16 );
|
||||
output_seh( ".seh_save_fplr_x %u", stack_size + 16 );
|
||||
output( "\tmov x29, sp\n" );
|
||||
output_cfi( ".seh_set_fp" );
|
||||
output_cfi( ".seh_endprologue" );
|
||||
output_seh( ".seh_set_fp" );
|
||||
output_seh( ".seh_endprologue" );
|
||||
switch (stack_size)
|
||||
{
|
||||
case 64: output( "\tstp x6, x7, [sp, #64]\n" );
|
||||
|
@ -363,7 +363,7 @@ static void output_relay_debug( DLLSPEC *spec )
|
|||
output( "\tmov sp, x29\n" );
|
||||
output( "\tldp x29, x30, [sp], #%u\n", stack_size + 16 );
|
||||
output( "\tret\n");
|
||||
output_cfi( ".seh_endproc" );
|
||||
output_seh( ".seh_endproc" );
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -938,6 +938,19 @@ void output_cfi( const char *format, ... )
|
|||
va_end( valist );
|
||||
}
|
||||
|
||||
/* output a .seh directive */
|
||||
void output_seh( const char *format, ... )
|
||||
{
|
||||
va_list valist;
|
||||
|
||||
if (!is_pe()) return;
|
||||
va_start( valist, format );
|
||||
fputc( '\t', output_file );
|
||||
vfprintf( output_file, format, valist );
|
||||
fputc( '\n', output_file );
|
||||
va_end( valist );
|
||||
}
|
||||
|
||||
/* output an RVA pointer */
|
||||
void output_rva( const char *format, ... )
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue