diff --git a/jit-runtime-support.diff b/jit-runtime-support.diff new file mode 100644 index 0000000..7f62247 --- /dev/null +++ b/jit-runtime-support.diff @@ -0,0 +1,227 @@ +--- 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 + #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 diff --git a/valgrind.changes b/valgrind.changes index 32868a9..69255c6 100644 --- a/valgrind.changes +++ b/valgrind.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Mon Jul 9 17:50:59 CEST 2007 - dmueller@suse.de + +- support JIT runtimes (#289490) + ------------------------------------------------------------------- Tue Jul 3 12:38:13 CEST 2007 - dmueller@suse.de diff --git a/valgrind.spec b/valgrind.spec index 8be7b15..665b68e 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -26,7 +26,7 @@ Group: Development/Tools/Debuggers Summary: Memory Management Debugger BuildRoot: %{_tmppath}/%{name}-%{version}-build Version: 3.2.3 -Release: 32 +Release: 34 Source0: %{name}-%{version}.tar.bz2 # svn di svn://svn.valgrind.org/valgrind/tags/VALGRIND_3_2_1 svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_2_BRANCH > 3_2_BRANCH.diff # svn di svn://svn.valgrind.org/vex/tags/VEX_3_2_1 svn://svn.valgrind.org/vex/branches/VEX_3_2_BRANCH > VEX_3_2_BRANCH.diff @@ -35,6 +35,7 @@ Patch4: openat-handling.diff Patch5: omega_RC_01.patch Patch6: putenv-wrapper.diff Patch7: glibc-2.6.diff +Patch8: jit-runtime-support.diff Provides: callgrind Obsoletes: callgrind ExclusiveArch: %ix86 x86_64 ppc ppc64 @@ -120,6 +121,7 @@ cd .. %patch4 %patch6 %patch7 +%patch8 %build export CFLAGS="$RPM_OPT_FLAGS" @@ -149,6 +151,8 @@ mv $RPM_BUILD_ROOT/usr/share/doc/valgrind $RPM_BUILD_ROOT/usr/share/doc/packages %_libdir/valgrind/*/*.a %changelog +* Mon Jul 09 2007 - dmueller@suse.de +- support JIT runtimes (#289490) * Tue Jul 03 2007 - dmueller@suse.de - update suppression file (#287090) * Wed May 23 2007 - dmueller@suse.de