]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Have the inner Valgrind registering the interim_stack asap.
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Thu, 14 Jun 2012 22:18:50 +0000 (22:18 +0000)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Thu, 14 Jun 2012 22:18:50 +0000 (22:18 +0000)
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.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12638

coregrind/m_main.c

index 7a35112eca12e924f9e6dc49c1b0549d6c53ff4f..d02e5a4b360c10c4c6eb91e0b612a9352586c61f 100644 (file)
 #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 @@ Int valgrind_main ( Int argc, HChar **argv, HChar **envp )
    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.