2005-03-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / mini.h
index 58b1b4650a8b662ca5c55669046e381aecd293c7..1cd680fa6c7ac431081bd19faad6d047053684b3 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/utils/mono-compiler.h>
 
 #include "mini-arch.h"
 #include "regalloc.h"
@@ -193,6 +194,12 @@ struct MonoBasicBlock {
        gint8  nesting;
        gint8  loop_body_start;
 
+       /* 
+        * Whenever the bblock is rarely executed so it should be emitted after
+        * the function epilog.
+        */
+       gboolean out_of_line;
+
        /* use for liveness analysis */
        MonoBitSet *gen_set;
        MonoBitSet *kill_set;
@@ -224,12 +231,6 @@ struct MonoBasicBlock {
 
        /* The current symbolic register number, used in local register allocation. */
        guint32 max_ireg, max_freg;
-
-       /* 
-        * Whenever the bblock is rarely executed so it should be emitted after
-        * the function epilog.
-        */
-       gboolean out_of_line;
 };
 
 /* BBlock flags */
@@ -467,6 +468,14 @@ struct MonoJumpInfo {
        } data;
 };
 
+typedef enum {
+       MONO_TRAMPOLINE_GENERIC,
+       MONO_TRAMPOLINE_JUMP,
+       MONO_TRAMPOLINE_CLASS_INIT,
+       MONO_TRAMPOLINE_AOT,
+       MONO_TRAMPOLINE_NUM
+} MonoTrampolineType;
+
 /* optimization flags: keep up to date with the name array in driver.c */
 enum {
        MONO_OPT_PEEPHOLE = 1 << 0,
@@ -500,12 +509,6 @@ enum {
 
 #define MONO_BBLOCK_IS_IN_REGION(bblock, regtype) (((bblock)->region & (0xf << 4)) == (regtype))
 
-enum {
-       MONO_EXCEPTION_NONE = 0,
-       MONO_EXCEPTION_SECURITY = 1
-       /* add other exception type */
-};
-
 /*
  * Control Flow Graph and compilation unit information
  */
@@ -574,6 +577,7 @@ typedef struct {
        gboolean         need_lmf_area;
        gboolean         compile_aot;
        gboolean         got_var_allocated;
+       gboolean         ret_var_is_local;
        gpointer         debug_info;
        guint32          lmf_offset;
        guint16          *intvars;
@@ -779,6 +783,9 @@ void      mono_add_patch_info               (MonoCompile *cfg, int ip, MonoJumpI
 void      mono_remove_patch_info            (MonoCompile *cfg, int ip);
 gpointer  mono_resolve_patch_target         (MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *patch_info, gboolean run_cctors);
 MonoLMF** mono_get_lmf_addr                 (void);
+void      mono_jit_thread_attach            (MonoDomain *domain);
+guint32   mono_get_jit_tls_key              (void);
+gint32    mono_get_lmf_tls_offset           (void);
 GList    *mono_varlist_insert_sorted        (MonoCompile *cfg, GList *list, MonoMethodVar *mv, gboolean sort_end);
 GList    *mono_varlist_sort                 (MonoCompile *cfg, GList *list, int sort_type);
 void      mono_analyze_liveness             (MonoCompile *cfg);
@@ -807,6 +814,7 @@ MonoJitICallInfo *mono_find_jit_icall_by_addr  (gconstpointer addr);
 MonoJitICallInfo *mono_register_jit_icall      (gconstpointer func, const char *name, MonoMethodSignature *sig, gboolean is_save);
 gconstpointer     mono_icall_get_wrapper       (MonoJitICallInfo* callinfo);
 
+guint8 *          mono_get_trampoline_code (MonoTrampolineType tramp_type);
 gpointer          mono_create_jump_trampoline (MonoDomain *domain, 
                                                                                           MonoMethod *method, 
                                                                                           gboolean add_sync_wrapper);
@@ -814,6 +822,7 @@ gpointer          mono_create_class_init_trampoline (MonoVTable *vtable);
 gpointer          mono_create_jit_trampoline (MonoMethod *method);
 gpointer          mono_create_jit_trampoline_from_token (MonoImage *image, guint32 token);
 MonoVTable*       mono_find_class_init_trampoline_by_addr (gconstpointer addr);
+
 gboolean          mono_running_on_valgrind (void);
 void*             mono_global_codeman_reserve (int size);
 gint32*           mono_allocate_stack_slots (MonoCompile *cfg, guint32 *stack_size, guint32 *stack_align);
@@ -832,6 +841,7 @@ gpointer  mono_arch_get_throw_exception         (void);
 gpointer  mono_arch_get_rethrow_exception       (void);
 gpointer  mono_arch_get_throw_exception_by_name (void);
 gpointer  mono_arch_get_throw_corlib_exception  (void);
+guchar*   mono_arch_create_trampoline_code      (MonoTrampolineType tramp_type);
 gpointer  mono_arch_create_jit_trampoline       (MonoMethod *method);
 gpointer  mono_arch_create_jit_trampoline_from_token (MonoImage *image, guint32 token);
 MonoJitInfo *mono_arch_create_jump_trampoline      (MonoMethod *method);
@@ -868,6 +878,8 @@ gpointer mono_arch_get_call_filter              (void);
 gpointer mono_arch_get_restore_context          (void);
 gboolean mono_arch_handle_exception             (void *sigctx, gpointer obj, gboolean test_only);
 gpointer mono_arch_ip_from_context              (void *sigctx);
+void     mono_arch_sigctx_to_monoctx            (void *sigctx, MonoContext *ctx);
+void     mono_arch_monoctx_to_sigctx            (MonoContext *mctx, void *ctx);
 void     mono_arch_flush_register_windows       (void);
 gboolean mono_arch_is_inst_imm                  (gint64 imm);
 MonoInst* mono_arch_get_domain_intrinsic        (MonoCompile* cfg);
@@ -875,6 +887,9 @@ MonoInst* mono_arch_get_thread_intrinsic        (MonoCompile* cfg);
 gboolean mono_arch_is_int_overflow              (void *sigctx, void *info);
 void     mono_arch_invalidate_method            (MonoJitInfo *ji, void *func, gpointer func_arg);
 guint32  mono_arch_get_patch_offset             (guint8 *code);
+gpointer*mono_arch_get_vcall_slot_addr          (guint8* code, gpointer *regs);
+gpointer*mono_arch_get_delegate_method_ptr_addr (guint8* code, gpointer *regs);
+void     mono_arch_create_vars                  (MonoCompile *cfg);
 
 /* Exception handling */
 gboolean mono_handle_exception                  (MonoContext *ctx, gpointer obj,