projects
/
mono.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge pull request #3066 from alexanderkyte/pedump_sgen
[mono.git]
/
mono
/
mini
/
mini-generic-sharing.c
diff --git
a/mono/mini/mini-generic-sharing.c
b/mono/mini/mini-generic-sharing.c
index 1c37f38d726df2839d8fe82a9172edf7c47f2962..84c21c5890e9dfedf73e95a441857fc6875f370a 100644
(file)
--- a/
mono/mini/mini-generic-sharing.c
+++ b/
mono/mini/mini-generic-sharing.c
@@
-936,9
+936,10
@@
class_type_info (MonoDomain *domain, MonoClass *klass, MonoRgctxInfoType info_ty
memcpy_method [size] = m;
}
if (!domain_info->memcpy_addr [size]) {
memcpy_method [size] = m;
}
if (!domain_info->memcpy_addr [size]) {
- gpointer addr = mono_compile_method
(memcpy_method [size]
);
+ gpointer addr = mono_compile_method
_checked (memcpy_method [size], error
);
mono_memory_barrier ();
domain_info->memcpy_addr [size] = (gpointer *)addr;
mono_memory_barrier ();
domain_info->memcpy_addr [size] = (gpointer *)addr;
+ mono_error_assert_ok (error);
}
return domain_info->memcpy_addr [size];
} else {
}
return domain_info->memcpy_addr [size];
} else {
@@
-956,9
+957,10
@@
class_type_info (MonoDomain *domain, MonoClass *klass, MonoRgctxInfoType info_ty
bzero_method [size] = m;
}
if (!domain_info->bzero_addr [size]) {
bzero_method [size] = m;
}
if (!domain_info->bzero_addr [size]) {
- gpointer addr = mono_compile_method
(bzero_method [size]
);
+ gpointer addr = mono_compile_method
_checked (bzero_method [size], error
);
mono_memory_barrier ();
domain_info->bzero_addr [size] = (gpointer *)addr;
mono_memory_barrier ();
domain_info->bzero_addr [size] = (gpointer *)addr;
+ mono_error_assert_ok (error);
}
return domain_info->bzero_addr [size];
}
}
return domain_info->bzero_addr [size];
}
@@
-1085,7
+1087,11
@@
get_wrapper_shared_type (MonoType *t)
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
case MONO_TYPE_PTR:
case MONO_TYPE_SZARRAY:
case MONO_TYPE_ARRAY:
case MONO_TYPE_PTR:
- return &mono_defaults.int_class->byval_arg;
+ // FIXME: refs and intptr cannot be shared because
+ // they are treated differently when a method has a vret arg,
+ // see get_call_info ().
+ return &mono_defaults.object_class->byval_arg;
+ //return &mono_defaults.int_class->byval_arg;
case MONO_TYPE_GENERICINST: {
MonoError error;
MonoClass *klass;
case MONO_TYPE_GENERICINST: {
MonoError error;
MonoClass *klass;
@@
-1096,7
+1102,7
@@
get_wrapper_shared_type (MonoType *t)
int i;
if (!MONO_TYPE_ISSTRUCT (t))
int i;
if (!MONO_TYPE_ISSTRUCT (t))
- return
&mono_defaults.int_class->byval_arg
;
+ return
get_wrapper_shared_type (&mono_defaults.object_class->byval_arg)
;
klass = mono_class_from_mono_type (t);
orig_ctx = &klass->generic_class->context;
klass = mono_class_from_mono_type (t);
orig_ctx = &klass->generic_class->context;
@@
-1355,6
+1361,9
@@
mini_get_gsharedvt_out_sig_wrapper (MonoMethodSignature *sig)
// FIXME:
if (stind_op == CEE_STOBJ)
mono_mb_emit_op (mb, CEE_STOBJ, mono_class_from_mono_type (sig->ret));
// FIXME:
if (stind_op == CEE_STOBJ)
mono_mb_emit_op (mb, CEE_STOBJ, mono_class_from_mono_type (sig->ret));
+ else if (stind_op == CEE_STIND_REF)
+ /* Avoid write barriers, the vret arg points to the stack */
+ mono_mb_emit_byte (mb, CEE_STIND_I);
else
mono_mb_emit_byte (mb, stind_op);
}
else
mono_mb_emit_byte (mb, stind_op);
}
@@
-1411,6
+1420,7
@@
mini_get_gsharedvt_wrapper (gboolean gsharedvt_in, gpointer addr, MonoMethodSign
{
static gboolean inited = FALSE;
static int num_trampolines;
{
static gboolean inited = FALSE;
static int num_trampolines;
+ MonoError error;
gpointer res, info;
MonoDomain *domain = mono_domain_get ();
MonoJitDomainInfo *domain_info;
gpointer res, info;
MonoDomain *domain = mono_domain_get ();
MonoJitDomainInfo *domain_info;
@@
-1429,7
+1439,8
@@
mini_get_gsharedvt_wrapper (gboolean gsharedvt_in, gpointer addr, MonoMethodSign
wrapper = mini_get_gsharedvt_in_sig_wrapper (normal_sig);
else
wrapper = mini_get_gsharedvt_out_sig_wrapper (normal_sig);
wrapper = mini_get_gsharedvt_in_sig_wrapper (normal_sig);
else
wrapper = mini_get_gsharedvt_out_sig_wrapper (normal_sig);
- res = mono_compile_method (wrapper);
+ res = mono_compile_method_checked (wrapper, &error);
+ mono_error_assert_ok (&error);
return res;
}
return res;
}
@@
-1462,8
+1473,9
@@
mini_get_gsharedvt_wrapper (gboolean gsharedvt_in, gpointer addr, MonoMethodSign
if (!tramp_addr) {
wrapper = mono_marshal_get_gsharedvt_in_wrapper ();
if (!tramp_addr) {
wrapper = mono_marshal_get_gsharedvt_in_wrapper ();
- addr = mono_compile_method
(wrappe
r);
+ addr = mono_compile_method
_checked (wrapper, &erro
r);
mono_memory_barrier ();
mono_memory_barrier ();
+ mono_error_assert_ok (&error);
tramp_addr = addr;
}
addr = tramp_addr;
tramp_addr = addr;
}
addr = tramp_addr;
@@
-1473,8
+1485,9
@@
mini_get_gsharedvt_wrapper (gboolean gsharedvt_in, gpointer addr, MonoMethodSign
if (!tramp_addr) {
wrapper = mono_marshal_get_gsharedvt_out_wrapper ();
if (!tramp_addr) {
wrapper = mono_marshal_get_gsharedvt_out_wrapper ();
- addr = mono_compile_method
(wrappe
r);
+ addr = mono_compile_method
_checked (wrapper, &erro
r);
mono_memory_barrier ();
mono_memory_barrier ();
+ mono_error_assert_ok (&error);
tramp_addr = addr;
}
addr = tramp_addr;
tramp_addr = addr;
}
addr = tramp_addr;
@@
-1571,13
+1584,15
@@
instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
gpointer arg = NULL;
if (mono_llvm_only) {
gpointer arg = NULL;
if (mono_llvm_only) {
- addr = mono_compile_method (m);
+ addr = mono_compile_method_checked (m, error);
+ return_val_if_nok (error, NULL);
addr = mini_add_method_wrappers_llvmonly (m, addr, FALSE, FALSE, &arg);
/* Returns an ftndesc */
return mini_create_llvmonly_ftndesc (domain, addr, arg);
} else {
addr = mini_add_method_wrappers_llvmonly (m, addr, FALSE, FALSE, &arg);
/* Returns an ftndesc */
return mini_create_llvmonly_ftndesc (domain, addr, arg);
} else {
- addr = mono_compile_method ((MonoMethod *)data);
+ addr = mono_compile_method_checked ((MonoMethod *)data, error);
+ return_val_if_nok (error, NULL);
return mini_add_method_trampoline ((MonoMethod *)data, addr, mono_method_needs_static_rgctx_invoke ((MonoMethod *)data, FALSE), FALSE);
}
}
return mini_add_method_trampoline ((MonoMethod *)data, addr, mono_method_needs_static_rgctx_invoke ((MonoMethod *)data, FALSE), FALSE);
}
}
@@
-1588,7
+1603,8
@@
instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
g_assert (mono_llvm_only);
g_assert (mono_llvm_only);
- addr = mono_compile_method (m);
+ addr = mono_compile_method_checked (m, error);
+ return_val_if_nok (error, NULL);
MonoJitInfo *ji;
gboolean callee_gsharedvt;
MonoJitInfo *ji;
gboolean callee_gsharedvt;
@@
-1629,9
+1645,9
@@
instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
method = info->klass->vtable [ioffset + slot];
method = mono_class_inflate_generic_method_checked (method, context, error);
method = info->klass->vtable [ioffset + slot];
method = mono_class_inflate_generic_method_checked (method, context, error);
- if (!mono_error_ok (error))
-
return NULL
;
-
addr = mono_compile_method (method
);
+ return_val_if_nok (error, NULL);
+
addr = mono_compile_method_checked (method, error)
;
+
return_val_if_nok (error, NULL
);
return mini_add_method_trampoline (method, addr, mono_method_needs_static_rgctx_invoke (method, FALSE), FALSE);
}
case MONO_RGCTX_INFO_VIRT_METHOD_BOX_TYPE: {
return mini_add_method_trampoline (method, addr, mono_method_needs_static_rgctx_invoke (method, FALSE), FALSE);
}
case MONO_RGCTX_INFO_VIRT_METHOD_BOX_TYPE: {
@@
-1664,7
+1680,7
@@
instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
}
#ifndef DISABLE_REMOTING
case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK:
}
#ifndef DISABLE_REMOTING
case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK:
- return mono_compile_method
(mono_marshal_get_remoting_invoke_with_check ((MonoMethod *)data)
);
+ return mono_compile_method
_checked (mono_marshal_get_remoting_invoke_with_check ((MonoMethod *)data), error
);
#endif
case MONO_RGCTX_INFO_METHOD_DELEGATE_CODE:
return mono_domain_alloc0 (domain, sizeof (gpointer));
#endif
case MONO_RGCTX_INFO_METHOD_DELEGATE_CODE:
return mono_domain_alloc0 (domain, sizeof (gpointer));
@@
-1742,9
+1758,10
@@
instantiate_info (MonoDomain *domain, MonoRuntimeGenericContextInfoTemplate *oti
g_assert (method->is_inflated);
g_assert (method->is_inflated);
- if (!virtual_)
- addr = mono_compile_method (method);
- else
+ if (!virtual_) {
+ addr = mono_compile_method_checked (method, error);
+ return_val_if_nok (error, NULL);
+ } else
addr = NULL;
if (virtual_) {
addr = NULL;
if (virtual_) {