On Monday 03 December 2007, Julian Seward wrote:

> Please test it on platforms that are important to you, and let me know
> of any problems (and successes!).  If no serious problems show up,
> 3.3.0 final will be available in about a week from now.

the patch below does no longer apply. it is in the openSUSE package for mono 
support. I was told that it is being upstreamed, but I can't find it in 
trunk. Did it get lost? Was it rejected?

Thanks,
Dirk
--- coregrind/m_debuginfo/debuginfo.c	
+++ coregrind/m_debuginfo/debuginfo.c	
@@ -33,7 +33,7 @@
    This module was also extensively hacked on by Jeremy Fitzhardinge
    and Tom Hughes.
 */
-
+#include <stdio.h>
 #include "pub_core_basics.h"
 #include "pub_core_threadstate.h"
 #include "pub_core_debuginfo.h"   /* self */
@@ -376,6 +376,7 @@
       }
    }
   not_found:
+   
    *psi = NULL;
 }
 
@@ -449,6 +450,120 @@
    return True;
 }
 
+typedef struct {
+	char *name;
+	Addr  start, end;
+} JitEntry;
+
+static JitEntry *jit_entries;
+static int       jit_entries_size;
+static int       jit_entry_count;
+
+#define START_SIZE 128
+#define INCREMENT   64
+
+void VG_(register_jited_code) ( Char *name, Addr start, SizeT len)
+{
+	int l, u, mid, slot, j;
+	JitEntry *e = NULL;
+
+	if (jit_entry_count + 1 >= jit_entries_size){
+		if (jit_entries == NULL){
+			jit_entries = VG_(arena_calloc)(VG_AR_SYMTAB, START_SIZE, sizeof(JitEntry));
+			jit_entries_size = START_SIZE;
+		} else {
+			jit_entries = VG_(arena_realloc)(VG_AR_SYMTAB, jit_entries, (jit_entries_size + INCREMENT) * sizeof(JitEntry));
+			jit_entries_size += INCREMENT;
+		}
+	}	
+	l = 0;
+	u = jit_entry_count;
+	while (l < u){
+		mid = (l + u) / 2;
+		e = &jit_entries [mid];
+		if (e->start < start){
+			l = mid + 1;
+		} else if (e->start > start){
+			u = mid;
+		} else
+			break;
+	}
+	if (e == NULL){
+		if (jit_entry_count != 0){
+			// this would be an error;
+		}
+		slot = 0;
+	} else if (e->start < start)
+		slot = mid + 1;
+	else
+		slot = mid;
+
+	if (e != NULL){
+		for (j = jit_entry_count; j > mid+1; j--)
+			jit_entries [j] = jit_entries [j-1];
+	}
+
+	jit_entries [slot].name = VG_(strdup)(name);
+	jit_entries [slot].start = start;
+	jit_entries [slot].end = start + len;
+	jit_entry_count++;
+}
+
+void VG_(unregister_jited_code) ( Addr start )
+{
+	int l, u, mid;
+	JitEntry *e = NULL;
+
+	l = 0;
+	u = jit_entry_count;
+	while (l < u){
+		mid = (l + u) / 2;
+		e = &jit_entries [mid];
+
+		if (e->start < start){
+			l = mid + 1;
+		} else if (e->start > start){
+			u = mid;
+		} else {
+			break;
+		}
+	}
+	if (e != NULL && start == e->start){
+		int j;
+		
+		VG_(free) (e->name);
+		for (j = mid + 1; j < jit_entry_count; j++)
+			jit_entries [j-1] = jit_entries [j];
+	}
+}
+
+static Bool
+jit_lookup ( Addr pc, Char* buf, Int nbuf )
+{
+	int l, u, mid;
+	JitEntry *e = NULL;
+
+	l = 0;
+	u = jit_entry_count;
+	while (l < u){
+		mid = (l + u) / 2;
+		e = &jit_entries [mid];
+
+		if (e->end < pc){
+			l = mid + 1;
+		} else if (e->start > pc){
+			u = mid;
+		} else {
+			break;
+		}
+	}
+	if (e != NULL && pc >= e->start && pc < e->end){
+		VG_(strncpy_safely) (buf, e->name, nbuf);
+		return True;
+	}
+	return False;
+}
+
 /* ppc64-linux only: find the TOC pointer (R2 value) that should be in
    force at the entry point address of the function containing
    guest_code_addr.  Returns 0 if not known. */
