diff options
author | Alex Soto <alex@alexsoto.me> | 2021-03-10 20:30:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-10 20:30:13 +0300 |
commit | 14ac6d4f0b8b8f1230633d2679ef12ccd9ba370f (patch) | |
tree | 0032a6cafa9f32849d220ac3fa0c187227db2113 | |
parent | 7dc02abf99cd82d0cf379ea5f82acbcb7c197129 (diff) |
[2020-02] Backport Apple silicon support (#20909)
Adds Apple silicon support from https://github.com/mono/mono/pull/20597 to 2020-02
Co-authored-by: Zoltan Varga <vargaz@gmail.com>
Co-authored-by: Ilia <ki.stfu@gmail.com>
Co-authored-by: Aleksey Kliger (λgeek) <alklig@microsoft.com>
Co-authored-by: mathieubourgeois <mathieu.bourgeois@gameloft.com>
Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
29 files changed, 394 insertions, 82 deletions
diff --git a/configure.ac b/configure.ac index 4d32c907c23..35f9250e326 100644 --- a/configure.ac +++ b/configure.ac @@ -442,6 +442,10 @@ case "$host" in platform_ios=yes has_dtrace=no ;; + aarch64*-darwin20*) + # OSX/arm64 + support_boehm=no + ;; aarch64*-darwin*) platform_ios=yes ;; @@ -1192,6 +1196,7 @@ if test "x$crash_reporting" != "xyes"; then CFLAGS="$CFLAGS -DDISABLE_CRASH_REPORTING=1" CXXFLAGS="$CXXFLAGS -DDISABLE_CRASH_REPORTING=1" fi +AM_CONDITIONAL(DISABLE_CRASH_REPORTING, test x$crash_reporting != xyes) AC_ARG_ENABLE(monodroid, [ --enable-monodroid Enable runtime support for Monodroid (Xamarin.Android)], enable_monodroid=$enableval, enable_monodroid=no) AM_CONDITIONAL(ENABLE_MONODROID, test x$enable_monodroid = xyes) @@ -2760,7 +2765,7 @@ if test x$host_win32 = xno; then AC_CHECK_HEADERS(pthread_np.h) AC_CHECK_FUNCS(pthread_mutex_timedlock) AC_CHECK_FUNCS(pthread_getattr_np pthread_attr_get_np pthread_getname_np pthread_setname_np pthread_cond_timedwait_relative_np) - AC_CHECK_FUNCS(pthread_kill) + AC_CHECK_FUNCS(pthread_kill pthread_jit_write_protect_np) AC_MSG_CHECKING(for PTHREAD_MUTEX_RECURSIVE) AC_TRY_COMPILE([ #include <pthread.h>], [ pthread_mutexattr_t attr; @@ -4680,6 +4685,14 @@ if test "x$host" != "x$target"; then sizeof_register=8 AC_DEFINE(TARGET_WATCHOS, 1, [...]) ;; + aarch64*darwin20*) + TARGET=ARM64 + TARGET_SYS=OSX + ;; + aarch64*darwin*) + TARGET=ARM64 + TARGET_SYS=IOS + ;; aarch64-*) TARGET=ARM64 ;; @@ -4892,7 +4905,7 @@ if test "x$target_mach" = "xyes"; then CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_WATCHOS" CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_WATCHOS" BTLS_SUPPORTED=no - elif test "x$TARGET" = "xARM" -o "x$TARGET" = "xARM64" -o "x$TARGET" = "xARM6432"; then + elif test "x$TARGET_SYS" = "xIOS" -o "x$TARGET" = "xARM" -o "x$TARGET" = "xARM6432"; then AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS]) CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS" CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_IOS" @@ -4908,6 +4921,9 @@ if test "x$target_mach" = "xyes"; then CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_OSX" CFLAGS_FOR_LIBGC="$CFLAGS_FOR_LIBGC -DTARGET_OSX" target_osx=yes + if test "x$TARGET" = "xARM64"; then + BTLS_SUPPORTED=no + fi ], [ AC_DEFINE(TARGET_IOS,1,[The JIT/AOT targets iOS]) CPPFLAGS_FOR_LIBGC="$CPPFLAGS_FOR_LIBGC -DTARGET_IOS" diff --git a/mono/arch/arm64/Makefile.am b/mono/arch/arm64/Makefile.am index bdc37622a64..e735d0ed69a 100644 --- a/mono/arch/arm64/Makefile.am +++ b/mono/arch/arm64/Makefile.am @@ -1,3 +1,9 @@ MAKEFLAGS := $(MAKEFLAGS) --no-builtin-rules EXTRA_DIST = arm64-codegen.h codegen-test.c + +test-codegen: + $(CC) $(CFLAGS) -I../../.. -I../../eglib/ ../../eglib/.libs/libeglib.a -o codegen-test codegen-test.c + ./codegen-test > tmp.s + $(CC) $(CFLAGS) -c -o tmp.o tmp.s + objdump -d --triple=arm64e tmp.o diff --git a/mono/arch/arm64/arm64-codegen.h b/mono/arch/arm64/arm64-codegen.h index 239f4161fd9..d35fda11752 100644 --- a/mono/arch/arm64/arm64-codegen.h +++ b/mono/arch/arm64/arm64-codegen.h @@ -867,4 +867,40 @@ arm_encode_arith_imm (int imm, guint32 *shift) #define arm_cmpp arm_cmpx #endif +/* ARM v8.3 */ + +/* PACIA */ + +#define arm_format_pacia(p, crm, op2) arm_emit ((p), (0b11010101000000110010000000011111 << 0) | ((crm) << 8) | ((op2) << 5)) +#define arm_paciasp(p) arm_format_pacia ((p), 0b0011, 0b001) + +/* PACIB */ + +#define arm_format_pacib(p, crm, op2) arm_emit ((p), (0b11010101000000110010000000011111 << 0) | ((crm) << 8) | ((op2) << 5)) +#define arm_pacibsp(p) arm_format_pacib ((p), 0b0011, 0b011) + +/* RETA */ +#define arm_format_reta(p,key) arm_emit ((p), 0b11010110010111110000101111111111 + ((key) << 10)) + +#define arm_retaa(p) arm_format_reta ((p),0) +#define arm_retab(p) arm_format_reta ((p),1) + +/* BRA */ + +#define arm_format_bra(p, z, m, rn, rm) arm_emit ((p), (0b1101011000011111000010 << 10) + ((z) << 24) + ((m) << 10) + ((rn) << 5) + ((rm) << 0)) + +#define arm_braaz(p, rn) arm_format_bra ((p), 0, 0, (rn), 0b11111) +#define arm_brabz(p, rn) arm_format_bra ((p), 0, 1, (rn), 0b11111) +#define arm_braa(p, rn, rm) arm_format_bra ((p), 1, 0, (rn), (rm)) +#define arm_brab(p, rn, rm) arm_format_bra ((p), 1, 1, (rn), (rm)) + +/* BLRA */ + +#define arm_format_blra(p, z, m, rn, rm) arm_emit ((p), (0b1101011000111111000010 << 10) + ((z) << 24) + ((m) << 10) + ((rn) << 5) + ((rm) << 0)) + +#define arm_blraaz(p, rn) arm_format_blra ((p), 0, 0, (rn), 0b11111) +#define arm_blraa(p, rn, rm) arm_format_blra ((p), 1, 0, (rn), (rm)) +#define arm_blrabz(p, rn) arm_format_blra ((p), 0, 1, (rn), 0b11111) +#define arm_blrab(p, rn, rm) arm_format_blra ((p), 1, 1, (rn), (rm)) + #endif /* __arm_CODEGEN_H__ */ diff --git a/mono/arch/arm64/codegen-test.c b/mono/arch/arm64/codegen-test.c index bb9d9dcdecd..efb991e8427 100644 --- a/mono/arch/arm64/codegen-test.c +++ b/mono/arch/arm64/codegen-test.c @@ -416,6 +416,19 @@ main (int argc, char *argv []) arm_stlxrx (code, ARMREG_R0, ARMREG_R1, ARMREG_R2); arm_stlxrw (code, ARMREG_R0, ARMREG_R1, ARMREG_R2); + arm_paciasp (code); + arm_pacibsp (code); + arm_retaa (code); + arm_retab (code); + arm_braaz (code, ARMREG_R1); + arm_brabz (code, ARMREG_R1); + arm_braa (code, ARMREG_R1, ARMREG_R2); + arm_brab (code, ARMREG_R1, ARMREG_R2); + arm_blraaz (code, ARMREG_R1); + arm_blraa (code, ARMREG_R1, ARMREG_R2); + arm_blrabz (code, ARMREG_R1); + arm_blrab (code, ARMREG_R1, ARMREG_R2); + for (i = 0; i < code - buf; ++i) printf (".byte %d\n", buf [i]); printf ("\n"); diff --git a/mono/eglib/eglib-remap.h b/mono/eglib/eglib-remap.h index c5e27adae85..c9751049c3b 100644 --- a/mono/eglib/eglib-remap.h +++ b/mono/eglib/eglib-remap.h @@ -311,3 +311,6 @@ #define g_set_printerr_handler monoeg_set_printerr_handler #define g_size_to_int monoeg_size_to_int +#define g_ascii_charcmp monoeg_ascii_charcmp +#define g_ascii_charcasecmp monoeg_ascii_charcasecmp +#define g_warning_d monoeg_warning_d diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index e0dcfbc0b15..b2dcabf154a 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -12163,6 +12163,10 @@ compile_asm (MonoAotCompile *acfg) #define AS_OPTIONS "-arch i386" #elif defined(TARGET_X86) && !defined(TARGET_MACH) #define AS_OPTIONS "--32" +#elif defined(TARGET_AMD64) && defined(TARGET_OSX) +#define AS_OPTIONS "-arch x86_64" +#elif defined(TARGET_ARM64) && defined(TARGET_OSX) +#define AS_OPTIONS "-arch arm64" #else #define AS_OPTIONS "" #endif @@ -12190,6 +12194,9 @@ compile_asm (MonoAotCompile *acfg) #elif defined(TARGET_AMD64) && defined(TARGET_MACH) #define LD_NAME "clang" #define LD_OPTIONS "--shared" +#elif defined(TARGET_ARM64) && defined(TARGET_OSX) +#define LD_NAME "clang" +#define LD_OPTIONS "--shared -arch arm64" #elif defined(TARGET_WIN32_MSVC) #define LD_NAME "link.exe" #define LD_OPTIONS "/DLL /MACHINE:X64 /NOLOGO /INCREMENTAL:NO" diff --git a/mono/mini/exceptions-arm64.c b/mono/mini/exceptions-arm64.c index 11cb6ccdd9d..3c06a2ac070 100644 --- a/mono/mini/exceptions-arm64.c +++ b/mono/mini/exceptions-arm64.c @@ -36,6 +36,8 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot) size = 256; code = start = mono_global_codeman_reserve (size); + MINI_BEGIN_CODEGEN (); + arm_movx (code, ARMREG_IP0, ARMREG_R0); ctx_reg = ARMREG_IP0; @@ -63,8 +65,8 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot) arm_brk (code, 0); g_assert ((code - start) < size); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL)); + + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); if (info) *info = mono_tramp_info_create ("restore_context", start, code - start, ji, unwind_ops); @@ -106,6 +108,8 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot) * returning the value returned by the call. */ + MINI_BEGIN_CODEGEN (); + /* Setup a frame */ arm_stpx_pre (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, -frame_size); arm_movspx (code, ARMREG_FP, ARMREG_SP); @@ -152,8 +156,8 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot) arm_retx (code, ARMREG_LR); g_assert ((code - start) < size); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL)); + + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); if (info) *info = mono_tramp_info_create ("call_filter", start, code - start, ji, unwind_ops); @@ -186,6 +190,8 @@ get_throw_trampoline (int size, gboolean corlib, gboolean rethrow, gboolean llvm offset += num_fregs * 8; frame_size = ALIGN_TO (offset, MONO_ARCH_FRAME_ALIGNMENT); + MINI_BEGIN_CODEGEN (); + /* Setup a frame */ arm_stpx_pre (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, -frame_size); arm_movspx (code, ARMREG_FP, ARMREG_SP); @@ -254,8 +260,8 @@ get_throw_trampoline (int size, gboolean corlib, gboolean rethrow, gboolean llvm arm_brk (code, 0x0); g_assert ((code - start) < size); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL)); + + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); if (info) *info = mono_tramp_info_create (tramp_name, start, code - start, ji, unwind_ops); @@ -329,9 +335,6 @@ mono_arch_exceptions_init (void) GSList *tramps, *l; if (mono_aot_only) { - - // FIXME Macroize. - tramp = mono_aot_get_trampoline ("llvm_throw_corlib_exception_trampoline"); mono_register_jit_icall_info (&mono_get_jit_icall_info ()->mono_llvm_throw_corlib_exception_trampoline, tramp, "llvm_throw_corlib_exception_trampoline", NULL, TRUE, NULL); @@ -340,7 +343,6 @@ mono_arch_exceptions_init (void) tramp = mono_aot_get_trampoline ("llvm_resume_unwind_trampoline"); mono_register_jit_icall_info (&mono_get_jit_icall_info ()->mono_llvm_resume_unwind_trampoline, tramp, "llvm_resume_unwind_trampoline", NULL, TRUE, NULL); - } else { tramps = mono_arm_get_exception_trampolines (FALSE); for (l = tramps; l; l = l->next) { diff --git a/mono/mini/helpers.c b/mono/mini/helpers.c index 3ceffe6f137..b62361ed532 100644 --- a/mono/mini/helpers.c +++ b/mono/mini/helpers.c @@ -263,7 +263,7 @@ mono_disassemble_code (MonoCompile *cfg, guint8 *code, int size, char *id) fflush (stdout); -#if defined(__arm__) || defined(__aarch64__) +#if (defined(__arm__) || defined(__aarch64__)) && !defined(TARGET_OSX) /* * The arm assembler inserts ELF directives instructing objdump to display * everything as data. diff --git a/mono/mini/llvm-jit.cpp b/mono/mini/llvm-jit.cpp index 9f4d4d2cb8c..68107c27134 100644 --- a/mono/mini/llvm-jit.cpp +++ b/mono/mini/llvm-jit.cpp @@ -187,7 +187,7 @@ struct MonoLLVMJIT { void *sym = nullptr; auto err = mono_dl_symbol (current, name, &sym); if (!sym) { - outs () << "R: " << namestr << "\n"; + outs () << "R: " << namestr << " " << err << "\n"; } assert (sym); return JITSymbol{(uint64_t)(gssize)sym, flags}; diff --git a/mono/mini/mini-arm64.c b/mono/mini/mini-arm64.c index 6b420e10b0b..2dc1a5532ef 100644 --- a/mono/mini/mini-arm64.c +++ b/mono/mini/mini-arm64.c @@ -100,6 +100,8 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co { guint8 *code, *start; + MINI_BEGIN_CODEGEN (); + if (has_target) { start = code = mono_global_codeman_reserve (12); @@ -109,9 +111,6 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co arm_brx (code, ARMREG_IP0); g_assert ((code - start) <= 12); - - mono_arch_flush_icache (start, 12); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL)); } else { int size, i; @@ -125,10 +124,8 @@ get_delegate_invoke_impl (gboolean has_target, gboolean param_count, guint32 *co arm_brx (code, ARMREG_IP0); g_assert ((code - start) <= size); - - mono_arch_flush_icache (start, size); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL)); } + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL); if (code_size) *code_size = code - start; @@ -241,7 +238,7 @@ mono_arch_init (void) mono_arm_gsharedvt_init (); -#if defined(TARGET_IOS) || defined(TARGET_WATCHOS) +#if defined(TARGET_IOS) || defined(TARGET_WATCHOS) || defined(TARGET_OSX) ios_abi = TRUE; #endif } @@ -1058,7 +1055,11 @@ add_general (CallInfo *cinfo, ArgInfo *ainfo, int size, gboolean sign) { if (cinfo->gr >= PARAM_REGS) { ainfo->storage = ArgOnStack; - if (ios_abi) { + /* + * FIXME: The vararg argument handling code in ves_icall_System_ArgIterator_IntGetNextArg + * assumes every argument is allocated to a separate full size stack slot. + */ + if (ios_abi && !cinfo->vararg) { /* Assume size == align */ } else { /* Put arguments into 8 byte aligned stack slots */ @@ -1326,6 +1327,10 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig) cinfo->nargs = n; cinfo->pinvoke = sig->pinvoke; + // Constrain this to OSX only for now +#ifdef TARGET_OSX + cinfo->vararg = sig->call_convention == MONO_CALL_VARARG; +#endif /* Return value */ add_param (cinfo, &cinfo->ret, sig->ret); @@ -5333,6 +5338,8 @@ mono_arch_build_imt_trampoline (MonoVTable *vtable, MonoDomain *domain, MonoIMTC buf = mono_domain_code_reserve (domain, buf_len); code = buf; + MINI_BEGIN_CODEGEN (); + /* * We are called by JITted code, which passes in the IMT argument in * MONO_ARCH_RGCTX_REG (r27). We need to preserve all caller saved regs @@ -5402,8 +5409,7 @@ mono_arch_build_imt_trampoline (MonoVTable *vtable, MonoDomain *domain, MonoIMTC g_assert ((code - buf) <= buf_len); - mono_arch_flush_icache (buf, code - buf); - MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL)); + MINI_END_CODEGEN (buf, code - buf, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL); return buf; } @@ -5443,7 +5449,9 @@ mono_arch_set_breakpoint (MonoJitInfo *ji, guint8 *ip) } else { /* ip points to an ldrx */ code += 4; + mono_codeman_enable_write (); arm_blrx (code, ARMREG_IP0); + mono_codeman_disable_write (); mono_arch_flush_icache (ip, code - ip); } } @@ -5462,7 +5470,9 @@ mono_arch_clear_breakpoint (MonoJitInfo *ji, guint8 *ip) } else { /* ip points to an ldrx */ code += 4; + mono_codeman_enable_write (); arm_nop (code); + mono_codeman_disable_write (); mono_arch_flush_icache (ip, code - ip); } } diff --git a/mono/mini/mini-arm64.h b/mono/mini/mini-arm64.h index 381160ebdcf..9f6784be916 100644 --- a/mono/mini/mini-arm64.h +++ b/mono/mini/mini-arm64.h @@ -168,6 +168,9 @@ typedef struct { #define MONO_ARCH_FLOAT32_SUPPORTED 1 #define MONO_ARCH_HAVE_INTERP_PINVOKE_TRAMP 1 #define MONO_ARCH_LLVM_TARGET_LAYOUT "e-i64:64-i128:128-n32:64-S128" +#ifdef TARGET_OSX +#define MONO_ARCH_FORCE_FLOAT32 1 +#endif // Does the ABI have a volatile non-parameter register, so tailcall // can pass context to generics or interfaces? @@ -241,7 +244,7 @@ typedef struct { struct CallInfo { int nargs; int gr, fr, stack_usage; - gboolean pinvoke; + gboolean pinvoke, vararg; ArgInfo ret; ArgInfo sig_cookie; ArgInfo args [1]; diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c index 9287d5656e3..57113a19dcf 100644 --- a/mono/mini/mini-llvm.c +++ b/mono/mini/mini-llvm.c @@ -11212,8 +11212,11 @@ llvm_jit_finalize_method (EmitContext *ctx) while (g_hash_table_iter_next (&iter, NULL, (void**)&var)) callee_vars [i ++] = var; + mono_codeman_enable_write (); cfg->native_code = (guint8*)mono_llvm_compile_method (ctx->module->mono_ee, ctx->lmethod, nvars, callee_vars, callee_addrs, &eh_frame); + mono_llvm_remove_gc_safepoint_poll (ctx->lmodule); + mono_codeman_disable_write (); if (cfg->verbose_level > 1) { g_print ("\n*** Optimized LLVM IR for %s ***\n", mono_method_full_name (cfg->method, TRUE)); if (cfg->compile_aot) { diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c index 3b44af7adff..4619638f31b 100644 --- a/mono/mini/mini-runtime.c +++ b/mono/mini/mini-runtime.c @@ -1443,9 +1443,11 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, } } + mono_codeman_enable_write (); for (i = 0; i < patch_info->data.table->table_size; i++) { jump_table [i] = code + GPOINTER_TO_INT (patch_info->data.table->table [i]); } + mono_codeman_disable_write (); target = jump_table; break; @@ -1728,6 +1730,8 @@ mini_patch_jump_sites (MonoDomain *domain, MonoMethod *method, gpointer addr) patch_info.type = MONO_PATCH_INFO_METHOD_JUMP; patch_info.data.method = method; + mono_codeman_enable_write (); + #ifdef MONO_ARCH_HAVE_PATCH_CODE_NEW for (tmp = jlist->list; tmp; tmp = tmp->next) mono_arch_patch_code_new (NULL, domain, (guint8 *)tmp->data, &patch_info, addr); @@ -1740,6 +1744,8 @@ mini_patch_jump_sites (MonoDomain *domain, MonoMethod *method, gpointer addr) mono_error_assert_ok (error); } #endif + + mono_codeman_disable_write (); } } diff --git a/mono/mini/mini-runtime.h b/mono/mini/mini-runtime.h index e2fd25ae4d7..122b107e5d3 100644 --- a/mono/mini/mini-runtime.h +++ b/mono/mini/mini-runtime.h @@ -608,5 +608,16 @@ gboolean MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal); void mini_register_sigterm_handler (void); +#define MINI_BEGIN_CODEGEN() do { \ + mono_codeman_enable_write (); \ + } while (0) + +#define MINI_END_CODEGEN(buf,size,type,arg) do { \ + mono_codeman_disable_write (); \ + mono_arch_flush_icache ((buf), (size)); \ + if ((int)type != -1) \ + MONO_PROFILER_RAISE (jit_code_buffer, ((buf), (size), (type), (arg))); \ + } while (0) + #endif /* __MONO_MINI_RUNTIME_H__ */ diff --git a/mono/mini/mini.c b/mono/mini/mini.c index 9b5b2cba220..10d5efb73f3 100644 --- a/mono/mini/mini.c +++ b/mono/mini/mini.c @@ -2248,6 +2248,8 @@ mono_codegen (MonoCompile *cfg) code = (guint8 *)mono_domain_code_reserve (code_domain, cfg->code_size + cfg->thunk_area + unwindlen); } + mono_codeman_enable_write (); + if (cfg->thunk_area) { cfg->thunks_offset = cfg->code_size + unwindlen; cfg->thunks = code + cfg->thunks_offset; @@ -2339,6 +2341,9 @@ mono_codegen (MonoCompile *cfg) } else { mono_domain_code_commit (code_domain, cfg->native_code, cfg->code_size, cfg->code_len); } + + mono_codeman_disable_write (); + MONO_PROFILER_RAISE (jit_code_buffer, (cfg->native_code, cfg->code_len, MONO_PROFILER_CODE_BUFFER_METHOD, cfg->method)); mono_arch_flush_icache (cfg->native_code, cfg->code_len); @@ -3046,6 +3051,9 @@ init_backend (MonoBackend *backend) #ifdef MONO_ARCH_HAVE_OPTIMIZED_DIV backend->optimized_div = 1; #endif +#ifdef MONO_ARCH_FORCE_FLOAT32 + backend->force_float32 = 1; +#endif } static gboolean @@ -3145,6 +3153,9 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, JitFl #ifndef MONO_ARCH_FLOAT32_SUPPORTED opts &= ~MONO_OPT_FLOAT32; #endif + if (current_backend->force_float32) + /* Force float32 mode on newer platforms */ + opts |= MONO_OPT_FLOAT32; restart_compile: if (method_is_gshared) { diff --git a/mono/mini/mini.h b/mono/mini/mini.h index ca2d416e733..5099cdaaf96 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1190,7 +1190,7 @@ typedef struct { guint have_generalized_imt_trampoline : 1; gboolean have_op_tailcall_membase : 1; gboolean have_op_tailcall_reg : 1; - gboolean have_volatile_non_param_register : 1; + gboolean have_volatile_non_param_register : 1; guint gshared_supported : 1; guint use_fpstack : 1; guint ilp32 : 1; @@ -1200,6 +1200,7 @@ typedef struct { guint disable_div_with_mul : 1; guint explicit_null_checks : 1; guint optimized_div : 1; + guint force_float32 : 1; int monitor_enter_adjustment; int dyn_call_param_area; } MonoBackend; diff --git a/mono/mini/trace.c b/mono/mini/trace.c index d9bca2f1441..571aa492c64 100644 --- a/mono/mini/trace.c +++ b/mono/mini/trace.c @@ -27,7 +27,7 @@ #include "trace.h" #include <mono/metadata/callspec.h> -#if defined (HOST_ANDROID) || (defined (TARGET_IOS) && defined (TARGET_IOS)) +#if defined (HOST_ANDROID) || defined (TARGET_IOS) # undef printf # define printf(...) g_log("mono", G_LOG_LEVEL_MESSAGE, __VA_ARGS__) # undef fprintf diff --git a/mono/mini/tramp-arm64-gsharedvt.c b/mono/mini/tramp-arm64-gsharedvt.c index c1038511d67..269624c259d 100644 --- a/mono/mini/tramp-arm64-gsharedvt.c +++ b/mono/mini/tramp-arm64-gsharedvt.c @@ -13,6 +13,7 @@ #include "mini.h" #include "mini-arm64.h" #include "mini-arm64-gsharedvt.h" +#include "mini-runtime.h" /* * GSHAREDVT @@ -36,13 +37,16 @@ mono_arch_get_gsharedvt_arg_trampoline (MonoDomain *domain, gpointer arg, gpoint */ buf = code = mono_global_codeman_reserve (buf_len); + MINI_BEGIN_CODEGEN (); + code = mono_arm_emit_imm64 (code, ARMREG_IP1, (guint64)arg); code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)addr); arm_brx (code, ARMREG_IP0); g_assert ((code - buf) < buf_len); - mono_arch_flush_icache (buf, code - buf); + + MINI_END_CODEGEN (buf, code - buf, -1, NULL); return buf; } @@ -248,6 +252,8 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) cfa_offset = offset; + MINI_BEGIN_CODEGEN (); + /* Setup frame */ arm_stpx_pre (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, -cfa_offset); mono_add_unwind_op_def_cfa (unwind_ops, code, buf, ARMREG_SP, cfa_offset); @@ -547,7 +553,8 @@ mono_arch_get_gsharedvt_trampoline (MonoTrampInfo **info, gboolean aot) if (info) *info = mono_tramp_info_create ("gsharedvt_trampoline", buf, code - buf, ji, unwind_ops); - mono_arch_flush_icache (buf, code - buf); + MINI_END_CODEGEN (buf, code - buf, -1, NULL); + return buf; } diff --git a/mono/mini/tramp-arm64.c b/mono/mini/tramp-arm64.c index 04eda906c46..7b889a3ffde 100644 --- a/mono/mini/tramp-arm64.c +++ b/mono/mini/tramp-arm64.c @@ -30,8 +30,9 @@ void mono_arch_patch_callsite (guint8 *method_start, guint8 *code_ptr, guint8 *addr) { + MINI_BEGIN_CODEGEN (); mono_arm_patch (code_ptr - 4, addr, MONO_R_ARM64_BL); - mono_arch_flush_icache (code_ptr - 4, 4); + MINI_END_CODEGEN (code_ptr - 4, 4, -1, NULL); } void @@ -133,6 +134,8 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf //offset += 22 * 8; frame_size = ALIGN_TO (offset, MONO_ARCH_FRAME_ALIGNMENT); + MINI_BEGIN_CODEGEN (); + /* Setup stack frame */ imm = frame_size; mono_add_unwind_op_def_cfa (unwind_ops, code, buf, ARMREG_SP, 0); @@ -303,8 +306,8 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf arm_brx (code, ARMREG_IP0); g_assert ((code - buf) < buf_len); - mono_arch_flush_icache (buf, code - buf); - MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); + + MINI_END_CODEGEN (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) { tramp_name = mono_get_generic_trampoline_name (tramp_type); @@ -328,14 +331,16 @@ mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_ty buf = code = mono_domain_code_reserve (domain, buf_len); + MINI_BEGIN_CODEGEN (); + code = mono_arm_emit_imm64 (code, ARMREG_IP1, (guint64)arg1); code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)tramp); arm_brx (code, ARMREG_IP0); g_assert ((code - buf) < buf_len); - mono_arch_flush_icache (buf, code - buf); - MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type))); + + MINI_END_CODEGEN (buf, code - buf, MONO_PROFILER_CODE_BUFFER_SPECIFIC_TRAMPOLINE, mono_get_generic_trampoline_simple_name (tramp_type)); if (code_len) *code_len = code - buf; @@ -351,13 +356,17 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) MonoDomain *domain = mono_domain_get (); start = code = mono_domain_code_reserve (domain, size); + + MINI_BEGIN_CODEGEN (); + code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)addr); arm_addx_imm (code, ARMREG_R0, ARMREG_R0, MONO_ABI_SIZEOF (MonoObject)); arm_brx (code, ARMREG_IP0); g_assert ((code - start) <= size); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m)); + + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_UNBOX_TRAMPOLINE, m); + return start; } @@ -369,14 +378,16 @@ mono_arch_get_static_rgctx_trampoline (gpointer arg, gpointer addr) MonoDomain *domain = mono_domain_get (); start = code = mono_domain_code_reserve (domain, buf_len); + + MINI_BEGIN_CODEGEN (); + code = mono_arm_emit_imm64 (code, MONO_ARCH_RGCTX_REG, (guint64)arg); code = mono_arm_emit_imm64 (code, ARMREG_IP0, (guint64)addr); arm_brx (code, ARMREG_IP0); - g_assert ((code - start) <= buf_len); + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); + g_assert ((code - start) <= buf_len); return start; } @@ -415,6 +426,8 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info /* The vtable/mrgtx is in R0 */ g_assert (MONO_ARCH_VTABLE_REG == ARMREG_R0); + MINI_BEGIN_CODEGEN (); + if (is_mrgctx) { /* get mrgctx ptr */ arm_movx (code, ARMREG_IP1, ARMREG_R0); @@ -468,11 +481,10 @@ mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 slot, MonoTrampInfo **info } arm_brx (code, ARMREG_IP0); - mono_arch_flush_icache (buf, code - buf); - MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); - g_assert (code - buf <= buf_size); + MINI_END_CODEGEN (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); + if (info) { char *name = mono_get_rgctx_fetch_trampoline_name (slot); *info = mono_tramp_info_create (name, buf, code - buf, ji, unwind_ops); @@ -498,6 +510,8 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo mono_add_unwind_op_def_cfa (unwind_ops, code, buf, ARMREG_SP, 0); + MINI_BEGIN_CODEGEN (); + // FIXME: Currently, we always go to the slow path. /* Load trampoline addr */ arm_ldrx (code, ARMREG_IP0, MONO_ARCH_RGCTX_REG, 8); @@ -505,11 +519,10 @@ mono_arch_create_general_rgctx_lazy_fetch_trampoline (MonoTrampInfo **info, gboo g_assert (MONO_ARCH_VTABLE_REG == ARMREG_R0); arm_brx (code, ARMREG_IP0); - mono_arch_flush_icache (buf, code - buf); - MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL)); - g_assert (code - buf <= tramp_size); + MINI_END_CODEGEN (buf, code - buf, MONO_PROFILER_CODE_BUFFER_GENERICS_TRAMPOLINE, NULL); + if (info) *info = mono_tramp_info_create ("rgctx_fetch_trampoline_general", buf, code - buf, ji, unwind_ops); @@ -547,6 +560,8 @@ mono_arch_create_sdb_trampoline (gboolean single_step, MonoTrampInfo **info, gbo // FIXME: Unwind info + MINI_BEGIN_CODEGEN (); + /* Setup stack frame */ imm = frame_size; while (imm > 256) { @@ -605,10 +620,10 @@ mono_arch_create_sdb_trampoline (gboolean single_step, MonoTrampInfo **info, gbo arm_retx (code, ARMREG_LR); - mono_arch_flush_icache (code, code - buf); - MONO_PROFILER_RAISE (jit_code_buffer, (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); g_assert (code - buf <= tramp_size); + MINI_END_CODEGEN (buf, code - buf, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); + const char *tramp_name = single_step ? "sdb_single_step_trampoline" : "sdb_breakpoint_trampoline"; *info = mono_tramp_info_create (tramp_name, buf, code - buf, ji, unwind_ops); @@ -644,6 +659,8 @@ mono_arch_get_interp_to_native_trampoline (MonoTrampInfo **info) framesize = ALIGN_TO (framesize, MONO_ARCH_FRAME_ALIGNMENT); + MINI_BEGIN_CODEGEN (); + arm_subx_imm (code, ARMREG_SP, ARMREG_SP, framesize); arm_stpx (code, ARMREG_FP, ARMREG_LR, ARMREG_SP, 0); arm_movspx (code, ARMREG_FP, ARMREG_SP); @@ -712,8 +729,7 @@ mono_arch_get_interp_to_native_trampoline (MonoTrampInfo **info) g_assert (code - start < buf_len); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL)); + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_HELPER, NULL); if (info) *info = mono_tramp_info_create ("interp_to_native_trampoline", start, code - start, ji, unwind_ops); @@ -744,6 +760,8 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) offset += sizeof (CallContext); framesize = ALIGN_TO (offset, MONO_ARCH_FRAME_ALIGNMENT); + MINI_BEGIN_CODEGEN (); + mono_add_unwind_op_def_cfa (unwind_ops, code, start, ARMREG_SP, 0); arm_subx_imm (code, ARMREG_SP, ARMREG_SP, framesize); @@ -788,8 +806,7 @@ mono_arch_get_native_to_interp_trampoline (MonoTrampInfo **info) g_assert (code - start < buf_len); - mono_arch_flush_icache (start, code - start); - MONO_PROFILER_RAISE (jit_code_buffer, (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL)); + MINI_END_CODEGEN (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); if (info) *info = mono_tramp_info_create ("native_to_interp_trampoline", start, code - start, ji, unwind_ops); diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index 929e9db71c5..fc76d20d310 100755 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -1119,7 +1119,9 @@ endif endif - +if DISABLE_CRASH_REPORTING +PLATFORM_DISABLED_TESTS += merp-json-valid.exe merp-crash-test.exe +endif if HOST_DARWIN diff --git a/mono/tools/offsets-tool/offsets-tool.py b/mono/tools/offsets-tool/offsets-tool.py index f568a132b7e..f06799cba12 100644 --- a/mono/tools/offsets-tool/offsets-tool.py +++ b/mono/tools/offsets-tool/offsets-tool.py @@ -7,7 +7,7 @@ import sys import argparse import clang.cindex -IOS_DEFINES = ["HOST_DARWIN", "TARGET_MACH", "MONO_CROSS_COMPILE", "USE_MONO_CTX", "_XOPEN_SOURCE"] +MACIOS_DEFINES = ["HOST_DARWIN", "TARGET_MACH", "MONO_CROSS_COMPILE", "USE_MONO_CTX", "_XOPEN_SOURCE"] ANDROID_DEFINES = ["HOST_ANDROID", "MONO_CROSS_COMPILE", "USE_MONO_CTX", "BIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"] class Target: @@ -87,24 +87,31 @@ class OffsetsTool: # iOS elif "arm-apple-darwin10" == args.abi: require_sysroot (args) - self.target = Target ("TARGET_ARM", "TARGET_IOS", ["ARM_FPU_VFP", "HAVE_ARMV5"] + IOS_DEFINES) + self.target = Target ("TARGET_ARM", "TARGET_IOS", ["ARM_FPU_VFP", "HAVE_ARMV5"] + MACIOS_DEFINES) self.target_args += ["-arch", "arm"] self.target_args += ["-isysroot", args.sysroot] elif "aarch64-apple-darwin10" == args.abi: require_sysroot (args) - self.target = Target ("TARGET_ARM64", "TARGET_IOS", IOS_DEFINES) + self.target = Target ("TARGET_ARM64", "TARGET_IOS", MACIOS_DEFINES) + self.target_args += ["-arch", "arm64"] + self.target_args += ["-isysroot", args.sysroot] + + # macOS + if "aarch64-apple-darwin20" == args.abi: + require_sysroot (args) + self.target = Target ("TARGET_ARM64", "TARGET_OSX", MACIOS_DEFINES) self.target_args += ["-arch", "arm64"] self.target_args += ["-isysroot", args.sysroot] # watchOS elif "armv7k-apple-darwin" == args.abi: require_sysroot (args) - self.target = Target ("TARGET_ARM", "TARGET_WATCHOS", ["ARM_FPU_VFP", "HAVE_ARMV5"] + IOS_DEFINES) + self.target = Target ("TARGET_ARM", "TARGET_WATCHOS", ["ARM_FPU_VFP", "HAVE_ARMV5"] + MACIOS_DEFINES) self.target_args += ["-arch", "armv7k"] self.target_args += ["-isysroot", args.sysroot] elif "aarch64-apple-darwin10_ilp32" == args.abi: require_sysroot (args) - self.target = Target ("TARGET_ARM64", "TARGET_WATCHOS", ["MONO_ARCH_ILP32"] + IOS_DEFINES) + self.target = Target ("TARGET_ARM64", "TARGET_WATCHOS", ["MONO_ARCH_ILP32"] + MACIOS_DEFINES) self.target_args += ["-arch", "arm64_32"] self.target_args += ["-isysroot", args.sysroot] @@ -153,6 +160,7 @@ class OffsetsTool: args.mono_path + "/mono", args.mono_path + "/mono/eglib", args.target_path, + args.target_path + "/mono", args.target_path + "/mono/eglib" ] diff --git a/mono/utils/mono-codeman.c b/mono/utils/mono-codeman.c index a69f25bb43e..234aac4b0ca 100644 --- a/mono/utils/mono-codeman.c +++ b/mono/utils/mono-codeman.c @@ -4,6 +4,11 @@ #include "config.h" +#if defined(TARGET_OSX) +/* So we can use the declaration of pthread_jit_write_protect_np () */ +#define _DARWIN_C_SOURCE +#endif + #ifdef HAVE_UNISTD_H #include <unistd.h> #endif @@ -27,7 +32,7 @@ static void* mono_code_manager_heap; #endif #include <mono/utils/mono-os-mutex.h> - +#include <mono/utils/mono-tls.h> static uintptr_t code_memory_used = 0; static size_t dynamic_code_alloc_count; @@ -102,6 +107,7 @@ struct _MonoCodeManager { static mono_mutex_t valloc_mutex; static GHashTable *valloc_freelists; +static MonoNativeTlsKey write_level_tls_id; static void* codechunk_valloc (void *preferred, guint32 size) @@ -121,7 +127,9 @@ codechunk_valloc (void *preferred, guint32 size) freelist = (GSList *) g_hash_table_lookup (valloc_freelists, GUINT_TO_POINTER (size)); if (freelist) { ptr = freelist->data; + mono_codeman_enable_write (); memset (ptr, 0, size); + mono_codeman_disable_write (); freelist = g_slist_delete_link (freelist, freelist); g_hash_table_insert (valloc_freelists, GUINT_TO_POINTER (size), freelist); } else { @@ -176,6 +184,8 @@ mono_code_manager_init (void) mono_counters_register ("Dynamic code allocs", MONO_COUNTER_JIT | MONO_COUNTER_ULONG, &dynamic_code_alloc_count); mono_counters_register ("Dynamic code bytes", MONO_COUNTER_JIT | MONO_COUNTER_ULONG, &dynamic_code_bytes_count); mono_counters_register ("Dynamic code frees", MONO_COUNTER_JIT | MONO_COUNTER_ULONG, &dynamic_code_frees_count); + + mono_native_tls_alloc (&write_level_tls_id, NULL); } void @@ -271,7 +281,10 @@ mono_codeman_malloc (gsize n) g_assert (heap); return HeapAlloc (heap, 0, n); #else - return dlmemalign (MIN_ALIGN, n); + mono_codeman_enable_write (); + gpointer res = dlmemalign (MIN_ALIGN, n); + mono_codeman_disable_write (); + return res; #endif } @@ -285,7 +298,9 @@ mono_codeman_free (gpointer p) g_assert (heap); HeapFree (heap, 0, p); #else + mono_codeman_enable_write (); dlfree (p); + mono_codeman_disable_write (); #endif } @@ -476,7 +491,9 @@ new_codechunk (MonoCodeManager *cman, int size) #ifdef BIND_ROOM if (flags == CODE_FLAG_MALLOC) { /* Make sure the thunks area is zeroed */ + mono_codeman_enable_write (); memset (ptr, 0, bsize); + mono_codeman_disable_write (); } #endif @@ -639,3 +656,43 @@ mono_code_manager_size (MonoCodeManager *cman, int *used_size) *used_size = used; return size; } + +/* + * mono_codeman_enable_write (): + * + * Enable writing to code memory on the current thread on platforms that need it. + * Calls can be nested. + */ +void +mono_codeman_enable_write (void) +{ +#if defined(HAVE_PTHREAD_JIT_WRITE_PROTECT_NP) && defined(TARGET_OSX) + if (__builtin_available (macOS 11, *)) { + int level = GPOINTER_TO_INT (mono_native_tls_get_value (write_level_tls_id)); + level ++; + mono_native_tls_set_value (write_level_tls_id, GINT_TO_POINTER (level)); + pthread_jit_write_protect_np (0); + } +#endif +} + +/* + * mono_codeman_disable_write (): + * + * Disable writing to code memory on the current thread on platforms that need it. + * Calls can be nested. + */ +void +mono_codeman_disable_write (void) +{ +#if defined(HAVE_PTHREAD_JIT_WRITE_PROTECT_NP) && defined(TARGET_OSX) + if (__builtin_available (macOS 11, *)) { + int level = GPOINTER_TO_INT (mono_native_tls_get_value (write_level_tls_id)); + g_assert (level); + level --; + mono_native_tls_set_value (write_level_tls_id, GINT_TO_POINTER (level)); + if (level == 0) + pthread_jit_write_protect_np (1); + } +#endif +} diff --git a/mono/utils/mono-codeman.h b/mono/utils/mono-codeman.h index 4cf447f6e08..fbe2a2f2d4f 100644 --- a/mono/utils/mono-codeman.h +++ b/mono/utils/mono-codeman.h @@ -41,5 +41,8 @@ void mono_code_manager_install_callbacks (const MonoCodeManagerCallb typedef int (*MonoCodeManagerFunc) (void *data, int csize, int size, void *user_data); void mono_code_manager_foreach (MonoCodeManager *cman, MonoCodeManagerFunc func, void *user_data); +void mono_codeman_enable_write (void); +void mono_codeman_disable_write (void); + #endif /* __MONO_CODEMAN_H__ */ diff --git a/mono/utils/mono-dl.h b/mono/utils/mono-dl.h index 7e81bc5a16b..bfbbefc0c03 100644 --- a/mono/utils/mono-dl.h +++ b/mono/utils/mono-dl.h @@ -11,11 +11,7 @@ #ifdef TARGET_WIN32 #define MONO_SOLIB_EXT ".dll" -#elif defined(__ppc__) && defined(TARGET_MACH) -#define MONO_SOLIB_EXT ".dylib" -#elif defined(TARGET_MACH) && defined(TARGET_X86) -#define MONO_SOLIB_EXT ".dylib" -#elif defined(TARGET_MACH) && defined(TARGET_AMD64) +#elif defined(TARGET_MACH) #define MONO_SOLIB_EXT ".dylib" #else #define MONO_SOLIB_EXT ".so" diff --git a/mono/utils/mono-merp.c b/mono/utils/mono-merp.c index 0da6f07a22f..7a21658d734 100644 --- a/mono/utils/mono-merp.c +++ b/mono/utils/mono-merp.c @@ -129,7 +129,8 @@ typedef enum { MerpArchx86_64 = 1, MerpArchx86 = 2, MerpArchPPC = 3, - MerpArchPPC64 = 4 + MerpArchPPC64 = 4, + MerpArchARM64 = 5 } MerpArch; typedef enum @@ -218,6 +219,8 @@ get_merp_bitness (MerpArch arch) return "x64"; case MerpArchx86: return "x32"; + case MerpArchARM64: + return "arm64"; default: g_assert_not_reached (); } @@ -234,6 +237,8 @@ get_merp_arch (void) return MerpArchPPC; #elif defined(TARGET_POWERPC64) return MerpArchPPC64; +#elif defined(TARGET_ARM64) + return MerpArchARM64; #else g_assert_not_reached (); #endif diff --git a/mono/utils/mono-mmap.c b/mono/utils/mono-mmap.c index 6f9e2c9629c..41dc2070f2d 100644 --- a/mono/utils/mono-mmap.c +++ b/mono/utils/mono-mmap.c @@ -304,6 +304,12 @@ mono_valloc (void *addr, size_t length, int flags, MonoMemAccountType type) } if ((flags & MONO_MMAP_JIT) && (use_mmap_jit || is_hardened_runtime == 1)) mflags |= MAP_JIT; +#if defined(HOST_ARM64) + /* Patching code on apple silicon seems to cause random crashes without this flag */ + /* No __builtin_available in old versions of Xcode that could be building Mono on x86 or amd64 */ + if (__builtin_available (macOS 11, *)) + mflags |= MAP_JIT; +#endif } #endif diff --git a/sdks/builds/.gitignore b/sdks/builds/.gitignore index ffee1cf171a..7b3d0cb2ca9 100644 --- a/sdks/builds/.gitignore +++ b/sdks/builds/.gitignore @@ -55,6 +55,8 @@ ios-netcore_simtv-*/ ios-netcore_simwatch-*/ ios-netcore_simwatch64-*/ mac-mac64-*/ +mac-macarm64-*/ +mac-crossarm64-*/ maccat-mac64-*/ wasm-runtime-*/ wasm-cross-*/ diff --git a/sdks/builds/mac.mk b/sdks/builds/mac.mk index 9c7a4840e3c..7490e78b59f 100644 --- a/sdks/builds/mac.mk +++ b/sdks/builds/mac.mk @@ -12,10 +12,11 @@ ADDITIONAL_PACKAGE_DEPS += $(mac_BIN_DIR) $(mac_PKG_CONFIG_DIR) $(mac_LIBS_DIR) # Parameters # $(1): target # $(2): host arch -# $(3): xcode dir +# $(3): host arch for compiler (x86_64 or arm64) +# $(4): xcode dir define MacTemplate -mac_$(1)_PLATFORM_BIN=$(3)/Toolchains/XcodeDefault.xctoolchain/usr/bin +mac_$(1)_PLATFORM_BIN=$(4)/Toolchains/XcodeDefault.xctoolchain/usr/bin _mac-$(1)_CC=$$(CCACHE) $$(mac_$(1)_PLATFORM_BIN)/clang _mac-$(1)_CXX=$$(CCACHE) $$(mac_$(1)_PLATFORM_BIN)/clang++ @@ -28,11 +29,11 @@ _mac-$(1)_AC_VARS= \ _mac-$(1)_CFLAGS= \ $$(mac-$(1)_SYSROOT) \ - -arch $(2) + -arch $(3) _mac-$(1)_CXXFLAGS= \ $$(mac-$(1)_SYSROOT) \ - -arch $(2) + -arch $(3) _mac-$(1)_CPPFLAGS= @@ -60,36 +61,110 @@ $$(eval $$(call RuntimeTemplate,mac,$(1),$(2)-apple-darwin10,yes)) endef -mac-mac64_SYSROOT=-isysroot $(XCODE_DIR)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_VERSION).sdk -mmacosx-version-min=$(MACOS_VERSION_MIN) +## +# Cross compiler builds +# +# Parameters: +# $(1): target (crossarm64) +# $(2): host arch (x86_64 or aarch64) +# $(3): target arch (arm or aarch64) +# $(4): device target (target64, targetarm64 ...) +# $(5): llvm +# $(6): offsets dumper abi +# $(7): sysroot path +# +# Flags: +# mac-$(1)_AC_VARS +# mac-$(1)_CFLAGS +# mac-$(1)_CXXFLAGS +# mac-$(1)_LDFLAGS +# mac-$(1)_CONFIGURE_FLAGS +define MacCrossTemplate + +_mac-$(1)_OFFSETS_DUMPER_ARGS=--libclang="$$(XCODE_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/lib/libclang.dylib" --sysroot="$(7)" +_mac_$(1)_PLATFORM_BIN=$(XCODE_DIR)/Toolchains/XcodeDefault.xctoolchain/usr/bin + +_mac-$(1)_CC=$$(CCACHE) $$(_mac_$(1)_PLATFORM_BIN)/clang +_mac-$(1)_CXX=$$(CCACHE) $$(_mac_$(1)_PLATFORM_BIN)/clang++ + +_mac-$(1)_AC_VARS= \ + ac_cv_func_fstatat=no \ + ac_cv_func_readlinkat=no \ + ac_cv_func_futimens=no \ + ac_cv_func_utimensat=no + +_mac-$(1)_CFLAGS= \ + $$(mac-$(1)_SYSROOT) \ + -arch $(2) \ + -Qunused-arguments + +_mac-$(1)_CXXFLAGS= \ + $$(mac-$(1)_SYSROOT) \ + -arch $(2) \ + -Qunused-arguments \ + -stdlib=libc++ + +_mac-$(1)_CPPFLAGS= \ + -arch $(2) \ + +_mac-$(1)_LDFLAGS= \ + -stdlib=libc++ + +_mac-$(1)_CONFIGURE_FLAGS= \ + --disable-boehm \ + --disable-btls \ + --disable-iconv \ + --disable-mcs-build \ + --disable-nls \ + --enable-dtrace=no \ + --enable-maintainer-mode \ + --with-glib=embedded \ + --with-mcs-docs=no + +$$(eval $$(call CrossRuntimeTemplate,mac,$(1),$(2)-apple-darwin20,$(3),$(4),$(5),$(6))) + +endef + +mac_sysroot_path = $(XCODE_DIR)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(MACOS_VERSION).sdk +mac_sysroot = -isysroot $(mac_sysroot_path) + +mac-mac64_SYSROOT=$(mac_sysroot) -mmacosx-version-min=$(MACOS_VERSION_MIN) +mac-macarm64_SYSROOT=$(mac_sysroot) -mmacosx-version-min=$(MACOS_VERSION_MIN) + +mac-crossarm64_SYSROOT=$(mac_sysroot) -mmacosx-version-min=$(MACOS_VERSION_MIN) + +$(eval $(call MacTemplate,mac64,x86_64,x86_64,$(XCODE_DIR))) +$(eval $(call MacTemplate,macarm64,aarch64,arm64,$(XCODE_DIR))) -$(eval $(call MacTemplate,mac64,x86_64,$(XCODE_DIR))) +$(eval $(call MacCrossTemplate,crossarm64,x86_64,aarch64-apple-darwin20.0.0,macarm64,llvm-llvm64,aarch64-apple-darwin20,$(mac_sysroot_path))) $(eval $(call BclTemplate,mac,xammac xammac_net_4_5,xammac xammac_net_4_5)) -$(mac_BIN_DIR): package-mac-mac64 +$(mac_BIN_DIR): package-mac-mac64 package-mac-macarm64 package-mac-crossarm64 rm -rf $(mac_BIN_DIR) mkdir -p $(mac_BIN_DIR) cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/bin/mono-sgen $(mac_BIN_DIR)/mono-sgen + cp $(TOP)/sdks/out/mac-crossarm64-$(CONFIGURATION)/bin/aarch64-apple-darwin20.0.0-mono-sgen $(mac_BIN_DIR)/aarch64-darwin-mono-sgen -$(mac_PKG_CONFIG_DIR): package-mac-mac64 +$(mac_PKG_CONFIG_DIR): package-mac-mac64 package-mac-macarm64 rm -rf $(mac_PKG_CONFIG_DIR) mkdir -p $(mac_PKG_CONFIG_DIR) cp $(TOP)/sdks/builds/mac-mac64-$(CONFIGURATION)/data/mono-2.pc $(mac_PKG_CONFIG_DIR) -$(mac_LIBS_DIR): package-mac-mac64 +$(mac_LIBS_DIR): package-mac-mac64 package-mac-macarm64 rm -rf $(mac_LIBS_DIR) mkdir -p $(mac_LIBS_DIR) - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmonosgen-2.0.dylib $(mac_LIBS_DIR)/libmonosgen-2.0.dylib - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-compat.dylib $(mac_LIBS_DIR)/libmono-native-compat.dylib - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-unified.dylib $(mac_LIBS_DIR)/libmono-native-unified.dylib - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libMonoPosixHelper.dylib $(mac_LIBS_DIR)/libMonoPosixHelper.dylib - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmonosgen-2.0.a $(mac_LIBS_DIR)/libmonosgen-2.0.a - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-compat.a $(mac_LIBS_DIR)/libmono-native-compat.a - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-unified.a $(mac_LIBS_DIR)/libmono-native-unified.a - cp $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-profiler-log.a $(mac_LIBS_DIR)/libmono-profiler-log.a + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmonosgen-2.0.dylib $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmonosgen-2.0.dylib -create -output $(mac_LIBS_DIR)/libmonosgen-2.0.dylib + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-compat.dylib $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmono-native-compat.dylib -create -output $(mac_LIBS_DIR)/libmono-native-compat.dylib + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-unified.dylib $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmono-native-unified.dylib -create -output $(mac_LIBS_DIR)/libmono-native-unified.dylib + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libMonoPosixHelper.dylib $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libMonoPosixHelper.dylib -create -output $(mac_LIBS_DIR)/libMonoPosixHelper.dylib + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmonosgen-2.0.a $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmonosgen-2.0.a -create -output $(mac_LIBS_DIR)/libmonosgen-2.0.a + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-compat.a $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmono-native-compat.a -create -output $(mac_LIBS_DIR)/libmono-native-compat.a + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-native-unified.a $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmono-native-unified.a -create -output $(mac_LIBS_DIR)/libmono-native-unified.a + $(mac_mac64_PLATFORM_BIN)/lipo $(TOP)/sdks/out/mac-mac64-$(CONFIGURATION)/lib/libmono-profiler-log.a $(TOP)/sdks/out/mac-macarm64-$(CONFIGURATION)/lib/libmono-profiler-log.a -create -output $(mac_LIBS_DIR)/libmono-profiler-log.a $(mac_mac64_PLATFORM_BIN)/install_name_tool -id @rpath/libmonosgen-2.0.dylib $(mac_LIBS_DIR)/libmonosgen-2.0.dylib $(mac_mac64_PLATFORM_BIN)/install_name_tool -id @rpath/libmono-native-compat.dylib $(mac_LIBS_DIR)/libmono-native-compat.dylib diff --git a/support/sys-uio.c b/support/sys-uio.c index 53e162f9fda..dbbb54ed821 100644 --- a/support/sys-uio.c +++ b/support/sys-uio.c @@ -11,6 +11,12 @@ #define _GNU_SOURCE #endif /* ndef _GNU_SOURCE */ +#include <config.h> +#if defined(TARGET_MACH) + /* So we can use the declaration of preadv () */ +#define _DARWIN_C_SOURCE +#endif + #include "sys-uio.h" #include <sys/uio.h> |