* ResourceReaderTest.cs: Add a little logic for finding
[mono.git] / mono / jit / trampoline.c
index 6e987ddd4d7a050f7667fc38af887b767356ba81..5bbfd7fb3d3d690d3c5998e2c3cfc2ad95365d36 100644 (file)
 #include <mono/metadata/appdomain.h>
 #include <mono/metadata/tabledefs.h>
 #include <mono/arch/x86/x86-codegen.h>
+#include <mono/metadata/mono-debug-debugger.h>
 
 #include "jit.h"
 #include "codegen.h"
-#include "debug.h"
 
 /*
  * Address of the x86 trampoline code.  This is used by the debugger to check
  */
 guint8 *mono_generic_trampoline_code = NULL;
 
-/*
- * Address of a special breakpoint trampoline code for the debugger.
- */
-guint8 *mono_breakpoint_trampoline_code = NULL;
-
 /*
  * get_unbox_trampoline:
  * @m: method pointer
@@ -56,39 +51,6 @@ get_unbox_trampoline (MonoMethod *m, gpointer addr)
        return start;
 }
 
-/*
- * get_breakpoint_trampoline:
- * @m: method pointer
- * @addr: pointer to native code for @m
- *
- * creates a special trampoline for the debugger which is used to get
- * a breakpoint after compiling a method.
- */
-static gpointer
-get_breakpoint_trampoline (MonoMethod *m, guint32 breakpoint_id, gpointer addr)
-{
-       guint8 *code, *start, *buf;
-
-       if (!mono_breakpoint_trampoline_code) {
-               mono_breakpoint_trampoline_code = buf = g_malloc (8);
-
-               x86_breakpoint (buf);
-               x86_alu_reg_imm (buf, X86_ADD, X86_ESP, 8);
-               x86_ret (buf);
-
-               g_assert ((buf - mono_breakpoint_trampoline_code) <= 8);
-       }
-
-       start = code = g_malloc (22);
-       x86_push_imm (code, addr);
-       x86_push_imm (code, breakpoint_id);
-       x86_push_imm (code, m);
-       x86_jump_code (code, mono_breakpoint_trampoline_code);
-       g_assert ((code - start) <= 22);
-
-       return start;
-}
-
 /**
  * x86_magic_trampoline:
  * @eax: saved x86 register 
@@ -116,8 +78,7 @@ x86_magic_trampoline (int eax, int ecx, int edx, int esi, int edi,
        guint8 reg;
        gint32 disp;
        char *o;
-       guint32 breakpoint_id;
-       gpointer addr, trampoline;
+       gpointer addr;
 
        EnterCriticalSection (metadata_section);
        addr = mono_compile_method (m);
@@ -140,14 +101,8 @@ x86_magic_trampoline (int eax, int ecx, int edx, int esi, int edi,
                        reg = code [1] & 0x07;
                        disp = *((gint32*)(code + 2));
                } else if ((code [1] == 0xe8)) {
-                       breakpoint_id = mono_method_has_breakpoint (m, TRUE);
-                       if (breakpoint_id) {
-                               mono_remove_breakpoint (breakpoint_id);
-                               trampoline = get_breakpoint_trampoline (m, breakpoint_id, addr);
-                       } else
-                               trampoline = addr;
                        *((guint32*)(code + 2)) = (guint)addr - ((guint)code + 1) - 5; 
-                       return trampoline;
+                       return addr;
                } else {
                        printf ("Invalid trampoline sequence: %x %x %x %x %x %x %x\n", code [0], code [1], code [2], code [3],
                                code [4], code [5], code [6]);
@@ -181,17 +136,9 @@ x86_magic_trampoline (int eax, int ecx, int edx, int esi, int edi,
        o += disp;
 
        if (m->klass->valuetype) {
-               trampoline = *((gpointer *)o) = get_unbox_trampoline (m, addr);
-       } else {
-               trampoline = *((gpointer *)o) = addr;
-       }
-
-       breakpoint_id = mono_method_has_breakpoint (m, TRUE);
-       if (breakpoint_id) {
-               mono_remove_breakpoint (breakpoint_id);
-               return get_breakpoint_trampoline (m, breakpoint_id, trampoline);
+               return *((gpointer *)o) = get_unbox_trampoline (m, addr);
        } else {
-               return trampoline;
+               return *((gpointer *)o) = addr;
        }
 }
 
@@ -209,9 +156,7 @@ x86_magic_trampoline (int eax, int ecx, int edx, int esi, int edi,
 gpointer
 arch_create_jit_trampoline (MonoMethod *method)
 {
-       MonoDomain *domain = mono_domain_get ();
        guint8 *code, *buf;
-       GHashTable *jit_code_hash;
 
        /* previously created trampoline code */
        if (method->info)
@@ -228,20 +173,20 @@ arch_create_jit_trampoline (MonoMethod *method)
            (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL)) {
                MonoMethod *nm;
                
-               nm = mono_marshal_get_native_wrapper (method);
-               method->info = mono_compile_method (nm);
-               return method->info;
-       }
-
-       /* check if we already have JITed code */
-       if (mono_jit_share_code)
-               jit_code_hash = mono_root_domain->jit_code_hash;
-       else
-               jit_code_hash = domain->jit_code_hash;
+               if (!method->addr && (method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL))
+                       mono_lookup_pinvoke_call (method);
 
-       if ((code = g_hash_table_lookup (jit_code_hash, method))) {
-               mono_jit_stats.methods_lookups++;
-               return code;
+#ifdef MONO_USE_EXC_TABLES
+               if (mono_method_blittable (method)) {
+                       method->info = method->addr;
+               } else {
+#endif
+                       nm = mono_marshal_get_native_wrapper (method);
+                       method->info = mono_compile_method (nm);
+#ifdef MONO_USE_EXC_TABLES
+               }
+#endif
+               return method->info;
        }
 
        if (!mono_generic_trampoline_code) {