Module: wine Branch: master Commit: 6828fc8b3a7fe1fd396a0f5ebe5cec95d24c7840 URL: https://gitlab.winehq.org/wine/wine/-/commit/6828fc8b3a7fe1fd396a0f5ebe5cec9...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Sep 19 12:00:35 2023 +0200
winebuild: Add a separate helper for .seh annotations.
---
tools/winebuild/build.h | 2 ++ tools/winebuild/import.c | 8 ++++---- tools/winebuild/spec32.c | 10 +++++----- tools/winebuild/utils.c | 13 +++++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index 733cd34e614..dfa8574a5da 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -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, ... ) diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index de4bc26f60d..1de0bea3faa 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -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" ); diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index 874c81d0ddc..e3c29acfa91 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -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; }
diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 49d2468b236..64437acf9ce 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -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, ... ) {