Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Soto <alex@alexsoto.me>2021-03-10 20:30:13 +0300
committerGitHub <noreply@github.com>2021-03-10 20:30:13 +0300
commit14ac6d4f0b8b8f1230633d2679ef12ccd9ba370f (patch)
tree0032a6cafa9f32849d220ac3fa0c187227db2113
parent7dc02abf99cd82d0cf379ea5f82acbcb7c197129 (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>
-rw-r--r--configure.ac20
-rw-r--r--mono/arch/arm64/Makefile.am6
-rw-r--r--mono/arch/arm64/arm64-codegen.h36
-rw-r--r--mono/arch/arm64/codegen-test.c13
-rw-r--r--mono/eglib/eglib-remap.h3
-rw-r--r--mono/mini/aot-compiler.c7
-rw-r--r--mono/mini/exceptions-arm64.c22
-rw-r--r--mono/mini/helpers.c2
-rw-r--r--mono/mini/llvm-jit.cpp2
-rw-r--r--mono/mini/mini-arm64.c30
-rw-r--r--mono/mini/mini-arm64.h5
-rw-r--r--mono/mini/mini-llvm.c3
-rw-r--r--mono/mini/mini-runtime.c6
-rw-r--r--mono/mini/mini-runtime.h11
-rw-r--r--mono/mini/mini.c11
-rw-r--r--mono/mini/mini.h3
-rw-r--r--mono/mini/trace.c2
-rw-r--r--mono/mini/tramp-arm64-gsharedvt.c11
-rw-r--r--mono/mini/tramp-arm64.c61
-rwxr-xr-xmono/tests/Makefile.am4
-rw-r--r--mono/tools/offsets-tool/offsets-tool.py18
-rw-r--r--mono/utils/mono-codeman.c61
-rw-r--r--mono/utils/mono-codeman.h3
-rw-r--r--mono/utils/mono-dl.h6
-rw-r--r--mono/utils/mono-merp.c7
-rw-r--r--mono/utils/mono-mmap.c6
-rw-r--r--sdks/builds/.gitignore2
-rw-r--r--sdks/builds/mac.mk109
-rw-r--r--support/sys-uio.c6
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>