@@ -708,6 +823,10 @@
                            buf_dirname, BUF_LEN, &know_dirinfo,
                            &lineno 
                         );
+   if (!know_fnname){
+	   know_fnname = jit_lookup (eip, buf_fn, BUF_LEN);
+   }
+   
    if (VG_(clo_xml)) {
 
       Bool   human_readable = True;
--- coregrind/m_scheduler/scheduler.c		2007-01-08 02:43:14.000000000 -0500
+++ coregrind/m_scheduler/scheduler.c		2007-07-04 02:42:04.000000000 -0400
@@ -81,6 +81,7 @@
 #include "pub_core_tooliface.h"
 #include "pub_core_translate.h"     // For VG_(translate)()
 #include "pub_core_transtab.h"
+#include "pub_core_debuginfo.h"
 #include "vki_unistd.h"
 #include "priv_sema.h"
 
@@ -1256,6 +1257,16 @@
          SET_CLREQ_RETVAL( tid, VG_(get_n_errs_found)() );
          break;
 
+      case VG_USERREQ__JIT_REGISTER_MAP:
+	 VG_(register_jited_code) ((char *) arg [1], arg[2], arg[3]);
+         SET_CLREQ_RETVAL( tid, 0 );     /* return value is meaningless */
+	 break;
+
+      case VG_USERREQ__JIT_UNREGISTER_MAP:
+	 VG_(unregister_jited_code) (arg[1]);
+         SET_CLREQ_RETVAL( tid, 0 );     /* return value is meaningless */
+	 break;
+	 
       default:
 	 if (os_client_request(tid, arg)) {
 	    // do nothing, os_client_request() handled it
--- coregrind/pub_core_debuginfo.h		2007-01-08 02:43:15.000000000 -0500
+++ coregrind/pub_core_debuginfo.h		2007-07-04 02:39:22.000000000 -0400
@@ -54,6 +54,9 @@
 extern Bool VG_(get_fnname_nodemangle)( Addr a, 
                                         Char* fnname, Int n_fnname );
 
+extern void VG_(register_jited_code) ( Char *name, Addr start, SizeT len );
+extern void VG_(unregister_jited_code) ( Addr start );
+
 /* Use DWARF2/3 CFA information to do one step of stack unwinding. */
 extern Bool VG_(use_CF_info) ( /*MOD*/Addr* ipP,
                                /*MOD*/Addr* spP,
--- include/valgrind.h		2007-01-08 02:43:09.000000000 -0500
+++ include/valgrind.h		2007-07-04 02:41:38.000000000 -0400
@@ -2296,7 +2296,12 @@
           /* Stack support. */
           VG_USERREQ__STACK_REGISTER   = 0x1501,
           VG_USERREQ__STACK_DEREGISTER = 0x1502,
-          VG_USERREQ__STACK_CHANGE     = 0x1503
+          VG_USERREQ__STACK_CHANGE     = 0x1503,
+
+	  /* JIT suppor */
+	  VG_USERREQ__JIT_REGISTER_MAP = 0x1601,
+	  VG_USERREQ__JIT_UNREGISTER_MAP = 0x1602
+	  
    } Vg_ClientRequest;
 
 #if !defined(__GNUC__)
@@ -2530,7 +2535,20 @@
                                id, start, end, 0, 0);             \
    }
 
+#define VALGRIND_JIT_REGISTER_MAP(name, start, end) 		  \
+   {unsigned int _qzz_res;                                        \
+    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, 			  \
+			       VG_USERREQ__JIT_REGISTER_MAP,	  \
+			       name, start, end, 0, 0); 	  \
+   }
 
+#define VALGRIND_JIT_UNREGISTER_MAP(name, start) 		  \
+   {unsigned int _qzz_res;                                        \
+    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, 			  \
+			       VG_USERREQ__JIT_REGISTER_MAP,	  \
+			       start, 0, 0, 0, 0); 	  	  \
+   }
+ 
 #undef ARCH_x86
 #undef ARCH_amd64
 #undef ARCH_ppc32
-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to