From a1ef30c676bc03579eff20014e296521de74250b Mon Sep 17 00:00:00 2001 From: Calvin Buckley Date: Sun, 24 Nov 2019 18:08:19 -0400 Subject: [PATCH] Allow runtime to be built with C++ on AIX (mono/mono#17672) * Allow runtime to be built with C++ on AIX Many AIX/PPC/BE specific codepaths didn't do casting properly, since C++ is much stricter than C about pointer typing. Also specify the C99 format macros early as possible, since inttypes may get included before eglib gets a chance to set the macros. Also explicitly use -pthread, since not using it is the cause of many libstdc++ crashes on AIX. * Oops, should have been that define instead * Suggested changes from Jay on style * Remove unneeded cast Commit migrated from https://github.com/mono/mono/commit/a3f4def8b6951fed5c248bd1875e90a7ab748d15 --- src/mono/configure.ac | 6 ++++-- src/mono/mono/arch/ppc/ppc-codegen.h | 2 +- src/mono/mono/eglib/giconv.c | 3 ++- src/mono/mono/metadata/sre-encode.c | 2 +- src/mono/mono/metadata/threads.c | 8 +++++-- src/mono/mono/metadata/w32file-unix.c | 6 +++--- src/mono/mono/metadata/w32process-unix-default.c | 2 +- src/mono/mono/metadata/w32process-unix.c | 4 ++-- src/mono/mono/mini/exceptions-ppc.c | 22 +++++++++---------- src/mono/mono/mini/mini-ppc.c | 27 ++++++++++++------------ src/mono/mono/mini/mini-runtime.c | 2 +- src/mono/mono/mini/tramp-ppc.c | 8 +++---- src/mono/mono/utils/mono-context.c | 4 ++-- src/mono/mono/utils/mono-threads-aix.c | 2 +- 14 files changed, 53 insertions(+), 45 deletions(-) diff --git a/src/mono/configure.ac b/src/mono/configure.ac index 3a7399d..a63ad98 100644 --- a/src/mono/configure.ac +++ b/src/mono/configure.ac @@ -510,8 +510,8 @@ case "$host" in dnl We still set this for *FLAGS, however, because we may not dnl be setting OBJECT_MODE. LDFLAGS="$LDFLAGS -maix64" - CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT" - libmono_cflags="-D_THREAD_SAFE -D_REENTRANT" + CPPFLAGS="$CPPFLAGS -maix64 -DGC_AIX_THREADS -D_ALL_SOURCE -pthread -D_THREAD_SAFE -D_LARGE_FILES -D_REENTRANT" + libmono_cflags="-pthread -D_THREAD_SAFE -D_REENTRANT" dnl Would you believe GNU nm doesn't know how to process AIX libraries? dnl Hardcode IBM binutils in case GNU ones end up on our path. Also dnl specifiy 64-bit mode for tools. (OBJECT_MODE is finicky with cmake.) @@ -1206,8 +1206,10 @@ AC_ARG_ENABLE(cxx, [ --enable-cxx compile some code as C++]) # mono/corefx/native has a lot of invalid C++98 in its headers # dotnet/corefx/native looks a lot better, i.e. 44e5bdafb8d989a220c9cf1b94f31a64a6e4f052 +# use these C99 print macros in the command line, since glib may not win first inttypes include #CXXFLAGS_COMMON=' -std=gnu++98 -fno-exceptions -fno-rtti ' CXXFLAGS_COMMON=' -std=gnu++0x -fno-exceptions -fno-rtti ' +CXXFLAGS_COMMON="$CXXFLAGS_COMMON -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS" # "c++0x" instead of C++11, for compat with Centos6/gcc4.4 # -stdlib=libc++ is needed by clang for iOS 6.0 (-miphoneos-version-min=6.0) diff --git a/src/mono/mono/arch/ppc/ppc-codegen.h b/src/mono/mono/arch/ppc/ppc-codegen.h index 44f0ce0..83d366a 100644 --- a/src/mono/mono/arch/ppc/ppc-codegen.h +++ b/src/mono/mono/arch/ppc/ppc-codegen.h @@ -124,7 +124,7 @@ enum { PPC_TRAP_GE_UN = 16 + PPC_TRAP_EQ }; -#define ppc_emit32(c,x) do { *((guint32 *) (c)) = (guint32) (x); (c) = (gpointer)((guint8 *)(c) + sizeof (guint32));} while (0) +#define ppc_emit32(c,x) do { *((guint32 *) (c)) = (guint32) (x); (c) = ((guint8 *)(c) + sizeof (guint32));} while (0) #define ppc_is_imm16(val) ((((val)>> 15) == 0) || (((val)>> 15) == -1)) #define ppc_is_uimm16(val) ((glong)(val) >= 0L && (glong)(val) <= 65535L) diff --git a/src/mono/mono/eglib/giconv.c b/src/mono/mono/eglib/giconv.c index 5dee361..8223d4a 100644 --- a/src/mono/mono/eglib/giconv.c +++ b/src/mono/mono/eglib/giconv.c @@ -196,7 +196,8 @@ g_iconv (GIConv cd, gchar **inbytes, gsize *inbytesleft, } else { outleftptr = NULL; } -#if defined(__NetBSD__) +// AIX needs this for C++ and GNU iconv +#if defined(__NetBSD__) || defined(_AIX) return iconv (cd->cd, (const gchar **)inbytes, inleftptr, outbytes, outleftptr); #else return iconv (cd->cd, inbytes, inleftptr, outbytes, outleftptr); diff --git a/src/mono/mono/metadata/sre-encode.c b/src/mono/mono/metadata/sre-encode.c index 86e2c29..3df60f6 100644 --- a/src/mono/mono/metadata/sre-encode.c +++ b/src/mono/mono/metadata/sre-encode.c @@ -620,7 +620,7 @@ handle_enum: mono_metadata_encode_value (len, b, &b); #if G_BYTE_ORDER != G_LITTLE_ENDIAN idx = mono_image_add_stream_data (&assembly->blob, blob_size, b-blob_size); - swap_with_size (blob_size, box_val, len, 1); + swap_with_size (blob_size, (const char*)box_val, len, 1); mono_image_add_stream_data (&assembly->blob, blob_size, len); #else idx = mono_dynamic_image_add_to_blob_cached (assembly, blob_size, b-blob_size, box_val, len); diff --git a/src/mono/mono/metadata/threads.c b/src/mono/mono/metadata/threads.c index e6c09a9..6455431 100644 --- a/src/mono/mono/metadata/threads.c +++ b/src/mono/mono/metadata/threads.c @@ -5659,7 +5659,11 @@ mono_thread_is_foreign (MonoThread *thread) static void threads_native_thread_join_lock (gpointer tid, gpointer value) { - pthread_t thread = (pthread_t)tid; + /* + * Have to cast to a pointer-sized integer first, as we can't narrow + * from a pointer if pthread_t is an integer smaller than a pointer. + */ + pthread_t thread = (pthread_t)(intptr_t)tid; if (thread != pthread_self ()) { MONO_ENTER_GC_SAFE; /* This shouldn't block */ @@ -5672,7 +5676,7 @@ threads_native_thread_join_lock (gpointer tid, gpointer value) static void threads_native_thread_join_nolock (gpointer tid, gpointer value) { - pthread_t thread = (pthread_t)tid; + pthread_t thread = (pthread_t)(intptr_t)tid; MONO_ENTER_GC_SAFE; mono_native_thread_join (thread); MONO_EXIT_GC_SAFE; diff --git a/src/mono/mono/metadata/w32file-unix.c b/src/mono/mono/metadata/w32file-unix.c index 4203e15..819bbba 100644 --- a/src/mono/mono/metadata/w32file-unix.c +++ b/src/mono/mono/metadata/w32file-unix.c @@ -3885,7 +3885,7 @@ mono_w32file_get_logical_drive (guint32 len, gunichar2 *buf) total = 0; MONO_ENTER_GC_SAFE; - ret = mntctl (MCTL_QUERY, sizeof(needsize), &needsize); + ret = mntctl (MCTL_QUERY, sizeof(needsize), (char*)&needsize); MONO_EXIT_GC_SAFE; if (ret == -1) return 0; @@ -3893,7 +3893,7 @@ mono_w32file_get_logical_drive (guint32 len, gunichar2 *buf) if (mounts == NULL) return 0; MONO_ENTER_GC_SAFE; - ret = mntctl (MCTL_QUERY, needsize, mounts); + ret = mntctl (MCTL_QUERY, needsize, (char*)mounts); MONO_EXIT_GC_SAFE; if (ret == -1) { g_free (mounts); @@ -3908,7 +3908,7 @@ mono_w32file_get_logical_drive (guint32 len, gunichar2 *buf) } g_free (dir); total += length + 1; - mounts = (void*)mounts + mounts->vmt_length; // next! + mounts = (struct vmount *)((char*)mounts + mounts->vmt_length); // next! } if (total < len) buf [total] = 0; diff --git a/src/mono/mono/metadata/w32process-unix-default.c b/src/mono/mono/metadata/w32process-unix-default.c index 960ba3a..e2fda17 100644 --- a/src/mono/mono/metadata/w32process-unix-default.c +++ b/src/mono/mono/metadata/w32process-unix-default.c @@ -193,7 +193,7 @@ mono_w32process_get_modules (pid_t pid) mod = g_new0 (MonoW32ProcessModule, 1); mod->address_start = module.pr_vaddr; mod->address_end = module.pr_vaddr + module.pr_size; - mod->address_offset = module.pr_off; + mod->address_offset = (void*)module.pr_off; mod->perms = g_strdup ("r--p"); /* XXX? */ /* AIX has what appears to be device, channel and inode information, diff --git a/src/mono/mono/metadata/w32process-unix.c b/src/mono/mono/metadata/w32process-unix.c index 14559fd..e279b9b 100644 --- a/src/mono/mono/metadata/w32process-unix.c +++ b/src/mono/mono/metadata/w32process-unix.c @@ -3191,7 +3191,7 @@ big_up_string_block (gconstpointer data_ptr, version_data *block) g_free (big_value); big_value = g_convert ((gchar *)data_ptr, - unicode_chars (data_ptr) * 2, + unicode_chars ((const gunichar2*)data_ptr) * 2, "UTF-16BE", "UTF-16LE", NULL, NULL, NULL); if (big_value == NULL) { @@ -3199,7 +3199,7 @@ big_up_string_block (gconstpointer data_ptr, version_data *block) return(NULL); } memcpy ((gpointer)data_ptr, big_value, - unicode_chars (data_ptr) * 2); + unicode_chars ((const gunichar2*)data_ptr) * sizeof(gunichar2)); g_free (big_value); data_ptr = ((gunichar2 *)data_ptr) + block->value_len; diff --git a/src/mono/mono/mini/exceptions-ppc.c b/src/mono/mono/mini/exceptions-ppc.c index d6d6e9e8..44d09bc 100644 --- a/src/mono/mono/mini/exceptions-ppc.c +++ b/src/mono/mono/mini/exceptions-ppc.c @@ -583,9 +583,9 @@ mono_arch_unwind_frame (MonoDomain *domain, MonoJitTlsData *jit_tls, for (i = MONO_PPC_FIRST_SAVED_GREG; i < MONO_MAX_IREGS; ++i) regs [i] = ctx->regs [i]; - gboolean success = mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, + gboolean success = mono_unwind_frame (unwind_info, unwind_info_len, (guint8*)ji->code_start, (guint8*)ji->code_start + ji->code_size, - ip, NULL, regs, ppc_lr + 1, + (guint8*)ip, NULL, regs, ppc_lr + 1, save_locations, MONO_MAX_IREGS, &cfa); if (!success) @@ -624,7 +624,7 @@ mono_arch_unwind_frame (MonoDomain *domain, MonoJitTlsData *jit_tls, /* FIXME: what about trampoline LMF frames? see exceptions-x86.c */ - *lmf = (*lmf)->previous_lmf; + *lmf = (MonoLMF*)(*lmf)->previous_lmf; return TRUE; } @@ -638,7 +638,7 @@ mono_arch_ip_from_context (void *sigctx) #ifdef MONO_CROSS_COMPILE g_assert_not_reached (); #else - os_ucontext *uc = sigctx; + os_ucontext *uc = (os_ucontext*)sigctx; return (gpointer)UCONTEXT_REG_NIP(uc); #endif } @@ -676,7 +676,7 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s } if (!ji) if (mono_dump_start ()) - mono_handle_native_crash ("SIGSEGV", sigctx, siginfo); + mono_handle_native_crash ("SIGSEGV", (MonoContext*)sigctx, siginfo); /* setup a call frame on the real stack so that control is returned there * and exception handling can continue. * The frame looks like: @@ -687,8 +687,8 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s frame_size = sizeof (MonoContext) + sizeof (gpointer) * 16 + 224; frame_size += 15; frame_size &= ~15; - sp = (gpointer)(UCONTEXT_REG_Rn(uc, 1) & ~15); - sp = (gpointer)((char*)sp - frame_size); + sp = (void**)(UCONTEXT_REG_Rn(uc, 1) & ~15); + sp = (void**)((char*)sp - frame_size); /* may need to adjust pointers in the new struct copy, depending on the OS */ uc_copy = (MonoContext*)(sp + 16); mono_sigctx_to_monoctx (uc, uc_copy); @@ -791,7 +791,7 @@ mono_arch_handle_exception (void *ctx, gpointer obj) sp = (host_mgreg_t)(UCONTEXT_REG_Rn(uc, 1) & ~15); sp = (host_mgreg_t)(sp - frame_size); UCONTEXT_REG_Rn(uc, 1) = (host_mgreg_t)sp; - setup_ucontext_return (uc, handle_signal_exception); + setup_ucontext_return (uc, (gpointer)handle_signal_exception); return TRUE; #else @@ -815,11 +815,11 @@ void mono_arch_setup_async_callback (MonoContext *ctx, void (*async_cb)(void *fun), gpointer user_data) { uintptr_t sp = (uintptr_t) MONO_CONTEXT_GET_SP(ctx); - ctx->regs [PPC_FIRST_ARG_REG] = user_data; + ctx->regs [PPC_FIRST_ARG_REG] = (host_mgreg_t)user_data; sp -= PPC_MINIMAL_STACK_SIZE; - *(unsigned long *)sp = MONO_CONTEXT_GET_SP(ctx); + *(unsigned long *)sp = (uintptr_t) MONO_CONTEXT_GET_SP(ctx); MONO_CONTEXT_SET_BP(ctx, sp); - mono_arch_setup_resume_sighandler_ctx(ctx, (unsigned long) async_cb); + mono_arch_setup_resume_sighandler_ctx(ctx, (gpointer) async_cb); } void diff --git a/src/mono/mono/mini/mini-ppc.c b/src/mono/mono/mini/mini-ppc.c index 057b5b1..1b2e38a 100644 --- a/src/mono/mono/mini/mini-ppc.c +++ b/src/mono/mono/mini/mini-ppc.c @@ -424,7 +424,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe return cached; if (mono_ee_features.use_aot_trampolines) { - start = mono_aot_get_trampoline ("delegate_invoke_impl_has_target"); + start = (guint8*)mono_aot_get_trampoline ("delegate_invoke_impl_has_target"); } else { MonoTrampInfo *info; start = get_delegate_invoke_impl (&info, TRUE, 0, FALSE); @@ -450,7 +450,7 @@ mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_targe if (mono_ee_features.use_aot_trampolines) { char *name = g_strdup_printf ("delegate_invoke_impl_target_%d", sig->param_count); - start = mono_aot_get_trampoline (name); + start = (guint8*)mono_aot_get_trampoline (name); g_free (name); } else { MonoTrampInfo *info; @@ -1736,7 +1736,7 @@ void mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src) { MonoCallInst *call = (MonoCallInst*)ins->inst_p0; - ArgInfo *ainfo = ins->inst_p1; + ArgInfo *ainfo = (ArgInfo*)ins->inst_p1; int ovf_size = ainfo->vtsize; int doffset = ainfo->offset; int i, soffset, dreg; @@ -2916,7 +2916,7 @@ ppc_patch_full (MonoCompile *cfg, MonoDomain *domain, guchar *code, const guchar } } else { if (is_fd) - target = mono_get_addr_from_ftnptr ((gpointer)target); + target = (const guchar*)mono_get_addr_from_ftnptr ((gpointer)target); } /* FIXME: make this thread safe */ @@ -3650,13 +3650,14 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) break; case OP_GOT_ENTRY: // FIXME: Fix max instruction length - mono_add_patch_info (cfg, offset, (MonoJumpInfoType)ins->inst_right->inst_i1, ins->inst_right->inst_p0); + /* XXX: This is hairy; we're casting a pointer from a union to an enum... */ + mono_add_patch_info (cfg, offset, (MonoJumpInfoType)(intptr_t)ins->inst_right->inst_i1, ins->inst_right->inst_p0); /* arch_emit_got_access () patches this */ ppc_load32 (code, ppc_r0, 0); ppc_ldptr_indexed (code, ins->dreg, ins->inst_basereg, ppc_r0); break; case OP_AOTCONST: - mono_add_patch_info (cfg, offset, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0); + mono_add_patch_info (cfg, offset, (MonoJumpInfoType)(intptr_t)ins->inst_i1, ins->inst_p0); ppc_load_sequence (code, ins->dreg, 0); break; CASE_PPC32 (OP_ICONV_TO_I4) @@ -4049,7 +4050,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_COND_EXC_GE_UN: case OP_COND_EXC_LE: case OP_COND_EXC_LE_UN: - EMIT_COND_SYSTEM_EXCEPTION (ins->opcode - OP_COND_EXC_EQ, ins->inst_p1); + EMIT_COND_SYSTEM_EXCEPTION (ins->opcode - OP_COND_EXC_EQ, (const char*)ins->inst_p1); break; case OP_COND_EXC_IEQ: case OP_COND_EXC_INE_UN: @@ -4061,7 +4062,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_COND_EXC_IGE_UN: case OP_COND_EXC_ILE: case OP_COND_EXC_ILE_UN: - EMIT_COND_SYSTEM_EXCEPTION (ins->opcode - OP_COND_EXC_IEQ, ins->inst_p1); + EMIT_COND_SYSTEM_EXCEPTION (ins->opcode - OP_COND_EXC_IEQ, (const char*)ins->inst_p1); break; case OP_IBEQ: case OP_IBNE_UN: @@ -4422,12 +4423,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) */ ppc_mfspr (code, ppc_r0, ppc_xer); ppc_andisd (code, ppc_r0, ppc_r0, (1 << 13)); /* CA */ - EMIT_COND_SYSTEM_EXCEPTION_FLAGS (PPC_BR_FALSE, PPC_BR_EQ, ins->inst_p1); + EMIT_COND_SYSTEM_EXCEPTION_FLAGS (PPC_BR_FALSE, PPC_BR_EQ, (const char*)ins->inst_p1); break; case OP_COND_EXC_OV: ppc_mfspr (code, ppc_r0, ppc_xer); ppc_andisd (code, ppc_r0, ppc_r0, (1 << 14)); /* OV */ - EMIT_COND_SYSTEM_EXCEPTION_FLAGS (PPC_BR_FALSE, PPC_BR_EQ, ins->inst_p1); + EMIT_COND_SYSTEM_EXCEPTION_FLAGS (PPC_BR_FALSE, PPC_BR_EQ, (const char*)ins->inst_p1); break; case OP_LBEQ: case OP_LBNE_UN: @@ -4684,7 +4685,7 @@ mono_arch_patch_code_new (MonoCompile *cfg, MonoDomain *domain, guint8 *code, Mo /* fall through */ #endif default: - ppc_patch_full (cfg, domain, ip, target, is_fd); + ppc_patch_full (cfg, domain, ip, (const guchar*)target, is_fd); break; } } @@ -5353,7 +5354,7 @@ mono_arch_emit_exceptions (MonoCompile *cfg) */ for (patch_info = cfg->patch_info; patch_info; patch_info = patch_info->next) { if (patch_info->type == MONO_PATCH_INFO_EXC) { - i = exception_id_by_name (patch_info->data.target); + i = exception_id_by_name ((const char*)patch_info->data.target); if (!exc_throw_found [i]) { max_epilog_size += (2 * PPC_LOAD_SEQUENCE_LENGTH) + 5 * 4; exc_throw_found [i] = TRUE; @@ -5416,7 +5417,7 @@ mono_arch_emit_exceptions (MonoCompile *cfg) MonoClass *exc_class; unsigned char *ip = patch_info->ip.i + cfg->native_code; - i = exception_id_by_name (patch_info->data.target); + i = exception_id_by_name ((const char*)patch_info->data.target); if (exc_throw_pos [i] && !(ip > exc_throw_pos [i] && ip - exc_throw_pos [i] > 50000)) { ppc_patch (ip, exc_throw_pos [i]); patch_info->type = MONO_PATCH_INFO_NONE; diff --git a/src/mono/mono/mini/mini-runtime.c b/src/mono/mono/mini/mini-runtime.c index a14a0a3..8304783 100644 --- a/src/mono/mono/mini/mini-runtime.c +++ b/src/mono/mono/mini/mini-runtime.c @@ -3785,7 +3785,7 @@ mini_create_ftnptr (MonoDomain *domain, gpointer addr) #if defined(PPC_USES_FUNCTION_DESCRIPTOR) gpointer* desc = NULL; - if ((desc = g_hash_table_lookup (domain->ftnptrs_hash, addr))) + if ((desc = (gpointer*)g_hash_table_lookup (domain->ftnptrs_hash, addr))) return desc; #if defined(__mono_ppc64__) desc = mono_domain_alloc0 (domain, 3 * sizeof (gpointer)); diff --git a/src/mono/mono/mini/tramp-ppc.c b/src/mono/mono/mini/tramp-ppc.c index 3e2b6ce..5e603b6 100644 --- a/src/mono/mono/mini/tramp-ppc.c +++ b/src/mono/mono/mini/tramp-ppc.c @@ -90,7 +90,7 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) mono_domain_lock (domain); start = code = mono_domain_code_reserve (domain, size); code = mono_ppc_create_pre_code_ftnptr (code); - short_branch = branch_for_target_reachable (code + 4, addr); + short_branch = branch_for_target_reachable (code + 4, (guint8*)addr); if (short_branch) mono_domain_code_commit (domain, code, size, 8); mono_domain_unlock (domain); @@ -140,7 +140,7 @@ mono_arch_get_static_rgctx_trampoline (gpointer arg, gpointer addr) mono_domain_lock (domain); start = code = mono_domain_code_reserve (domain, size); code = mono_ppc_create_pre_code_ftnptr (code); - short_branch = branch_for_target_reachable (code + imm_size, addr); + short_branch = branch_for_target_reachable (code + imm_size, (guint8*)addr); if (short_branch) mono_domain_code_commit (domain, code, size, imm_size + 4); mono_domain_unlock (domain); @@ -168,7 +168,7 @@ mono_arch_patch_callsite (guint8 *method_start, guint8 *code_ptr, guint8 *addr) { guint32 *code = (guint32*)code_ptr; - addr = mono_get_addr_from_ftnptr (addr); + addr = (guint8*)mono_get_addr_from_ftnptr (addr); /* This is the 'blrl' instruction */ --code; @@ -404,7 +404,7 @@ mono_arch_create_generic_trampoline (MonoTrampolineType tramp_type, MonoTrampInf if (aot) { g_error ("Not implemented"); } else { - gconstpointer checkpoint = mono_thread_force_interruption_checkpoint_noraise; + gconstpointer checkpoint = (gconstpointer)mono_thread_force_interruption_checkpoint_noraise; ppc_load_func (code, PPC_CALL_REG, checkpoint); ppc_mtlr (code, PPC_CALL_REG); } diff --git a/src/mono/mono/utils/mono-context.c b/src/mono/mono/utils/mono-context.c index 4db04ee..59af925 100644 --- a/src/mono/mono/utils/mono-context.c +++ b/src/mono/mono/utils/mono-context.c @@ -528,7 +528,7 @@ mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) void mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) { - os_ucontext *uc = sigctx; + os_ucontext *uc = (os_ucontext*)sigctx; mctx->sc_ir = UCONTEXT_REG_NIP(uc); mctx->sc_sp = UCONTEXT_REG_Rn(uc, 1); @@ -540,7 +540,7 @@ mono_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) void mono_monoctx_to_sigctx (MonoContext *mctx, void *sigctx) { - os_ucontext *uc = sigctx; + os_ucontext *uc = (os_ucontext*)sigctx; memcpy (&UCONTEXT_REG_Rn(uc, 0), &mctx->regs, sizeof (host_mgreg_t) * MONO_MAX_IREGS); memcpy (&UCONTEXT_REG_FPRn(uc, 0), &mctx->fregs, sizeof (double) * MONO_MAX_FREGS); diff --git a/src/mono/mono/utils/mono-threads-aix.c b/src/mono/mono/utils/mono-threads-aix.c index a1dd373..28cae9b 100644 --- a/src/mono/mono/utils/mono-threads-aix.c +++ b/src/mono/mono/utils/mono-threads-aix.c @@ -30,7 +30,7 @@ mono_threads_platform_get_stack_bounds (guint8 **staddr, size_t *stsize) res = pthread_getthrds_np(&pt, PTHRDSINFO_QUERY_ALL, &pi, ps, rb, &rbv); /* FIXME: are these the right values? */ - *staddr = (void*)(pi.__pi_stackaddr); + *staddr = (guint8*)pi.__pi_stackaddr; /* * ruby doesn't use stacksize; see: * github.com/ruby/ruby/commit/a2594be783c727c6034308f5294333752c3845bb -- 2.7.4