|
From: Bart V. A. <bar...@gm...> - 2008-05-24 07:02:27
|
Hello,
Currently whenever a file is mapped into memory Valgrind's core first notifies
the tool about the mmap() system call and after this the core reads the debug
information from the file being mapped. This is unfortunate because this
makes it impossible for tools to use the debug information when notified about
an mmap() system call. I would like to have the debug information available in
exp-drd when this tool is notified about an mmap() system call. There are two
possible approaches: either adding a new notification, one that is sent after
the debug info has been read, or swapping the order of tool notification and
debug info reading. The patch below implements the latter approach. Is it OK
if I merge this patch from the CROSS_COMPILATION branch to the trunk ?
I have verified that the "make regtest" output is identical both with and
without the patch.
Bart.
Index: coregrind/m_syswrap/syswrap-generic.c
===================================================================
--- coregrind/m_syswrap/syswrap-generic.c (.../trunk/coregrind/m_syswrap/syswrap-generic.c) (revision 8086)
+++ coregrind/m_syswrap/syswrap-generic.c (.../branches/CROSS_COMPILATION/coregrind/m_syswrap/syswrap-generic.c) (working copy)
@@ -59,6 +59,15 @@
#include "priv_syswrap-generic.h"
+/* Local function declarations. */
+
+static
+void notify_aspacem_of_mmap(Addr a, SizeT len, UInt prot,
+ UInt flags, Int fd, Off64T offset);
+static
+void notify_tool_of_mmap(Addr a, SizeT len, UInt prot, Off64T offset);
+
+
/* Returns True iff address range is something the client can
plausibly mess with: all of it is either already belongs to the
client or is free or a reservation. */
@@ -147,8 +156,16 @@
ML_(notify_aspacem_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot,
UInt flags, Int fd, Off64T offset )
{
- Bool rr, ww, xx, d;
+ notify_aspacem_of_mmap(a, len, prot, flags, fd, offset);
+ notify_tool_of_mmap(a, len, prot, offset);
+}
+static
+void notify_aspacem_of_mmap(Addr a, SizeT len, UInt prot,
+ UInt flags, Int fd, Off64T offset)
+{
+ Bool d;
+
/* 'a' is the return value from a real kernel mmap, hence: */
vg_assert(VG_IS_PAGE_ALIGNED(a));
/* whereas len is whatever the syscall supplied. So: */
@@ -156,15 +173,26 @@
d = VG_(am_notify_client_mmap)( a, len, prot, flags, fd, offset );
+ if (d)
+ VG_(discard_translations)( (Addr64)a, (ULong)len,
+ "ML_(notify_aspacem_of_mmap)" );
+}
+
+static
+void notify_tool_of_mmap(Addr a, SizeT len, UInt prot, Off64T offset)
+{
+ Bool rr, ww, xx;
+
+ /* 'a' is the return value from a real kernel mmap, hence: */
+ vg_assert(VG_IS_PAGE_ALIGNED(a));
+ /* whereas len is whatever the syscall supplied. So: */
+ len = VG_PGROUNDUP(len);
+
rr = toBool(prot & VKI_PROT_READ);
ww = toBool(prot & VKI_PROT_WRITE);
xx = toBool(prot & VKI_PROT_EXEC);
VG_TRACK( new_mem_mmap, a, len, rr, ww, xx );
-
- if (d)
- VG_(discard_translations)( (Addr64)a, (ULong)len,
- "ML_(notify_aspacem_and_tool_of_mmap)" );
}
/* Expand (or shrink) an existing mapping, potentially moving it at
@@ -1909,15 +1937,24 @@
}
if (!sres.isError) {
- /* Notify aspacem and the tool. */
- ML_(notify_aspacem_and_tool_of_mmap)(
+ /* Notify aspacem. */
+ notify_aspacem_of_mmap(
(Addr)sres.res, /* addr kernel actually assigned */
- arg2, arg3,
+ arg2, /* length */
+ arg3, /* prot */
arg4, /* the original flags value */
- arg5, arg6
+ arg5, /* fd */
+ arg6 /* offset */
);
/* Load symbols? */
VG_(di_notify_mmap)( (Addr)sres.res, False/*allow_SkFileV*/ );
+ /* Notify the tool. */
+ notify_tool_of_mmap(
+ (Addr)sres.res, /* addr kernel actually assigned */
+ arg2, /* length */
+ arg3, /* prot */
+ arg6 /* offset */
+ );
}
/* Stay sane */
|