From 849d08b0aed1b256ac459347cb488ef3db5ce3f9 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Fri, 14 Aug 2020 14:54:14 +0300 Subject: [PATCH] winebuild: Use the right arm64 page/pageoff relocation syntax for darwin. Signed-off-by: Martin Storsjo Signed-off-by: Alexandre Julliard --- tools/winebuild/build.h | 2 ++ tools/winebuild/import.c | 34 ++++++++++++++++++---------------- tools/winebuild/spec32.c | 4 ++-- tools/winebuild/utils.c | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h index e1d2e5edf85..03715af9563 100644 --- a/tools/winebuild/build.h +++ b/tools/winebuild/build.h @@ -291,6 +291,8 @@ extern const char *get_asm_export_section(void); extern const char *get_asm_rodata_section(void); extern const char *get_asm_rsrc_section(void); extern const char *get_asm_string_section(void); +extern const char *arm64_page( const char *sym ); +extern const char *arm64_pageoff( const char *sym ); extern void output_function_size( const char *name ); extern void output_gnu_stack_note(void); diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index da9ad620225..751335f36f3 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -761,8 +761,8 @@ static void output_import_thunk( const char *name, const char *table, int pos ) output( "1:\t.long %s+%u-(1b+4)\n", table, pos ); break; case CPU_ARM64: - output( "\tadrp x9, %s\n", table ); - output( "\tadd x9, x9, #:lo12:%s\n", table ); + output( "\tadrp x9, %s\n", arm64_page( table ) ); + output( "\tadd x9, x9, #%s\n", arm64_pageoff( table ) ); if (pos & 0xf000) output( "\tadd x9, x9, #%u\n", pos & 0xf000 ); if (pos & 0x0f00) output( "\tadd x9, x9, #%u\n", pos & 0x0f00 ); if (pos & 0x00f0) output( "\tadd x9, x9, #%u\n", pos & 0x00f0 ); @@ -1080,8 +1080,8 @@ static void output_delayed_import_thunks( const DLLSPEC *spec ) case CPU_ARM64: output( "\tstp x29, x30, [sp,#-16]!\n" ); output( "\tmov x29, sp\n" ); - output( "\tadrp x9, %s\n", asm_name("__wine_spec_delay_load") ); - output( "\tadd x9, x9, #:lo12:%s\n", asm_name("__wine_spec_delay_load") ); + output( "\tadrp x9, %s\n", arm64_page( asm_name("__wine_spec_delay_load") ) ); + output( "\tadd x9, x9, #%s\n", arm64_pageoff( asm_name("__wine_spec_delay_load") ) ); output( "\tblr x9\n" ); output( "\tmov x9, x0\n" ); output( "\tldp x29, x30, [sp],#16\n" ); @@ -1367,17 +1367,19 @@ void output_stubs( DLLSPEC *spec ) else output( "\t.long %u\n", odp->ordinal ); break; case CPU_ARM64: - output( "\tadrp x0, .L__wine_spec_file_name\n" ); - output( "\tadd x0, x0, #:lo12:.L__wine_spec_file_name\n" ); + output( "\tadrp x0, %s\n", arm64_page(".L__wine_spec_file_name") ); + output( "\tadd x0, x0, #%s\n", arm64_pageoff(".L__wine_spec_file_name") ); if (exp_name) { - output( "\tadrp x1, .L%s_string\n", name ); - output( "\tadd x1, x1, #:lo12:.L%s_string\n", name ); + char *sym = strmake( ".L%s_string", name ); + output( "\tadrp x1, %s\n", arm64_page( sym ) ); + output( "\tadd x1, x1, #%s\n", arm64_pageoff( sym ) ); + free( sym ); } else output( "\tmov x1, %u\n", odp->ordinal ); - output( "\tadrp x2, %s\n", asm_name("__wine_spec_unimplemented_stub") ); - output( "\tadd x2, x2, #:lo12:%s\n", asm_name("__wine_spec_unimplemented_stub") ); + output( "\tadrp x2, %s\n", arm64_page( asm_name("__wine_spec_unimplemented_stub") ) ); + output( "\tadd x2, x2, #%s\n", arm64_pageoff( asm_name("__wine_spec_unimplemented_stub") ) ); output( "\tblr x2\n" ); break; default: @@ -1627,8 +1629,8 @@ void output_syscalls( DLLSPEC *spec ) output( "\tldr x20, [x19]\n" ); /* prev frame */ output( "\tstr x20, [sp, #88]\n" ); output( "\tstr x29, [x19]\n" ); /* syscall frame */ - output( "\tadrp x16, .Lsyscall_args\n" ); - output( "\tadd x16, x16, #:lo12:.Lsyscall_args\n" ); + output( "\tadrp x16, %s\n", arm64_page(".Lsyscall_args") ); + output( "\tadd x16, x16, #%s\n", arm64_pageoff(".Lsyscall_args") ); output( "\tldrb w9, [x16, x8]\n" ); output( "\tsubs x9, x9, #64\n" ); output( "\tbls 2f\n" ); @@ -1640,8 +1642,8 @@ void output_syscalls( DLLSPEC *spec ) output( "\tldr x10, [x11, x9]\n" ); output( "\tstr x10, [sp, x9]\n" ); output( "\tcbnz x9, 1b\n" ); - output( "2:\tadrp x16, .Lsyscall_table\n" ); - output( "\tadd x16, x16, #:lo12:.Lsyscall_table\n" ); + output( "2:\tadrp x16, %s\n", arm64_page(".Lsyscall_table") ); + output( "\tadd x16, x16, #%s\n", arm64_pageoff(".Lsyscall_table") ); output( "\tldr x16, [x16, x8, lsl 3]\n" ); output( "\tblr x16\n" ); output( "\tmov sp, x29\n" ); @@ -1741,8 +1743,8 @@ void output_syscalls( DLLSPEC *spec ) case CPU_ARM64: output( "\tstp x29, x30, [sp,#-16]!\n" ); output( "\tmov x8, #%u\n", i ); - output( "\tadrp x16, %s\n", asm_name("__wine_syscall_dispatcher") ); - output( "\tldr x16, [x16, #:lo12:%s]\n", asm_name("__wine_syscall_dispatcher") ); + output( "\tadrp x16, %s\n", arm64_page( asm_name("__wine_syscall_dispatcher") ) ); + output( "\tldr x16, [x16, #%s]\n", arm64_pageoff( asm_name("__wine_syscall_dispatcher") ) ); output( "\tblr x16\n"); output( "\tldp x29, x30, [sp], #16\n" ); output( "\tret\n" ); diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c index c85249b2a96..efb136a8e61 100644 --- a/tools/winebuild/spec32.c +++ b/tools/winebuild/spec32.c @@ -339,8 +339,8 @@ static void output_relay_debug( DLLSPEC *spec ) output( "\tstp x8, x9, [SP,#-16]!\n" ); output( "\tmov w1, #%u\n", odp->u.func.args_str_offset << 16 ); if (i - spec->base) output( "\tadd w1, w1, #%u\n", i - spec->base ); - output( "\tadrp x0, .L__wine_spec_relay_descr\n"); - output( "\tadd x0, x0, #:lo12:.L__wine_spec_relay_descr\n"); + output( "\tadrp x0, %s\n", arm64_page(".L__wine_spec_relay_descr") ); + output( "\tadd x0, x0, #%s\n", arm64_pageoff(".L__wine_spec_relay_descr") ); output( "\tldr x3, [x0, #8]\n"); output( "\tblr x3\n"); output( "\tadd SP, SP, #16\n" ); diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c index 07ef2ed2989..1af42f10005 100644 --- a/tools/winebuild/utils.c +++ b/tools/winebuild/utils.c @@ -1291,3 +1291,35 @@ const char *get_asm_string_section(void) default: return ".section .rodata"; } } + +const char *arm64_page( const char *sym ) +{ + static char *buffer; + + switch (target_platform) + { + case PLATFORM_APPLE: + free( buffer ); + buffer = strmake( "%s@PAGE", sym ); + return buffer; + default: + return sym; + } +} + +const char *arm64_pageoff( const char *sym ) +{ + static char *buffer; + + free( buffer ); + switch (target_platform) + { + case PLATFORM_APPLE: + buffer = strmake( "%s@PAGEOFF", sym ); + break; + default: + buffer = strmake( ":lo12:%s", sym ); + break; + } + return buffer; +}