* CALL_TARGET is the symbol pointing to the native code of METHOD.
*/
static void
-arch_emit_unbox_trampoline (MonoAotCompile *acfg, MonoMethod *method, MonoGenericSharingContext *gsctx, const char *call_target)
+arch_emit_unbox_trampoline (MonoAotCompile *acfg, MonoMethod *method, const char *call_target)
{
#if defined(TARGET_AMD64)
guint8 buf [32];
guint8 *code;
int this_reg;
- this_reg = mono_arch_get_this_arg_reg (mono_method_signature (method), gsctx, NULL);
+ this_reg = mono_arch_get_this_arg_reg (NULL);
code = buf;
amd64_alu_reg_imm (code, X86_ADD, this_reg, sizeof (MonoObject));
sprintf (call_target, "%s", cfg->asm_symbol);
- arch_emit_unbox_trampoline (acfg, cfg->orig_method, cfg->generic_sharing_context, call_target);
+ arch_emit_unbox_trampoline (acfg, cfg->orig_method, call_target);
}
if (cfg->compile_llvm)
}
int
-mono_arch_get_this_arg_reg (MonoMethodSignature *sig, MonoGenericSharingContext *gsctx, guint8 *code)
+mono_arch_get_this_arg_reg (guint8 *code)
{
return AMD64_ARG_REG1;
}
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
- return (gpointer)regs [mono_arch_get_this_arg_reg (sig, gsctx, code)];
+ return (gpointer)regs [mono_arch_get_this_arg_reg (code)];
}
#define MAX_ARCH_DELEGATE_PARAMS 10
}
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
return (gpointer)regs [ARMREG_R0];
}
* IA64 has MONO_ARCH_THIS_AS_FIRST_ARG defined, but we don't need to really pass
* this as first, because this is stored in a non-stacked register by the calling
* sequence.
+ * FIXME: mono_arch_get_unbox_trampoline () depends on this.
*/
/* this */
int out_reg;
/*
- * mono_arch_find_this_arg () needs to find the this argument in a global
+ * mono_arch_get_this_arg_from_call () needs to find the this argument in a global
* register.
*/
cinfo = get_call_info (cfg, cfg->mempool, call->signature, FALSE);
#endif
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
return (gpointer)regs [IA64_R10];
}
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
- /* FIXME: handle returning a struct */
g_assert(regs);
- if (sig && MONO_TYPE_ISSTRUCT (sig->ret))
- return (gpointer)regs [mips_a1];
return (gpointer)regs [mips_a0];
}
}
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
mgreg_t *r = (mgreg_t*)regs;
/*------------------------------------------------------------------*/
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
MonoLMF *lmf = (MonoLMF *) ((gchar *) regs - sizeof(MonoLMF));
- /* FIXME: handle returning a struct */
return (gpointer) lmf->gregs [s390_r2];
}
}
/*========================= End of Function ========================*/
-
-/*------------------------------------------------------------------*/
-/* */
-/* Name - mono_arch_find_this_argument. */
-/* */
-/* Function - */
-/* */
-/*------------------------------------------------------------------*/
-
-MonoObject *
-mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method,
- MonoGenericSharingContext *gsctx)
-{
- return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
-}
-
-/*========================= End of Function ========================*/
}
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
mono_sparc_flushw ();
static CRITICAL_SECTION trampolines_mutex;
static gpointer
-get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr, gboolean need_rgctx_tramp)
+get_unbox_trampoline (MonoMethod *m, gpointer addr, gboolean need_rgctx_tramp)
{
if (mono_aot_only) {
if (need_rgctx_tramp)
return mono_aot_get_unbox_trampoline (m);
} else {
unbox_trampolines ++;
- return mono_arch_get_unbox_trampoline (gsctx, m, addr);
+ return mono_arch_get_unbox_trampoline (m, addr);
}
}
static gpointer*
mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *code, MonoMethod *method, MonoMethod **impl_method, gboolean *need_rgctx_tramp, gboolean *variance_used, gpointer *aot_addr)
{
- MonoObject *this_argument = mono_arch_get_this_arg_from_call (NULL, mono_method_signature (method), regs, code);
+ MonoObject *this_argument = mono_arch_get_this_arg_from_call (regs, code);
MonoVTable *vt = this_argument->vtable;
int displacement = slot - ((gpointer*)vt);
vtable_slot = orig_vtable_slot;
g_assert (vtable_slot);
- this_arg = mono_arch_get_this_arg_from_call (NULL, mono_method_signature (m), regs, code);
+ this_arg = mono_arch_get_this_arg_from_call (regs, code);
if (this_arg->vtable->klass == mono_defaults.transparent_proxy_class) {
/* Use the slow path for now */
#endif
} else {
#ifdef MONO_ARCH_HAVE_IMT
- MonoObject *this_argument = mono_arch_get_this_arg_from_call (NULL, mono_method_signature (m), regs, code);
+ MonoObject *this_argument = mono_arch_get_this_arg_from_call (regs, code);
vt = this_argument->vtable;
vtable_slot = orig_vtable_slot;
g_assert (vtable_slot);
if (vt->klass->valuetype) /*FIXME is this required variant iface?*/
- addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp);
+ addr = get_unbox_trampoline (m, addr, need_rgctx_tramp);
mono_method_add_generic_virtual_invocation (mono_domain_get (),
vt, vtable_slot,
if (vtable_slot) {
if (m->klass->valuetype)
- addr = get_unbox_trampoline (mono_get_generic_context_from_code (code), m, addr, need_rgctx_tramp);
+ addr = get_unbox_trampoline (m, addr, need_rgctx_tramp);
if (vtable_slot_to_patch && (mono_aot_is_got_entry (code, (guint8*)vtable_slot_to_patch) || mono_domain_owns_vtable_slot (mono_domain_get (), vtable_slot_to_patch))) {
g_assert (*vtable_slot_to_patch);
/*
* Obtain the vtable from the 'this' arg.
*/
- this = mono_arch_get_this_arg_from_call (NULL, NULL, regs, code);
+ this = mono_arch_get_this_arg_from_call (regs, code);
g_assert (this);
vt = this->vtable;
trampoline_calls ++;
/* Obtain the delegate object according to the calling convention */
-
- /*
- * Avoid calling mono_get_generic_context_from_code () now since it is expensive,
- * get_this_arg_from_call will call it if needed.
- */
- delegate = mono_arch_get_this_arg_from_call (NULL, mono_method_signature (invoke), regs, code);
+ delegate = mono_arch_get_this_arg_from_call (regs, code);
if (delegate->method) {
method = delegate->method;
}
gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig,
- mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
{
guint32 esp = regs [X86_ESP];
CallInfo *cinfo = NULL;
void mono_arch_create_vars (MonoCompile *cfg) MONO_INTERNAL;
void mono_arch_save_unwind_info (MonoCompile *cfg) MONO_INTERNAL;
void mono_arch_register_lowlevel_calls (void) MONO_INTERNAL;
-gpointer mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr) MONO_INTERNAL;
+gpointer mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr) MONO_INTERNAL;
gpointer mono_arch_get_static_rgctx_trampoline (MonoMethod *m, MonoMethodRuntimeGenericContext *mrgctx, gpointer addr) MONO_INTERNAL;
gpointer mono_arch_get_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *method, int vt_offset) MONO_INTERNAL;
void mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr) MONO_INTERNAL;
void mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr) MONO_INTERNAL;
void mono_arch_nullify_class_init_trampoline(guint8 *code, mgreg_t *regs) MONO_INTERNAL;
void mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs) MONO_INTERNAL;
-int mono_arch_get_this_arg_reg (MonoMethodSignature *sig, MonoGenericSharingContext *gsctx, guint8 *code) MONO_INTERNAL;
-gpointer mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code) MONO_INTERNAL;
+int mono_arch_get_this_arg_reg (guint8 *code) MONO_INTERNAL;
+gpointer mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code) MONO_INTERNAL;
gpointer mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_target) MONO_INTERNAL;
gpointer mono_arch_create_specific_trampoline (gpointer arg1, MonoTrampolineType tramp_type, MonoDomain *domain, guint32 *code_len) MONO_INTERNAL;
void mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt_arg) MONO_INTERNAL;
/*
* mono_arch_get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *code, *start;
int this_reg;
MonoDomain *domain = mono_domain_get ();
- this_reg = mono_arch_get_this_arg_reg (mono_method_signature (m), gsctx, NULL);
+ this_reg = mono_arch_get_this_arg_reg (NULL);
start = code = mono_domain_code_reserve (domain, 20);
start = code = mono_domain_code_reserve (domain, buf_len);
- this_reg = mono_arch_get_this_arg_reg (mono_method_signature (m), NULL, NULL);
+ this_reg = mono_arch_get_this_arg_reg (NULL);
/* Set imt arg */
amd64_mov_reg_imm (code, MONO_ARCH_IMT_REG, m);
/*
* mono_arch_get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *code, *start;
MonoDomain *domain = mono_domain_get ();
}
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
g_assert_not_reached ();
return NULL;
/*
* mono_arch_get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *buf;
gpointer func_addr, func_gp;
/*
* get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *code, *start;
int this_pos = mips_a0;
/*
* get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *code, *start;
int this_pos = 3;
/* When value type methods are called through the */
/* vtable we need to unbox the 'this' argument. */
/* */
-/* Parameters - gsctx - Generic sharing context */
-/* method - Methd pointer */
+/* Parameters - method - Methd pointer */
/* addr - Pointer to native code for method */
/* */
/*------------------------------------------------------------------*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *method, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *method, gpointer addr)
{
guint8 *code, *start;
int this_pos = s390_r2;
/* When value type methods are called through the */
/* vtable we need to unbox the 'this' argument. */
/* */
-/* Parameters - gsctx - Generic sharing context */
-/* method - Methd pointer */
+/* Parameters - method - Methd pointer */
/* addr - Pointer to native code for method */
/* */
/*------------------------------------------------------------------*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *method, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *method, gpointer addr)
{
guint8 *code, *start;
int this_pos = s390_r2;
/*
* mono_arch_get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *code, *start;
- int this_pos = 4, reg;
+ int reg;
- if (MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret))
- this_pos = 8;
-
start = code = mono_global_codeman_reserve (36);
/* This executes in the context of the caller, hence o0 */
/*
* mono_arch_get_unbox_trampoline:
- * @gsctx: the generic sharing context
* @m: method pointer
* @addr: pointer to native code for @m
*
* unboxing before calling the method
*/
gpointer
-mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
{
guint8 *code, *start;
int this_pos = 4;