x86_patch (code, (unsigned char*)target);
}
+void
+mono_amd64_patch (unsigned char* code, gpointer target)
+{
+ amd64_patch (code, target);
+}
+
typedef enum {
ArgInIReg,
ArgInFloatSSEReg,
* Draft Version 0.23" document for more information.
*/
static CallInfo*
-get_call_info (MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
+get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
{
guint32 i, gr, fr;
MonoType *ret_type;
/* return value */
{
ret_type = mono_type_get_underlying_type (sig->ret);
+ ret_type = mini_get_basic_type_from_generic (cfg, ret_type);
switch (ret_type->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
continue;
}
ptype = mono_type_get_underlying_type (sig->params [i]);
+ ptype = mini_get_basic_type_from_generic (cfg, ptype);
switch (ptype->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info)
{
int k;
- CallInfo *cinfo = get_call_info (NULL, csig, FALSE);
+ CallInfo *cinfo = get_call_info (NULL, NULL, csig, FALSE);
guint32 args_size = cinfo->stack_usage;
/* The arguments are saved to a stack area in mono_arch_instrument_prolog */
{
MonoMethodSignature *sig;
MonoMethodHeader *header;
- int i;
+ int i, locals_size;
CallInfo *cinfo;
if (cfg->arch.omit_fp_computed)
sig = mono_method_signature (cfg->method);
if (!cfg->arch.cinfo)
- cfg->arch.cinfo = get_call_info (cfg->mempool, sig, FALSE);
+ cfg->arch.cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
cinfo = cfg->arch.cinfo;
/*
}
}
- if (cfg->num_varinfo > 10000) {
+ locals_size = 0;
+ for (i = cfg->locals_start; i < cfg->num_varinfo; i++) {
+ MonoInst *ins = cfg->varinfo [i];
+ int ialign;
+
+ locals_size += mono_type_size (ins->inst_vtype, &ialign);
+ }
+
+ if ((cfg->num_varinfo > 10000) || (locals_size >= (1 << 15))) {
/* Avoid hitting the stack_alloc_size < (1 << 16) assertion in emit_epilog () */
cfg->arch.omit_fp = FALSE;
}
sig = mono_method_signature (cfg->method);
if (!cfg->arch.cinfo)
- cfg->arch.cinfo = get_call_info (cfg->mempool, sig, FALSE);
+ cfg->arch.cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
cinfo = cfg->arch.cinfo;
if (cinfo->ret.storage == ArgValuetypeInReg)
sig = call->signature;
n = sig->param_count + sig->hasthis;
- cinfo = get_call_info (cfg->mempool, sig, sig->pinvoke);
+ cinfo = get_call_info (cfg, cfg->mempool, sig, sig->pinvoke);
for (i = 0; i < n; ++i) {
ainfo = cinfo->args + i;
case OP_VCALL:
case OP_VCALL_REG:
case OP_VCALL_MEMBASE:
- cinfo = get_call_info (cfg->mempool, ((MonoCallInst*)ins)->signature, FALSE);
+ cinfo = get_call_info (cfg, cfg->mempool, ((MonoCallInst*)ins)->signature, FALSE);
if (cinfo->ret.storage == ArgValuetypeInReg) {
/* Pop the destination address from the stack */
amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 8);
CallInfo *cinfo;
gint32 lmf_offset = cfg->arch.lmf_offset;
- cfg->code_size = MAX (((MonoMethodNormal *)method)->header->code_size * 4, 512);
+ cfg->code_size = MAX (((MonoMethodNormal *)method)->header->code_size * 4, 1024);
if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
cfg->code_size += 512;
/* Allocate a new area on the stack and save arguments there */
sig = mono_method_signature (cfg->method);
- cinfo = get_call_info (cfg->mempool, sig, FALSE);
+ cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
n = sig->param_count + sig->hasthis;
mono_arch_emit_this_vret_args (MonoCompile *cfg, MonoCallInst *inst, int this_reg, int this_type, int vt_reg)
{
MonoCallInst *call = (MonoCallInst*)inst;
- CallInfo * cinfo = get_call_info (cfg->mempool, inst->signature, FALSE);
+ CallInfo * cinfo = get_call_info (cfg, cfg->mempool, inst->signature, FALSE);
if (vt_reg != -1) {
MonoInst *vtarg;