|
From: <sv...@va...> - 2012-06-14 22:19:02
|
philippe 2012-06-14 23:18:50 +0100 (Thu, 14 Jun 2012)
New Revision: 12638
Log:
Have the inner Valgrind registering the interim_stack asap.
This is needed to have the outer valgrind able to do stack
traces of the inner Valgrind before the main thread runs.
Without this, the outer crashes (segv) when doing a stack trace.
In mtV.txt, an ugly kludge was described to avoid this crash.
This is the clean solution replacing the kludge.
Modified files:
trunk/coregrind/m_main.c
Modified: trunk/coregrind/m_main.c (+17 -0)
===================================================================
--- trunk/coregrind/m_main.c 2012-06-14 20:56:20 +01:00 (rev 12637)
+++ trunk/coregrind/m_main.c 2012-06-14 23:18:50 +01:00 (rev 12638)
@@ -65,6 +65,10 @@
#include "pub_core_translate.h" // For VG_(translate)
#include "pub_core_trampoline.h"
#include "pub_core_transtab.h"
+#include "pub_tool_inner.h"
+#if defined(ENABLE_INNER_CLIENT_REQUEST)
+#include "valgrind.h"
+#endif
/*====================================================================*/
@@ -1457,6 +1461,19 @@
struct vki_rlimit zero = { 0, 0 };
XArray* addr2dihandle = NULL;
+ // For an inner Valgrind, register the interim stack asap.
+ // This is needed to allow the outer valgrind to do stacktraces during init.
+ // Note that this stack is not unregistered when the main thread
+ // is switching to the (real) stack. Unregistering this would imply
+ // to save the stack id in a global variable, and have a "if"
+ // in run_a_thread_NORETURN to do the unregistration only for the
+ // main thread. This unregistration is not worth this complexity.
+ INNER_REQUEST
+ ((void) VALGRIND_STACK_REGISTER
+ (&VG_(interim_stack).bytes[0],
+ &VG_(interim_stack).bytes[0] + sizeof(VG_(interim_stack))));
+
+
//============================================================
//
// Nb: startup is complex. Prerequisites are shown at every step.
|