2006-03-19 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Sun, 19 Mar 2006 19:28:22 +0000 (19:28 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sun, 19 Mar 2006 19:28:22 +0000 (19:28 -0000)
* mini.c (mono_print_method_from_ip): Recognize JIT trampolines as well.
(can_access_internals): Fix a warning.

svn path=/trunk/mono/; revision=58167

mono/mini/ChangeLog
mono/mini/mini.c

index ae1a4018cbf4210d50852e76c6535a63f215d595..78cb7f97e0f7153fcb0e58ea22d6007f2fb742c3 100644 (file)
@@ -1,5 +1,8 @@
 2006-03-19  Zoltan Varga  <vargaz@gmail.com>
 
+       * mini.c (mono_print_method_from_ip): Recognize JIT trampolines as well.
+       (can_access_internals): Fix a warning.
+
        * mini.c (print_method_from_ip): Rename this to 
        mono_print_method_from_ip so it gets exported.
 
index 4c376199495e0630f8c8d60902ede9613eadc6eb..9b057b35fdb50c396a9bb286246ab32a901053c0 100644 (file)
@@ -161,6 +161,20 @@ mono_create_ftnptr (MonoDomain *domain, gpointer addr)
 #endif
 }
 
+typedef struct {
+       void *ip;
+       MonoMethod *method;
+} FindTrampUserData;
+
+static void
+find_tramp (gpointer key, gpointer value, gpointer user_data)
+{
+       FindTrampUserData *ud = (FindTrampUserData*)user_data;
+
+       if (value == ud->ip)
+               ud->method = (MonoMethod*)key;
+}
+
 /* debug function */
 G_GNUC_UNUSED static char*
 get_method_from_ip (void *ip)
@@ -170,10 +184,23 @@ get_method_from_ip (void *ip)
        char *source;
        char *res;
        MonoDomain *domain = mono_domain_get ();
+       FindTrampUserData user_data;
        
        ji = mono_jit_info_table_find (domain, ip);
        if (!ji) {
-               return NULL;
+               user_data.ip = ip;
+               user_data.method = NULL;
+               mono_domain_lock (domain);
+               g_hash_table_foreach (domain->jit_trampoline_hash, find_tramp, &user_data);
+               mono_domain_unlock (domain);
+               if (user_data.method) {
+                       char *mname = mono_method_full_name (user_data.method, TRUE);
+                       res = g_strdup_printf ("<%p - JIT trampoline for %s>", ip, mname);
+                       g_free (mname);
+                       return res;
+               }
+               else
+                       return NULL;
        }
        method = mono_method_full_name (ji->method, TRUE);
        source = mono_debug_source_location_from_address (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), NULL, domain);
@@ -200,10 +227,22 @@ mono_print_method_from_ip (void *ip)
        char *method;
        char *source;
        MonoDomain *domain = mono_domain_get ();
+       FindTrampUserData user_data;
        
        ji = mono_jit_info_table_find (domain, ip);
        if (!ji) {
-               g_print ("No method at %p\n", ip);
+               user_data.ip = ip;
+               user_data.method = NULL;
+               mono_domain_lock (domain);
+               g_hash_table_foreach (domain->jit_trampoline_hash, find_tramp, &user_data);
+               mono_domain_unlock (domain);
+               if (user_data.method) {
+                       char *mname = mono_method_full_name (user_data.method, TRUE);
+                       printf ("IP %p is a JIT trampoline for %s\n", ip, mname);
+                       g_free (mname);
+               }
+               else
+                       g_print ("No method at %p\n", ip);
                return;
        }
        method = mono_method_full_name (ji->method, TRUE);
@@ -3482,7 +3521,7 @@ can_access_internals (MonoAssembly *accessing, MonoAssembly* accessed)
                if (friend->public_key_token [0]) {
                        if (!accessing->aname.public_key_token [0])
                                continue;
-                       if (strcmp (friend->public_key_token, accessing->aname.public_key_token))
+                       if (strcmp ((char*)friend->public_key_token, (char*)accessing->aname.public_key_token))
                                continue;
                }
                return TRUE;