2007-09-30 Carlos Alberto Cortez <calberto.cortez@gmail.com>
[mono.git] / mono / mini / mini.h
index 5214355f34ad8d6a21c691756f6851130b914709..6e0ab2f1f120c2cbd8b335124391bdf94e100d06 100644 (file)
@@ -15,6 +15,7 @@
 #include "mono/metadata/class-internals.h"
 #include "mono/metadata/object-internals.h"
 #include <mono/metadata/profiler-private.h>
+#include <mono/metadata/debug-helpers.h>
 #include <mono/utils/mono-compiler.h>
 
 #include "mini-arch.h"
 
 /* for 32 bit systems */
 #if G_BYTE_ORDER == G_LITTLE_ENDIAN
-#define MINI_LS_WORD_OFFSET 0
-#define MINI_MS_WORD_OFFSET 4
-#define inst_ls_word data.op[0].const_val
-#define inst_ms_word data.op[1].const_val
+#define MINI_LS_WORD_IDX 0
+#define MINI_MS_WORD_IDX 1
 #else
-#define MINI_LS_WORD_OFFSET 4
-#define MINI_MS_WORD_OFFSET 0
-#define inst_ls_word data.op[1].const_val
-#define inst_ms_word data.op[0].const_val
+#define MINI_LS_WORD_IDX 1
+#define MINI_MS_WORD_IDX 0
 #endif
+#define MINI_LS_WORD_OFFSET (MINI_LS_WORD_IDX * 4)
+#define MINI_MS_WORD_OFFSET (MINI_MS_WORD_IDX * 4)
+#define inst_ls_word data.op[MINI_LS_WORD_IDX].const_val
+#define inst_ms_word data.op[MINI_MS_WORD_IDX].const_val
 
 /* Version number of the AOT file format */
 #define MONO_AOT_FILE_VERSION "32"
@@ -130,8 +131,8 @@ extern int mono_exc_esp_offset;
 #else
 extern gboolean mono_compile_aot;
 #endif
-extern gboolean mono_use_security_manager;
-extern gboolean mono_security_smcs_hack;
+extern MonoMethodDesc *mono_inject_async_exc_method;
+extern int mono_inject_async_exc_pos;
 
 struct MonoEdge {
        MonoEdge *next;
@@ -270,6 +271,10 @@ enum {
        BB_EXCEPTION_HANDLER  = 1 << 4
 };
 
+typedef struct MonoMemcpyArgs {
+       int size, align;
+} MonoMemcpyArgs;
+
 struct MonoInst {
        union {
                union {
@@ -301,7 +306,8 @@ struct MonoInst {
        union {
                gint32 reg3;
                gint32 arg_info;
-               gint32 size; /* in OP_MEMSET and OP_MEMCPY */
+               gint32 size;
+               MonoMemcpyArgs *memcpy_args; /* in OP_MEMSET and OP_MEMCPY */
                gint shift_amount;
                gboolean is_pinvoke; /* for variables in the unmanaged marshal format */
                gpointer data;
@@ -441,6 +447,8 @@ typedef struct {
        MonoLMF          *first_lmf;
        gpointer         signal_stack;
        guint32          signal_stack_size;
+       gpointer         stack_ovf_guard_base;
+       guint32          stack_ovf_guard_size;
        void            (*abort_func) (MonoObject *object);
 } MonoJitTlsData;
 
@@ -600,6 +608,7 @@ typedef struct {
        guint            dont_verify_stack_merge : 1;
        guint            unverifiable : 1;
        guint            skip_visibility : 1;
+       guint            generic_shared : 1;
        gpointer         debug_info;
        guint32          lmf_offset;
        guint16          *intvars;
@@ -820,6 +829,16 @@ enum {
        MONO_EXC_INTRINS_NUM
 };
 
+/*
+ * Flags for which contexts were used in inflating a generic.
+ */
+enum {
+       MONO_GENERIC_CONTEXT_USED_CLASS = 1,
+       MONO_GENERIC_CONTEXT_USED_METHOD = 2
+};
+
+#define MONO_GENERIC_CONTEXT_USED_BOTH         (MONO_GENERIC_CONTEXT_USED_CLASS | MONO_GENERIC_CONTEXT_USED_METHOD)
+
 typedef void (*MonoInstFunc) (MonoInst *tree, gpointer data);
 
 /* main function */
@@ -939,6 +958,8 @@ CompRelation      mono_opcode_to_cond (int opcode) MONO_INTERNAL;
 CompType          mono_opcode_to_type (int opcode, int cmp_opcode) MONO_INTERNAL;
 
 /* methods that must be provided by the arch-specific port */
+void      mono_arch_init                        (void) MONO_INTERNAL;
+void      mono_arch_cleanup                     (void) MONO_INTERNAL;
 void      mono_arch_cpu_init                    (void) MONO_INTERNAL;
 guint32   mono_arch_cpu_optimizazions           (guint32 *exclude_mask) MONO_INTERNAL;
 void      mono_arch_instrument_mem_needs        (MonoMethod *method, int *stack, int *code) MONO_INTERNAL;
@@ -989,6 +1010,7 @@ MonoJitInfo *mono_arch_find_jit_info            (MonoDomain *domain,
 gpointer mono_arch_get_call_filter              (void) MONO_INTERNAL;
 gpointer mono_arch_get_restore_context          (void) MONO_INTERNAL;
 gboolean mono_arch_handle_exception             (void *sigctx, gpointer obj, gboolean test_only) MONO_INTERNAL;
+void     mono_arch_handle_altstack_exception    (void *sigctx, gpointer fault_addr, gboolean stack_ovf) MONO_INTERNAL;
 gpointer mono_arch_ip_from_context              (void *sigctx) MONO_INTERNAL;
 void     mono_arch_sigctx_to_monoctx            (void *sigctx, MonoContext *ctx) MONO_INTERNAL;
 void     mono_arch_monoctx_to_sigctx            (MonoContext *mctx, void *ctx) MONO_INTERNAL;
@@ -1090,4 +1112,15 @@ int mini_wapi_hps     (int argc, char **argv);
 int mini_wapi_semdel  (int argc, char **argv);
 int mini_wapi_seminfo (int argc, char **argv);
 
+/* Generic sharing */
+
+int mono_method_check_context_used (MonoMethod *method, MonoGenericContext *context) MONO_INTERNAL;
+int mono_class_check_context_used (MonoClass *class, MonoGenericContext *context) MONO_INTERNAL;
+
+gboolean mono_method_is_generic_impl (MonoMethod *method) MONO_INTERNAL;
+gboolean mono_method_is_generic_sharable_impl (MonoMethod *method) MONO_INTERNAL;
+
+MonoGenericContext* mono_make_shared_context (MonoCompile *cfg, MonoGenericContext *context) MONO_INTERNAL;
+
+
 #endif /* __MONO_MINI_H__ */