valgrind/jit-runtime-support.diff

232 lines
6.8 KiB
Diff

Index: include/valgrind.h
===================================================================
--- include/valgrind.h (revision 7276)
+++ include/valgrind.h (working copy)
@@ -3625,7 +3625,11 @@
/* Stack support. */
VG_USERREQ__STACK_REGISTER = 0x1501,
VG_USERREQ__STACK_DEREGISTER = 0x1502,
- VG_USERREQ__STACK_CHANGE = 0x1503
+ VG_USERREQ__STACK_CHANGE = 0x1503,
+
+ /* JIT support */
+ VG_USERREQ__JIT_REGISTER_MAP = 0x1601,
+ VG_USERREQ__JIT_UNREGISTER_MAP = 0x1602
} Vg_ClientRequest;
#if !defined(__GNUC__)
@@ -3904,7 +3908,21 @@
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 PLAT_x86_linux
#undef PLAT_amd64_linux
#undef PLAT_ppc32_linux
Index: coregrind/m_debuginfo/debuginfo.c
===================================================================
--- coregrind/m_debuginfo/debuginfo.c (revision 7276)
+++ coregrind/m_debuginfo/debuginfo.c (working copy)
@@ -576,6 +576,132 @@
return True;
}
+
+/* Storing and retrieving information caused by JITted code. TODO:
+ move somewhere more suitable. */
+
+typedef
+ struct {
+ Char *name;
+ Addr start, end;
+ }
+ JitEntry;
+
+static JitEntry *jit_entries;
+static Int jit_entries_size;
+static Int jit_entry_count;
+
+#define JITSYMS_START_SIZE 128
+#define JITSYMS_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,
+ JITSYMS_START_SIZE, sizeof(JitEntry)
+ );
+ jit_entries_size = JITSYMS_START_SIZE;
+ } else {
+ jit_entries = VG_(arena_realloc)(
+ VG_AR_SYMTAB, jit_entries,
+ (jit_entries_size + JITSYMS_INCREMENT)
+ * sizeof(JitEntry)
+ );
+ jit_entries_size += JITSYMS_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. */
@@ -894,6 +1020,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;
Index: coregrind/pub_core_debuginfo.h
===================================================================
--- coregrind/pub_core_debuginfo.h (revision 7276)
+++ coregrind/pub_core_debuginfo.h (working copy)
@@ -75,6 +75,10 @@
extern Bool VG_(get_fnname_nodemangle)( Addr a,
Char* fnname, Int n_fnname );
+/* Register/deregister symbols created by JITs. */
+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,
Index: coregrind/m_scheduler/scheduler.c
===================================================================
--- coregrind/m_scheduler/scheduler.c (revision 7276)
+++ coregrind/m_scheduler/scheduler.c (working copy)
@@ -83,6 +83,7 @@
#include "pub_core_tooliface.h"
#include "pub_core_translate.h" // For VG_(translate)()
#include "pub_core_transtab.h"
+#include "pub_core_debuginfo.h" // VG_({un}register_jited_code)
#include "priv_sema.h"
#include "pub_core_scheduler.h" // self
@@ -1367,6 +1368,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