Merge pull request #601 from knocte/sock_improvements
[mono.git] / mono / mini / mini-codegen.c
index e9cbe049eef7374a1e384735d120c24028a20c23..8ef772a1b14c82c2c139ba05f0ea329e46bc9b16 100644 (file)
@@ -271,6 +271,17 @@ mono_call_inst_add_outarg_reg (MonoCompile *cfg, MonoCallInst *call, int vreg, i
        }
 }
 
+/*
+ * mono_call_inst_add_outarg_vt:
+ *
+ *   Register OUTARG_VT as belonging to CALL.
+ */
+void
+mono_call_inst_add_outarg_vt (MonoCompile *cfg, MonoCallInst *call, MonoInst *outarg_vt)
+{
+       call->outarg_vts = g_slist_append_mempool (cfg->mempool, call->outarg_vts, outarg_vt);
+}
+
 static void
 resize_spill_info (MonoCompile *cfg, int bank)
 {
@@ -399,6 +410,37 @@ typedef struct {
 } RegTrack;
 
 #ifndef DISABLE_LOGGING
+
+static const char* const patch_info_str[] = {
+#define PATCH_INFO(a,b) "" #a,
+#include "patch-info.h"
+#undef PATCH_INFO
+};
+
+void
+mono_print_ji (const MonoJumpInfo *ji)
+{
+       switch (ji->type) {
+       case MONO_PATCH_INFO_RGCTX_FETCH: {
+               MonoJumpInfoRgctxEntry *entry = ji->data.rgctx_entry;
+
+               printf ("[RGCTX_FETCH ");
+               mono_print_ji (entry->data);
+               printf (" - %s]", mono_rgctx_info_type_to_str (entry->info_type));
+               break;
+       }
+       case MONO_PATCH_INFO_METHODCONST: {
+               char *s = mono_method_full_name (ji->data.method, TRUE);
+               printf ("[METHODCONST - %s]", s);
+               g_free (s);
+               break;
+       }
+       default:
+               printf ("[%s]", patch_info_str [ji->type]);
+               break;
+       }
+}
+
 void
 mono_print_ins_index (int i, MonoInst *ins)
 {
@@ -521,6 +563,7 @@ mono_print_ins_index (int i, MonoInst *ins)
        case OP_IAND_IMM:
        case OP_IOR_IMM:
        case OP_IXOR_IMM:
+       case OP_SUB_IMM:
                printf (" [%d]", (int)ins->inst_imm);
                break;
        case OP_ADD_IMM:
@@ -552,7 +595,8 @@ mono_print_ins_index (int i, MonoInst *ins)
        case OP_VCALL2_MEMBASE:
        case OP_VOIDCALL:
        case OP_VOIDCALL_MEMBASE:
-       case OP_VOIDCALLVIRT: {
+       case OP_VOIDCALLVIRT:
+       case OP_TAILCALL: {
                MonoCallInst *call = (MonoCallInst*)ins;
                GSList *list;
 
@@ -569,6 +613,11 @@ mono_print_ins_index (int i, MonoInst *ins)
                        char *full_name = mono_method_full_name (call->method, TRUE);
                        printf (" [%s]", full_name);
                        g_free (full_name);
+               } else if (call->fptr_is_patch) {
+                       MonoJumpInfo *ji = (MonoJumpInfo*)call->fptr;
+
+                       printf (" ");
+                       mono_print_ji (ji);
                } else if (call->fptr) {
                        MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
                        if (info)
@@ -625,6 +674,9 @@ mono_print_ins_index (int i, MonoInst *ins)
        case OP_GC_LIVENESS_USE:
                printf (" R%d", (int)ins->inst_c1);
                break;
+       case OP_SEQ_POINT:
+               printf (" il: %x", (int)ins->inst_imm);
+               break;
        default:
                break;
        }
@@ -653,6 +705,12 @@ print_regtrack (RegTrack *t, int num)
        }
 }
 #else
+
+void
+mono_print_ji (const MonoJumpInfo *ji)
+{
+}
+
 void
 mono_print_ins_index (int i, MonoInst *ins)
 {
@@ -2159,8 +2217,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
                                        MONO_INST_NEW (cfg, fxch, OP_X86_FXCH);
                                        fxch->inst_imm = sp - 1 - i;
 
-                                       prev->next = fxch;
-                                       fxch->next = ins;
+                                       mono_bblock_insert_after_ins (bb, prev, fxch);
                                        prev = fxch;
 
                                        tmp = fpstack [sp - 1];
@@ -2174,8 +2231,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
                                MONO_INST_NEW (cfg, fxch, OP_X86_FXCH);
                                fxch->inst_imm = 1;
 
-                               prev->next = fxch;
-                               fxch->next = ins;
+                               mono_bblock_insert_after_ins (bb, prev, fxch);
                                prev = fxch;
 
                                tmp = fpstack [sp - 1];
@@ -2199,8 +2255,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
                                        MONO_INST_NEW (cfg, fxch, OP_X86_FXCH);
                                        fxch->inst_imm = sp - 1 - i;
 
-                                       prev->next = fxch;
-                                       fxch->next = ins;
+                                       mono_bblock_insert_after_ins (bb, prev, fxch);
                                        prev = fxch;
 
                                        tmp = fpstack [sp - 1];
@@ -2227,8 +2282,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
                                        MONO_INST_NEW (cfg, fxch, OP_X86_FXCH);
                                        fxch->inst_imm = sp - 1 - i;
 
-                                       prev->next = fxch;
-                                       fxch->next = ins;
+                                       mono_bblock_insert_after_ins (bb, prev, fxch);
                                        prev = fxch;
 
                                        tmp = fpstack [sp - 1];
@@ -2476,8 +2530,9 @@ mono_is_regsize_var (MonoType *t)
                return FALSE;
        case MONO_TYPE_VALUETYPE:
                return FALSE;
+       default:
+               return FALSE;
        }
-       return FALSE;
 }
 
 #ifndef DISABLE_JIT