winebuild: Add a separate helper for .seh annotations.

This commit is contained in:
Alexandre Julliard 2023-09-19 12:00:35 +02:00
parent 38a7e68af1
commit 6828fc8b3a
4 changed files with 24 additions and 9 deletions

View file

@ -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, ... )

View file

@ -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" );

View file

@ -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;
}

View file

@ -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, ... )
{