Add a new regbank for spill slots holding managed pointers. Treat those as PIN.
[mono.git] / mono / mini / mini.h
index 6e30af22c532d186dd288c99e736ab3604fea3d3..4c195b18b80ad7c1dfc6a492ccec6c607f2e4e89 100644 (file)
@@ -1035,8 +1035,10 @@ enum {
 
 #ifdef HAVE_SGEN_GC
 #define vreg_is_ref(cfg, vreg) ((vreg) < (cfg)->vreg_is_ref_len ? (cfg)->vreg_is_ref [(vreg)] : 0)
+#define vreg_is_mp(cfg, vreg) ((vreg) < (cfg)->vreg_is_mp_len ? (cfg)->vreg_is_mp [(vreg)] : 0)
 #else
 #define vreg_is_ref(cfg, vreg) FALSE
+#define vreg_is_mp(cfg, vreg) FALSE
 #endif
 
 /*
@@ -1208,6 +1210,13 @@ typedef struct {
        /* Size of above array */
        guint32 vreg_is_ref_len;
 
+       /* Marks vregs which hold a managed pointer */
+       /* FIXME: Use a bitmap */
+       gboolean *vreg_is_mp;
+
+       /* Size of above array */
+       guint32 vreg_is_mp_len;
+
        /* 
         * The original method to compile, differs from 'method' when doing generic
         * sharing.
@@ -1588,7 +1597,10 @@ guint32   mono_alloc_freg                   (MonoCompile *cfg) MONO_LLVM_INTERNA
 guint32   mono_alloc_preg                   (MonoCompile *cfg) MONO_LLVM_INTERNAL;
 guint32   mono_alloc_dreg                   (MonoCompile *cfg, MonoStackType stack_type) MONO_INTERNAL;
 guint32   mono_alloc_ireg_ref               (MonoCompile *cfg) MONO_LLVM_INTERNAL;
+guint32   mono_alloc_ireg_mp                (MonoCompile *cfg) MONO_LLVM_INTERNAL;
+guint32   mono_alloc_ireg_copy              (MonoCompile *cfg, guint32 vreg) MONO_LLVM_INTERNAL;
 void      mono_mark_vreg_as_ref             (MonoCompile *cfg, int vreg) MONO_INTERNAL;
+void      mono_mark_vreg_as_mp              (MonoCompile *cfg, int vreg) MONO_INTERNAL;
 
 void      mono_link_bblock                  (MonoCompile *cfg, MonoBasicBlock *from, MonoBasicBlock* to) MONO_INTERNAL;
 void      mono_unlink_bblock                (MonoCompile *cfg, MonoBasicBlock *from, MonoBasicBlock* to) MONO_INTERNAL;