Import thrcheck from the THRCHECK branch, and rename it Helgrind (with
permission of the existing Helgrind authors).



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@7116 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/helgrind/Makefile.am b/helgrind/Makefile.am
new file mode 100644
index 0000000..4a9d93d
--- /dev/null
+++ b/helgrind/Makefile.am
@@ -0,0 +1,121 @@
+include $(top_srcdir)/Makefile.tool.am
+
+noinst_PROGRAMS = 
+if VGP_X86_LINUX
+noinst_PROGRAMS += helgrind-x86-linux vgpreload_helgrind-x86-linux.so
+endif
+if VGP_AMD64_LINUX
+noinst_PROGRAMS += helgrind-amd64-linux vgpreload_helgrind-amd64-linux.so
+endif
+if VGP_PPC32_LINUX
+noinst_PROGRAMS += helgrind-ppc32-linux vgpreload_helgrind-ppc32-linux.so
+endif
+if VGP_PPC64_LINUX
+noinst_PROGRAMS += helgrind-ppc64-linux vgpreload_helgrind-ppc64-linux.so
+endif
+if VGP_PPC32_AIX5
+noinst_PROGRAMS += helgrind-ppc32-aix5 vgpreload_helgrind-ppc32-aix5.so
+endif
+if VGP_PPC64_AIX5
+noinst_PROGRAMS += helgrind-ppc64-aix5 vgpreload_helgrind-ppc64-aix5.so
+endif
+
+VGPRELOAD_HELGRIND_SOURCES_COMMON = hg_intercepts.c
+
+vgpreload_helgrind_x86_linux_so_SOURCES      = $(VGPRELOAD_HELGRIND_SOURCES_COMMON)
+vgpreload_helgrind_x86_linux_so_CPPFLAGS     = $(AM_CPPFLAGS_X86_LINUX) -O -g -fno-omit-frame-pointer
+vgpreload_helgrind_x86_linux_so_CFLAGS       = $(AM_CFLAGS_X86_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_helgrind_x86_linux_so_DEPENDENCIES = $(LIBREPLACEMALLOC_X86_LINUX)
+vgpreload_helgrind_x86_linux_so_LDFLAGS      = \
+	$(PRELOAD_LDFLAGS_X86_LINUX) \
+	$(LIBREPLACEMALLOC_LDFLAGS_X86_LINUX)
+
+vgpreload_helgrind_amd64_linux_so_SOURCES      = $(VGPRELOAD_HELGRIND_SOURCES_COMMON)
+vgpreload_helgrind_amd64_linux_so_CPPFLAGS     = $(AM_CPPFLAGS_AMD64_LINUX) -O -g
+vgpreload_helgrind_amd64_linux_so_CFLAGS       = $(AM_CFLAGS_AMD64_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_helgrind_amd64_linux_so_DEPENDENCIES = $(LIBREPLACEMALLOC_AMD64_LINUX)
+vgpreload_helgrind_amd64_linux_so_LDFLAGS      = \
+	$(PRELOAD_LDFLAGS_AMD64_LINUX) \
+	$(LIBREPLACEMALLOC_LDFLAGS_AMD64_LINUX)
+
+vgpreload_helgrind_ppc32_linux_so_SOURCES      = $(VGPRELOAD_HELGRIND_SOURCES_COMMON)
+vgpreload_helgrind_ppc32_linux_so_CPPFLAGS     = $(AM_CPPFLAGS_PPC32_LINUX) -O -g
+vgpreload_helgrind_ppc32_linux_so_CFLAGS       = $(AM_CFLAGS_PPC32_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_helgrind_ppc32_linux_so_DEPENDENCIES = $(LIBREPLACEMALLOC_PPC32_LINUX)
+vgpreload_helgrind_ppc32_linux_so_LDFLAGS      = \
+	$(PRELOAD_LDFLAGS_PPC32_LINUX) \
+	$(LIBREPLACEMALLOC_LDFLAGS_PPC32_LINUX)
+
+vgpreload_helgrind_ppc64_linux_so_SOURCES      = $(VGPRELOAD_HELGRIND_SOURCES_COMMON)
+vgpreload_helgrind_ppc64_linux_so_CPPFLAGS     = $(AM_CPPFLAGS_PPC64_LINUX) -O -g
+vgpreload_helgrind_ppc64_linux_so_CFLAGS       = $(AM_CFLAGS_PPC64_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_helgrind_ppc64_linux_so_DEPENDENCIES = $(LIBREPLACEMALLOC_PPC64_LINUX)
+vgpreload_helgrind_ppc64_linux_so_LDFLAGS      = \
+	$(PRELOAD_LDFLAGS_PPC64_LINUX) \
+	$(LIBREPLACEMALLOC_LDFLAGS_PPC64_LINUX)
+
+vgpreload_helgrind_ppc32_aix5_so_SOURCES      = $(VGPRELOAD_HELGRIND_SOURCES_COMMON)
+vgpreload_helgrind_ppc32_aix5_so_CPPFLAGS     = $(AM_CPPFLAGS_PPC32_AIX5) -O -g
+vgpreload_helgrind_ppc32_aix5_so_CFLAGS       = $(AM_CFLAGS_PPC32_AIX5) $(AM_CFLAGS_PIC)
+vgpreload_helgrind_ppc32_aix5_so_DEPENDENCIES = $(LIBREPLACEMALLOC_PPC32_AIX5)
+vgpreload_helgrind_ppc32_aix5_so_LDFLAGS      = \
+	$(PRELOAD_LDFLAGS_PPC32_AIX5) \
+	$(LIBREPLACEMALLOC_LDFLAGS_PPC32_AIX5)
+
+vgpreload_helgrind_ppc64_aix5_so_SOURCES      = $(VGPRELOAD_HELGRIND_SOURCES_COMMON)
+vgpreload_helgrind_ppc64_aix5_so_CPPFLAGS     = $(AM_CPPFLAGS_PPC64_AIX5) -O -g
+vgpreload_helgrind_ppc64_aix5_so_CFLAGS       = $(AM_CFLAGS_PPC64_AIX5) $(AM_CFLAGS_PIC)
+vgpreload_helgrind_ppc64_aix5_so_DEPENDENCIES = $(LIBREPLACEMALLOC_PPC64_AIX5)
+vgpreload_helgrind_ppc64_aix5_so_LDFLAGS      = \
+	$(PRELOAD_LDFLAGS_PPC64_AIX5) \
+	$(LIBREPLACEMALLOC_LDFLAGS_PPC64_AIX5)
+
+HELGRIND_SOURCES_COMMON = hg_wordfm.c hg_wordset.c hg_main.c
+
+helgrind_x86_linux_SOURCES      = $(HELGRIND_SOURCES_COMMON)
+helgrind_x86_linux_CPPFLAGS     = $(AM_CPPFLAGS_X86_LINUX)
+helgrind_x86_linux_CFLAGS       = $(AM_CFLAGS_X86_LINUX) -O2
+helgrind_x86_linux_DEPENDENCIES = $(COREGRIND_LIBS_X86_LINUX)
+helgrind_x86_linux_LDADD        = $(TOOL_LDADD_X86_LINUX)
+helgrind_x86_linux_LDFLAGS      = $(TOOL_LDFLAGS_X86_LINUX)
+
+helgrind_amd64_linux_SOURCES      = $(HELGRIND_SOURCES_COMMON)
+helgrind_amd64_linux_CPPFLAGS     = $(AM_CPPFLAGS_AMD64_LINUX)
+helgrind_amd64_linux_CFLAGS       = $(AM_CFLAGS_AMD64_LINUX) -O2
+helgrind_amd64_linux_DEPENDENCIES = $(COREGRIND_LIBS_AMD64_LINUX)
+helgrind_amd64_linux_LDADD        = $(TOOL_LDADD_AMD64_LINUX)
+helgrind_amd64_linux_LDFLAGS      = $(TOOL_LDFLAGS_AMD64_LINUX)
+
+helgrind_ppc32_linux_SOURCES      = $(HELGRIND_SOURCES_COMMON)
+helgrind_ppc32_linux_CPPFLAGS     = $(AM_CPPFLAGS_PPC32_LINUX)
+helgrind_ppc32_linux_CFLAGS       = $(AM_CFLAGS_PPC32_LINUX) -O2
+helgrind_ppc32_linux_DEPENDENCIES = $(COREGRIND_LIBS_PPC32_LINUX)
+helgrind_ppc32_linux_LDADD        = $(TOOL_LDADD_PPC32_LINUX)
+helgrind_ppc32_linux_LDFLAGS      = $(TOOL_LDFLAGS_PPC32_LINUX)
+
+helgrind_ppc64_linux_SOURCES      = $(HELGRIND_SOURCES_COMMON)
+helgrind_ppc64_linux_CPPFLAGS     = $(AM_CPPFLAGS_PPC64_LINUX)
+helgrind_ppc64_linux_CFLAGS       = $(AM_CFLAGS_PPC64_LINUX) -O2
+helgrind_ppc64_linux_DEPENDENCIES = $(COREGRIND_LIBS_PPC64_LINUX)
+helgrind_ppc64_linux_LDADD        = $(TOOL_LDADD_PPC64_LINUX)
+helgrind_ppc64_linux_LDFLAGS      = $(TOOL_LDFLAGS_PPC64_LINUX)
+
+helgrind_ppc32_aix5_SOURCES      = $(HELGRIND_SOURCES_COMMON)
+helgrind_ppc32_aix5_CPPFLAGS     = $(AM_CPPFLAGS_PPC32_AIX5)
+helgrind_ppc32_aix5_CFLAGS       = $(AM_CFLAGS_PPC32_AIX5) -O2
+helgrind_ppc32_aix5_DEPENDENCIES = $(COREGRIND_LIBS_PPC32_AIX5)
+helgrind_ppc32_aix5_LDADD        = $(TOOL_LDADD_PPC32_AIX5)
+helgrind_ppc32_aix5_LDFLAGS      = $(TOOL_LDFLAGS_PPC32_AIX5)
+
+helgrind_ppc64_aix5_SOURCES      = $(HELGRIND_SOURCES_COMMON)
+helgrind_ppc64_aix5_CPPFLAGS     = $(AM_CPPFLAGS_PPC64_AIX5)
+helgrind_ppc64_aix5_CFLAGS       = $(AM_CFLAGS_PPC64_AIX5) -O2
+helgrind_ppc64_aix5_DEPENDENCIES = $(COREGRIND_LIBS_PPC64_AIX5)
+helgrind_ppc64_aix5_LDADD        = $(TOOL_LDADD_PPC64_AIX5)
+helgrind_ppc64_aix5_LDFLAGS      = $(TOOL_LDFLAGS_PPC64_AIX5)
+
+hgincludedir = $(includedir)/valgrind
+
+hginclude_HEADERS = helgrind.h
+
+noinst_HEADERS = hg_wordfm.h hg_wordset.h
diff --git a/helgrind/docs/Makefile.am b/helgrind/docs/Makefile.am
new file mode 100644
index 0000000..84f630f
--- /dev/null
+++ b/helgrind/docs/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = hg-manual.xml
diff --git a/helgrind/docs/hg-manual.xml b/helgrind/docs/hg-manual.xml
new file mode 100644
index 0000000..5090cfc
--- /dev/null
+++ b/helgrind/docs/hg-manual.xml
@@ -0,0 +1,1311 @@
+<?xml version="1.0"?> <!-- -*- sgml -*- -->
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+          "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+
+
+<chapter id="tc-manual" xreflabel="Thrcheck: thread error detector">
+  <title>Thrcheck: a thread error detector</title>
+
+<para>To use this tool, you must specify
+<computeroutput>--tool=thrcheck</computeroutput> on the Valgrind
+command line.</para>
+
+
+
+
+<sect1 id="tc-manual.overview" xreflabel="Overview">
+<title>Overview</title>
+
+<para>Thrcheck is a Valgrind tool for detecting synchronisation errors
+in C, C++ and Fortran programs that use the POSIX pthreads
+threading primitives.</para>
+
+<para>The main abstractions in POSIX pthreads are: a set of threads
+sharing a common address space, thread creation, thread joinage,
+thread exit, mutexes (locks), condition variables (inter-thread event
+notifications), reader-writer locks, and semaphores.</para>
+
+<para>Thrcheck is aware of all these abstractions and tracks their
+effects as accurately as it can.  Currently it does not correctly
+handle pthread barriers and pthread spinlocks, although it will not
+object if you use them.  On x86 and amd64 platforms, it understands
+and partially handles implicit locking arising from the use of the
+LOCK instruction prefix.
+</para>
+
+<para>Thrcheck can detect three classes of errors, which are discussed
+in detail in the next three sections:</para>
+
+<orderedlist>
+ <listitem>
+  <para><link linkend="tc-manual.api-checks">
+        Misuses of the POSIX pthreads API.</link></para>
+ </listitem>
+ <listitem>
+  <para><link linkend="tc-manual.lock-orders">
+        Potential deadlocks arising from lock
+        ordering problems.</link></para>
+ </listitem>
+ <listitem>
+  <para><link linkend="tc-manual.data-races">
+        Data races -- accessing memory without adequate locking.
+        </link></para>
+ </listitem>
+</orderedlist>
+
+<para>Following those is a section containing 
+<link linkend="tc-manual.effective-use">
+hints and tips on how to get the best out of Thrcheck.</link>
+</para>
+
+<para>Then there is a
+<link linkend="tc-manual.options">summary of command-line
+options.</link>
+</para>
+
+<para>Finally, there is 
+<link linkend="tc-manual.todolist">a brief summary of areas in which Thrcheck
+could be improved.</link>
+</para>
+
+</sect1>
+
+
+
+
+<sect1 id="tc-manual.api-checks" xreflabel="API Checks">
+<title>Detected errors: Misuses of the POSIX pthreads API</title>
+
+<para>Thrcheck intercepts calls to many POSIX pthreads functions, and
+is therefore able to report on various common problems.  Although
+these are unglamourous errors, their presence can lead to undefined
+program behaviour and hard-to-find bugs later in execution.  The
+detected errors are:</para>
+
+<itemizedlist>
+ <listitem><para>unlocking an invalid mutex</para></listitem>
+ <listitem><para>unlocking a not-locked mutex</para></listitem>
+ <listitem><para>unlocking a mutex held by a different
+                 thread</para></listitem>
+ <listitem><para>destroying an invalid or a locked mutex</para></listitem>
+ <listitem><para>recursively locking a non-recursive mutex</para></listitem>
+ <listitem><para>deallocation of memory that contains a
+                 locked mutex</para></listitem>
+ <listitem><para>passing mutex arguments to functions expecting
+                 reader-writer lock arguments, and vice
+                 versa</para></listitem>
+ <listitem><para>when a POSIX pthread function fails with an
+                 error code that must be handled</para></listitem>
+ <listitem><para>when a thread exits whilst still holding locked
+                 locks</para></listitem>
+ <listitem><para>calling <computeroutput>pthread_cond_wait</computeroutput>
+                 with a not-locked mutex, or one locked by a different
+                 thread</para></listitem>
+</itemizedlist>
+
+<para>Checks pertaining to the validity of mutexes are generally also
+performed for reader-writer locks.</para>
+
+<para>Various kinds of this-can't-possibly-happen events are also
+reported.  These usually indicate bugs in the system threading
+library.</para>
+
+<para>Reported errors always contain a primary stack trace indicating
+where the error was detected.  They may also contain auxiliary stack
+traces giving additional information.  In particular, most errors
+relating to mutexes will also tell you where that mutex first came to
+Thrcheck's attention (the "<computeroutput>was first observed
+at</computeroutput>" part), so you have a chance of figuring out which
+mutex it is referring to.  For example:</para>
+
+<programlisting><![CDATA[
+Thread #1 unlocked a not-locked lock at 0x7FEFFFA90
+   at 0x4C2408D: pthread_mutex_unlock (tc_intercepts.c:492)
+   by 0x40073A: nearly_main (tc09_bad_unlock.c:27)
+   by 0x40079B: main (tc09_bad_unlock.c:50)
+  Lock at 0x7FEFFFA90 was first observed
+   at 0x4C25D01: pthread_mutex_init (tc_intercepts.c:326)
+   by 0x40071F: nearly_main (tc09_bad_unlock.c:23)
+   by 0x40079B: main (tc09_bad_unlock.c:50)
+]]></programlisting>
+
+<para>Thrcheck has a way of summarising thread identities, as
+evidenced here by the text "<computeroutput>Thread
+#1</computeroutput>".  This is so that it can speak about threads and
+sets of threads without overwhelming you with details.  See 
+<link linkend="tc-manual.data-races.errmsgs">below</link>
+for more information on interpreting error messages.</para>
+
+</sect1>
+
+
+
+
+<sect1 id="tc-manual.lock-orders" xreflabel="Lock Orders">
+<title>Detected errors: Inconsistent Lock Orderings</title>
+
+<para>In this section, and in general, to "acquire" a lock simply
+means to lock that lock, and to "release" a lock means to unlock
+it.</para>
+
+<para>Thrcheck monitors the order in which threads acquire locks.
+This allows it to detect potential deadlocks which could arise from
+the formation of cycles of locks.  Detecting such inconsistencies is
+useful because, whilst actual deadlocks are fairly obvious, potential
+deadlocks may never be discovered during testing and could later lead
+to hard-to-diagnose in-service failures.</para>
+
+<para>The simplest example of such a problem is as
+follows.</para>
+
+<itemizedlist>
+ <listitem><para>Imagine some shared resource R, which, for whatever
+  reason, is guarded by two locks, L1 and L2, which must both be held
+  when R is accessed.</para>
+ </listitem>
+ <listitem><para>Suppose a thread acquires L1, then L2, and proceeds
+  to access R.  The implication of this is that all threads in the
+  program must acquire the two locks in the order first L1 then L2.
+  Not doing so risks deadlock.</para>
+ </listitem>
+ <listitem><para>The deadlock could happen if two threads -- call them
+  T1 and T2 -- both want to access R.  Suppose T1 acquires L1 first,
+  and T2 acquires L2 first.  Then T1 tries to acquire L2, and T2 tries
+  to acquire L1, but those locks are both already held.  So T1 and T2
+  become deadlocked.</para>
+ </listitem>
+</itemizedlist>
+
+<para>Thrcheck builds a directed graph indicating the order in which
+locks have been acquired in the past.  When a thread acquires a new
+lock, the graph is updated, and then checked to see if it now contains
+a cycle.  The presence of a cycle indicates a potential deadlock involving
+the locks in the cycle.</para>
+
+<para>In simple situations, where the cycle only contains two locks,
+Thrcheck will show where the required order was established:</para>
+
+<programlisting><![CDATA[
+Thread #1: lock order "0x7FEFFFAB0 before 0x7FEFFFA80" violated
+   at 0x4C23C91: pthread_mutex_lock (tc_intercepts.c:388)
+   by 0x40081F: main (tc13_laog1.c:24)
+  Required order was established by acquisition of lock at 0x7FEFFFAB0
+   at 0x4C23C91: pthread_mutex_lock (tc_intercepts.c:388)
+   by 0x400748: main (tc13_laog1.c:17)
+  followed by a later acquisition of lock at 0x7FEFFFA80
+   at 0x4C23C91: pthread_mutex_lock (tc_intercepts.c:388)
+   by 0x400773: main (tc13_laog1.c:18)
+]]></programlisting>
+
+<para>When there are more than two locks in the cycle, the error is
+equally serious.  However, at present Thrcheck does not show the locks
+involved, so as to avoid flooding you with information.  That could be
+fixed in future.  For example, here is a an example involving a cycle
+of five locks from a naive implementation the famous Dining
+Philosophers problem
+(see <computeroutput>thrcheck/tests/tc14_laog_dinphils.c</computeroutput>).
+In this case Thrcheck has detected that all 5 philosophers could
+simultaneously pick up their left fork and then deadlock whilst
+waiting to pick up their right forks.</para>
+
+<programlisting><![CDATA[
+Thread #6: lock order "0x6010C0 before 0x601160" violated
+   at 0x4C23C91: pthread_mutex_lock (tc_intercepts.c:388)
+   by 0x4007C0: dine (tc14_laog_dinphils.c:19)
+   by 0x4C25DF7: mythread_wrapper (tc_intercepts.c:178)
+   by 0x4E2F09D: start_thread (in /lib64/libpthread-2.5.so)
+   by 0x51054CC: clone (in /lib64/libc-2.5.so)
+]]></programlisting>
+
+</sect1>
+
+
+
+
+<sect1 id="tc-manual.data-races" xreflabel="Data Races">
+<title>Detected errors: Data Races</title>
+
+<para>A data race happens, or could happen, when two threads
+access a shared memory location without using suitable locks to
+ensure single-threaded access.  Such missing locking can cause
+obscure timing dependent bugs.  Ensuring programs are race-free is
+one of the central difficulties of threaded programming.</para>
+
+<para>Reliably detecting races is a difficult problem, and most
+of Thrcheck's internals are devoted to do dealing with it.  
+As a consequence this section is somewhat long and involved.
+We begin with a simple example.</para>
+
+
+<sect2 id="tc-manual.data-races.example" xreflabel="Simple Race">
+<title>A Simple Data Race</title>
+
+<para>About the simplest possible example of a race is as follows.  In
+this program, it is impossible to know what the value
+of <computeroutput>var</computeroutput> is at the end of the program.
+Is it 2 ?  Or 1 ?</para>
+
+<programlisting><![CDATA[
+#include <pthread.h>
+
+int var = 0;
+
+void* child_fn ( void* arg ) {
+   var++; /* Unprotected relative to parent */ /* this is line 6 */
+   return NULL;
+}
+
+int main ( void ) {
+   pthread_t child;
+   pthread_create(&child, NULL, child_fn, NULL);
+   var++; /* Unprotected relative to child */ /* this is line 13 */
+   pthread_join(child, NULL);
+   return 0;
+}
+]]></programlisting>
+
+<para>The problem is there is nothing to
+stop <computeroutput>var</computeroutput> being updated simultaneously
+by both threads.  A correct program would 
+protect <computeroutput>var</computeroutput> with a lock of type
+<computeroutput>pthread_mutex_t</computeroutput>, which is acquired
+before each access and released afterwards.  Thrcheck's output for
+this program is:</para>
+
+<programlisting><![CDATA[
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x510548E: clone (in /lib64/libc-2.5.so)
+   by 0x4E2F305: do_clone (in /lib64/libpthread-2.5.so)
+   by 0x4E2F7C5: pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.5.so)
+   by 0x4C23870: pthread_create@* (tc_intercepts.c:198)
+   by 0x4005F1: main (simple_race.c:12)
+
+Possible data race during write of size 4 at 0x601034
+   at 0x4005F2: main (simple_race.c:13)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x601034 has never been protected by any lock
+]]></programlisting>
+
+<para>This is quite a lot of detail for an apparently simple error.
+The last clause is the main error message.  It says there is a race as
+a result of a write of size 4 (bytes), at 0x601034, which is
+presumably the address of <computeroutput>var</computeroutput>,
+happening in function <computeroutput>main</computeroutput> at line 13
+in the program.</para>
+
+<para>Note that it is purely by chance that the race is
+reported for the parent thread's access.  It could equally have been
+reported instead for the child's access, at line 6.  The error will
+only be reported for one of the locations, since neither the parent
+nor child is, by itself, incorrect.  It is only when both access
+<computeroutput>var</computeroutput> without a lock that an error
+exists.</para>
+
+<para>The error message shows some other interesting details.  The
+sections below explain them.  Here we merely note their presence:</para>
+
+<itemizedlist>
+ <listitem><para>Thrcheck maintains some kind of state machine for the
+  memory location in question, hence the "<computeroutput>Old
+  state:</computeroutput>" and "<computeroutput>New
+  state:</computeroutput>" lines.</para>
+ </listitem>
+ <listitem><para>Thrcheck keeps track of which threads have accessed
+  the location: "<computeroutput>threads #1, #2</computeroutput>".
+  Before printing the main error message, it prints the creation
+  points of these two threads, so you can see which threads it is
+  referring to.</para>
+ </listitem>
+ <listitem><para>Thrcheck tries to provide an explaination of why the
+  race exists: "<computeroutput>Location 0x601034 has never been
+  protected by any lock</computeroutput>".</para>
+ </listitem>
+</itemizedlist>
+
+<para>Understanding the memory state machine is central to
+understanding Thrcheck's race-detection algorithm.  The next three
+subsections explain this.</para>
+
+</sect2>
+
+
+<sect2 id="tc-manual.data-races.memstates" xreflabel="Memory States">
+<title>Thrcheck's Memory State Machine</title>
+
+<para>Thrcheck tracks the state of every byte of memory used by your
+program.  There are a number of states, but only three are
+interesting:</para>
+
+<itemizedlist>
+ <listitem><para>Exclusive: memory in this state is regarded as owned
+  exclusively by one particular thread.  That thread may read and
+  write it without a lock.  Even in highly threaded programs, the
+  majority of locations never leave the Exclusive state, since most
+  data is thread-private.</para>
+ </listitem>
+ <listitem><para>Shared-Readonly: memory in this state is regarded as
+  shared by multiple threads.  In this state, any thread may read the
+  memory without a lock, reflecting the fact that readonly data may
+  safely be shared between threads without locking.</para>
+ </listitem>
+ <listitem><para>Shared-Modified: memory in this state is regarded as
+  shared by multiple threads, at least one of which has written to it.
+  All participating threads must hold at least one lock in common when
+  accessing the memory.  If no such lock exists, Thrcheck reports a
+  race error.</para>
+ </listitem>
+</itemizedlist>
+
+<para>Let's review the simple example above with this in mind.  When
+the program starts, <computeroutput>var</computeroutput> is not in any
+of these states.  Either the parent or child thread gets to its
+<computeroutput>var++</computeroutput> first, and thereby
+thereby gets Exclusive ownership of the location.</para>
+
+<para>The later-running thread now arrives at
+its <computeroutput>var++</computeroutput> statement.  It first reads
+the existing value from memory.
+Because <computeroutput>var</computeroutput> is currently marked as
+owned exclusively by the other thread, its state is changed to
+shared-readonly by both threads.</para>
+
+<para>This same thread adds one to the value it has and stores it back
+in <computeroutput>var</computeroutput>.  This causes another state
+change, this time to the shared-modified state.  Because Thrcheck has
+also been tracking which threads hold which locks, it can see that
+<computeroutput>var</computeroutput> is in shared-modified state but
+no lock has been used to consistently protect it.  Hence a race is
+reported exactly at the transition from shared-readonly to
+shared-modified.</para>
+
+<para>The essence of the algorithm is this.  Thrcheck keeps track of
+each memory location that has been accessed by more than one thread.
+For each such location it incrementally infers the set of locks which
+have consistently been used to protect that location.  If the
+location's lockset becomes empty, and at some point one of the threads
+attempts to write to it, a race is then reported.</para>
+
+<para>This technique is known as "lockset inference" and was
+introduced in: "Eraser: A Dynamic Data Race Detector for Multithreaded
+Programs" (Stefan Savage, Michael Burrows, Greg Nelson, Patrick
+Sobalvarro and Thomas Anderson, ACM Transactions on Computer Systems,
+15(4):391-411, November 1997).</para>
+
+<para>Lockset inference has since been widely implemented, studied and
+extended.  Thrcheck incorporates several refinements aimed at avoiding
+the high false error rate that naive versions of the algorithm suffer
+from.  A 
+<link linkend="tc-manual.data-races.summary">summary of the complete
+algorithm used by Thrcheck</link> is presented below.  First, however,
+it is important to understand details of transitions pertaining to the
+Exclusive-ownership state.</para>
+
+</sect2>
+
+
+
+<sect2 id="tc-manual.data-races.exclusive" xreflabel="Excl Transfers">
+<title>Transfers of Exclusive Ownership Between Threads</title>
+
+<para>As presented, the algorithm is far too strict.  It reports many
+errors in perfectly correct, widely used parallel programming
+constructions, for example, using child worker threads and worker
+thread pools.</para>
+
+<para>To avoid these false errors, we must refine the algorithm so
+that it keeps memory in an Exclusive ownership state in cases where it
+would otherwise decay into a shared-readonly or shared-modified state.
+Recall that Exclusive ownership is special in that it grants the
+owning thread the right to access memory without use of any locks.  In
+order to support worker-thread and worker-thread-pool idioms, we will
+allow threads to steal exclusive ownership of memory from other
+threads under certain circumstances.</para>
+
+<para>Here's an example.  Imagine a parent thread creates child
+threads to do units of work.  For each unit of work, the parent
+allocates a work buffer, fills it in, and creates the child thread,
+handing it a pointer to the buffer.  The child reads/writes the buffer
+and eventually exits, and the waiting parent then extracts the results
+from the buffer:</para>
+
+<programlisting><![CDATA[
+typedef ... Buffer;
+
+pthread_t child;
+Buffer    buf;
+
+/* ---- Parent ---- */                          /* ---- Child ---- */
+
+/* parent writes workload into buf */
+pthread_create( &child, child_fn, &buf );
+
+/* parent does not read */                      void child_fn ( Buffer* buf ) {
+/* or write buf */                                 /* read/write buf */
+                                                }
+
+pthread_join ( child );
+/* parent reads results from buf */
+]]></programlisting>
+
+<para>Although <computeroutput>buf</computeroutput> is accessed by
+both threads, neither uses locks, yet the program is race-free.  The
+essential observation is that the child's creation and exit create
+synchronisation events between it and the parent.  These force the
+child's accesses to <computeroutput>buf</computeroutput> to happen
+after the parent initialises <computeroutput>buf</computeroutput>, and
+before the parent reads the results
+from <computeroutput>buf</computeroutput>.</para>
+
+<para>To model this, Thrcheck allows the child to steal, from the
+parent, exclusive ownership of any memory exclusively owned by the
+parent before the pthread_create call.  Similarly, once the parent's
+pthread_join call returns, it can steal back ownership of memory
+exclusively owned by the child.  In this way ownership
+of <computeroutput>buf</computeroutput> is transferred from parent to
+child and back, so the basic algorithm does not report any races
+despite the absence of any locking.</para>
+
+<para>Note that the child may only steal memory owned by the parent
+prior to the pthread_create call.  If the child attempts to read or
+write memory which is also accessed by the parent in between the
+pthread_create and pthread_join calls, an error is still
+reported.</para>
+
+<para>This technique was introduced with the name "thread lifetime
+segments" in "Runtime Checking of Multithreaded Applications with
+Visual Threads" (Jerry J. Harrow, Jr, Proceedings of the 7th
+International SPIN Workshop on Model Checking of Software Stanford,
+California, USA, August 2000, LNCS 1885, pp331--342).  Thrcheck
+implements an extended version of it.  Specifically, Thrcheck allows
+transfer of exclusive ownership in the following situations:</para>
+
+<itemizedlist>
+ <listitem><para>At thread creation: a child can acquire ownership of
+  memory held exclusively by the parent prior to the child's
+  creation.</para>
+ </listitem>
+ <listitem><para>At thread joining: the joiner (thread not exiting)
+  can acquire ownership of memory held exclusively by the joinee
+  (thread that is exiting) at the point it exited.</para>
+ </listitem>
+ <listitem><para>At condition variable signallings and broadcasts.  A
+  thread Tw which completes a pthread_cond_wait call as a result of
+  a signal or broadcast on the same condition variable by some other
+  thread Ts, may acquire ownership of memory held exclusively by
+  Ts prior to the pthread_cond_signal/broadcast
+  call.</para>
+ </listitem>
+ <listitem><para>At semaphore posts (sem_post) calls.  A thread Tw
+  which completes a sem_wait call call as a result of a sem_post call
+  on the same semaphore by some other thread Tp, may acquire
+  ownership of memory held exclusively by Tp prior to the sem_post
+  call.</para>
+ </listitem>
+</itemizedlist>
+
+</sect2>
+
+
+
+<sect2 id="tc-manual.data-races.re-excl" xreflabel="Re-Excl Transfers">
+<title>Restoration of Exclusive Ownership</title>
+
+<para>Another common idiom is to partition the lifetime of the program
+as a whole into several distinct phases.  In some of those phases, a
+memory location may be accessed by multiple threads and so require
+locking.  In other phases only one thread exists and so can access the
+memory without locking.  For example:</para>
+
+<programlisting><![CDATA[
+int             var = 0;                         /* shared variable */
+pthread_mutex_t mx  = PTHREAD_MUTEX_INITIALIZER; /* guard for var */
+pthread_t       child;
+
+/* ---- Parent ---- */                          /* ---- Child ---- */
+
+var += 1; /* no lock used */
+
+pthread_create( &child, child_fn, NULL );
+
+                                                void child_fn ( void* uu ) {
+pthread_mutex_lock(&mx);                           pthread_mutex_lock(&mx);         
+var += 2;                                          var += 3;
+pthread_mutex_unlock(&mx);                         pthread_mutex_unlock(&mx);
+                                                }
+
+pthread_join ( child );
+
+var += 4; /* no lock used */
+]]></programlisting>
+
+<para>This program is correct, but using only the mechanisms described
+so far, Thrcheck would report an error at
+<computeroutput>var += 4</computeroutput>.  This is because, by that
+point, <computeroutput>var</computeroutput> is marked as being in the
+state "shared-modified and protected by the
+lock <computeroutput>mx</computeroutput>", but is being accessed
+without locking.  Really, what we want is
+for <computeroutput>var</computeroutput> to return to the parent
+thread's exclusive ownership after the child thread has exited.</para>
+
+<para>To make this possible, for every memory location Thrcheck also keeps
+track of all the threads that have accessed that location
+-- its threadset.  When a thread Tquitter joins back to Tstayer,
+Thrcheck examines the locksets of all memory in shared-modified or
+shared-readable state.  In each such lockset, if Tquitter is
+mentioned, it is removed and replaced by Tstayer.  If, as a result, a
+lockset becomes a singleton set containing Tstayer, then the
+location's state is changed to belongs-exclusively-to-Tstayer.</para>
+
+<para>In our example, the result is exactly as we desire:
+<computeroutput>var</computeroutput> is reacquired exclusively by the
+parent after the child exits.</para>
+
+<para>More generally, when a group of threads merges back to a single
+thread via a cascade of pthread_join calls, any memory shared by the
+group (or a subset of it) ends up being owned exclusively by the sole
+surviving thread.  This significantly enhances Thrcheck's flexibility,
+since it means that each memory location may make arbitrarily many
+transitions between exclusive and shared ownership.  Furthermore, a
+different lock may protect the location during each period of shared
+ownership.</para>
+
+</sect2>
+
+
+
+<sect2 id="tc-manual.data-races.summary" xreflabel="Race Det Summary">
+<title>A Summary of the Race Detection Algorithm</title>
+
+<para>Thrcheck looks for memory locations which are accessed by more
+than one thread.  For each such location, Thrcheck records which of
+the program's locks were held by the accessing thread at the time of
+each access.  The hope is to discover that there is indeed at least
+one lock which is consistently used by all threads to protect that
+location.  If no such lock can be found, then there is apparently no
+consistent locking strategy being applied for that location, and so a
+possible data race might result.  Thrcheck accordingly reports an
+error.</para>
+
+<para>In practice this discipline is far too simplistic, and is
+unusable since it reports many races in some widely used and
+known-correct programming disciplines.  Thrcheck's checking therefore
+incorporates many refinements to this basic idea, and can be
+summarised as follows:</para>
+
+<para>The following thread events are intercepted and monitored:</para>
+
+<itemizedlist>
+ <listitem><para>thread creation and exiting (pthread_create,
+           pthread_join, pthread_exit)</para>
+ </listitem>
+ <listitem>
+  <para>lock acquisition and release (pthread_mutex_lock,
+        pthread_mutex_unlock, pthread_rwlock_rdlock,
+        pthread_rwlock_wrlock,
+        pthread_rwlock_unlock)</para>
+ </listitem>
+ <listitem>
+  <para>inter-thread event notifications (pthread_cond_wait,
+        pthread_cond_signal, pthread_cond_broadcast, 
+        sem_wait, sem_post)</para>
+ </listitem>
+</itemizedlist>
+
+<para>Memory allocation and deallocation events are intercepted and
+monitored:</para>
+
+<itemizedlist>
+ <listitem>
+  <para>malloc/new/free/delete and variants</para>
+ </listitem>
+ <listitem>
+  <para>stack allocation and deallocation</para>
+ </listitem>
+</itemizedlist>
+
+<para>All memory accesses are intercepted and monitored.</para>
+
+<para>By observing the above events, Thrcheck can infer certain
+aspects of the program's locking discipline.  Programs which adhere to
+the following rules are considered to be acceptable:
+</para>
+
+<itemizedlist>
+ <listitem>
+  <para>A thread may allocate memory, and write initial values into
+  it, without locking.  That thread is regarded as owning the memory
+  exclusively.</para>
+ </listitem>
+ <listitem>
+  <para>A thread may read and write memory which it owns exclusively,
+  without locking.</para>
+ </listitem>
+ <listitem>
+  <para>Memory which is owned exclusively by one thread may be read by
+  that thread and others without locking.  However, in this situation
+  no thread may do unlocked writes to the memory (except for the owner
+  thread's initializing write).</para>
+ </listitem>
+ <listitem>
+  <para>Memory which is shared between multiple threads, one or more
+  of which writes to it, must be protected by a lock which is
+  correctly acquired and released by all threads accessing the
+  memory.</para>
+ </listitem>
+</itemizedlist>
+
+<para>Any violation of this discipline will cause an error to be reported.
+However, two exemptions apply:</para>
+
+<itemizedlist>
+ <listitem>
+  <para>A thread Y can acquire exclusive ownership of memory
+  previously owned exclusively by a different thread X providing
+  X's last access and Y's first access are separated by one of the
+  following synchronization events:</para>
+  <itemizedlist>
+   <listitem><para>X creates thread Y</para></listitem>
+   <listitem><para>X joins back to Y</para></listitem>
+   <listitem><para>X uses a condition-variable to signal at Y, and Y is
+   waiting for that event</para></listitem>
+   <listitem><para>Y completes a semaphore wait as a result of X signalling 
+   on that same semaphore</para></listitem>
+  </itemizedlist>
+  <para>
+  This refinement allows Thrcheck to correctly track the ownership
+  state of inter-thread buffers used in the worker-thread and
+  worker-thread-pool concurrent programming idioms (styles).</para>
+ </listitem>
+ <listitem>
+  <para>Similarly, if thread Y joins back to thread X, memory
+  exclusively owned by Y becomes exclusively owned by X instead.
+  Also, memory that has been shared only by X and Y becomes
+  exclusively owned by X.  More generally, memory that has been shared
+  by X, Y and some arbitrary other set S of threads is re-marked as
+  shared by X and S.  Hence, under the right circumstances, memory
+  shared amongst multiple threads, all of which join into just one,
+  can revert to the exclusive ownership state.</para>
+  <para>
+  In effect, each memory location may make arbitrarily many
+  transitions between exclusive and shared ownership.  Furthermore, a
+  different lock may protect the location during each period of shared
+  ownership.  This significantly enhances the flexibility of the
+  algorithm.</para>
+ </listitem>
+</itemizedlist>
+
+<para>The ownership state, accessing thread-set and related lock-set
+for each memory location are tracked at 8-bit granularity.  This means
+the algorithm is precise even for 16- and 8-bit memory
+accesses.</para>
+
+<para>Thrcheck correctly handles reader-writer locks in this
+framework.  Locations shared between multiple threads can be protected
+during reads by locks held in either read-mode or write-mode, but can
+only be protected during writes by locks held in write-mode.  Normal
+POSIX mutexes are treated as if they are reader-writer locks which are
+only ever held in write-mode.</para>
+
+<para>Thrcheck correctly handles POSIX mutexes for which recursive
+locking is allowed.</para>
+
+<para>Thrcheck partially correctly handles x86 and amd64 memory access
+instructions preceded by a LOCK prefix.  Writes are correctly handled,
+by pretending that the LOCK prefix implies acquisition and release of
+a magic "bus hardware lock" mutex before and after the instruction.
+This unfortunately requires subsequent reads from such locations to
+also use a LOCK prefix, which is not required by the real hardware.
+Thrcheck does not offer any equivalent handling for atomic sequences
+on PowerPC/POWER platforms created by the use of lwarx/stwcx
+instructions.</para>
+
+</sect2>
+
+
+
+<sect2 id="tc-manual.data-races.errmsgs" xreflabel="Race Error Messages">
+<title>Interpreting Race Error Messages</title>
+
+<para>Thrcheck's race detection algorithm collects a lot of
+information, and tries to present it in a helpful way when a race is
+detected.  Here's an example:</para>
+
+<programlisting><![CDATA[
+Thread #2 was created
+   at 0x510548E: clone (in /lib64/libc-2.5.so)
+   by 0x4E2F305: do_clone (in /lib64/libpthread-2.5.so)
+   by 0x4E2F7C5: pthread_create@@GLIBC_2.2.5 (in /lib64/libpthread-2.5.so)
+   by 0x4C23870: pthread_create@* (tc_intercepts.c:198)
+   by 0x400CEF: main (tc17_sembar.c:195)
+
+// And the same for threads #3, #4 and #5 -- omitted for conciseness
+
+Possible data race during read of size 4 at 0x602174
+   at 0x400BE5: gomp_barrier_wait (tc17_sembar.c:122)
+   by 0x400C44: child (tc17_sembar.c:161)
+   by 0x4C25DF7: mythread_wrapper (tc_intercepts.c:178)
+   by 0x4E2F09D: start_thread (in /lib64/libpthread-2.5.so)
+   by 0x51054CC: clone (in /lib64/libc-2.5.so)
+  Old state: shared-modified by threads #2, #3, #4, #5
+  New state: shared-modified by threads #2, #3, #4, #5
+  Reason:    this thread, #2, holds no consistent locks
+  Last consistently used lock for 0x602174 was first observed
+   at 0x4C25D01: pthread_mutex_init (tc_intercepts.c:326)
+   by 0x4009E4: gomp_barrier_init (tc17_sembar.c:46)
+   by 0x400CBC: main (tc17_sembar.c:192)
+]]></programlisting>
+
+<para>Thrcheck first announces the creation points of any threads
+referenced in the error message.  This is so it can speak concisely
+about threads and sets of threads without repeatedly printing their
+creation point call stacks.  Each thread is only ever announced once,
+the first time it appears in any Thrcheck error message.</para>
+
+<para>The main error message begins at the text
+"<computeroutput>Possible data race during read</computeroutput>".
+At the start is information you would expect to see -- address and
+size of the racing access, whether a read or a write, and the call
+stack at the point it was detected.</para>
+
+<para>More interesting is the state transition caused by this access.
+This memory is already in the shared-modified state, and up to now has
+been consistently protected by at least one lock.  However, the thread
+making the access in question (thread #2, here) does not hold any
+locks in common with those held during all previous accesses to the
+location -- "no consistent locks", in other words.</para>
+
+<para>Finally, Thrcheck shows the lock which has protected this
+location in all previous accesses.  (If there is more than one, only
+one is shown).  This can be a useful hint, because it typically shows
+the lock that the programmers intended to use to protect the location,
+but in this case forgot.</para>
+
+<para>Here are some more examples of race reports.  This not an
+exhaustive list of combinations, but should give you some insight into
+how to interpret the output.</para>
+
+<programlisting><![CDATA[
+Possible data race during write ...
+  Old state: shared-readonly by threads #1, #2, #3
+  New state: shared-modified by threads #1, #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location ... has never been protected by any lock
+]]></programlisting>
+
+<para>The location is shared by 3 threads, all of which have been
+reading it without locking ("has never been protected by any lock").
+Now one of them is writing it.  Regardless of whether the writer has a
+lock or not, this is still an error, because the write races against
+the previously observed reads.</para>
+
+<programlisting><![CDATA[
+Possible data race during read ...
+  Old state: shared-modified by threads #1, #2, #3
+  New state: shared-modified by threads #1, #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Last consistently used lock for ... was first observed ...
+]]></programlisting>
+
+<para>The location is shared by 3 threads, all of which have been
+reading and writing it while (as required) holding at least one lock
+in common.  Now it is being read without that lock being held.  In the
+"Last consistently used lock" part, Thrcheck offers its best guess as
+to the identity of the lock that should have been used.</para>
+
+<programlisting><![CDATA[
+Possible data race during write ...
+  Old state: owned exclusively by thread #4
+  New state: shared-modified by threads #4, #5
+  Reason:    this thread, #5, holds no locks at all
+]]></programlisting>
+
+<para>A location that has so far been accessed exclusively by thread
+#4 has now been written by thread #5, without use of any lock.  This
+can be a sign that the programmer did not consider the possibility of
+the location being shared between threads, or, alternatively, forgot
+to use the appropriate lock.</para>
+
+<para>Note that thread #4 exclusively owns the location, and so has
+the right to access it without holding a lock.  However, this message
+does not say that thread #4 is not using a lock for this location.
+Indeed, it could be using a lock for the location because it intends
+to make it available to other threads, one of which is thread #5 --
+and thread #5 has forgotten to use the lock.</para>
+
+<para>Also, this message implies that Thrcheck did not see any
+synchronisation event between threads #4 and #5 that would have
+allowed #5 to acquire exclusive ownership from #4.  See
+<link linkend="tc-manual.data-races.exclusive">above</link>
+for a discussion of transfers of exclusive ownership states between
+threads.</para>
+
+</sect2>
+
+
+</sect1>
+
+<sect1 id="tc-manual.effective-use" xreflabel="Thrcheck Effective Use">
+<title>Hints and Tips for Effective Use of Thrcheck</title>
+
+<para>Thrcheck can be very helpful in finding and resolving
+threading-related problems.  Like all sophisticated tools, it is most
+effective when you understand how to play to its strengths.</para>
+
+<para>Thrcheck will be less effective when you merely throw an
+existing threaded program at it and try to make sense of any reported
+errors.  It will be more effective if you design threaded programs
+from the start in a way that helps Thrcheck verify correctness.  The
+same is true for finding memory errors with Memcheck, but applies more
+here, because thread checking is a harder problem.  Consequently it is
+much easier to write a correct program for which Thrcheck falsely
+reports (threading) errors than it is to write a correct program for
+which Memcheck falsely reports (memory) errors.</para>
+
+<para>With that in mind, here are some tips, listed most important first,
+for getting reliable results and avoiding false errors.  The first two
+are critical.  Any violations of them will swamp you with huge numbers
+of false data-race errors.</para>
+
+
+<orderedlist>
+
+  <listitem>
+    <para>Make sure your application, and all the libraries it uses,
+    use the POSIX threading primitives.  Thrcheck needs to be able to
+    see all events pertaining to thread creation, exit, locking and
+    other syncronisation events.  To do so it intercepts many POSIX
+    pthread_ functions.</para>
+
+    <para>Do not roll your own threading primitives (mutexes, etc)
+    from combinations of the Linux futex syscall, counters and wotnot.
+    These throw Thrcheck's internal what's-going-on models way off
+    course and will give bogus results.</para>
+
+    <para>Also, do not reimplement existing POSIX abstractions using
+    other POSIX abstractions.  For example, don't build your own
+    semaphore routines or reader-writer locks from POSIX mutexes and
+    condition variables.  Instead use POSIX reader-writer locks and
+    semaphores directly, since Thrcheck supports them directly.</para>
+
+    <para>Thrcheck directly supports the following POSIX threading
+    abstractions: mutexes, reader-writer locks, condition variables
+    (but see below), and semaphores.  Currently spinlocks and barriers
+    are not supported, although they could be in future.  A prototype
+    "safe" implementation of barriers, based on semaphores, is
+    available: please contact the Valgrind authors for details.</para>
+
+    <para>At the time of writing, the following popular Linux packages
+    are known to implement their own threading primitives:</para>
+
+    <itemizedlist>
+      <listitem><para>Qt version 4.X.  Qt 3.X is fine, but not 4.X.
+      Thrcheck contains partial direct support for Qt 4.X threading,
+      but this is not yet in a usable state.  Assistance from folks
+      knowledgeable in Qt 4 threading internals would be
+      appreciated.</para></listitem>
+
+      <listitem><para>Runtime support library for GNU OpenMP (part of
+      GCC), at least GCC versions 4.2 and 4.3.  With some minor effort
+      of modifying the GNU OpenMP runtime support sources, it is
+      possible to use Thrcheck on GNU OpenMP compiled codes.  Please
+      contact the Valgrind authors for details.</para></listitem>
+    </itemizedlist>
+  </listitem>
+
+  <listitem>
+    <para>Avoid memory recycling.  If you can't avoid it, you must use
+    tell Thrcheck what is going on via the VALGRIND_HG_CLEAN_MEMORY
+    client request
+    (in <computeroutput>thrcheck.h</computeroutput>).</para>
+
+    <para>Thrcheck is aware of standard memory allocation and
+    deallocation that occurs via malloc/free/new/delete and from entry
+    and exit of stack frames.  In particular, when memory is
+    deallocated via free, delete, or function exit, Thrcheck considers
+    that memory clean, so when it is eventually reallocated, its
+    history is irrelevant.</para>
+
+    <para>However, it is common practice to implement memory recycling
+    schemes.  In these, memory to be freed is not handed to
+    malloc/delete, but instead put into a pool of free buffers to be
+    handed out again as required.  The problem is that Thrcheck has no
+    way to know that such memory is logically no longer in use, and
+    its history is irrelevant.  Hence you must make that explicit,
+    using the VALGRIND_HG_CLEAN_MEMORY client request to specify the
+    relevant address ranges.  It's easiest to put these requests into
+    the pool manager code, and use them either when memory is returned
+    to the pool, or is allocated from it.</para>
+  </listitem>
+
+  <listitem>
+    <para>Avoid POSIX condition variables.  If you can, use POSIX
+    semaphores (sem_t, sem_post, sem_wait) to do inter-thread event
+    signalling.  Semaphores with an initial value of zero are
+    particularly useful for this.</para>
+
+    <para>Thrcheck only partially correctly handles POSIX condition
+    variables.  This is because Thrcheck can see inter-thread
+    dependencies between a pthread_cond_wait call and a
+    pthread_cond_signal/broadcast call only if the waiting thread
+    actually gets to the rendezvous first (so that it actually calls
+    pthread_cond_wait).  It can't see dependencies between the threads
+    if the signaller arrives first.  In the latter case, POSIX
+    guidelines imply that the associated boolean condition still
+    provides an inter-thread synchronisation event, but one which is
+    invisible to Thrcheck.</para>
+
+    <para>The result of Thrcheck missing some inter-thread
+    synchronisation events is to cause it to report false positives.
+    That's because missing such events reduces the extent to which it
+    can transfer exclusive memory ownership between threads.  So
+    memory may end up in a shared-modified state when that was not
+    intended by the application programmers.</para>
+
+    <para>The root cause of this synchronisation lossage is
+    particularly hard to understand, so an example is helpful.  It was
+    discussed at length by Arndt Muehlenfeld ("Runtime Race Detection
+    in Multi-Threaded Programs", Dissertation, TU Graz, Austria).  The
+    canonical POSIX-recommended usage scheme for condition variables
+    is as follows:</para>
+
+<programlisting><![CDATA[
+b   is a Boolean condition, which is False most of the time
+cv  is a condition variable
+mx  is its associated mutex
+
+Signaller:                             Waiter:
+
+lock(mx)                               lock(mx)
+b = True                               while (b == False)
+signal(cv)                                wait(cv,mx)
+unlock(mx)                             unlock(mx)
+]]></programlisting>
+
+    <para>Assume <computeroutput>b</computeroutput> is False most of
+    the time.  If the waiter arrives at the rendezvous first, it
+    enters its while-loop, waits for the signaller to signal, and
+    eventually proceeds.  Thrcheck sees the signal, notes the
+    dependency, and all is well.</para>
+
+    <para>If the signaller arrives
+    first, <computeroutput>b</computeroutput> is set to true, and the
+    signal disappears into nowhere.  When the waiter later arrives, it
+    does not enter its while-loop and simply carries on.  But even in
+    this case, the waiter code following the while-loop cannot execute
+    until the signaller sets <computeroutput>b</computeroutput> to
+    True.  Hence there is still the same inter-thread dependency, but
+    this time it is through an arbitrary in-memory condition, and
+    Thrcheck cannot see it.</para>
+
+    <para>By comparison, Thrcheck's detection of inter-thread
+    dependencies caused by semaphore operations is believed to be
+    exactly correct.</para>
+
+    <para>As far as I know, a solution to this problem that does not
+    require source-level annotation of condition-variable wait loops
+    is beyond the current state of the art.</para>
+  </listitem>
+
+  <listitem>
+    <para>Make sure you are using a supported Linux distribution.  At
+    present, Thrcheck only properly supports x86-linux and amd64-linux
+    with glibc-2.3 or later.  The latter restriction means we only
+    support glibc's NPTL threading implementation.  The old
+    LinuxThreads implementation is not supported.</para>
+
+    <para>Unsupported targets may work to varying degrees.  In
+    particular ppc32-linux and ppc64-linux running NTPL should work,
+    but you will get false race errors because Thrcheck does not know
+    how to properly handle atomic instruction sequences created using
+    the lwarx/stwcx instructions.</para>
+  </listitem>
+
+  <listitem>
+    <para>Round up all finished threads using pthread_join.  Avoid
+    detaching threads: don't create threads in the detached state, and
+    don't call pthread_detach on existing threads.</para>
+
+    <para>Using pthread_join to round up finished threads provides a
+    clear synchronisation point that both Thrcheck and programmers can
+    see.  This synchronisation point allows Thrcheck to adjust its
+    memory ownership
+    models <link linkend="tc-manual.data-races.exclusive">as described
+    extensively above</link>, which helps Thrcheck produce more
+    accurate error reports.</para>
+
+    <para>If you don't call pthread_join on a thread, Thrcheck has no
+    way to know when it finishes, relative to any significant
+    synchronisation points for other threads in the program.  So it
+    assumes that the thread lingers indefinitely and can potentially
+    interfere indefinitely with the memory state of the program.  It
+    has every right to assume that -- after all, it might really be
+    the case that, for scheduling reasons, the exiting thread did run
+    very slowly in the last stages of its life.</para>
+  </listitem>
+
+  <listitem>
+    <para>Perform thread debugging (with Thrcheck) and memory
+    debugging (with Memcheck) together.</para>
+
+    <para>Thrcheck tracks the state of memory in detail, and memory
+    management bugs in the application are liable to cause confusion.
+    In extreme cases, applications which do many invalid reads and
+    writes (particularly to freed memory) have been known to crash
+    Thrcheck.  So, ideally, you should make your application
+    Memcheck-clean before using Thrcheck.</para>
+
+    <para>It may be impossible to make your application Memcheck-clean
+    unless you first remove threading bugs.  In particular, it may be
+    difficult to remove all reads and writes to freed memory in
+    multithreaded C++ destructor sequences at program termination.
+    So, ideally, you should make your application Thrcheck-clean
+    before using Memcheck.</para>
+
+    <para>Since this circularity is obviously unresolvable, at least
+    bear in mind that Memcheck and Thrcheck are to some extent
+    complementary, and you may need to use them together.</para>
+  </listitem>
+
+  <listitem>
+    <para>POSIX requires that implementations of standard I/O (printf,
+    fprintf, fwrite, fread, etc) are thread safe.  Unfortunately GNU
+    libc implements this by using internal locking primitives that
+    Thrcheck is unable to intercept.  Consequently Thrcheck generates
+    many false race reports when you use these functions.</para>
+
+    <para>Thrcheck attempts to hide these errors using the standard
+    Valgrind error-suppression mechanism.  So, at least for simple
+    test cases, you don't see any.  Nevertheless, some may slip
+    through.  Just something to be aware of.</para>
+  </listitem>
+
+  <listitem>
+    <para>Thrcheck's error checks do not work properly inside the
+    system threading library itself
+    (<computeroutput>libpthread.so</computeroutput>), and it usually
+    observes large numbers of (false) errors in there.  Valgrind's
+    suppression system then filters these out, so you should not see
+    them.</para>
+
+    <para>If you see any race errors reported
+    where <computeroutput>libpthread.so</computeroutput> or
+    <computeroutput>ld.so</computeroutput> is the object associated
+    with the innermost stack frame, please file a bug report at
+    http://www.valgrind.org.</para>
+  </listitem>
+
+</orderedlist>
+
+</sect1>
+
+
+
+
+<sect1 id="tc-manual.options" xreflabel="Thrcheck Options">
+<title>Thrcheck Options</title>
+
+<para>The following end-user options are available:</para>
+
+<!-- start of xi:include in the manpage -->
+<variablelist id="tc.opts.list">
+
+  <varlistentry id="opt.happens-before" xreflabel="--happens-before">
+    <term>
+      <option><![CDATA[--happens-before=none|threads|all
+      [default: all] ]]></option>
+    </term>
+    <listitem>
+      <para>Thrcheck always regards locks as the basis for
+       inter-thread synchronisation.  However, by default, before
+       reporting a race error, Thrcheck will also check whether
+       certain other kinds of inter-thread synchronisation events
+       happened.  It may be that if such events took place, then no
+       race really occurred, and so no error needs to be reported.
+       See <link linkend="tc-manual.data-races.exclusive">above</link>
+       for a discussion of transfers of exclusive ownership states
+       between threads.
+      </para>
+      <para>With <varname>--happens-before=all</varname>, the
+       following events are regarded as sources of synchronisation:
+       thread creation/joinage, condition variable
+       signal/broadcast/waits, and semaphore posts/waits.
+      </para>
+      <para>With <varname>--happens-before=threads</varname>, only
+       thread creation/joinage events are regarded as sources of
+       synchronisation.
+      </para>
+      <para>With <varname>--happens-before=none</varname>, no events
+       (apart, of course, from locking) are regarded as sources of
+       synchronisation.
+      </para>
+      <para>Changing this setting from the default will increase your
+       false-error rate but give little or no gain.  The only advantage
+       is that <option>--happens-before=threads</option> and 
+       <option>--happens-before=none</option> should make Thrcheck
+       less and less sensitive to the scheduling of threads, and hence
+       the output more and more repeatable across runs.
+      </para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry id="opt.trace-addr" xreflabel="--trace-addr">
+    <term>
+      <option><![CDATA[--trace-addr=0xXXYYZZ
+      ]]></option> and
+      <option><![CDATA[--trace-level=0|1|2 [default: 1]
+      ]]></option>
+    </term>
+    <listitem>
+      <para>Requests that Thrcheck produces a log of all state changes
+      to location 0xXXYYZZ.  This can be helpful in tracking down
+      tricky races.  <varname>--trace-level</varname> controls the
+      verbosity of the log.  At the default setting (1), a one-line
+      summary of is printed for each state change.  At level 2 a
+      complete stack trace is printed for each state change.</para>
+    </listitem>
+  </varlistentry>
+
+</variablelist>
+<!-- end of xi:include in the manpage -->
+
+<!-- start of xi:include in the manpage -->
+<para>In addition, the following debugging options are available for
+Thrcheck:</para>
+
+<variablelist id="tc.debugopts.list">
+
+  <varlistentry id="opt.trace-malloc" xreflabel="--trace-malloc">
+    <term>
+      <option><![CDATA[--trace-malloc=no|yes [no]
+      ]]></option>
+    </term>
+    <listitem>
+      <para>Show all client malloc (etc) and free (etc) requests.</para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry id="opt.gen-vcg" xreflabel="--gen-vcg">
+    <term>
+      <option><![CDATA[--gen-vcg=no|yes|yes-w-vts [no]
+      ]]></option>
+    </term>
+    <listitem>
+      <para>At exit, write to stderr a dump of the happens-before
+	graph computed by Thrcheck, in a format suitable for the VCG 
+        graph visualisation tool.  A suitable command line is:</para>
+      <para><computeroutput>valgrind --tool=thrcheck 
+        --gen-vcg=yes my_app 2&gt;&amp;1
+        | grep xxxxxx | sed "s/xxxxxx//g"
+        | xvcg -</computeroutput></para>
+      <para>With <varname>--gen-vcg=yes</varname>, the basic
+        happens-before graph is shown.  With 
+        <varname>--gen-vcg=yes-w-vts</varname>, the vector timestamp 
+        for each node is also shown.</para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry id="opt.cmp-race-err-addrs" 
+                xreflabel="--cmp-race-err-addrs">
+    <term>
+      <option><![CDATA[--cmp-race-err-addrs=no|yes [no]
+      ]]></option>
+    </term>
+    <listitem>
+      <para>Controls whether or not race (data) addresses should be
+        taken into account when removing duplicates of race errors.
+        With <varname>--cmp-race-err-addrs=no</varname>, two otherwise
+        identical race errors will be considered to be the same if
+        their race addresses differ.  With
+        With <varname>--cmp-race-err-addrs=yes</varname> they will be
+        considered different.  This is provided to help make certain
+        regression tests work reliably.</para>
+    </listitem>
+  </varlistentry>
+
+  <varlistentry id="opt.tc-sanity-flags" xreflabel="--tc-sanity-flags">
+    <term>
+      <option><![CDATA[--tc-sanity-flags=<XXXXX> (X = 0|1) [00000]
+      ]]></option>
+    </term>
+    <listitem>
+      <para>Run extensive sanity checks on Thrcheck's internal
+        data structures at events defined by the bitstring, as
+        follows:</para>
+      <para><computeroutput>10000 </computeroutput>after changes to
+        the lock order acquisition graph</para>
+      <para><computeroutput>01000 </computeroutput>after every client
+        memory access (NB: not currently used)</para>
+      <para><computeroutput>00100 </computeroutput>after every client
+        memory range permission setting of 256 bytes or greater</para>
+      <para><computeroutput>00010 </computeroutput>after every client
+        lock or unlock event</para>
+      <para><computeroutput>00001 </computeroutput>after every client
+        thread creation or joinage event</para>
+      <para>Note these will make Thrcheck run very slowly, often to
+        the point of being completely unusable.</para>
+    </listitem>
+  </varlistentry>
+
+</variablelist>
+<!-- end of xi:include in the manpage -->
+
+
+</sect1>
+
+<sect1 id="tc-manual.todolist" xreflabel="To Do List">
+<title>A To-Do List for Thrcheck</title>
+
+<para>The following is a list of loose ends which should be tidied up
+some time.</para>
+
+<itemizedlist>
+  <listitem><para>Track which mutexes are associated with which
+    condition variables, and emit a warning if this becomes
+    inconsistent.</para>
+  </listitem>
+  <listitem><para>For lock order errors, print the complete lock
+    cycle, rather than only doing for size-2 cycles as at
+    present.</para>
+  </listitem>
+  <listitem><para>Document the VALGRIND_HG_CLEAN_MEMORY client
+    request.</para>
+  </listitem>
+  <listitem><para>Possibly a client request to forcibly transfer
+    ownership of memory from one thread to another.  Requires further
+    consideration.</para>
+  </listitem>
+  <listitem><para>Add a new client request that marks an address range
+    as being "shared-modified with empty lockset" (the error state),
+    and describe how to use it.</para>
+  </listitem>
+  <listitem><para>Document races caused by gcc's thread-unsafe code
+    generation for speculative stores.  In the interim see
+    <computeroutput>http://gcc.gnu.org/ml/gcc/2007-10/msg00266.html
+    </computeroutput>
+    and <computeroutput>http://lkml.org/lkml/2007/10/24/673</computeroutput>.
+    </para>
+  </listitem>
+  <listitem><para>Don't update the lock-order graph, and don't check
+    for errors, when a "try"-style lock operation happens (eg
+    pthread_mutex_trylock).  Such calls do not add any real
+    restrictions to the locking order, since they can always fail to
+    acquire the lock, resulting in the caller going off and doing Plan
+    B (presumably it will have a Plan B).  Doing such checks could
+    generate false lock-order errors and confuse users.</para>
+  </listitem>
+  <listitem><para> Performance can be very poor.  Slowdowns on the
+    order of 100:1 are not unusual.  There is quite some scope for
+    performance improvements, though.
+    </para>
+  </listitem>
+
+</itemizedlist>
+
+</sect1>
+
+</chapter>
diff --git a/helgrind/helgrind.h b/helgrind/helgrind.h
new file mode 100644
index 0000000..b2f6ed3
--- /dev/null
+++ b/helgrind/helgrind.h
@@ -0,0 +1,109 @@
+/*
+   ----------------------------------------------------------------
+
+   Notice that the above BSD-style license applies to this one file
+   (helgrind.h) only.  The entire rest of Valgrind is licensed under
+   the terms of the GNU General Public License, version 2.  See the
+   COPYING file in the source distribution for details.
+
+   ----------------------------------------------------------------
+
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 OpenWorks LLP
+      info@open-works.co.uk
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. The origin of this software must not be misrepresented; you must 
+      not claim that you wrote the original software.  If you use this 
+      software in a product, an acknowledgment in the product 
+      documentation would be appreciated but is not required.
+
+   3. Altered source versions must be plainly marked as such, and must
+      not be misrepresented as being the original software.
+
+   4. The name of the author may not be used to endorse or promote 
+      products derived from this software without specific prior written 
+      permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+   ----------------------------------------------------------------
+
+   Notice that the above BSD-style license applies to this one file
+   (helgrind.h) only.  The entire rest of Valgrind is licensed under
+   the terms of the GNU General Public License, version 2.  See the
+   COPYING file in the source distribution for details.
+
+   ---------------------------------------------------------------- 
+*/
+
+#ifndef __HELGRIND_H
+#define __HELGRIND_H
+
+#include "valgrind.h"
+
+typedef
+   enum {
+      VG_USERREQ__HG_CLEAN_MEMORY = VG_USERREQ_TOOL_BASE('H','G'),
+
+      /* The rest are for Helgrind's internal use.  Not for end-user
+         use.  Do not use them unless you are a Valgrind developer. */
+
+      /* Notify the tool what this thread's pthread_t is. */
+      _VG_USERREQ__HG_SET_MY_PTHREAD_T = VG_USERREQ_TOOL_BASE('H','G') 
+                                         + 256,
+      _VG_USERREQ__HG_PTH_API_ERROR,              /* char*, int */
+      _VG_USERREQ__HG_PTHREAD_JOIN_POST,          /* pthread_t of quitter */
+      _VG_USERREQ__HG_PTHREAD_MUTEX_INIT_POST,    /* pth_mx_t*, long mbRec */
+      _VG_USERREQ__HG_PTHREAD_MUTEX_DESTROY_PRE,  /* pth_mx_t* */
+      _VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,   /* pth_mx_t* */
+      _VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST,  /* pth_mx_t* */
+      _VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE, /* pth_mx_t*, long isTryLock */
+      _VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,    /* pth_mx_t* */
+      _VG_USERREQ__HG_PTHREAD_COND_SIGNAL_PRE,    /* pth_cond_t* */
+      _VG_USERREQ__HG_PTHREAD_COND_BROADCAST_PRE, /* pth_cond_t* */
+      _VG_USERREQ__HG_PTHREAD_COND_WAIT_PRE,     /* pth_cond_t*, pth_mx_t* */
+      _VG_USERREQ__HG_PTHREAD_COND_WAIT_POST,    /* pth_cond_t*, pth_mx_t* */
+      _VG_USERREQ__HG_PTHREAD_RWLOCK_INIT_POST,   /* pth_rwlk_t* */
+      _VG_USERREQ__HG_PTHREAD_RWLOCK_DESTROY_PRE, /* pth_rwlk_t* */
+      _VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE,    /* pth_rwlk_t*, long isW */
+      _VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,   /* pth_rwlk_t*, long isW */
+      _VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_PRE,  /* pth_rwlk_t* */
+      _VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_POST, /* pth_rwlk_t* */
+      _VG_USERREQ__HG_POSIX_SEMPOST_PRE,          /* sem_t* */
+      _VG_USERREQ__HG_POSIX_SEMWAIT_POST,         /* sem_t* */
+      _VG_USERREQ__HG_POSIX_SEM_ZAPSTACK,         /* sem_t* */
+      _VG_USERREQ__HG_GET_MY_SEGMENT              /* -> Segment* */
+   } Vg_TCheckClientRequest;
+
+/* Clean memory state.  This makes Helgrind forget everything it knew
+   about the specified memory range, and resets it to New.  This is
+   particularly useful for memory allocators that wish to recycle
+   memory. */
+#define VALGRIND_HG_CLEAN_MEMORY(_qzz_start, _qzz_len)                    \
+   do {                                                                   \
+     unsigned long _qzz_res;                                              \
+     VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0, VG_USERREQ__HG_CLEAN_MEMORY, \
+                                _qzz_start, _qzz_len, 0, 0, 0);	          \
+     (void)0;                                                             \
+   } while(0)
+
+#endif /* __HELGRIND_H */
diff --git a/helgrind/hg_intercepts.c b/helgrind/hg_intercepts.c
new file mode 100644
index 0000000..10be82b
--- /dev/null
+++ b/helgrind/hg_intercepts.c
@@ -0,0 +1,1219 @@
+
+/*--------------------------------------------------------------------*/
+/*--- pthread intercepts for thread checking.                      ---*/
+/*---                                              tc_intercepts.c ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 OpenWorks LLP
+      info@open-works.co.uk
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+
+   Neither the names of the U.S. Department of Energy nor the
+   University of California nor the names of its contributors may be
+   used to endorse or promote products derived from this software
+   without prior written permission.
+*/
+
+/* RUNS ON SIMULATED CPU
+   Interceptors for pthread_* functions, so that tc_main can see
+   significant thread events. 
+
+   Important: when adding a function wrapper to this file, remember to
+   add a test case to tc20_verifywrap.c.  A common cause of failure is
+   for wrappers to not engage on different distros, and
+   tc20_verifywrap essentially checks that each wrapper is really
+   doing something.
+*/
+
+#include "pub_tool_basics.h"
+#include "valgrind.h"
+#include "helgrind.h"
+
+#define TRACE_PTH_FNS 0
+#define TRACE_QT4_FNS 0
+
+
+/*----------------------------------------------------------------*/
+/*---                                                          ---*/
+/*----------------------------------------------------------------*/
+
+#define PTH_FUNC(ret_ty, f, args...) \
+   ret_ty I_WRAP_SONAME_FNNAME_ZZ(libpthreadZdsoZd0,f)(args); \
+   ret_ty I_WRAP_SONAME_FNNAME_ZZ(libpthreadZdsoZd0,f)(args)
+
+// Do a client request.  This is a macro rather than a function 
+// so as to avoid having an extra function in the stack trace.
+
+#define DO_CREQ_v_W(_creqF, _ty1F,_arg1F)                \
+   do {                                                  \
+      Word _unused_res, _arg1;                           \
+      assert(sizeof(_ty1F) == sizeof(Word));             \
+      _arg1 = (Word)(_arg1F);                            \
+      VALGRIND_DO_CLIENT_REQUEST(_unused_res, 0,         \
+                                 (_creqF),               \
+                                 _arg1, 0,0,0,0);        \
+   } while (0)
+
+#define DO_CREQ_v_WW(_creqF, _ty1F,_arg1F, _ty2F,_arg2F) \
+   do {                                                  \
+      Word _unused_res, _arg1, _arg2;                    \
+      assert(sizeof(_ty1F) == sizeof(Word));             \
+      assert(sizeof(_ty2F) == sizeof(Word));             \
+      _arg1 = (Word)(_arg1F);                            \
+      _arg2 = (Word)(_arg2F);                            \
+      VALGRIND_DO_CLIENT_REQUEST(_unused_res, 0,         \
+                                 (_creqF),               \
+                                 _arg1,_arg2,0,0,0);     \
+   } while (0)
+
+#define DO_CREQ_W_WW(_resF, _creqF, _ty1F,_arg1F, _ty2F,_arg2F)	\
+   do {                                                  \
+      Word _res, _arg1, _arg2;                           \
+      assert(sizeof(_ty1F) == sizeof(Word));             \
+      assert(sizeof(_ty2F) == sizeof(Word));             \
+      _arg1 = (Word)(_arg1F);                            \
+      _arg2 = (Word)(_arg2F);                            \
+      VALGRIND_DO_CLIENT_REQUEST(_res, 2,                \
+                                 (_creqF),               \
+                                 _arg1,_arg2,0,0,0);     \
+      _resF = _res;                                      \
+   } while (0)
+
+#define DO_CREQ_v_WWW(_creqF, _ty1F,_arg1F,              \
+		      _ty2F,_arg2F, _ty3F, _arg3F)       \
+   do {                                                  \
+      Word _unused_res, _arg1, _arg2, _arg3;             \
+      assert(sizeof(_ty1F) == sizeof(Word));             \
+      assert(sizeof(_ty2F) == sizeof(Word));             \
+      assert(sizeof(_ty3F) == sizeof(Word));             \
+      _arg1 = (Word)(_arg1F);                            \
+      _arg2 = (Word)(_arg2F);                            \
+      _arg3 = (Word)(_arg3F);                            \
+      VALGRIND_DO_CLIENT_REQUEST(_unused_res, 0,         \
+                                 (_creqF),               \
+                                 _arg1,_arg2,_arg3,0,0); \
+   } while (0)
+
+
+#define DO_PthAPIerror(_fnnameF, _errF)                  \
+   do {                                                  \
+      char* _fnname = (char*)(_fnnameF);                 \
+      long  _err    = (long)(int)(_errF);	         \
+      char* _errstr = lame_strerror(_err);               \
+      DO_CREQ_v_WWW(_VG_USERREQ__HG_PTH_API_ERROR,       \
+                    char*,_fnname,                       \
+                    long,_err, char*,_errstr);           \
+   } while (0)
+
+
+/* Needed for older glibcs (2.3 and older, at least) who don't
+   otherwise "know" about pthread_rwlock_anything or about
+   PTHREAD_MUTEX_RECURSIVE (amongst things). */
+#define _GNU_SOURCE 1
+
+#include <stdio.h>
+#include <assert.h>
+#include <errno.h>
+#include <pthread.h>
+
+
+/* A lame version of strerror which doesn't use the real libc
+   strerror_r, since using the latter just generates endless more
+   threading errors (glibc goes off and does tons of crap w.r.t.
+   locales etc) */
+static char* lame_strerror ( long err )
+{   switch (err) {
+      case EPERM:       return "EPERM: Operation not permitted";
+      case ENOENT:      return "ENOENT: No such file or directory";
+      case ESRCH:       return "ESRCH: No such process";
+      case EINTR:       return "EINTR: Interrupted system call";
+      case EBADF:       return "EBADF: Bad file number";
+      case EAGAIN:      return "EAGAIN: Try again";
+      case ENOMEM:      return "ENOMEM: Out of memory";
+      case EACCES:      return "EACCES: Permission denied";
+      case EFAULT:      return "EFAULT: Bad address";
+      case EEXIST:      return "EEXIST: File exists";
+      case EINVAL:      return "EINVAL: Invalid argument";
+      case EMFILE:      return "EMFILE: Too many open files";
+      case ENOSYS:      return "ENOSYS: Function not implemented";
+      case EOVERFLOW:   return "EOVERFLOW: Value too large "
+                               "for defined data type";
+      case EBUSY:       return "EBUSY: Device or resource busy";
+      case ETIMEDOUT:   return "ETIMEDOUT: Connection timed out";
+      case EDEADLK:     return "EDEADLK: Resource deadlock would occur";
+      case EOPNOTSUPP:  return "EOPNOTSUPP: Operation not supported on "
+                               "transport endpoint"; /* honest, guv */
+      default:          return "tc_intercepts.c: lame_strerror(): "
+                               "unhandled case -- please fix me!";
+   }
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- pthread_create, pthread_join, pthread_exit               ---*/
+/*----------------------------------------------------------------*/
+
+static void* mythread_wrapper ( void* xargsV )
+{
+   volatile Word volatile* xargs = (volatile Word volatile*) xargsV;
+   void*(*fn)(void*) = (void*(*)(void*))xargs[0];
+   void* arg         = (void*)xargs[1];
+   pthread_t me = pthread_self();
+   /* Tell the tool what my pthread_t is. */
+   DO_CREQ_v_W(_VG_USERREQ__HG_SET_MY_PTHREAD_T, pthread_t,me);
+   /* allow the parent to proceed.  We can't let it proceed until
+      we're ready because (1) we need to make sure it doesn't exit and
+      hence deallocate xargs[] while we still need it, and (2) we
+      don't want either parent nor child to proceed until the tool has
+      been notified of the child's pthread_t. */
+   xargs[2] = 0;
+   /* Now we can no longer safely use xargs[]. */
+   return (void*) fn( (void*)arg );
+}
+
+// pthread_create
+PTH_FUNC(int, pthreadZucreateZAZa, // pthread_create@*
+              pthread_t *thread, const pthread_attr_t *attr,
+              void *(*start) (void *), void *arg)
+{
+   int    ret;
+   OrigFn fn;
+   volatile Word xargs[3];
+
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_create wrapper"); fflush(stderr);
+   }
+   xargs[0] = (Word)start;
+   xargs[1] = (Word)arg;
+   xargs[2] = 1; /* serves as a spinlock -- sigh */
+
+   CALL_FN_W_WWWW(ret, fn, thread,attr,mythread_wrapper,&xargs[0]);
+
+   if (ret == 0) {
+      /* we have to wait for the child to notify the tool of its
+         pthread_t before continuing */
+      while (xargs[2] != 0) {
+         // FIXME: add a yield client request
+         /* do nothing */
+      }
+   } else { 
+      DO_PthAPIerror( "pthread_create", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: pth_create -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+// pthread_join
+PTH_FUNC(int, pthreadZujoin, // pthread_join
+              pthread_t thread, void** value_pointer)
+{
+   int ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_join wrapper"); fflush(stderr);
+   }
+
+   CALL_FN_W_WW(ret, fn, thread,value_pointer);
+
+   /* At least with NPTL as the thread library, this is safe because
+      it is guaranteed (by NPTL) that the joiner will completely gone
+      before pthread_join (the original) returns.  See email below.*/
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_JOIN_POST, pthread_t,thread);
+   } else { 
+      DO_PthAPIerror( "pthread_join", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: pth_join -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+/* Behaviour of pthread_join on NPTL:
+
+Me:
+I have a question re the NPTL pthread_join implementation.
+
+  Suppose I am the thread 'stayer'.  
+
+  If I call pthread_join(quitter), is it guaranteed that the
+  thread 'quitter' has really exited before pthread_join returns?
+
+  IOW, is it guaranteed that 'quitter' will not execute any further
+  instructions after pthread_join returns?
+
+I believe this is true based on the following analysis of
+glibc-2.5 sources.  However am not 100% sure and would appreciate
+confirmation.
+
+  'quitter' will be running start_thread() in nptl/pthread_create.c
+
+  The last action of start_thread() is to exit via
+  __exit_thread_inline(0), which simply does sys_exit 
+  (nptl/pthread_create.c:403)
+
+  'stayer' meanwhile is waiting for lll_wait_tid (pd->tid) 
+  (call at nptl/pthread_join.c:89)
+
+  As per comment at nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h:536,
+  lll_wait_tid will not return until kernel notifies via futex
+  wakeup that 'quitter' has terminated.
+
+  Hence pthread_join cannot return until 'quitter' really has
+  completely disappeared.
+
+Drepper:
+>   As per comment at nptl/sysdeps/unix/sysv/linux/i386/lowlevellock.h:536,
+>   lll_wait_tid will not return until kernel notifies via futex
+>   wakeup that 'quitter' has terminated.
+That's the key.  The kernel resets the TID field after the thread is
+done.  No way the joiner can return before the thread is gone.
+*/
+
+
+/*----------------------------------------------------------------*/
+/*--- pthread_mutex_t functions                                ---*/
+/*----------------------------------------------------------------*/
+
+/* Handled:   pthread_mutex_init pthread_mutex_destroy
+              pthread_mutex_lock
+              pthread_mutex_trylock pthread_mutex_timedlock
+              pthread_mutex_unlock
+
+   Unhandled: pthread_spin_init pthread_spin_destroy 
+              pthread_spin_lock
+              pthread_spin_trylock
+              pthread_spin_unlock
+*/
+
+// pthread_mutex_init
+PTH_FUNC(int, pthreadZumutexZuinit, // pthread_mutex_init
+              pthread_mutex_t *mutex,
+              pthread_mutexattr_t* attr)
+{
+   int    ret;
+   long   mbRec;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_mxinit %p", mutex); fflush(stderr);
+   }
+
+   mbRec = 0;
+   if (attr) {
+      int ty, zzz;
+      zzz = pthread_mutexattr_gettype(attr, &ty);
+      if (zzz == 0 && ty == PTHREAD_MUTEX_RECURSIVE)
+         mbRec = 1;
+   }
+
+   CALL_FN_W_WW(ret, fn, mutex,attr);
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_INIT_POST,
+                   pthread_mutex_t*,mutex, long,mbRec);
+   } else { 
+      DO_PthAPIerror( "pthread_mutex_init", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: mxinit -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+// pthread_mutex_destroy
+PTH_FUNC(int, pthreadZumutexZudestroy, // pthread_mutex_destroy
+              pthread_mutex_t *mutex)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_mxdestroy %p", mutex); fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_DESTROY_PRE,
+               pthread_mutex_t*,mutex);
+
+   CALL_FN_W_W(ret, fn, mutex);
+
+   if (ret != 0) {
+      DO_PthAPIerror( "pthread_mutex_destroy", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: mxdestroy -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+// pthread_mutex_lock
+PTH_FUNC(int, pthreadZumutexZulock, // pthread_mutex_lock
+              pthread_mutex_t *mutex)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_mxlock %p", mutex); fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,
+                pthread_mutex_t*,mutex, long,0/*!isTryLock*/);
+
+   CALL_FN_W_W(ret, fn, mutex);
+
+   /* There's a hole here: libpthread now knows the lock is locked,
+      but the tool doesn't, so some other thread could run and detect
+      that the lock has been acquired by someone (this thread).  Does
+      this matter?  Not sure, but I don't think so. */
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+                  pthread_mutex_t*,mutex);
+   } else { 
+      DO_PthAPIerror( "pthread_mutex_lock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: mxlock -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+// pthread_mutex_trylock.  The handling needed here is very similar
+// to that for pthread_mutex_lock, except that we need to tell
+// the pre-lock creq that this is a trylock-style operation, and
+// therefore not to complain if the lock is nonrecursive and 
+// already locked by this thread -- because then it'll just fail
+// immediately with EBUSY.
+PTH_FUNC(int, pthreadZumutexZutrylock, // pthread_mutex_trylock
+              pthread_mutex_t *mutex)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_mxtrylock %p", mutex); fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,
+                pthread_mutex_t*,mutex, long,1/*isTryLock*/);
+
+   CALL_FN_W_W(ret, fn, mutex);
+
+   /* There's a hole here: libpthread now knows the lock is locked,
+      but the tool doesn't, so some other thread could run and detect
+      that the lock has been acquired by someone (this thread).  Does
+      this matter?  Not sure, but I don't think so. */
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+                  pthread_mutex_t*,mutex);
+   } else { 
+      if (ret != EBUSY)
+         DO_PthAPIerror( "pthread_mutex_trylock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: mxtrylock -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+// pthread_mutex_timedlock.  Identical logic to pthread_mutex_trylock.
+PTH_FUNC(int, pthreadZumutexZutimedlock, // pthread_mutex_timedlock
+	 pthread_mutex_t *mutex,
+         void* timeout)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_mxtimedlock %p %p", mutex, timeout); 
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,
+                pthread_mutex_t*,mutex, long,1/*isTryLock-ish*/);
+
+   CALL_FN_W_WW(ret, fn, mutex,timeout);
+
+   /* There's a hole here: libpthread now knows the lock is locked,
+      but the tool doesn't, so some other thread could run and detect
+      that the lock has been acquired by someone (this thread).  Does
+      this matter?  Not sure, but I don't think so. */
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+                  pthread_mutex_t*,mutex);
+   } else { 
+      if (ret != ETIMEDOUT)
+         DO_PthAPIerror( "pthread_mutex_timedlock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: mxtimedlock -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+// pthread_mutex_unlock
+PTH_FUNC(int, pthreadZumutexZuunlock, // pthread_mutex_unlock
+              pthread_mutex_t *mutex)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_mxunlk %p", mutex); fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,
+               pthread_mutex_t*,mutex);
+
+   CALL_FN_W_W(ret, fn, mutex);
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST,
+                  pthread_mutex_t*,mutex);
+   } else { 
+      DO_PthAPIerror( "pthread_mutex_unlock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " mxunlk -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- pthread_cond_t functions                                 ---*/
+/*----------------------------------------------------------------*/
+
+/* Handled:   pthread_cond_wait pthread_cond_timedwait
+              pthread_cond_signal pthread_cond_broadcast
+
+   Unhandled: pthread_cond_init pthread_cond_destroy
+              -- are these important?
+*/
+
+// pthread_cond_wait
+PTH_FUNC(int, pthreadZucondZuwaitZAZa, // pthread_cond_wait@*
+              pthread_cond_t* cond, pthread_mutex_t* mutex)
+{
+   int ret;
+   OrigFn fn;
+   unsigned long mutex_is_valid;
+
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_cond_wait %p %p", cond, mutex);
+      fflush(stderr);
+   }
+
+   /* Tell the tool a cond-wait is about to happen, so it can check
+      for bogus argument values.  In return it tells us whether it
+      thinks the mutex is valid or not. */
+   DO_CREQ_W_WW(mutex_is_valid,
+                _VG_USERREQ__HG_PTHREAD_COND_WAIT_PRE,
+                pthread_cond_t*,cond, pthread_mutex_t*,mutex);
+   assert(mutex_is_valid == 1 || mutex_is_valid == 0);
+
+   /* Tell the tool we're about to drop the mutex.  This reflects the
+      fact that in a cond_wait, we show up holding the mutex, and the
+      call atomically drops the mutex and waits for the cv to be
+      signalled. */
+   if (mutex_is_valid) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,
+                  pthread_mutex_t*,mutex);
+   }
+
+   CALL_FN_W_WW(ret, fn, cond,mutex);
+
+   /* these conditionals look stupid, but compare w/ same logic for
+      pthread_cond_timedwait below */
+   if (ret == 0 && mutex_is_valid) {
+      /* and now we have the mutex again */
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+                  pthread_mutex_t*,mutex);
+   }
+
+   if (ret == 0 && mutex_is_valid) {
+      DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_COND_WAIT_POST,
+                   pthread_cond_t*,cond, pthread_mutex_t*,mutex);
+   }
+
+   if (ret != 0) {
+      DO_PthAPIerror( "pthread_cond_wait", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " cowait -> %d >>\n", ret);
+   }
+
+   return ret;
+}
+
+
+// pthread_cond_timedwait
+PTH_FUNC(int, pthreadZucondZutimedwaitZAZa, // pthread_cond_timedwait@*
+         pthread_cond_t* cond, pthread_mutex_t* mutex, 
+         struct timespec* abstime)
+{
+   int ret;
+   OrigFn fn;
+   unsigned long mutex_is_valid;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_cond_timedwait %p %p %p", 
+                      cond, mutex, abstime);
+      fflush(stderr);
+   }
+
+   /* Tell the tool a cond-wait is about to happen, so it can check
+      for bogus argument values.  In return it tells us whether it
+      thinks the mutex is valid or not. */
+   DO_CREQ_W_WW(mutex_is_valid,
+                _VG_USERREQ__HG_PTHREAD_COND_WAIT_PRE,
+                pthread_cond_t*,cond, pthread_mutex_t*,mutex);
+   assert(mutex_is_valid == 1 || mutex_is_valid == 0);
+
+   /* Tell the tool we're about to drop the mutex.  This reflects the
+      fact that in a cond_wait, we show up holding the mutex, and the
+      call atomically drops the mutex and waits for the cv to be
+      signalled. */
+   if (mutex_is_valid) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,
+                  pthread_mutex_t*,mutex);
+   }
+
+   CALL_FN_W_WWW(ret, fn, cond,mutex,abstime);
+
+   if ((ret == 0 || ret == ETIMEDOUT) && mutex_is_valid) {
+      /* and now we have the mutex again */
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+                  pthread_mutex_t*,mutex);
+   }
+
+   if (ret == 0 && mutex_is_valid) {
+      DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_COND_WAIT_POST,
+                   pthread_cond_t*,cond, pthread_mutex_t*,mutex);
+   }
+
+   if (ret != 0 && ret != ETIMEDOUT) {
+      DO_PthAPIerror( "pthread_cond_timedwait", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " cotimedwait -> %d >>\n", ret);
+   }
+
+   return ret;
+}
+
+
+// pthread_cond_signal
+PTH_FUNC(int, pthreadZucondZusignalZAZa, // pthread_cond_signal@*
+              pthread_cond_t* cond)
+{
+   int ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_cond_signal %p", cond);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_COND_SIGNAL_PRE,
+               pthread_cond_t*,cond);
+
+   CALL_FN_W_W(ret, fn, cond);
+
+   if (ret != 0) {
+      DO_PthAPIerror( "pthread_cond_signal", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " cosig -> %d >>\n", ret);
+   }
+
+   return ret;
+}
+
+
+// pthread_cond_broadcast
+// Note, this is pretty much identical, from a dependency-graph
+// point of view, with cond_signal, so the code is duplicated.
+// Maybe it should be commoned up.
+PTH_FUNC(int, pthreadZucondZubroadcastZAZa, // pthread_cond_broadcast@*
+              pthread_cond_t* cond)
+{
+   int ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_broadcast_signal %p", cond);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_COND_BROADCAST_PRE,
+               pthread_cond_t*,cond);
+
+   CALL_FN_W_W(ret, fn, cond);
+
+   if (ret != 0) { 
+      DO_PthAPIerror( "pthread_cond_broadcast", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " cobro -> %d >>\n", ret);
+   }
+
+   return ret;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- pthread_rwlock_t functions                               ---*/
+/*----------------------------------------------------------------*/
+
+/* Handled:   pthread_rwlock_init pthread_rwlock_destroy
+              pthread_rwlock_rdlock 
+              pthread_rwlock_wrlock
+              pthread_rwlock_unlock
+
+   Unhandled: pthread_rwlock_timedrdlock
+              pthread_rwlock_tryrdlock
+
+              pthread_rwlock_timedwrlock
+              pthread_rwlock_trywrlock
+*/
+
+// pthread_rwlock_init
+PTH_FUNC(int, pthreadZurwlockZuinit, // pthread_rwlock_init
+              pthread_rwlock_t *rwl,
+              pthread_rwlockattr_t* attr)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_rwl_init %p", rwl); fflush(stderr);
+   }
+
+   CALL_FN_W_WW(ret, fn, rwl,attr);
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_INIT_POST,
+                  pthread_rwlock_t*,rwl);
+   } else { 
+      DO_PthAPIerror( "pthread_rwlock_init", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: rwl_init -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+// pthread_rwlock_destroy
+PTH_FUNC(int, pthreadZurwlockZudestroy, // pthread_rwlock_destroy
+              pthread_rwlock_t *rwl)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_rwl_destroy %p", rwl); fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_DESTROY_PRE,
+               pthread_rwlock_t*,rwl);
+
+   CALL_FN_W_W(ret, fn, rwl);
+
+   if (ret != 0) {
+      DO_PthAPIerror( "pthread_rwlock_destroy", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: rwl_destroy -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+PTH_FUNC(int, pthreadZurwlockZuwrlock, // pthread_rwlock_wrlock
+	 pthread_rwlock_t* rwlock)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_rwl_wlk %p", rwlock); fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE,
+                pthread_rwlock_t*,rwlock, long,1/*isW*/);
+
+   CALL_FN_W_W(ret, fn, rwlock);
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,
+                   pthread_rwlock_t*,rwlock, long,1/*isW*/);
+   } else { 
+      DO_PthAPIerror( "pthread_rwlock_wrlock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: rwl_wlk -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+PTH_FUNC(int, pthreadZurwlockZurdlock, // pthread_rwlock_rdlock
+	 pthread_rwlock_t* rwlock)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_rwl_rlk %p", rwlock); fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE,
+                pthread_rwlock_t*,rwlock, long,0/*!isW*/);
+
+   CALL_FN_W_W(ret, fn, rwlock);
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,
+                   pthread_rwlock_t*,rwlock, long,0/*!isW*/);
+   } else { 
+      DO_PthAPIerror( "pthread_rwlock_rdlock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: rwl_rlk -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+PTH_FUNC(int, pthreadZurwlockZuunlock, // pthread_rwlock_unlock
+	 pthread_rwlock_t* rwlock)
+{
+   int    ret;
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, "<< pthread_rwl_unlk %p", rwlock); fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_PRE,
+               pthread_rwlock_t*,rwlock);
+
+   CALL_FN_W_W(ret, fn, rwlock);
+
+   if (ret == 0 /*success*/) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_POST,
+                  pthread_rwlock_t*,rwlock);
+   } else { 
+      DO_PthAPIerror( "pthread_rwlock_unlock", ret );
+   }
+
+   if (TRACE_PTH_FNS) {
+      fprintf(stderr, " :: rwl_unlk -> %d >>\n", ret);
+   }
+   return ret;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- POSIX semaphores                                         ---*/
+/*----------------------------------------------------------------*/
+
+#include <semaphore.h>
+
+#define TRACE_SEM_FNS 0
+
+/* Handled: 
+     int sem_init(sem_t *sem, int pshared, unsigned value);
+     int sem_destroy(sem_t *sem);
+     int sem_wait(sem_t *sem);
+     int sem_post(sem_t *sem);
+
+   Unhandled:
+     int sem_trywait(sem_t *sem);
+     int sem_timedwait(sem_t *restrict sem,
+                       const struct timespec *restrict abs_timeout);
+*/
+
+/* glibc-2.5 has sem_init@@GLIBC_2.2.5 (amd64-linux)
+             and sem_init@@GLIBC_2.1 (x86-linux): match sem_init@* */
+PTH_FUNC(int, semZuinitZAZa, sem_t* sem, int pshared, unsigned long value)
+{
+   OrigFn fn;
+   int    ret;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, "<< sem_init(%p,%d,%lu) ", sem,pshared,value);
+      fflush(stderr);
+   }
+
+   CALL_FN_W_WWW(ret, fn, sem,pshared,value);
+
+   if (ret == 0) {
+      /* Probably overly paranoid, but still ... */
+      DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEM_ZAPSTACK, sem_t*,sem);
+   } else {
+      DO_PthAPIerror( "sem_init", errno );
+   }
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, " sem_init -> %d >>\n", ret);
+      fflush(stderr);
+   }
+
+   return ret;
+}
+
+
+/* glibc-2.5 has sem_destroy@@GLIBC_2.2.5 (amd64-linux)
+             and sem_destroy@@GLIBC_2.1 (x86-linux); match sem_destroy@* */
+PTH_FUNC(int, semZudestroyZAZa, sem_t* sem)
+{
+   OrigFn fn;
+   int    ret;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, "<< sem_destroy(%p) ", sem);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEM_ZAPSTACK, sem_t*,sem);
+
+   CALL_FN_W_W(ret, fn, sem);
+
+   if (ret != 0) {
+      DO_PthAPIerror( "sem_destroy", errno );
+   }
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, " sem_destroy -> %d >>\n", ret);
+      fflush(stderr);
+   }
+
+   return ret;
+}
+
+
+/* glibc-2.5 has sem_wait (amd64-linux); match sem_wait
+             and sem_wait@@GLIBC_2.1 (x86-linux); match sem_wait@* */
+/* wait: decrement semaphore - acquire lockage */
+static int sem_wait_WRK(sem_t* sem)
+{
+   OrigFn fn;
+   int    ret;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, "<< sem_wait(%p) ", sem);
+      fflush(stderr);
+   }
+
+   CALL_FN_W_W(ret, fn, sem);
+
+   if (ret == 0) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEMWAIT_POST, sem_t*,sem);
+   } else {
+      DO_PthAPIerror( "sem_wait", errno );
+   }
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, " sem_wait -> %d >>\n", ret);
+      fflush(stderr);
+   }
+
+   return ret;
+}
+PTH_FUNC(int, semZuwait, sem_t* sem) { /* sem_wait */
+   return sem_wait_WRK(sem);
+}
+PTH_FUNC(int, semZuwaitZAZa, sem_t* sem) { /* sem_wait@* */
+   return sem_wait_WRK(sem);
+}
+
+
+/* glibc-2.5 has sem_post (amd64-linux); match sem_post
+             and sem_post@@GLIBC_2.1 (x86-linux); match sem_post@* */
+/* post: increment semaphore - release lockage */
+static int sem_post_WRK(sem_t* sem)
+{
+   OrigFn fn;
+   int    ret;
+
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, "<< sem_post(%p) ", sem);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_POSIX_SEMPOST_PRE, sem_t*,sem);
+
+   CALL_FN_W_W(ret, fn, sem);
+
+   if (ret != 0) {
+      DO_PthAPIerror( "sem_post", errno );
+   }
+
+   if (TRACE_SEM_FNS) {
+      fprintf(stderr, " sem_post -> %d >>\n", ret);
+      fflush(stderr);
+   }
+
+   return ret;
+}
+PTH_FUNC(int, semZupost, sem_t* sem) { /* sem_post */
+   return sem_post_WRK(sem);
+}
+PTH_FUNC(int, semZupostZAZa, sem_t* sem) { /* sem_post@* */
+   return sem_post_WRK(sem);
+}
+
+
+
+/*----------------------------------------------------------------*/
+/*--- Qt 4 threading functions (w/ GNU name mangling)          ---*/
+/*----------------------------------------------------------------*/
+
+/* Handled:   QMutex::lock()
+              QMutex::unlock()
+              QMutex::tryLock
+              QReadWriteLock::lockForRead()
+              QReadWriteLock::lockForWrite()
+              QReadWriteLock::unlock()
+
+   Unhandled: QMutex::tryLock(int)
+              QReadWriteLock::tryLockForRead(int)
+              QReadWriteLock::tryLockForRead()
+              QReadWriteLock::tryLockForWrite(int)
+              QReadWriteLock::tryLockForWrite()
+
+              maybe not the next 3; qt-4.3.1 on Unix merely
+              implements QWaitCondition using pthread_cond_t
+              QWaitCondition::wait(QMutex*, unsigned long)
+              QWaitCondition::wakeAll()
+              QWaitCondition::wakeOne()
+*/
+
+// soname is libQtCore.so.4 ; match against libQtCore.so*
+#define QT4_FUNC(ret_ty, f, args...) \
+   ret_ty I_WRAP_SONAME_FNNAME_ZZ(libQtCoreZdsoZa,f)(args); \
+   ret_ty I_WRAP_SONAME_FNNAME_ZZ(libQtCoreZdsoZa,f)(args)
+
+// QMutex::lock()
+QT4_FUNC(void, ZuZZN6QMutex4lockEv, // _ZN6QMutex4lockEv == QMutex::lock()
+               void* self)
+{
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, "<< QMutex::lock %p", self); fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,
+                void*,self, long,0/*!isTryLock*/);
+
+   CALL_FN_v_W(fn, self);
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+               void*, self);
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, " :: Q::lock done >>\n");
+   }
+}
+
+// QMutex::unlock()
+QT4_FUNC(void, ZuZZN6QMutex6unlockEv, // _ZN6QMutex6unlockEv == QMutex::unlock()
+               void* self)
+{
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, "<< QMutex::unlock %p", self); fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE,
+               void*, self);
+
+   CALL_FN_v_W(fn, self);
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST,
+               void*, self);
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, " Q::unlock done >>\n");
+   }
+}
+
+// QMutex::tryLock
+// _ZN6QMutex7tryLockEv == bool QMutex::tryLock()
+// using 'long' to mimic C++ 'bool'
+QT4_FUNC(long, ZuZZN6QMutex7tryLockEv,
+               void* self)
+{
+   OrigFn fn;
+   long   ret;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, "<< QMutex::tryLock %p", self); fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE,
+                void*,self, long,1/*isTryLock*/);
+
+   CALL_FN_W_W(ret, fn, self);
+
+   // assumes that only the low 8 bits of the 'bool' are significant
+   if (ret & 0xFF) {
+      DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST,
+                  void*, self);
+   }
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, " :: Q::tryLock -> %lu >>\n", ret);
+   }
+   
+   return ret;
+}
+
+
+// QReadWriteLock::lockForRead()
+// _ZN14QReadWriteLock11lockForReadEv == QReadWriteLock::lockForRead()
+QT4_FUNC(void, ZuZZN14QReadWriteLock11lockForReadEv, 
+               // _ZN14QReadWriteLock11lockForReadEv
+               void* self)
+{
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, "<< QReadWriteLock::lockForRead %p", self);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE,
+                void*,self, long,0/*!isW*/);
+
+   CALL_FN_v_W(fn, self);
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,
+                void*,self, long,0/*!isW*/);
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, " :: Q::lockForRead :: done >>\n");
+   }
+}
+
+// QReadWriteLock::lockForWrite()
+// _ZN14QReadWriteLock12lockForWriteEv == QReadWriteLock::lockForWrite()
+QT4_FUNC(void, ZuZZN14QReadWriteLock12lockForWriteEv, 
+               // _ZN14QReadWriteLock12lockForWriteEv
+               void* self)
+{
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, "<< QReadWriteLock::lockForWrite %p", self);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE,
+                void*,self, long,1/*isW*/);
+
+   CALL_FN_v_W(fn, self);
+
+   DO_CREQ_v_WW(_VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST,
+                void*,self, long,1/*isW*/);
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, " :: Q::lockForWrite :: done >>\n");
+   }
+}
+
+// QReadWriteLock::unlock()
+// _ZN14QReadWriteLock6unlockEv == QReadWriteLock::unlock()
+QT4_FUNC(void, ZuZZN14QReadWriteLock6unlockEv,
+               // _ZN14QReadWriteLock6unlockEv
+               void* self)
+{
+   OrigFn fn;
+   VALGRIND_GET_ORIG_FN(fn);
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, "<< QReadWriteLock::unlock %p", self);
+      fflush(stderr);
+   }
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_PRE,
+               void*,self);
+
+   CALL_FN_v_W(fn, self);
+
+   DO_CREQ_v_W(_VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_POST,
+               void*,self);
+
+   if (TRACE_QT4_FNS) {
+      fprintf(stderr, " :: Q::unlock :: done >>\n");
+   }
+}
+
+
+/*--------------------------------------------------------------------*/
+/*--- end                                          tc_intercepts.c ---*/
+/*--------------------------------------------------------------------*/
diff --git a/helgrind/hg_main.c b/helgrind/hg_main.c
new file mode 100644
index 0000000..0a97571
--- /dev/null
+++ b/helgrind/hg_main.c
@@ -0,0 +1,8782 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Helgrind: a Valgrind tool for detecting errors               ---*/
+/*--- in threaded programs.                              hg_main.c ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 OpenWorks LLP
+      info@open-works.co.uk
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+
+   Neither the names of the U.S. Department of Energy nor the
+   University of California nor the names of its contributors may be
+   used to endorse or promote products derived from this software
+   without prior written permission.
+*/
+
+#include "pub_tool_basics.h"
+#include "pub_tool_aspacemgr.h"
+#include "pub_tool_libcassert.h"
+#include "pub_tool_libcbase.h"
+#include "pub_tool_libcprint.h"
+#include "pub_tool_mallocfree.h"
+#include "pub_tool_threadstate.h"
+#include "pub_tool_tooliface.h"
+#include "pub_tool_hashtable.h"
+#include "pub_tool_replacemalloc.h"
+#include "pub_tool_machine.h"
+#include "pub_tool_options.h"
+#include "pub_tool_xarray.h"
+#include "pub_tool_stacktrace.h"
+
+#include "helgrind.h"
+
+#define HG_(str) VGAPPEND(vgHelgrind_,str)
+#include "hg_wordfm.h"
+#include "hg_wordset.h"
+
+/*----------------------------------------------------------------*/
+/*---                                                          ---*/
+/*----------------------------------------------------------------*/
+
+/* Note there are a whole bunch of ugly double casts of the form
+   (Word*)(void*)&p.  These placate gcc at -O2.  The obvious form
+   (Word*)&p causes gcc to complain that 'dereferencing a type-punned
+   pointer ill break strict-aliasing rules'.  It stops complaining
+   when the intermediate void* type is inserted.  Is this a reasonable
+   "fix"?  I don't know. */
+
+// FIXME what is supposed to happen to locks in memory which
+// is relocated as a result of client realloc?
+
+// FIXME some kind of ownership recycling problem in
+// init_thread_specific_state() for programs which use the same thread
+// slot more than once?
+
+// FIXME put referencing ThreadId into Thread and get
+// rid of the slow reverse mapping function.
+
+// FIXME accesses to NoAccess areas: change state to Excl?
+
+// FIXME report errors for accesses of NoAccess memory?
+
+// FIXME pth_cond_wait/timedwait wrappers.  Even if these fail,
+// the thread still holds the lock.
+
+/* ------------ Debug/trace options ------------ */
+
+// this is:
+// shadow_mem_make_NoAccess: 29156 SMs, 1728 scanned
+// happens_before_wrk: 1000
+// ev__post_thread_join: 3360 SMs, 29 scanned, 252 re-Excls
+#define SHOW_EXPENSIVE_STUFF 0
+
+// 0 for silent, 1 for some stuff, 2 for lots of stuff
+#define SHOW_EVENTS 0
+
+// Flags for controlling for which events sanity checking is done
+#define SCE_THREADS  (1<<0)  // Sanity check at thread create/join
+#define SCE_LOCKS    (1<<1)  // Sanity check at lock events
+#define SCE_BIGRANGE (1<<2)  // Sanity check at big mem range events
+#define SCE_ACCESS   (1<<3)  // Sanity check at mem accesses
+#define SCE_LAOG     (1<<4)  // Sanity check at significant LAOG events
+
+#define SCE_BIGRANGE_T 256  // big mem range minimum size
+
+
+/* For the shadow mem cache stuff we may want more intrusive
+   checks.  Unfortunately there's no almost-zero-cost way to make them
+   selectable at run time.  Hence set the #if 0 to #if 1 and
+   rebuild if you want them. */
+#if 0
+#  define SCE_CACHELINE 1  /* do sanity-check CacheLine stuff */
+#  define inline __attribute__((noinline))
+   /* probably want to ditch -fomit-frame-pointer too */
+#else
+#  define SCE_CACHELINE 0   /* don't sanity-check CacheLine stuff */
+#endif
+
+static void all__sanity_check ( Char* who ); /* fwds */
+
+#define HG_CLI__MALLOC_REDZONE_SZB 16 /* let's say */
+
+// 0 for none, 1 for dump at end of run
+#define SHOW_DATA_STRUCTURES 0
+
+
+/* ------------ Command line options ------------ */
+
+// 0 = no segments at all
+// 1 = segments at thread create/join
+// 2 = as 1 + segments at condition variable signal/broadcast/wait too
+static Int clo_happens_before = 2;  /* default setting */
+
+/* Generate .vcg output of the happens-before graph?
+   0: no  1: yes, without VTSs  2: yes, with VTSs */
+static Int clo_gen_vcg = 0;
+
+/* When comparing race errors for equality, should the race address be
+   taken into account?  For users, no, but for verification purposes
+   (regtesting) this is sometimes important. */
+static Bool clo_cmp_race_err_addrs = False;
+
+/* Tracing memory accesses, so we can see what's going on.
+   clo_trace_addr is the address to monitor.  clo_trace_level = 0 for
+   no tracing, 1 for summary, 2 for detailed. */
+static Addr clo_trace_addr  = 0;
+static Int  clo_trace_level = 0;
+
+/* Sanity check level.  This is an or-ing of
+   SCE_{THREADS,LOCKS,BIGRANGE,ACCESS,LAOG}. */
+static Int clo_sanity_flags = 0;
+
+/* This has to do with printing error messages.  See comments on
+   announce_threadset() and summarise_threadset().  Perhaps it
+   should be a command line option. */
+#define N_THREADS_TO_ANNOUNCE 5
+
+
+/* ------------ Misc comments ------------ */
+
+// FIXME: don't hardwire initial entries for root thread.
+// Instead, let the pre_thread_ll_create handler do this.
+
+// FIXME: when a SecMap is completely set via and address range
+// setting operation to a non-ShR/M state, clear its .mbHasShared 
+// bit
+
+/* FIXME: figure out what the real rules are for Excl->ShR/M
+   transitions w.r.t locksets.
+
+   Muelenfeld thesis Sec 2.2.1 p 8/9 says that
+
+     When another thread accesses the memory location, the lock-set
+     is initialized with all active locks and the algorithm reports
+     the next access that results in an empty lock-set.
+
+   What does "all active locks" mean?  All locks held by the accessing
+   thread, or all locks held by the system as a whole?
+
+   However: Muelenfeld's enhanced Helgrind (eraser_mem_read_word)
+   seems to use simply the set of locks held by the thread causing the
+   transition into a shared state at the time of the transition:
+
+     *sword = SW(Vge_Shar, packLockSet(thread_locks_rd[tid]));
+
+   Original Eraser paper also says "all active locks".
+*/
+
+// Major stuff to fix:
+// - reader-writer locks
+
+/* Thread async exit:
+   
+   remove the map_threads entry
+   leave the Thread object in place
+   complain if holds any locks
+   
+   unlike with Join, do not change any memory states
+
+   I _think_ this is correctly handled now.
+*/
+
+/*----------------------------------------------------------------*/
+/*--- Some very basic stuff                                    ---*/
+/*----------------------------------------------------------------*/
+
+static void* hg_zalloc ( SizeT n ) {
+   void* p;
+   tl_assert(n > 0);
+   p = VG_(malloc)( n );
+   tl_assert(p);
+   VG_(memset)(p, 0, n);
+   return p;
+}
+static void hg_free ( void* p ) {
+   tl_assert(p);
+   VG_(free)(p);
+}
+
+/* Round a up to the next multiple of N.  N must be a power of 2 */
+#define ROUNDUP(a, N)   ((a + N - 1) & ~(N-1))
+/* Round a down to the next multiple of N.  N must be a power of 2 */
+#define ROUNDDN(a, N)   ((a) & ~(N-1))
+
+#ifdef HAVE_BUILTIN_EXPECT
+#define LIKELY(cond)   __builtin_expect((cond),1)
+#define UNLIKELY(cond) __builtin_expect((cond),0)
+#else
+#define LIKELY(cond)   (cond)
+#define UNLIKELY(cond) (cond)
+#endif
+
+
+/*----------------------------------------------------------------*/
+/*--- Primary data definitions                                 ---*/
+/*----------------------------------------------------------------*/
+
+/* These are handles for thread segments.  CONSTRAINTS: Must be small
+   ints numbered from zero, since 30-bit versions of them must are
+   used to represent Exclusive shadow states.  Are used as keys in
+   WordFMs so must be castable to Words at the appropriate points. */
+typedef  UInt  SegmentID;
+
+
+/* These are handles for Word sets.  CONSTRAINTS: must be (very) small
+   ints numbered from zero, since < 30-bit versions of them are used to
+   encode thread-sets and lock-sets in 32-bit shadow words. */
+typedef  WordSet  WordSetID;
+
+
+/* Stores information about a thread.  Addresses of these also serve
+   as unique thread identifiers and so are never freed, so they should
+   be as small as possible. */
+typedef
+   struct _Thread {
+      /* ADMIN */
+      struct _Thread* admin;
+      UInt            magic;
+      /* USEFUL */
+      WordSetID locksetA; /* WordSet of Lock* currently held by thread */
+      WordSetID locksetW; /* subset of locksetA held in w-mode */
+      SegmentID csegid;  /* current thread segment for thread */
+      /* EXPOSITION */
+      /* Place where parent was when this thread was created. */
+      ExeContext* created_at;
+      Bool        announced;
+      /* Index for generating references in error messages. */
+      Int         errmsg_index;
+   }
+   Thread;
+
+
+/* Stores information about a lock's current state.  These are
+   allocated and later freed (when the containing memory becomes
+   NoAccess).  This gives a problem for the XError type, which
+   contains Lock*s.  Solution is to copy any Lock which is to be
+   incorporated into an XErrors, so as to make it independent from the
+   'normal' collection of Locks, which can come and go.  When the lock
+   is copied, its .magic is changed from LockN_Magic to
+   LockP_Magic. */
+
+/* Lock kinds. */
+typedef
+   enum {
+      LK_mbRec=1001, /* normal mutex, possibly recursive */
+      LK_nonRec,     /* normal mutex, definitely non recursive */
+      LK_rdwr        /* reader-writer lock */
+   }
+   LockKind;
+
+typedef
+   struct _Lock {
+      /* ADMIN */
+      struct _Lock* admin;
+      ULong         unique; /* used for persistence-hashing */
+      UInt          magic;  /* LockN_MAGIC or LockP_MAGIC */
+      /* EXPOSITION */
+      /* Place where lock first came to the attention of Helgrind. */
+      ExeContext*   appeared_at;
+      /* Place where the lock most recently made an unlocked->locked
+         transition. */
+      ExeContext*   acquired_at;
+      /* USEFUL-STATIC */
+      Addr          guestaddr; /* Guest address of lock */
+      LockKind      kind;      /* what kind of lock this is */
+      /* USEFUL-DYNAMIC */
+      Bool          heldW; 
+      WordBag*      heldBy; /* bag of threads that hold this lock */
+      /* .heldBy is NULL: lock is unheld, and .heldW is meaningless
+                          but arbitrarily set to False
+         .heldBy is non-NULL:
+            .heldW is True:  lock is w-held by threads in heldBy
+            .heldW is False: lock is r-held by threads in heldBy
+            Either way, heldBy may not validly be an empty Bag.
+
+         for LK_nonRec, r-holdings are not allowed, and w-holdings may
+         only have sizeTotal(heldBy) == 1
+
+         for LK_mbRec, r-holdings are not allowed, and w-holdings may
+         only have sizeUnique(heldBy) == 1
+
+         for LK_rdwr, w-holdings may only have sizeTotal(heldBy) == 1 */
+   }
+   Lock;
+
+
+/* Stores information about thread segments.  .prev can be NULL only
+   when this is the first segment for the thread.  .other is NULL
+   unless this segment depends on a message (create, join, signal)
+   from some other thread.  Segments are never freed (!) */
+typedef
+   struct _Segment {
+      /* ADMIN */
+      struct _Segment* admin;
+      UInt             magic;
+      /* USEFUL */
+      UInt             dfsver; /* Version # for depth-first searches */
+      Thread*          thr;    /* The thread that I am part of */
+      struct _Segment* prev;   /* The previous segment in this thread */
+      struct _Segment* other;  /* Possibly a segment from some other 
+                                  thread, which happened-before me */
+      XArray*          vts;    /* XArray of ScalarTS */
+      /* DEBUGGING ONLY: what does 'other' arise from?  
+         c=thread creation, j=join, s=cvsignal, S=semaphore */
+      Char other_hint;
+   }
+   Segment;
+
+
+/* ------ CacheLine ------ */
+
+#define N_LINE_BITS      5 /* must be >= 3 */
+#define N_LINE_ARANGE    (1 << N_LINE_BITS)
+#define N_LINE_TREES     (N_LINE_ARANGE >> 3)
+
+typedef
+   struct {
+      UShort descrs[N_LINE_TREES];
+      UInt   svals[N_LINE_ARANGE]; // == N_LINE_TREES * 8
+   }
+   CacheLine;
+
+#define TREE_DESCR_16_0 (1<<0)
+#define TREE_DESCR_32_0 (1<<1)
+#define TREE_DESCR_16_1 (1<<2)
+#define TREE_DESCR_64   (1<<3)
+#define TREE_DESCR_16_2 (1<<4)
+#define TREE_DESCR_32_1 (1<<5)
+#define TREE_DESCR_16_3 (1<<6)
+#define TREE_DESCR_8_0  (1<<7)
+#define TREE_DESCR_8_1  (1<<8)
+#define TREE_DESCR_8_2  (1<<9)
+#define TREE_DESCR_8_3  (1<<10)
+#define TREE_DESCR_8_4  (1<<11)
+#define TREE_DESCR_8_5  (1<<12)
+#define TREE_DESCR_8_6  (1<<13)
+#define TREE_DESCR_8_7  (1<<14)
+#define TREE_DESCR_DTY  (1<<15)
+
+typedef
+   struct {
+      UInt  dict[4]; /* can represent up to 4 diff values in the line */
+      UChar ix2s[N_LINE_ARANGE/4]; /* array of N_LINE_ARANGE 2-bit
+                                      dict indexes */
+      /* if dict[0] == 0 then dict[1] is the index of the CacheLineF
+         to use */
+   }
+   CacheLineZ; /* compressed rep for a cache line */
+
+typedef
+   struct {
+      Bool inUse;
+      UInt w32s[N_LINE_ARANGE];
+   }
+   CacheLineF; /* full rep for a cache line */
+
+
+/* Shadow memory.
+   Primary map is a WordFM Addr SecMap*.  
+   SecMaps cover some page-size-ish section of address space and hold
+     a compressed representation.
+   CacheLine-sized chunks of SecMaps are copied into a Cache, being
+   decompressed when moved into the cache and recompressed on the
+   way out.  Because of this, the cache must operate as a writeback
+   cache, not a writethrough one.
+*/
+/* See comments below on shadow_mem_make_NoAccess re performance
+   effects of N_SECMAP_BITS settings.  On a 2.4GHz Core2,
+   starting/quitting OOo (32-bit), I have these rough numbers:
+      N_SECMAP_BITS = 11    2m23
+      N_SECMAP_BITS = 12    1m58
+      N_SECMAP_BITS = 13    1m53
+
+   Each SecMap must hold a power-of-2 number of CacheLines.  Hence
+   N_SECMAP_BITS must >= N_LINE_BITS.
+*/
+#define N_SECMAP_BITS   13
+#define N_SECMAP_ARANGE (1 << N_SECMAP_BITS)
+
+// # CacheLines held by a SecMap
+#define N_SECMAP_ZLINES (N_SECMAP_ARANGE / N_LINE_ARANGE)
+typedef
+   struct {
+      UInt magic;
+      Bool mbHasLocks;  /* hint: any locks in range?  safe: True */
+      Bool mbHasShared; /* hint: any ShM/ShR states in range?  safe: True */
+      CacheLineZ  linesZ[N_SECMAP_ZLINES];
+      CacheLineF* linesF;
+      Int         linesF_size;
+   }
+   SecMap;
+
+typedef
+   struct {
+      Int line_no; /* which Z-line are we in? */
+      Int word_no; /* inside the line, which word is current? */
+   }
+   SecMapIter;
+
+static void initSecMapIter ( SecMapIter* itr ) {
+   itr->line_no = 0;
+   itr->word_no = 0;
+}
+
+/* Get the current val, and move to the next position.  This is called
+   a huge amount in some programs (eg OpenOffice).  Hence the
+   'inline'. */
+static UWord stats__secmap_iterator_steppings; /* fwds */
+
+inline
+static Bool stepSecMapIter ( /*OUT*/UInt** pVal, 
+                             /*MOD*/SecMapIter* itr, SecMap* sm )
+{
+   CacheLineZ* lineZ = NULL;
+   CacheLineF* lineF = NULL;
+   /* Either it points to a valid place, or to (-1,-1) */
+   stats__secmap_iterator_steppings++;
+   if (UNLIKELY(itr->line_no == -1)) {
+      tl_assert(itr->word_no == -1);
+      return False;
+   }
+   /* so now it must be a valid place in the SecMap. */
+   if (0) VG_(printf)("%p %d %d\n", sm, (Int)itr->line_no, (Int)itr->word_no);
+   tl_assert(itr->line_no >= 0 && itr->line_no < N_SECMAP_ZLINES);
+   lineZ = &sm->linesZ[itr->line_no];
+   if (UNLIKELY(lineZ->dict[0] == 0)) {
+      tl_assert(sm->linesF);
+      tl_assert(sm->linesF_size > 0);
+      tl_assert(lineZ->dict[1] >= 0);
+      tl_assert(lineZ->dict[1] < sm->linesF_size);
+      lineF = &sm->linesF[ lineZ->dict[1] ];
+      tl_assert(lineF->inUse);
+      tl_assert(itr->word_no >= 0 && itr->word_no < N_LINE_ARANGE);
+      *pVal = &lineF->w32s[itr->word_no];
+      itr->word_no++;
+      if (itr->word_no == N_LINE_ARANGE)
+         itr->word_no = 0;
+   } else {
+      tl_assert(itr->word_no >= 0 && itr->word_no <= 3);
+      tl_assert(lineZ->dict[itr->word_no] != 0);
+      *pVal = &lineZ->dict[itr->word_no];
+      itr->word_no++;
+      if (itr->word_no == 4 || lineZ->dict[itr->word_no] == 0)
+         itr->word_no = 0;
+   }
+
+   if (itr->word_no == 0) {
+      itr->line_no++;
+      if (itr->line_no == N_SECMAP_ZLINES) {
+         itr->line_no = -1;
+         itr->word_no = -1;
+      }
+   }
+
+   return True;
+}
+
+/* ------ Cache ------ */
+
+#define N_WAY_BITS 16
+#define N_WAY_NENT (1 << N_WAY_BITS)
+
+/* Each tag is the address of the associated CacheLine, rounded down
+   to a CacheLine address boundary.  A CacheLine size must be a power
+   of 2 and must be 8 or more.  Hence an easy way to initialise the
+   cache so it is empty is to set all the tag values to any value % 8
+   != 0, eg 1.  This means all queries in the cache initially miss.
+   It does however require us to detect and not writeback, any line
+   with a bogus tag. */
+typedef
+   struct {
+      CacheLine lyns0[N_WAY_NENT];
+      Addr      tags0[N_WAY_NENT];
+   }
+   Cache;
+
+
+/* --------- Primary data structures --------- */
+
+/* Admin linked list of Threads */
+static Thread* admin_threads = NULL;
+
+/* Admin linked list of Locks */
+static Lock* admin_locks = NULL;
+
+/* Admin linked list of Segments */
+static Segment* admin_segments = NULL;
+
+/* Shadow memory primary map */
+static WordFM* map_shmem = NULL; /* WordFM Addr SecMap* */
+static Cache   cache_shmem;
+
+/* Mapping table for core ThreadIds to Thread* */
+static Thread** map_threads = NULL; /* Array[VG_N_THREADS] of Thread* */
+
+/* Mapping table for thread segments IDs to Segment* */
+static WordFM* map_segments = NULL; /* WordFM SegmentID Segment* */
+
+/* Mapping table for lock guest addresses to Lock* */
+static WordFM* map_locks = NULL; /* WordFM LockAddr Lock* */
+
+/* The word-set universes for thread sets and lock sets. */
+static WordSetU* univ_tsets = NULL; /* sets of Thread* */
+static WordSetU* univ_lsets = NULL; /* sets of Lock* */
+static WordSetU* univ_laog  = NULL; /* sets of Lock*, for LAOG */
+
+/* never changed; we only care about its address.  Is treated as if it
+   was a standard userspace lock.  Also we have a Lock* describing it
+   so it can participate in lock sets in the usual way. */
+static Int   __bus_lock = 0;
+static Lock* __bus_lock_Lock = NULL;
+
+
+/*----------------------------------------------------------------*/
+/*--- Simple helpers for the data structures                   ---*/
+/*----------------------------------------------------------------*/
+
+static UWord stats__lockN_acquires = 0;
+static UWord stats__lockN_releases = 0;
+
+static ThreadId map_threads_maybe_reverse_lookup_SLOW ( Thread* ); /*fwds*/
+
+#define Thread_MAGIC   0x504fc5e5
+#define LockN_MAGIC    0x6545b557 /* normal nonpersistent locks */
+#define LockP_MAGIC    0x755b5456 /* persistent (copied) locks */
+#define Segment_MAGIC  0x49e94d81
+#define SecMap_MAGIC   0x571e58cb
+
+static UWord stats__mk_Segment = 0;
+
+/* --------- Constructors --------- */
+
+static inline Bool is_sane_LockN ( Lock* lock ); /* fwds */
+
+static Thread* mk_Thread ( SegmentID csegid ) {
+   static Int indx      = 1;
+   Thread* thread       = hg_zalloc( sizeof(Lock) );
+   thread->locksetA     = HG_(emptyWS)( univ_lsets );
+   thread->locksetW     = HG_(emptyWS)( univ_lsets );
+   thread->csegid       = csegid;
+   thread->magic        = Thread_MAGIC;
+   thread->created_at   = NULL;
+   thread->announced    = False;
+   thread->errmsg_index = indx++;
+   thread->admin        = admin_threads;
+   admin_threads        = thread;
+   return thread;
+}
+// Make a new lock which is unlocked (hence ownerless)
+static Lock* mk_LockN ( LockKind kind, Addr guestaddr ) {
+   static ULong unique = 0;
+   Lock* lock             = hg_zalloc( sizeof(Lock) );
+   lock->admin            = admin_locks;
+   lock->unique           = unique++;
+   lock->magic            = LockN_MAGIC;
+   lock->appeared_at      = NULL;
+   lock->acquired_at      = NULL;
+   lock->guestaddr        = guestaddr;
+   lock->kind             = kind;
+   lock->heldW            = False;
+   lock->heldBy           = NULL;
+   tl_assert(is_sane_LockN(lock));
+   admin_locks            = lock;
+   return lock;
+}
+static Segment* mk_Segment ( Thread* thr, Segment* prev, Segment* other ) {
+   Segment* seg    = hg_zalloc( sizeof(Segment) );
+   seg->dfsver     = 0;
+   seg->thr        = thr;
+   seg->prev       = prev;
+   seg->other      = other;
+   seg->vts        = NULL;
+   seg->other_hint = ' ';
+   seg->magic      = Segment_MAGIC;
+   seg->admin      = admin_segments;
+   admin_segments = seg;
+   stats__mk_Segment++;
+   return seg;
+}
+
+static inline Bool is_sane_Segment ( Segment* seg ) {
+   return seg != NULL && seg->magic == Segment_MAGIC;
+}
+static inline Bool is_sane_Thread ( Thread* thr ) {
+   return thr != NULL && thr->magic == Thread_MAGIC;
+}
+
+static Bool is_sane_Bag_of_Threads ( WordBag* bag )
+{
+   Thread* thr;
+   Word    count;
+   HG_(initIterBag)( bag );
+   while (HG_(nextIterBag)( bag, (Word*)(void*)&thr, &count )) {
+      if (count < 1) return False;
+      if (!is_sane_Thread(thr)) return False;
+   }
+   HG_(doneIterBag)( bag );
+   return True;
+}
+static Bool is_sane_Lock_BASE ( Lock* lock )
+{
+   if (lock == NULL
+       || (lock->magic != LockN_MAGIC && lock->magic != LockP_MAGIC))
+      return False;
+   switch (lock->kind) { 
+      case LK_mbRec: case LK_nonRec: case LK_rdwr: break; 
+      default: return False; 
+   }
+   if (lock->heldBy == NULL) {
+      if (lock->acquired_at != NULL) return False;
+      /* Unheld.  We arbitrarily require heldW to be False. */
+      return !lock->heldW;
+   } else {
+      if (lock->acquired_at == NULL) return False;
+   }
+
+   /* If heldBy is non-NULL, we require it to contain at least one
+      thread. */
+   if (HG_(isEmptyBag)(lock->heldBy))
+      return False;
+
+   /* Lock is either r- or w-held. */
+   if (!is_sane_Bag_of_Threads(lock->heldBy)) 
+      return False;
+   if (lock->heldW) {
+      /* Held in write-mode */
+      if ((lock->kind == LK_nonRec || lock->kind == LK_rdwr)
+          && !HG_(isSingletonTotalBag)(lock->heldBy))
+         return False;
+   } else {
+      /* Held in read-mode */
+      if (lock->kind != LK_rdwr) return False;
+   }
+   return True;
+}
+static inline Bool is_sane_LockP ( Lock* lock ) {
+   return lock != NULL 
+          && lock->magic == LockP_MAGIC
+          && is_sane_Lock_BASE(lock);
+}
+static inline Bool is_sane_LockN ( Lock* lock ) {
+   return lock != NULL 
+          && lock->magic == LockN_MAGIC
+          && is_sane_Lock_BASE(lock);
+}
+static inline Bool is_sane_LockNorP ( Lock* lock ) {
+   return is_sane_Lock_BASE(lock);
+}
+
+/* Release storage for a Lock.  Also release storage in .heldBy, if
+   any. */
+static void del_LockN ( Lock* lk ) 
+{
+   tl_assert(is_sane_LockN(lk));
+   if (lk->heldBy)
+      HG_(deleteBag)( lk->heldBy );
+   VG_(memset)(lk, 0xAA, sizeof(*lk));
+   hg_free(lk);
+}
+
+/* Update 'lk' to reflect that 'thr' now has a write-acquisition of
+   it.  This is done strictly: only combinations resulting from
+   correct program and libpthread behaviour are allowed. */
+static void lockN_acquire_writer ( Lock* lk, Thread* thr ) 
+{
+   tl_assert(is_sane_LockN(lk));
+   tl_assert(is_sane_Thread(thr));
+
+   stats__lockN_acquires++;
+
+   /* EXPOSITION only */
+   /* We need to keep recording snapshots of where the lock was
+      acquired, so as to produce better lock-order error messages. */
+   if (lk->acquired_at == NULL) {
+      ThreadId tid;
+      tl_assert(lk->heldBy == NULL);
+      tid = map_threads_maybe_reverse_lookup_SLOW(thr);
+      lk->acquired_at
+         = VG_(record_ExeContext(tid, 0/*first_ip_delta*/));
+   } else {
+      tl_assert(lk->heldBy != NULL);
+   }
+   /* end EXPOSITION only */
+
+   switch (lk->kind) {
+      case LK_nonRec:
+      case_LK_nonRec:
+         tl_assert(lk->heldBy == NULL); /* can't w-lock recursively */
+         tl_assert(!lk->heldW);
+         lk->heldW  = True;
+         lk->heldBy = HG_(newBag)( hg_zalloc, hg_free );
+         HG_(addToBag)( lk->heldBy, (Word)thr );
+         break;
+      case LK_mbRec:
+         if (lk->heldBy == NULL)
+            goto case_LK_nonRec;
+         /* 2nd and subsequent locking of a lock by its owner */
+         tl_assert(lk->heldW);
+         /* assert: lk is only held by one thread .. */
+         tl_assert(HG_(sizeUniqueBag(lk->heldBy)) == 1);
+         /* assert: .. and that thread is 'thr'. */
+         tl_assert(HG_(elemBag)(lk->heldBy, (Word)thr)
+                   == HG_(sizeTotalBag)(lk->heldBy));
+         HG_(addToBag)(lk->heldBy, (Word)thr);
+         break;
+      case LK_rdwr:
+         tl_assert(lk->heldBy == NULL && !lk->heldW); /* must be unheld */
+         goto case_LK_nonRec;
+      default: 
+         tl_assert(0);
+  }
+  tl_assert(is_sane_LockN(lk));
+}
+
+static void lockN_acquire_reader ( Lock* lk, Thread* thr )
+{
+   tl_assert(is_sane_LockN(lk));
+   tl_assert(is_sane_Thread(thr));
+   /* can only add reader to a reader-writer lock. */
+   tl_assert(lk->kind == LK_rdwr);
+   /* lk must be free or already r-held. */
+   tl_assert(lk->heldBy == NULL 
+             || (lk->heldBy != NULL && !lk->heldW));
+
+   stats__lockN_acquires++;
+
+   /* EXPOSITION only */
+   /* We need to keep recording snapshots of where the lock was
+      acquired, so as to produce better lock-order error messages. */
+   if (lk->acquired_at == NULL) {
+      ThreadId tid;
+      tl_assert(lk->heldBy == NULL);
+      tid = map_threads_maybe_reverse_lookup_SLOW(thr);
+      lk->acquired_at
+         = VG_(record_ExeContext(tid, 0/*first_ip_delta*/));
+   } else {
+      tl_assert(lk->heldBy != NULL);
+   }
+   /* end EXPOSITION only */
+
+   if (lk->heldBy) {
+      HG_(addToBag)(lk->heldBy, (Word)thr);
+   } else {
+      lk->heldW  = False;
+      lk->heldBy = HG_(newBag)( hg_zalloc, hg_free );
+      HG_(addToBag)( lk->heldBy, (Word)thr );
+   }
+   tl_assert(!lk->heldW);
+   tl_assert(is_sane_LockN(lk));
+}
+
+/* Update 'lk' to reflect a release of it by 'thr'.  This is done
+   strictly: only combinations resulting from correct program and
+   libpthread behaviour are allowed. */
+
+static void lockN_release ( Lock* lk, Thread* thr )
+{
+   Bool b;
+   tl_assert(is_sane_LockN(lk));
+   tl_assert(is_sane_Thread(thr));
+   /* lock must be held by someone */
+   tl_assert(lk->heldBy);
+   stats__lockN_releases++;
+   /* Remove it from the holder set */
+   b = HG_(delFromBag)(lk->heldBy, (Word)thr);
+   /* thr must actually have been a holder of lk */
+   tl_assert(b);
+   /* normalise */
+   tl_assert(lk->acquired_at);
+   if (HG_(isEmptyBag)(lk->heldBy)) {
+      HG_(deleteBag)(lk->heldBy);
+      lk->heldBy      = NULL;
+      lk->heldW       = False;
+      lk->acquired_at = NULL;
+   }
+   tl_assert(is_sane_LockN(lk));
+}
+
+static void remove_Lock_from_locksets_of_all_owning_Threads( Lock* lk )
+{
+   Thread* thr;
+   if (!lk->heldBy) {
+      tl_assert(!lk->heldW);
+      return;
+   }
+   /* for each thread that holds this lock do ... */
+   HG_(initIterBag)( lk->heldBy );
+   while (HG_(nextIterBag)( lk->heldBy, (Word*)(void*)&thr, NULL )) {
+      tl_assert(is_sane_Thread(thr));
+      tl_assert(HG_(elemWS)( univ_lsets,
+                             thr->locksetA, (Word)lk ));
+      thr->locksetA
+         = HG_(delFromWS)( univ_lsets, thr->locksetA, (Word)lk );
+
+      if (lk->heldW) {
+         tl_assert(HG_(elemWS)( univ_lsets,
+                                thr->locksetW, (Word)lk ));
+         thr->locksetW
+            = HG_(delFromWS)( univ_lsets, thr->locksetW, (Word)lk );
+      }
+   }
+   HG_(doneIterBag)( lk->heldBy );
+}
+
+/* --------- xxxID functions --------- */
+
+/* Proposal (for debugging sanity):
+
+   SegmentIDs from 0x1000000 .. 0x1FFFFFF (16777216)
+
+   All other xxxID handles are invalid.
+*/
+static inline Bool is_sane_SegmentID ( SegmentID tseg ) {
+   return tseg >= 0x1000000 && tseg <= 0x1FFFFFF;
+}
+static inline Bool is_sane_ThreadId ( ThreadId coretid ) {
+   return coretid >= 0 && coretid < VG_N_THREADS;
+}
+static SegmentID alloc_SegmentID ( void ) {
+   static SegmentID next = 0x1000000;
+   tl_assert(is_sane_SegmentID(next));
+   return next++;
+}
+
+/* --------- Shadow memory --------- */
+
+static inline Bool is_valid_scache_tag ( Addr tag ) {
+   /* a valid tag should be naturally aligned to the start of
+      a CacheLine. */
+   return 0 == (tag & (N_LINE_ARANGE - 1));
+}
+
+static inline Bool is_sane_SecMap ( SecMap* sm ) {
+   return sm != NULL && sm->magic == SecMap_MAGIC;
+}
+
+/* Shadow value encodings:
+
+   11 WordSetID:TSID_BITS WordSetID:LSID_BITS  ShM  thread-set lock-set
+   10 WordSetID:TSID_BITS WordSetID:LSID_BITS  ShR  thread-set lock-set
+   01 TSegmentID:30                            Excl thread-segment
+   00 0--(20)--0 10 0000 0000                  New
+   00 0--(20)--0 01 0000 0000                  NoAccess
+   00 0--(20)--0 00 0000 0000                  Invalid
+
+   TSID_BITS + LSID_BITS must equal 30.
+   The elements in thread sets are Thread*, casted to Word.
+   The elements in lock sets are Lock*, casted to Word.
+*/
+
+#define N_LSID_BITS  17
+#define N_LSID_MASK  ((1 << (N_LSID_BITS)) - 1)
+#define N_LSID_SHIFT 0
+
+#define N_TSID_BITS  (30 - (N_LSID_BITS))
+#define N_TSID_MASK  ((1 << (N_TSID_BITS)) - 1)
+#define N_TSID_SHIFT (N_LSID_BITS)
+
+static inline Bool is_sane_WordSetID_LSet ( WordSetID wset ) {
+   return wset >= 0 && wset <= N_LSID_MASK;
+}
+static inline Bool is_sane_WordSetID_TSet ( WordSetID wset ) {
+   return wset >= 0 && wset <= N_TSID_MASK;
+}
+
+
+__attribute__((noinline))
+__attribute__((noreturn))
+static void mk_SHVAL_fail ( WordSetID tset, WordSetID lset, HChar* who ) {
+   VG_(printf)("\n");
+   VG_(printf)("Helgrind: Fatal internal error -- cannot continue.\n");
+   VG_(printf)("Helgrind: mk_SHVAL_ShR(tset=%d,lset=%d): FAILED\n",
+               (Int)tset, (Int)lset);
+   VG_(printf)("Helgrind: max allowed tset=%d, lset=%d\n",
+               (Int)N_TSID_MASK, (Int)N_LSID_MASK);
+   VG_(printf)("Helgrind: program has too many thread "
+              "sets or lock sets to track.\n");
+   tl_assert(0);
+}
+
+static inline UInt mk_SHVAL_ShM ( WordSetID tset, WordSetID lset ) {
+   if (LIKELY(is_sane_WordSetID_TSet(tset) 
+              && is_sane_WordSetID_LSet(lset))) {
+      return (UInt)( (3<<30) | (tset << N_TSID_SHIFT) 
+                             | (lset << N_LSID_SHIFT));
+   } else {
+      mk_SHVAL_fail(tset, lset, "mk_SHVAL_ShM");
+   }
+}
+static inline UInt mk_SHVAL_ShR ( WordSetID tset, WordSetID lset ) {
+   if (LIKELY(is_sane_WordSetID_TSet(tset) 
+              && is_sane_WordSetID_LSet(lset))) {
+      return (UInt)( (2<<30) | (tset << N_TSID_SHIFT) 
+                             | (lset << N_LSID_SHIFT) );
+   } else {
+      mk_SHVAL_fail(tset, lset, "mk_SHVAL_ShR");
+   }
+}
+static inline UInt mk_SHVAL_Excl ( SegmentID tseg ) {
+   tl_assert(is_sane_SegmentID(tseg));
+   return (UInt)( (1<<30) | tseg );
+}
+#define SHVAL_New      ((UInt)(2<<8))
+#define SHVAL_NoAccess ((UInt)(1<<8))
+#define SHVAL_Invalid  ((UInt)(0<<8))
+
+static inline Bool is_SHVAL_ShM ( UInt w32 ) { 
+   return (w32 >> 30) == 3;
+}
+static inline Bool is_SHVAL_ShR ( UInt w32 ) {
+   return (w32 >> 30) == 2;
+}
+static inline Bool is_SHVAL_Sh ( UInt w32 ) {
+   return (w32 >> 31) == 1;
+}
+static inline Bool is_SHVAL_Excl ( UInt w32 ) {
+   return (w32 >> 30) == 1; 
+}
+static inline Bool is_SHVAL_New ( UInt w32 ) {
+   return w32 == SHVAL_New;
+}
+static inline Bool is_SHVAL_NoAccess ( UInt w32 ) { 
+   return w32 == SHVAL_NoAccess;
+}
+static inline Bool is_SHVAL_valid ( UInt w32 ) {
+   return is_SHVAL_Excl(w32) || is_SHVAL_NoAccess(w32)
+          || is_SHVAL_Sh(w32) || is_SHVAL_New(w32);
+}
+
+static inline SegmentID un_SHVAL_Excl ( UInt w32 ) {
+   tl_assert(is_SHVAL_Excl(w32));
+   return w32 & ~(3<<30);
+}
+static inline WordSetID un_SHVAL_ShR_tset ( UInt w32 ) {
+   tl_assert(is_SHVAL_ShR(w32));
+   return (w32 >> N_TSID_SHIFT) & N_TSID_MASK;
+}
+static inline WordSetID un_SHVAL_ShR_lset ( UInt w32 ) {
+   tl_assert(is_SHVAL_ShR(w32));
+   return (w32 >> N_LSID_SHIFT) & N_LSID_MASK;
+}
+static inline WordSetID un_SHVAL_ShM_tset ( UInt w32 ) {
+   tl_assert(is_SHVAL_ShM(w32));
+   return (w32 >> N_TSID_SHIFT) & N_TSID_MASK;
+}
+static inline WordSetID un_SHVAL_ShM_lset ( UInt w32 ) {
+   tl_assert(is_SHVAL_ShM(w32));
+   return (w32 >> N_LSID_SHIFT) & N_LSID_MASK;
+}
+static inline WordSetID un_SHVAL_Sh_tset ( UInt w32 ) {
+   tl_assert(is_SHVAL_Sh(w32));
+   return (w32 >> N_TSID_SHIFT) & N_TSID_MASK;
+}
+static inline WordSetID un_SHVAL_Sh_lset ( UInt w32 ) {
+   tl_assert(is_SHVAL_Sh(w32));
+   return (w32 >> N_LSID_SHIFT) & N_LSID_MASK;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Print out the primary data structures                    ---*/
+/*----------------------------------------------------------------*/
+
+static WordSetID del_BHL ( WordSetID lockset ); /* fwds */
+static 
+void get_ZF_by_index ( /*OUT*/CacheLineZ** zp, /*OUT*/CacheLineF** fp,
+                       SecMap* sm, Int zix ); /* fwds */
+static 
+Segment* map_segments_maybe_lookup ( SegmentID segid ); /* fwds */
+
+#define PP_THREADS      (1<<1)
+#define PP_LOCKS        (1<<2)
+#define PP_SEGMENTS     (1<<3)
+#define PP_SHMEM_SHARED (1<<4)
+#define PP_ALL (PP_THREADS | PP_LOCKS | PP_SEGMENTS | PP_SHMEM_SHARED)
+
+
+static const Int sHOW_ADMIN = 0;
+
+static void space ( Int n )
+{
+   Int  i;
+   Char spaces[128+1];
+   tl_assert(n >= 0 && n < 128);
+   if (n == 0)
+      return;
+   for (i = 0; i < n; i++)
+      spaces[i] = ' ';
+   spaces[i] = 0;
+   tl_assert(i < 128+1);
+   VG_(printf)("%s", spaces);
+}
+
+static void pp_Thread ( Int d, Thread* t )
+{
+   space(d+0); VG_(printf)("Thread %p {\n", t);
+   if (sHOW_ADMIN) {
+   space(d+3); VG_(printf)("admin    %p\n",   t->admin);
+   space(d+3); VG_(printf)("magic    0x%x\n", (UInt)t->magic);
+   }
+   space(d+3); VG_(printf)("locksetA %d\n",   (Int)t->locksetA);
+   space(d+3); VG_(printf)("locksetW %d\n",   (Int)t->locksetW);
+   space(d+3); VG_(printf)("csegid   0x%x\n", (UInt)t->csegid);
+   space(d+0); VG_(printf)("}\n");
+}
+
+static void pp_admin_threads ( Int d )
+{
+   Int     i, n;
+   Thread* t;
+   for (n = 0, t = admin_threads;  t;  n++, t = t->admin) {
+      /* nothing */
+   }
+   space(d); VG_(printf)("admin_threads (%d records) {\n", n);
+   for (i = 0, t = admin_threads;  t;  i++, t = t->admin) {
+      if (0) {
+         space(n); 
+         VG_(printf)("admin_threads record %d of %d:\n", i, n);
+      }
+      pp_Thread(d+3, t);
+   }
+   space(d); VG_(printf)("}\n", n);
+}
+
+static void pp_map_threads ( Int d )
+{
+   Int i, n;
+   n = 0;
+   space(d); VG_(printf)("map_threads ");
+   n = 0;
+   for (i = 0; i < VG_N_THREADS; i++) {
+      if (map_threads[i] != NULL)
+         n++;
+   }
+   VG_(printf)("(%d entries) {\n", n);
+   for (i = 0; i < VG_N_THREADS; i++) {
+      if (map_threads[i] == NULL)
+         continue;
+      space(d+3);
+      VG_(printf)("coretid %d -> Thread %p\n", i, map_threads[i]);
+   }
+   space(d); VG_(printf)("}\n");
+}
+
+static const HChar* show_LockKind ( LockKind lkk ) {
+   switch (lkk) {
+      case LK_mbRec:  return "mbRec";
+      case LK_nonRec: return "nonRec";
+      case LK_rdwr:   return "rdwr";
+      default:        tl_assert(0);
+   }
+}
+
+static void pp_Lock ( Int d, Lock* lk )
+{
+   space(d+0); VG_(printf)("Lock %p (ga %p) {\n", lk, lk->guestaddr);
+   if (sHOW_ADMIN) {
+      space(d+3); VG_(printf)("admin  %p\n",   lk->admin);
+      space(d+3); VG_(printf)("magic  0x%x\n", (UInt)lk->magic);
+   }
+   space(d+3); VG_(printf)("unique %llu\n", lk->unique);
+   space(d+3); VG_(printf)("kind   %s\n", show_LockKind(lk->kind));
+   space(d+3); VG_(printf)("heldW  %s\n", lk->heldW ? "yes" : "no");
+   space(d+3); VG_(printf)("heldBy %p", lk->heldBy);
+   if (lk->heldBy) {
+      Thread* thr;
+      Word    count;
+      VG_(printf)(" { ");
+      HG_(initIterBag)( lk->heldBy );
+      while (HG_(nextIterBag)( lk->heldBy, (Word*)(void*)&thr, &count ))
+         VG_(printf)("%lu:%p ", count, thr);
+      HG_(doneIterBag)( lk->heldBy );
+      VG_(printf)("}");
+   }
+   VG_(printf)("\n");
+   space(d+0); VG_(printf)("}\n");
+}
+
+static void pp_admin_locks ( Int d )
+{
+   Int   i, n;
+   Lock* lk;
+   for (n = 0, lk = admin_locks;  lk;  n++, lk = lk->admin) {
+      /* nothing */
+   }
+   space(d); VG_(printf)("admin_locks (%d records) {\n", n);
+   for (i = 0, lk = admin_locks;  lk;  i++, lk = lk->admin) {
+      if (0) {
+         space(n); 
+         VG_(printf)("admin_locks record %d of %d:\n", i, n);
+      }
+      pp_Lock(d+3, lk);
+   }
+   space(d); VG_(printf)("}\n", n);
+}
+
+static void pp_map_locks ( Int d )
+{
+   void* gla;
+   Lock* lk;
+   space(d); VG_(printf)("map_locks (%d entries) {\n",
+                         (Int)HG_(sizeFM)( map_locks ));
+   HG_(initIterFM)( map_locks );
+   while (HG_(nextIterFM)( map_locks, (Word*)(void*)&gla,
+                                      (Word*)(void*)&lk )) {
+      space(d+3);
+      VG_(printf)("guest %p -> Lock %p\n", gla, lk);
+   }
+   HG_(doneIterFM)( map_locks );
+   space(d); VG_(printf)("}\n");
+}
+
+static void pp_Segment ( Int d, Segment* s )
+{
+   space(d+0); VG_(printf)("Segment %p {\n", s);
+   if (sHOW_ADMIN) {
+   space(d+3); VG_(printf)("admin  %p\n",   s->admin);
+   space(d+3); VG_(printf)("magic  0x%x\n", (UInt)s->magic);
+   }
+   space(d+3); VG_(printf)("dfsver    %u\n", s->dfsver);
+   space(d+3); VG_(printf)("thr       %p\n", s->thr);
+   space(d+3); VG_(printf)("prev      %p\n", s->prev);
+   space(d+3); VG_(printf)("other[%c] %p\n", s->other_hint, s->other);
+   space(d+0); VG_(printf)("}\n");
+}
+
+static void pp_admin_segments ( Int d )
+{
+   Int      i, n;
+   Segment* s;
+   for (n = 0, s = admin_segments;  s;  n++, s = s->admin) {
+      /* nothing */
+   }
+   space(d); VG_(printf)("admin_segments (%d records) {\n", n);
+   for (i = 0, s = admin_segments;  s;  i++, s = s->admin) {
+      if (0) {
+         space(n); 
+         VG_(printf)("admin_segments record %d of %d:\n", i, n);
+      }
+      pp_Segment(d+3, s);
+   }
+   space(d); VG_(printf)("}\n", n);
+}
+
+static void pp_map_segments ( Int d )
+{
+   SegmentID segid;
+   Segment*  seg;
+   space(d); VG_(printf)("map_segments (%d entries) {\n", 
+                         (Int)HG_(sizeFM)( map_segments ));
+   HG_(initIterFM)( map_segments );
+   while (HG_(nextIterFM)( map_segments, (Word*)(void*)&segid,
+                                         (Word*)(void*)&seg )) {
+      space(d+3);
+      VG_(printf)("segid 0x%x -> Segment %p\n", (UInt)segid, seg);
+   }
+   HG_(doneIterFM)( map_segments );
+   space(d); VG_(printf)("}\n");
+}
+
+static void show_shadow_w32 ( /*OUT*/Char* buf, Int nBuf, UInt w32 )
+{
+   tl_assert(nBuf-1 >= 99);
+   VG_(memset)(buf, 0, nBuf);
+   if (is_SHVAL_ShM(w32)) {
+      VG_(sprintf)(buf, "ShM(%u,%u)", 
+                   un_SHVAL_ShM_tset(w32), un_SHVAL_ShM_lset(w32));
+   }
+   else
+   if (is_SHVAL_ShR(w32)) {
+      VG_(sprintf)(buf, "ShR(%u,%u)", 
+                   un_SHVAL_ShR_tset(w32), un_SHVAL_ShR_lset(w32));
+   }
+   else
+   if (is_SHVAL_Excl(w32)) {
+      VG_(sprintf)(buf, "Excl(%u)", un_SHVAL_Excl(w32));
+   }
+   else
+   if (is_SHVAL_New(w32)) {
+      VG_(sprintf)(buf, "%s", "New");
+   }
+   else
+   if (is_SHVAL_NoAccess(w32)) {
+      VG_(sprintf)(buf, "%s", "NoAccess");
+   }
+   else {
+      VG_(sprintf)(buf, "Invalid-shadow-word(%u)", w32);
+   }
+}
+
+static
+void show_shadow_w32_for_user ( /*OUT*/Char* buf, Int nBuf, UInt w32 )
+{
+   tl_assert(nBuf-1 >= 99);
+   VG_(memset)(buf, 0, nBuf);
+   if (is_SHVAL_ShM(w32)) {
+      WordSetID tset = un_SHVAL_ShM_tset(w32);
+      WordSetID lset = del_BHL( un_SHVAL_ShM_lset(w32) );
+      VG_(sprintf)(buf, "ShMod(#Tset=%d,#Lset=%d)", 
+                   HG_(cardinalityWS)(univ_tsets, tset),
+                   HG_(cardinalityWS)(univ_lsets, lset));
+   }
+   else
+   if (is_SHVAL_ShR(w32)) {
+      WordSetID tset = un_SHVAL_ShR_tset(w32);
+      WordSetID lset = del_BHL( un_SHVAL_ShR_lset(w32) );
+      VG_(sprintf)(buf, "ShRO(#Tset=%d,#Lset=%d)", 
+                   HG_(cardinalityWS)(univ_tsets, tset),
+                   HG_(cardinalityWS)(univ_lsets, lset));
+   }
+   else
+   if (is_SHVAL_Excl(w32)) {
+      SegmentID segid  = un_SHVAL_Excl(w32);
+      Segment*  mb_seg = map_segments_maybe_lookup(segid);
+      if (mb_seg && mb_seg->thr && is_sane_Thread(mb_seg->thr)) {
+         VG_(sprintf)(buf, "Exclusive(thr#%d)", mb_seg->thr->errmsg_index);
+      } else {
+         VG_(sprintf)(buf, "Exclusive(segid=%u)", un_SHVAL_Excl(w32));
+      }
+   }
+   else
+   if (is_SHVAL_New(w32)) {
+      VG_(sprintf)(buf, "%s", "New");
+   }
+   else
+   if (is_SHVAL_NoAccess(w32)) {
+      VG_(sprintf)(buf, "%s", "NoAccess");
+   }
+   else {
+      VG_(sprintf)(buf, "Invalid-shadow-word(%u)", w32);
+   }
+}
+
+static void pp_SecMap_shared ( Int d, SecMap* sm, Addr ga )
+{
+   Int  i;
+#if 0
+   Addr a;
+   UInt w32;
+   Char buf[100];
+#endif
+   CacheLineZ* lineZ;
+   CacheLineF* lineF;
+   space(d+0); VG_(printf)("SecMap %p (ga %p) {\n", sm, (void*)ga);
+
+   for (i = 0; i < N_SECMAP_ZLINES; i++) {
+      get_ZF_by_index( &lineZ, &lineF, sm, i );
+      space(d+3); VG_(printf)("// pp_SecMap_shared: not implemented\n");
+   }
+
+#if 0
+   for (i = 0; i < N_SECMAP_ARANGE; i++) {
+      w32 = sm->w32s[i];
+      a   = ga + 1 * i;
+      if (! (is_SHVAL_ShM(w32) || is_SHVAL_ShR(w32)))
+         continue;
+      space(d+3); VG_(printf)("%p -> 0x%08x ", (void*)a, w32);
+      show_shadow_w32(buf, sizeof(buf), w32);
+      VG_(printf)("%s\n", buf);
+   }
+#endif
+
+   space(d+0); VG_(printf)("}\n");
+}
+
+static void pp_map_shmem_shared ( Int d )
+{
+   Addr    ga;
+   SecMap* sm;
+   space(d); VG_(printf)("map_shmem_ShR_and_ShM_only {\n");
+   HG_(initIterFM)( map_shmem );
+   while (HG_(nextIterFM)( map_shmem, (Word*)(void*)&ga,
+                                      (Word*)(void*)&sm )) {
+      pp_SecMap_shared( d+3, sm, ga );
+   }
+   HG_(doneIterFM) ( map_shmem );
+   space(d); VG_(printf)("}\n");
+}
+
+static void pp_everything ( Int flags, Char* caller )
+{
+   Int d = 0;
+   VG_(printf)("\n");
+   VG_(printf)("All_Data_Structures (caller = \"%s\") {\n", caller);
+   if (flags & PP_THREADS) {
+      VG_(printf)("\n");
+      pp_admin_threads(d+3);
+      VG_(printf)("\n");
+      pp_map_threads(d+3);
+   }
+   if (flags & PP_LOCKS) {
+      VG_(printf)("\n");
+      pp_admin_locks(d+3);
+      VG_(printf)("\n");
+      pp_map_locks(d+3);
+   }
+   if (flags & PP_SEGMENTS) {
+      VG_(printf)("\n");
+      pp_admin_segments(d+3);
+      VG_(printf)("\n");
+      pp_map_segments(d+3);
+   }
+   if (flags & PP_SHMEM_SHARED) {
+      VG_(printf)("\n");
+      pp_map_shmem_shared( d+3 );
+   }
+
+   VG_(printf)("\n");
+   VG_(printf)("}\n");
+   VG_(printf)("\n");
+}
+
+#undef SHOW_ADMIN
+
+
+/*----------------------------------------------------------------*/
+/*--- Initialise the primary data structures                   ---*/
+/*----------------------------------------------------------------*/
+
+/* fwds */
+static void map_segments_add ( SegmentID segid, Segment* seg );
+static void shmem__invalidate_scache ( void );
+static void hbefore__invalidate_cache ( void );
+static void shmem__set_mbHasLocks ( Addr a, Bool b );
+static Bool shmem__get_mbHasLocks ( Addr a );
+static void shadow_mem_set8 ( Thread* uu_thr_acc, Addr a, UInt svNew );
+static XArray* singleton_VTS ( Thread* thr, UWord tym );
+
+static void initialise_data_structures ( void )
+{
+   SegmentID segid;
+   Segment*  seg;
+   Thread*   thr;
+
+   /* Get everything initialised and zeroed. */
+   tl_assert(admin_threads == NULL);
+   tl_assert(admin_locks == NULL);
+   tl_assert(admin_segments == NULL);
+
+   tl_assert(sizeof(Addr) == sizeof(Word));
+   tl_assert(map_shmem == NULL);
+   map_shmem = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxed Word cmp*/);
+   tl_assert(map_shmem != NULL);
+   shmem__invalidate_scache();
+
+   tl_assert(map_threads == NULL);
+   map_threads = hg_zalloc( VG_N_THREADS * sizeof(Thread*) );
+   tl_assert(map_threads != NULL);
+
+   /* re <=: < on 64-bit platforms, == on 32-bit ones */
+   tl_assert(sizeof(SegmentID) <= sizeof(Word));
+   tl_assert(sizeof(Segment*) == sizeof(Word));
+   tl_assert(map_segments == NULL);
+   map_segments = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxed Word cmp*/);
+   tl_assert(map_segments != NULL);
+   hbefore__invalidate_cache();
+
+   tl_assert(sizeof(Addr) == sizeof(Word));
+   tl_assert(map_locks == NULL);
+   map_locks = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxed Word cmp*/);
+   tl_assert(map_locks != NULL);
+
+   __bus_lock_Lock = mk_LockN( LK_nonRec, (Addr)&__bus_lock );
+   tl_assert(is_sane_LockN(__bus_lock_Lock));
+   HG_(addToFM)( map_locks, (Word)&__bus_lock, (Word)__bus_lock_Lock );
+
+   tl_assert(univ_tsets == NULL);
+   univ_tsets = HG_(newWordSetU)( hg_zalloc, hg_free, 8/*cacheSize*/ );
+   tl_assert(univ_tsets != NULL);
+
+   tl_assert(univ_lsets == NULL);
+   univ_lsets = HG_(newWordSetU)( hg_zalloc, hg_free, 8/*cacheSize*/ );
+   tl_assert(univ_lsets != NULL);
+
+   tl_assert(univ_laog == NULL);
+   univ_laog = HG_(newWordSetU)( hg_zalloc, hg_free, 24/*cacheSize*/ );
+   tl_assert(univ_laog != NULL);
+
+   /* Set up entries for the root thread */
+   // FIXME: this assumes that the first real ThreadId is 1
+
+   /* a segment for the new thread ... */
+   // FIXME: code duplication in ev__post_thread_create
+   segid = alloc_SegmentID();
+   seg   = mk_Segment( NULL, NULL, NULL );
+   map_segments_add( segid, seg );
+
+   /* a Thread for the new thread ... */
+   thr = mk_Thread( segid );
+   seg->thr = thr;
+
+   /* Give the thread a starting-off vector timestamp. */
+   seg->vts = singleton_VTS( seg->thr, 1 );
+
+   /* and bind it in the thread-map table.
+      FIXME: assumes root ThreadId == 1. */
+   map_threads[1] = thr;
+
+   tl_assert(VG_INVALID_THREADID == 0);
+
+   /* Mark the new bus lock correctly (to stop the sanity checks
+      complaining) */
+   tl_assert( sizeof(__bus_lock) == 4 );
+   shadow_mem_set8( NULL/*unused*/, __bus_lock_Lock->guestaddr, 
+                                    mk_SHVAL_Excl(segid) );
+   shmem__set_mbHasLocks( __bus_lock_Lock->guestaddr, True );
+
+   all__sanity_check("initialise_data_structures");
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- map_threads :: WordFM core-ThreadId Thread*              ---*/
+/*----------------------------------------------------------------*/
+
+/* Doesn't assert if the relevant map_threads entry is NULL. */
+static Thread* map_threads_maybe_lookup ( ThreadId coretid )
+{
+   Thread* thr;
+   tl_assert( is_sane_ThreadId(coretid) );
+   thr = map_threads[coretid];
+   return thr;
+}
+
+/* Asserts if the relevant map_threads entry is NULL. */
+static inline Thread* map_threads_lookup ( ThreadId coretid )
+{
+   Thread* thr;
+   tl_assert( is_sane_ThreadId(coretid) );
+   thr = map_threads[coretid];
+   tl_assert(thr);
+   return thr;
+}
+
+/* Do a reverse lookup.  Warning: POTENTIALLY SLOW.  Does not assert
+   if 'thr' is not found in map_threads. */
+static ThreadId map_threads_maybe_reverse_lookup_SLOW ( Thread* thr )
+{
+   Int i;
+   tl_assert(is_sane_Thread(thr));
+   /* Check nobody used the invalid-threadid slot */
+   tl_assert(VG_INVALID_THREADID >= 0 && VG_INVALID_THREADID < VG_N_THREADS);
+   tl_assert(map_threads[VG_INVALID_THREADID] == NULL);
+   for (i = 0; i < VG_N_THREADS; i++) {
+      if (i != VG_INVALID_THREADID && map_threads[i] == thr)
+         return (ThreadId)i;
+   }
+   return VG_INVALID_THREADID;
+}
+
+/* Do a reverse lookup.  Warning: POTENTIALLY SLOW.  Asserts if 'thr'
+   is not found in map_threads. */
+static ThreadId map_threads_reverse_lookup_SLOW ( Thread* thr )
+{
+   ThreadId tid = map_threads_maybe_reverse_lookup_SLOW( thr );
+   tl_assert(tid != VG_INVALID_THREADID);
+   return tid;
+}
+
+static void map_threads_delete ( ThreadId coretid )
+{
+   Thread* thr;
+   tl_assert(coretid != 0);
+   tl_assert( is_sane_ThreadId(coretid) );
+   thr = map_threads[coretid];
+   tl_assert(thr);
+   map_threads[coretid] = NULL;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- map_locks :: WordFM guest-Addr-of-lock Lock*             ---*/
+/*----------------------------------------------------------------*/
+
+/* Make sure there is a lock table entry for the given (lock) guest
+   address.  If not, create one of the stated 'kind' in unheld state.
+   In any case, return the address of the existing or new Lock. */
+static 
+Lock* map_locks_lookup_or_create ( LockKind lkk, Addr ga, ThreadId tid )
+{
+   Bool  found;
+   Lock* oldlock = NULL;
+   tl_assert(is_sane_ThreadId(tid));
+   found = HG_(lookupFM)( map_locks, 
+                          NULL, (Word*)(void*)&oldlock, (Word)ga );
+   if (!found) {
+      Lock* lock = mk_LockN(lkk, ga);
+      lock->appeared_at = VG_(record_ExeContext)( tid, 0 );
+      tl_assert(is_sane_LockN(lock));
+      HG_(addToFM)( map_locks, (Word)ga, (Word)lock );
+      tl_assert(oldlock == NULL);
+      // mark the relevant secondary map has .mbHasLocks
+      shmem__set_mbHasLocks( ga, True );
+      return lock;
+   } else {
+      tl_assert(oldlock != NULL);
+      tl_assert(is_sane_LockN(oldlock));
+      tl_assert(oldlock->guestaddr == ga);
+      // check the relevant secondary map has .mbHasLocks?
+      tl_assert(shmem__get_mbHasLocks(ga) == True);
+      return oldlock;
+   }
+}
+
+static Lock* map_locks_maybe_lookup ( Addr ga )
+{
+   Bool  found;
+   Lock* lk = NULL;
+   found = HG_(lookupFM)( map_locks, NULL, (Word*)(void*)&lk, (Word)ga );
+   tl_assert(found  ?  lk != NULL  :  lk == NULL);
+   if (found) {
+      // check the relevant secondary map has .mbHasLocks?
+      tl_assert(shmem__get_mbHasLocks(ga) == True);
+   }
+   return lk;
+}
+
+static void map_locks_delete ( Addr ga )
+{
+   Addr  ga2 = 0;
+   Lock* lk  = NULL;
+   HG_(delFromFM)( map_locks,
+                   (Word*)(void*)&ga2, (Word*)(void*)&lk, (Word)ga );
+   /* delFromFM produces the val which is being deleted, if it is
+      found.  So assert it is non-null; that in effect asserts that we
+      are deleting a (ga, Lock) pair which actually exists. */
+   tl_assert(lk != NULL);
+   tl_assert(ga2 == ga);
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- map_segments :: WordFM SegmentID Segment*                ---*/
+/*--- the DAG of thread segments                               ---*/
+/*----------------------------------------------------------------*/
+
+static void segments__generate_vcg ( void ); /* fwds */
+
+/*--------------- SegmentID to Segment* maps ---------------*/
+
+static Segment* map_segments_lookup ( SegmentID segid )
+{
+   Bool     found;
+   Segment* seg = NULL;
+   tl_assert( is_sane_SegmentID(segid) );
+   found = HG_(lookupFM)( map_segments,
+                          NULL, (Word*)(void*)&seg, (Word)segid );
+   tl_assert(found);
+   tl_assert(seg != NULL);
+   return seg;
+}
+
+static Segment* map_segments_maybe_lookup ( SegmentID segid )
+{
+   Bool     found;
+   Segment* seg = NULL;
+   tl_assert( is_sane_SegmentID(segid) );
+   found = HG_(lookupFM)( map_segments,
+                          NULL, (Word*)(void*)&seg, (Word)segid );
+   if (!found) tl_assert(seg == NULL);
+   return seg;
+}
+
+static void map_segments_add ( SegmentID segid, Segment* seg )
+{
+   /* This is a bit inefficient.  Oh well. */
+   tl_assert( !HG_(lookupFM)( map_segments, NULL, NULL, segid ));
+   HG_(addToFM)( map_segments, (Word)segid, (Word)seg );
+}
+
+/*--------------- to do with Vector Timestamps ---------------*/
+
+/* Scalar Timestamp */
+typedef
+   struct {
+      Thread* thr;
+      UWord   tym;
+   }
+   ScalarTS;
+
+/* Vector Timestamp = XArray* ScalarTS */
+
+static Bool is_sane_VTS ( XArray* vts )
+{
+   UWord     i, n;
+   ScalarTS  *st1, *st2;
+   n = VG_(sizeXA)( vts );
+   if (n >= 2) {
+      for (i = 0; i < n-1; i++) {
+         st1 = VG_(indexXA)( vts, i );
+         st2 = VG_(indexXA)( vts, i+1 );
+         if (st1->thr >= st2->thr)
+            return False;
+         if (st1->tym == 0 || st2->tym == 0)
+            return False;
+      }
+   }
+   return True;
+}
+
+static XArray* new_VTS ( void ) {
+   return VG_(newXA)( hg_zalloc, hg_free, sizeof(ScalarTS) );
+}
+static XArray* singleton_VTS ( Thread* thr, UWord tym ) {
+   ScalarTS st;
+   XArray*  vts;
+   tl_assert(thr);
+   tl_assert(tym >= 1);
+   vts = new_VTS();
+   tl_assert(vts);
+   st.thr = thr;
+   st.tym = tym;
+   VG_(addToXA)( vts, &st );
+   return vts;
+}
+
+
+static Bool cmpGEQ_VTS ( XArray* a, XArray* b )
+{
+   Word     ia, ib, useda, usedb;
+   UWord    tyma, tymb;
+   Thread*  thr;
+   ScalarTS *tmpa, *tmpb;
+
+   Bool all_leq = True;
+   Bool all_geq = True;
+
+   tl_assert(a);
+   tl_assert(b);
+   useda = VG_(sizeXA)( a );
+   usedb = VG_(sizeXA)( b );
+
+   ia = ib = 0;
+
+   while (1) {
+
+      /* This logic is to enumerate triples (thr, tyma, tymb) drawn
+         from a and b in order, where thr is the next Thread*
+         occurring in either a or b, and tyma/b are the relevant
+         scalar timestamps, taking into account implicit zeroes. */
+      tl_assert(ia >= 0 && ia <= useda);
+      tl_assert(ib >= 0 && ib <= usedb);
+      tmpa = tmpb = NULL;
+
+      if (ia == useda && ib == usedb) {
+         /* both empty - done */
+         break;
+      }
+      else
+      if (ia == useda && ib != usedb) {
+         /* a empty, use up b */
+         tmpb = VG_(indexXA)( b, ib );
+         thr  = tmpb->thr;
+         tyma = 0;
+         tymb = tmpb->tym;
+         ib++;
+      }
+      else
+      if (ia != useda && ib == usedb) {
+         /* b empty, use up a */
+         tmpa = VG_(indexXA)( a, ia );
+         thr  = tmpa->thr;
+         tyma = tmpa->tym;
+         tymb = 0;
+         ia++;
+      }
+      else {
+         /* both not empty; extract lowest-Thread*'d triple */
+         tmpa = VG_(indexXA)( a, ia );
+         tmpb = VG_(indexXA)( b, ib );
+         if (tmpa->thr < tmpb->thr) {
+            /* a has the lowest unconsidered Thread* */
+            thr  = tmpa->thr;
+            tyma = tmpa->tym;
+            tymb = 0;
+            ia++;
+         }
+         else
+         if (tmpa->thr > tmpb->thr) {
+            /* b has the lowest unconsidered Thread* */
+            thr  = tmpb->thr;
+            tyma = 0;
+            tymb = tmpb->tym;
+            ib++;
+         } else {
+            /* they both next mention the same Thread* */
+            tl_assert(tmpa->thr == tmpb->thr);
+            thr  = tmpa->thr; /* == tmpb->thr */
+            tyma = tmpa->tym;
+            tymb = tmpb->tym;
+            ia++;
+            ib++;
+         }
+      }
+
+      /* having laboriously determined (thr, tyma, tymb), do something
+         useful with it. */
+      if (tyma < tymb)
+         all_geq = False;
+      if (tyma > tymb)
+         all_leq = False;
+   }
+
+   if (all_leq && all_geq)
+      return True; /* PordEQ */
+   /* now we know they aren't equal, so either all_leq or all_geq or
+      both are false. */
+   if (all_leq)
+      return False; /* PordLT */
+   if (all_geq)
+      return True; /* PordGT */
+   /* hmm, neither all_geq or all_leq.  This means unordered. */
+   return False; /* PordUN */
+}
+
+
+/* Compute max((tick(thra,a),b) into a new XArray.  a and b are
+   unchanged.  If neither a nor b supply a value for 'thra',
+   assert. */
+static
+XArray* tickL_and_joinR_VTS ( Thread* thra, XArray* a, XArray* b )
+{
+   Word     ia, ib, useda, usedb, ticks_found;
+   UWord    tyma, tymb, tymMax;
+   Thread*  thr;
+   XArray*  res;
+   ScalarTS *tmpa, *tmpb;
+
+   tl_assert(a);
+   tl_assert(b);
+   tl_assert(thra);
+   useda = VG_(sizeXA)( a );
+   usedb = VG_(sizeXA)( b );
+
+   res = new_VTS();
+   ia = ib = ticks_found = 0;
+
+   while (1) {
+
+      /* This logic is to enumerate triples (thr, tyma, tymb) drawn
+         from a and b in order, where thr is the next Thread*
+         occurring in either a or b, and tyma/b are the relevant
+         scalar timestamps, taking into account implicit zeroes. */
+      tl_assert(ia >= 0 && ia <= useda);
+      tl_assert(ib >= 0 && ib <= usedb);
+      tmpa = tmpb = NULL;
+
+      if (ia == useda && ib == usedb) {
+         /* both empty - done */
+         break;
+      }
+      else
+      if (ia == useda && ib != usedb) {
+         /* a empty, use up b */
+         tmpb = VG_(indexXA)( b, ib );
+         thr  = tmpb->thr;
+         tyma = 0;
+         tymb = tmpb->tym;
+         ib++;
+      }
+      else
+      if (ia != useda && ib == usedb) {
+         /* b empty, use up a */
+         tmpa = VG_(indexXA)( a, ia );
+         thr  = tmpa->thr;
+         tyma = tmpa->tym;
+         tymb = 0;
+         ia++;
+      }
+      else {
+         /* both not empty; extract lowest-Thread*'d triple */
+         tmpa = VG_(indexXA)( a, ia );
+         tmpb = VG_(indexXA)( b, ib );
+         if (tmpa->thr < tmpb->thr) {
+            /* a has the lowest unconsidered Thread* */
+            thr  = tmpa->thr;
+            tyma = tmpa->tym;
+            tymb = 0;
+            ia++;
+         }
+         else
+         if (tmpa->thr > tmpb->thr) {
+            /* b has the lowest unconsidered Thread* */
+            thr  = tmpb->thr;
+            tyma = 0;
+            tymb = tmpb->tym;
+            ib++;
+         } else {
+            /* they both next mention the same Thread* */
+            tl_assert(tmpa->thr == tmpb->thr);
+            thr  = tmpa->thr; /* == tmpb->thr */
+            tyma = tmpa->tym;
+            tymb = tmpb->tym;
+            ia++;
+            ib++;
+         }
+      }
+
+      /* having laboriously determined (thr, tyma, tymb), do something
+         useful with it. */
+      if (thr == thra) {
+         if (tyma > 0) {
+            /* VTS 'a' actually supplied this value; it is not a
+               default zero.  Do the required 'tick' action. */
+            tyma++;
+            ticks_found++;
+         } else {
+            /* 'a' didn't supply this value, so 'b' must have. */
+            tl_assert(tymb > 0);
+         }
+      }
+      tymMax = tyma > tymb ? tyma : tymb;
+      if (tymMax > 0) {
+         ScalarTS st;
+         st.thr = thr;
+         st.tym = tymMax;
+         VG_(addToXA)( res, &st );
+      }
+
+   }
+
+   tl_assert(is_sane_VTS( res ));
+
+   if (thra != NULL) {
+      tl_assert(ticks_found == 1);
+   } else {
+      tl_assert(ticks_found == 0);
+   }
+
+   return res;
+}
+
+
+/* Do 'vts[me]++', so to speak.  If 'me' does not have an entry in
+   'vts', set it to 1 in the returned VTS. */
+
+static XArray* tick_VTS ( Thread* me, XArray* vts ) {
+   ScalarTS* here = NULL;
+   ScalarTS  tmp;
+   XArray*   res;
+   Word      i, n; 
+   tl_assert(me);
+   tl_assert(is_sane_VTS(vts));
+   if (0) VG_(printf)("tick vts thrno %ld szin %d\n",
+                      (Word)me->errmsg_index, (Int)VG_(sizeXA)(vts) );
+   res = new_VTS();
+   n = VG_(sizeXA)( vts );
+   for (i = 0; i < n; i++) {
+      here = VG_(indexXA)( vts, i );
+      if (me < here->thr) {
+         /* We just went past 'me', without seeing it. */
+         tmp.thr = me;
+         tmp.tym = 1;
+         VG_(addToXA)( res, &tmp );
+         tmp = *here;
+         VG_(addToXA)( res, &tmp );
+         i++;
+         break;
+      } 
+      else if (me == here->thr) {
+         tmp = *here;
+         tmp.tym++;
+         VG_(addToXA)( res, &tmp );
+         i++;
+         break;
+      }
+      else /* me > here->thr */ {
+         tmp = *here;
+         VG_(addToXA)( res, &tmp );
+      }
+   }
+   tl_assert(i >= 0 && i <= n);
+   if (i == n && here && here->thr < me) {
+      tmp.thr = me;
+      tmp.tym = 1;
+      VG_(addToXA)( res, &tmp );
+   } else {
+      for (/*keepgoing*/; i < n; i++) {
+         here = VG_(indexXA)( vts, i );
+         tmp = *here;
+         VG_(addToXA)( res, &tmp );
+      }
+   }
+   tl_assert(is_sane_VTS(res));
+   if (0) VG_(printf)("tick vts thrno %ld szou %d\n",
+                      (Word)me->errmsg_index, (Int)VG_(sizeXA)(res) );
+   return res;
+}
+
+static void show_VTS ( HChar* buf, Int nBuf, XArray* vts ) {
+   ScalarTS* st;
+   HChar     unit[64];
+   Word      i, n;
+   Int       avail = nBuf;
+   tl_assert(avail > 16);
+   buf[0] = '[';
+   buf[1] = 0;
+   n = VG_(sizeXA)( vts );
+   for (i = 0; i < n; i++) {
+      tl_assert(avail >= 10);
+      st = VG_(indexXA)( vts, i );
+      VG_(memset)(unit, 0, sizeof(unit));
+      VG_(sprintf)(unit, i < n-1 ? "%ld:%ld " : "%ld:%ld",
+                         (Word)st->thr->errmsg_index, st->tym);
+      if (avail < VG_(strlen)(unit) + 10/*let's say*/) {
+         VG_(strcat)(buf, " ...]");
+         return;
+      }
+      VG_(strcat)(buf, unit);
+      avail -= VG_(strlen)(unit);
+   }
+   VG_(strcat)(buf, "]");
+}
+
+
+/*------------ searching the happens-before graph ------------*/
+
+static UWord stats__hbefore_queries   = 0; // total # queries
+static UWord stats__hbefore_cache0s   = 0; // hits at cache[0]
+static UWord stats__hbefore_cacheNs   = 0; // hits at cache[> 0]
+static UWord stats__hbefore_probes    = 0; // # checks in cache
+static UWord stats__hbefore_gsearches = 0; // # searches in graph
+static UWord stats__hbefore_gsearchFs = 0; // # fast searches in graph
+static UWord stats__hbefore_invals    = 0; // # cache invals
+static UWord stats__hbefore_stk_hwm   = 0; // stack high water mark
+
+/* Running marker for depth-first searches */
+/* NOTE: global variable */
+static UInt dfsver_current = 0;
+
+/* A stack of possibly-unexplored nodes used in the depth first search */
+/* NOTE: global variable */
+static XArray* dfsver_stack = NULL;
+
+// FIXME: check this - is it really correct?
+__attribute__((noinline))
+static Bool happens_before_do_dfs_from_to ( Segment* src, Segment* dst )
+{
+   Segment* here;
+   Word     ssz;
+
+   /* begin SPEEDUP HACK -- the following can safely be omitted */
+   /* fast track common case, without favouring either the
+      ->prev or ->other links */
+   tl_assert(src);
+   tl_assert(dst);
+   if ((src->prev && src->prev == dst)
+       || (src->other && src->other == dst)) {
+      stats__hbefore_gsearchFs++;
+      return True;
+   }
+   /* end SPEEDUP HACK */
+
+   /* empty out the stack */
+   tl_assert(dfsver_stack);
+   VG_(dropTailXA)( dfsver_stack, VG_(sizeXA)( dfsver_stack ));
+   tl_assert(VG_(sizeXA)( dfsver_stack ) == 0);
+
+   /* push starting point */
+   (void) VG_(addToXA)( dfsver_stack, &src );
+
+   while (True) {
+      /* While the stack is not empty, pop the next node off it and
+         consider. */
+      ssz = VG_(sizeXA)( dfsver_stack );
+      tl_assert(ssz >= 0);
+      if (ssz == 0)
+         return False; /* stack empty ==> no path from src to dst */
+
+      if (UNLIKELY( ((UWord)ssz) > stats__hbefore_stk_hwm ))
+         stats__hbefore_stk_hwm = (UWord)ssz;
+
+      /* here = pop(stack) */
+      here = *(Segment**) VG_(indexXA)( dfsver_stack, ssz-1 );
+      VG_(dropTailXA)( dfsver_stack, 1 );
+
+     again:
+      /* consider the node 'here' */
+      if (here == dst)
+         return True; /* found a path from src and dst */
+
+      /* have we been to 'here' before? */
+      tl_assert(here->dfsver <= dfsver_current);
+      if (here->dfsver == dfsver_current)
+         continue; /* We've been 'here' before - node is not interesting*/
+
+      /* Mark that we've been here */
+      here->dfsver = dfsver_current;
+
+      /* Now push both children on the stack */
+
+      /* begin SPEEDUP hack -- the following can safely be omitted */
+      /* idea is, if there is exactly one child, avoid the overhead of
+         pushing it on the stack and immediately popping it off again.
+         Kinda like doing a tail-call. */
+      if (here->prev && !here->other) {
+         here = here->prev;
+         goto again;
+      }
+      if (here->other && !here->prev) {
+         here = here->other;
+         goto again;
+      }
+      /* end of SPEEDUP HACK */
+
+      /* Push all available children on stack.  From some quick
+         experimentation it seems like exploring ->other first leads
+         to lower maximum stack use, although getting repeatable
+         results is difficult. */
+      if (here->prev)
+         (void) VG_(addToXA)( dfsver_stack, &(here->prev) );
+      if (here->other)
+         (void) VG_(addToXA)( dfsver_stack, &(here->other) );
+   }
+}
+
+__attribute__((noinline))
+static Bool happens_before_wrk ( Segment* seg1, Segment* seg2 )
+{
+   Bool reachable;
+
+   { static Int nnn = 0;
+     if (SHOW_EXPENSIVE_STUFF && (nnn++ % 1000) == 0)
+        VG_(printf)("happens_before_wrk: %d\n", nnn);
+   }
+
+   /* Now the question is, is there a chain of pointers through the
+      .prev and .other fields, that leads from seg2 back to seg1 ? */
+   tl_assert(dfsver_current < 0xFFFFFFFF);
+   dfsver_current++;
+   
+   if (dfsver_stack == NULL) {
+     dfsver_stack = VG_(newXA)( hg_zalloc, hg_free, sizeof(Segment*) );
+     tl_assert(dfsver_stack);
+   }
+
+   reachable = happens_before_do_dfs_from_to( seg2, seg1 );
+
+   return reachable;
+}
+
+/*--------------- the happens_before cache ---------------*/
+
+#define HBEFORE__N_CACHE 64
+typedef 
+   struct { SegmentID segid1; SegmentID segid2; Bool result; } 
+   HBeforeCacheEnt;
+
+static HBeforeCacheEnt hbefore__cache[HBEFORE__N_CACHE];
+
+static void hbefore__invalidate_cache ( void ) 
+{
+   Int i;
+   SegmentID bogus = 0;
+   tl_assert(!is_sane_SegmentID(bogus));
+   stats__hbefore_invals++;
+   for (i = 0; i < HBEFORE__N_CACHE; i++) {
+      hbefore__cache[i].segid1 = bogus;
+      hbefore__cache[i].segid2 = bogus;
+      hbefore__cache[i].result = False;
+   }
+}
+
+static Bool happens_before ( SegmentID segid1, SegmentID segid2 )
+{
+   Bool    hbG, hbV;
+   Int     i, j, iNSERT_POINT;
+   Segment *seg1, *seg2;
+   tl_assert(is_sane_SegmentID(segid1));
+   tl_assert(is_sane_SegmentID(segid2));
+   tl_assert(segid1 != segid2);
+   stats__hbefore_queries++;
+   stats__hbefore_probes++;
+   if (segid1 == hbefore__cache[0].segid1 
+       && segid2 == hbefore__cache[0].segid2) {
+      stats__hbefore_cache0s++;
+      return hbefore__cache[0].result;
+   }
+   for (i = 1; i < HBEFORE__N_CACHE; i++) {
+      stats__hbefore_probes++;
+      if (segid1 == hbefore__cache[i].segid1 
+          && segid2 == hbefore__cache[i].segid2) {
+         /* Found it.  Move it 1 step closer to the front. */
+         HBeforeCacheEnt tmp = hbefore__cache[i];
+         hbefore__cache[i]   = hbefore__cache[i-1];
+         hbefore__cache[i-1] = tmp;
+         stats__hbefore_cacheNs++;
+         return tmp.result;
+      }
+   }
+   /* Not found.  Search the graph and add an entry to the cache. */
+   stats__hbefore_gsearches++;
+
+   seg1 = map_segments_lookup(segid1);
+   seg2 = map_segments_lookup(segid2);
+   tl_assert(is_sane_Segment(seg1));
+   tl_assert(is_sane_Segment(seg2));
+   tl_assert(seg1 != seg2);
+   tl_assert(seg1->vts);
+   tl_assert(seg2->vts);
+
+   hbV = cmpGEQ_VTS( seg2->vts, seg1->vts );
+   if (0) {
+      /* Crosscheck the vector-timestamp comparison result against that
+         obtained from the explicit graph approach.  Can be very
+         slow. */
+      hbG = happens_before_wrk( seg1, seg2 );
+   } else {
+      /* Assume the vector-timestamp comparison result is correct, and
+         use it as-is. */
+      hbG = hbV;
+   }
+
+   if (hbV != hbG) {
+      VG_(printf)("seg1 %p  seg2 %p  hbV %d  hbG %d\n", 
+                  seg1,seg2,(Int)hbV,(Int)hbG);
+      segments__generate_vcg();
+   }
+   tl_assert(hbV == hbG);
+
+   iNSERT_POINT = (1*HBEFORE__N_CACHE)/4 - 1;
+   /* if (iNSERT_POINT > 4) iNSERT_POINT = 4; */
+
+   for (j = HBEFORE__N_CACHE-1; j > iNSERT_POINT; j--) {
+      hbefore__cache[j] = hbefore__cache[j-1];
+   }
+   hbefore__cache[iNSERT_POINT].segid1 = segid1;
+   hbefore__cache[iNSERT_POINT].segid2 = segid2;
+   hbefore__cache[iNSERT_POINT].result = hbG;
+
+   if (0)
+   VG_(printf)("hb %d %d\n", (Int)segid1-(1<<24), (Int)segid2-(1<<24));
+   return hbG;
+}
+
+/*--------------- generating .vcg output ---------------*/
+
+static void segments__generate_vcg ( void )
+{
+#define PFX "xxxxxx"
+   /* Edge colours:
+         Black  -- the chain of .prev links
+         Green  -- thread creation, link to parent
+         Red    -- thread exit, link to exiting thread
+         Yellow -- signal edge
+         Pink   -- semaphore-up edge
+   */
+   Segment* seg;
+   HChar vtsstr[128];
+   VG_(printf)(PFX "graph: { title: \"Segments\"\n");
+   VG_(printf)(PFX "orientation: top_to_bottom\n");
+   VG_(printf)(PFX "height: 900\n");
+   VG_(printf)(PFX "width: 500\n");
+   VG_(printf)(PFX "x: 20\n");
+   VG_(printf)(PFX "y: 20\n");
+   VG_(printf)(PFX "color: lightgrey\n");
+   for (seg = admin_segments; seg; seg=seg->admin) {
+
+      VG_(printf)(PFX "node: { title: \"%p\" color: lightcyan "
+                  "textcolor: darkgreen label: \"Seg %p\\n", 
+                  seg, seg);
+      if (seg->thr->errmsg_index == 1) {
+         VG_(printf)("ROOT_THREAD");
+      } else {
+         VG_(printf)("Thr# %d", seg->thr->errmsg_index);
+      }
+
+      if (clo_gen_vcg >= 2) {
+         show_VTS( vtsstr, sizeof(vtsstr)-1, seg->vts );
+         vtsstr[sizeof(vtsstr)-1] = 0;
+         VG_(printf)("\\n%s", vtsstr);
+      }
+
+      VG_(printf)("\" }\n", vtsstr);
+
+      if (seg->prev)
+         VG_(printf)(PFX "edge: { sourcename: \"%p\" targetname: \"%p\""
+                     "color: black }\n", seg->prev, seg );
+      if (seg->other) {
+         HChar* colour = "orange";
+         switch (seg->other_hint) {
+            case 'c': colour = "darkgreen";  break; /* creation */
+            case 'j': colour = "red";        break; /* join (exit) */
+            case 's': colour = "orange";     break; /* signal */
+            case 'S': colour = "pink";       break; /* sem_post->wait */
+            case 'u': colour = "cyan";       break; /* unlock */
+            default: tl_assert(0);
+         }
+         VG_(printf)(PFX "edge: { sourcename: \"%p\" targetname: \"%p\""
+                     " color: %s }\n", seg->other, seg, colour );
+      }
+   }
+   VG_(printf)(PFX "}\n");
+#undef PFX
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- map_shmem :: WordFM Addr SecMap                          ---*/
+/*--- shadow memory (low level handlers) (shmem__* fns)        ---*/
+/*----------------------------------------------------------------*/
+
+
+static UWord stats__secmaps_allocd       = 0; // # SecMaps issued
+static UWord stats__secmap_ga_space_covered = 0; // # ga bytes covered
+static UWord stats__secmap_linesZ_allocd = 0; // # CacheLineZ's issued
+static UWord stats__secmap_linesZ_bytes  = 0; // .. using this much storage
+static UWord stats__secmap_linesF_allocd = 0; // # CacheLineF's issued
+static UWord stats__secmap_linesF_bytes  = 0; //  .. using this much storage
+static UWord stats__secmap_iterator_steppings = 0; // # calls to stepSMIter
+static UWord stats__cache_Z_fetches      = 0; // # Z lines fetched
+static UWord stats__cache_Z_wbacks       = 0; // # Z lines written back
+static UWord stats__cache_F_fetches      = 0; // # F lines fetched
+static UWord stats__cache_F_wbacks       = 0; // # F lines written back
+static UWord stats__cache_invals         = 0; // # cache invals
+static UWord stats__cache_flushes        = 0; // # cache flushes
+static UWord stats__cache_totrefs        = 0; // # total accesses
+static UWord stats__cache_totmisses      = 0; // # misses
+static UWord stats__cline_normalises     = 0; // # calls to cacheline_normalise
+static UWord stats__cline_read64s        = 0; // # calls to s_m_read64
+static UWord stats__cline_read32s        = 0; // # calls to s_m_read32
+static UWord stats__cline_read16s        = 0; // # calls to s_m_read16
+static UWord stats__cline_read8s         = 0; // # calls to s_m_read8
+static UWord stats__cline_write64s       = 0; // # calls to s_m_write64
+static UWord stats__cline_write32s       = 0; // # calls to s_m_write32
+static UWord stats__cline_write16s       = 0; // # calls to s_m_write16
+static UWord stats__cline_write8s        = 0; // # calls to s_m_write8
+static UWord stats__cline_set64s         = 0; // # calls to s_m_set64
+static UWord stats__cline_set32s         = 0; // # calls to s_m_set32
+static UWord stats__cline_set16s         = 0; // # calls to s_m_set16
+static UWord stats__cline_set8s          = 0; // # calls to s_m_set8
+static UWord stats__cline_get8s          = 0; // # calls to s_m_get8
+static UWord stats__cline_copy8s         = 0; // # calls to s_m_copy8
+static UWord stats__cline_64to32splits   = 0; // # 64-bit accesses split
+static UWord stats__cline_32to16splits   = 0; // # 32-bit accesses split
+static UWord stats__cline_16to8splits    = 0; // # 16-bit accesses split
+static UWord stats__cline_64to32pulldown = 0; // # calls to pulldown_to_32
+static UWord stats__cline_32to16pulldown = 0; // # calls to pulldown_to_16
+static UWord stats__cline_16to8pulldown  = 0; // # calls to pulldown_to_8
+
+
+static UInt shadow_mem_get8 ( Addr a ); /* fwds */
+
+static inline Addr shmem__round_to_SecMap_base ( Addr a ) {
+   return a & ~(N_SECMAP_ARANGE - 1);
+}
+static inline UWord shmem__get_SecMap_offset ( Addr a ) {
+   return a & (N_SECMAP_ARANGE - 1);
+}
+
+/*--------------- SecMap allocation --------------- */
+
+static HChar* shmem__bigchunk_next = NULL;
+static HChar* shmem__bigchunk_end1 = NULL;
+
+static void* shmem__bigchunk_alloc ( SizeT n )
+{
+   const SizeT sHMEM__BIGCHUNK_SIZE = 4096 * 256;
+   tl_assert(n > 0);
+   n = ROUNDUP(n, 16);
+   tl_assert(shmem__bigchunk_next <= shmem__bigchunk_end1);
+   tl_assert(shmem__bigchunk_end1 - shmem__bigchunk_next
+             <= (SSizeT)sHMEM__BIGCHUNK_SIZE);
+   if (shmem__bigchunk_next + n > shmem__bigchunk_end1) {
+      if (0)
+      VG_(printf)("XXXXX bigchunk: abandoning %d bytes\n", 
+                  (Int)(shmem__bigchunk_end1 - shmem__bigchunk_next));
+      shmem__bigchunk_next = VG_(am_shadow_alloc)( sHMEM__BIGCHUNK_SIZE );
+      shmem__bigchunk_end1 = shmem__bigchunk_next + sHMEM__BIGCHUNK_SIZE;
+   }
+   tl_assert(shmem__bigchunk_next);
+   tl_assert( 0 == (((Addr)shmem__bigchunk_next) & (16-1)) );
+   tl_assert(shmem__bigchunk_next + n <= shmem__bigchunk_end1);
+   shmem__bigchunk_next += n;
+   return shmem__bigchunk_next - n;
+}
+
+static SecMap* shmem__alloc_SecMap ( void )
+{
+   Word    i, j;
+   SecMap* sm = shmem__bigchunk_alloc( sizeof(SecMap) );
+   if (0) VG_(printf)("alloc_SecMap %p\n",sm);
+   tl_assert(sm);
+   sm->magic       = SecMap_MAGIC;
+   sm->mbHasLocks  = False; /* dangerous */
+   sm->mbHasShared = False; /* dangerous */
+   for (i = 0; i < N_SECMAP_ZLINES; i++) {
+      sm->linesZ[i].dict[0] = SHVAL_NoAccess;
+      sm->linesZ[i].dict[1] = 0; /* completely invalid SHVAL */
+      sm->linesZ[i].dict[2] = 0;
+      sm->linesZ[i].dict[3] = 0;
+      for (j = 0; j < N_LINE_ARANGE/4; j++)
+         sm->linesZ[i].ix2s[j] = 0; /* all reference dict[0] */
+   }
+   sm->linesF      = NULL;
+   sm->linesF_size = 0;
+   stats__secmaps_allocd++;
+   stats__secmap_ga_space_covered += N_SECMAP_ARANGE;
+   stats__secmap_linesZ_allocd += N_SECMAP_ZLINES;
+   stats__secmap_linesZ_bytes += N_SECMAP_ZLINES * sizeof(CacheLineZ);
+   return sm;
+}
+
+static SecMap* shmem__find_or_alloc_SecMap ( Addr ga )
+{
+   SecMap* sm    = NULL;
+   Addr    gaKey = shmem__round_to_SecMap_base(ga);
+   if (HG_(lookupFM)( map_shmem,
+                      NULL/*keyP*/, (Word*)(void*)&sm, (Word)gaKey )) {
+      /* Found; address of SecMap is in sm */
+      tl_assert(sm);
+   } else {
+      /* create a new one */
+      sm = shmem__alloc_SecMap();
+      tl_assert(sm);
+      HG_(addToFM)( map_shmem, (Word)gaKey, (Word)sm );
+   }
+   return sm;
+}
+
+
+/*--------------- cache management/lookup --------------- */
+
+/*--------------- misc --------------- */
+
+static Bool shmem__get_mbHasLocks ( Addr a )
+{
+   SecMap* sm;
+   Addr aKey = shmem__round_to_SecMap_base(a);
+   if (HG_(lookupFM)( map_shmem,
+                      NULL/*keyP*/, (Word*)(void*)&sm, (Word)aKey )) {
+      /* Found */
+      return sm->mbHasLocks;
+   } else {
+      return False;
+   }
+}
+
+static void shmem__set_mbHasLocks ( Addr a, Bool b )
+{
+   SecMap* sm;
+   Addr aKey = shmem__round_to_SecMap_base(a);
+   tl_assert(b == False || b == True);
+   if (HG_(lookupFM)( map_shmem,
+                      NULL/*keyP*/, (Word*)(void*)&sm, (Word)aKey )) {
+      /* Found; address of SecMap is in sm */
+   } else {
+      /* create a new one */
+      sm = shmem__alloc_SecMap();
+      tl_assert(sm);
+      HG_(addToFM)( map_shmem, (Word)aKey, (Word)sm );
+   }
+   sm->mbHasLocks = b;
+}
+
+static void shmem__set_mbHasShared ( Addr a, Bool b )
+{
+   SecMap* sm;
+   Addr aKey = shmem__round_to_SecMap_base(a);
+   tl_assert(b == False || b == True);
+   if (HG_(lookupFM)( map_shmem,
+                      NULL/*keyP*/, (Word*)(void*)&sm, (Word)aKey )) {
+      /* Found; address of SecMap is in sm */
+   } else {
+      /* create a new one */
+      sm = shmem__alloc_SecMap();
+      tl_assert(sm);
+      HG_(addToFM)( map_shmem, (Word)aKey, (Word)sm );
+   }
+   sm->mbHasShared = b;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Sanity checking the data structures                      ---*/
+/*----------------------------------------------------------------*/
+
+static UWord stats__sanity_checks = 0;
+
+static Bool is_sane_CacheLine ( CacheLine* cl ); /* fwds */
+static Bool cmpGEQ_VTS ( XArray* a, XArray* b ); /* fwds */
+static void laog__sanity_check ( Char* who ); /* fwds */
+
+/* REQUIRED INVARIANTS:
+
+   Thread vs Segment/Lock/SecMaps
+
+      for each t in Threads {
+
+         // Thread.lockset: each element is really a valid Lock
+
+         // Thread.lockset: each Lock in set is actually held by that thread
+         for lk in Thread.lockset 
+            lk == LockedBy(t)
+
+         // Thread.csegid is a valid SegmentID
+         // and the associated Segment has .thr == t
+
+      }
+
+      all thread Locksets are pairwise empty under intersection
+      (that is, no lock is claimed to be held by more than one thread)
+      -- this is guaranteed if all locks in locksets point back to their
+      owner threads
+
+   Lock vs Thread/Segment/SecMaps
+
+      for each entry (gla, la) in map_locks
+         gla == la->guest_addr
+
+      for each lk in Locks {
+
+         lk->tag is valid
+         lk->guest_addr does not have shadow state NoAccess
+         if lk == LockedBy(t), then t->lockset contains lk
+         if lk == UnlockedBy(segid) then segid is valid SegmentID
+             and can be mapped to a valid Segment(seg)
+             and seg->thr->lockset does not contain lk
+         if lk == UnlockedNew then (no lockset contains lk)
+
+         secmaps for lk has .mbHasLocks == True
+
+      }
+
+   Segment vs Thread/Lock/SecMaps
+
+      the Segment graph is a dag (no cycles)
+      all of the Segment graph must be reachable from the segids
+         mentioned in the Threads
+
+      for seg in Segments {
+
+         seg->thr is a sane Thread
+
+      }
+
+   SecMaps vs Segment/Thread/Lock
+
+      for sm in SecMaps {
+
+         sm properly aligned
+         if any shadow word is ShR or ShM then .mbHasShared == True
+
+         for each Excl(segid) state
+            map_segments_lookup maps to a sane Segment(seg)
+         for each ShM/ShR(tsetid,lsetid) state
+            each lk in lset is a valid Lock
+            each thr in tset is a valid thread, which is non-dead
+
+      }
+*/
+
+
+/* Return True iff 'thr' holds 'lk' in some mode. */
+static Bool thread_is_a_holder_of_Lock ( Thread* thr, Lock* lk )
+{
+   if (lk->heldBy)
+      return HG_(elemBag)( lk->heldBy, (Word)thr ) > 0;
+   else
+      return False;
+}
+
+/* Sanity check Threads, as far as possible */
+__attribute__((noinline))
+static void threads__sanity_check ( Char* who )
+{
+#define BAD(_str) do { how = (_str); goto bad; } while (0)
+   Char*     how = "no error";
+   Thread*   thr;
+   WordSetID wsA, wsW;
+   Word*     ls_words;
+   Word      ls_size, i;
+   Lock*     lk;
+   Segment*  seg;
+   for (thr = admin_threads; thr; thr = thr->admin) {
+      if (!is_sane_Thread(thr)) BAD("1");
+      wsA = thr->locksetA;
+      wsW = thr->locksetW;
+      // locks held in W mode are a subset of all locks held
+      if (!HG_(isSubsetOf)( univ_lsets, wsW, wsA )) BAD("7");
+      HG_(getPayloadWS)( &ls_words, &ls_size, univ_lsets, wsA );
+      for (i = 0; i < ls_size; i++) {
+         lk = (Lock*)ls_words[i];
+         // Thread.lockset: each element is really a valid Lock
+         if (!is_sane_LockN(lk)) BAD("2");
+         // Thread.lockset: each Lock in set is actually held by that
+         // thread
+         if (!thread_is_a_holder_of_Lock(thr,lk)) BAD("3");
+         // Thread.csegid is a valid SegmentID
+         if (!is_sane_SegmentID(thr->csegid)) BAD("4");
+         // and the associated Segment has .thr == t
+         seg = map_segments_maybe_lookup(thr->csegid);
+         if (!is_sane_Segment(seg)) BAD("5");
+         if (seg->thr != thr) BAD("6");
+      }
+   }
+   return;
+  bad:
+   VG_(printf)("threads__sanity_check: who=\"%s\", bad=\"%s\"\n", who, how);
+   tl_assert(0);
+#undef BAD
+}
+
+
+/* Sanity check Locks, as far as possible */
+__attribute__((noinline))
+static void locks__sanity_check ( Char* who )
+{
+#define BAD(_str) do { how = (_str); goto bad; } while (0)
+   Char*     how = "no error";
+   Addr      gla;
+   Lock*     lk;
+   Int       i;
+   // # entries in admin_locks == # entries in map_locks
+   for (i = 0, lk = admin_locks;  lk;  i++, lk = lk->admin)
+      ;
+   if (i != HG_(sizeFM)(map_locks)) BAD("1");
+   // for each entry (gla, lk) in map_locks
+   //      gla == lk->guest_addr
+   HG_(initIterFM)( map_locks );
+   while (HG_(nextIterFM)( map_locks,
+                           (Word*)(void*)&gla, (Word*)(void*)&lk )) {
+      if (lk->guestaddr != gla) BAD("2");
+   }
+   HG_(doneIterFM)( map_locks );
+   // scan through admin_locks ...
+   for (lk = admin_locks; lk; lk = lk->admin) {
+      // lock is sane.  Quite comprehensive, also checks that
+      // referenced (holder) threads are sane.
+      if (!is_sane_LockN(lk)) BAD("3");
+      // map_locks binds guest address back to this lock
+      if (lk != map_locks_maybe_lookup(lk->guestaddr)) BAD("4");
+      // lk->guest_addr does not have shadow state NoAccess
+      // FIXME: this could legitimately arise from a buggy guest
+      // that attempts to lock in (eg) freed memory.  Detect this
+      // and warn about it in the pre/post-mutex-lock event handler.
+      if (is_SHVAL_NoAccess(shadow_mem_get8(lk->guestaddr))) BAD("5");
+      // look at all threads mentioned as holders of this lock.  Ensure
+      // this lock is mentioned in their locksets.
+      if (lk->heldBy) {
+         Thread* thr;
+         Word    count;
+         HG_(initIterBag)( lk->heldBy );
+         while (HG_(nextIterBag)( lk->heldBy, 
+                                  (Word*)(void*)&thr, &count )) {
+            // is_sane_LockN above ensures these
+            tl_assert(count >= 1);
+            tl_assert(is_sane_Thread(thr));
+            if (!HG_(elemWS)(univ_lsets, thr->locksetA, (Word)lk)) 
+               BAD("6");
+            // also check the w-only lockset
+            if (lk->heldW 
+                && !HG_(elemWS)(univ_lsets, thr->locksetW, (Word)lk)) 
+               BAD("7");
+            if ((!lk->heldW)
+                && HG_(elemWS)(univ_lsets, thr->locksetW, (Word)lk)) 
+               BAD("8");
+         }
+         HG_(doneIterBag)( lk->heldBy );
+      } else {
+         /* lock not held by anybody */
+         if (lk->heldW) BAD("9"); /* should be False if !heldBy */
+         // since lk is unheld, then (no lockset contains lk)
+         // hmm, this is really too expensive to check.  Hmm.
+      }
+      // secmaps for lk has .mbHasLocks == True
+      if (!shmem__get_mbHasLocks(lk->guestaddr)) BAD("10");
+   }
+
+   return;
+  bad:
+   VG_(printf)("locks__sanity_check: who=\"%s\", bad=\"%s\"\n", who, how);
+   tl_assert(0);
+#undef BAD
+}
+
+
+/* Sanity check Segments, as far as possible */
+__attribute__((noinline))
+static void segments__sanity_check ( Char* who )
+{
+#define BAD(_str) do { how = (_str); goto bad; } while (0)
+   Char*    how = "no error";
+   Int      i;
+   Segment* seg;
+   // FIXME
+   //   the Segment graph is a dag (no cycles)
+   //   all of the Segment graph must be reachable from the segids
+   //      mentioned in the Threads
+   // # entries in admin_segments == # entries in map_segments
+   for (i = 0, seg = admin_segments;  seg;  i++, seg = seg->admin)
+      ;
+   if (i != HG_(sizeFM)(map_segments)) BAD("1");
+   // for seg in Segments {
+   for (seg = admin_segments; seg; seg = seg->admin) {
+      if (!is_sane_Segment(seg)) BAD("2");
+      if (!is_sane_Thread(seg->thr)) BAD("3");
+      if (!seg->vts) BAD("4");
+      if (seg->prev && seg->prev->vts
+          && !cmpGEQ_VTS(seg->vts, seg->prev->vts))
+         BAD("5");
+      if (seg->other && seg->other->vts
+          && !cmpGEQ_VTS(seg->vts, seg->other->vts))
+         BAD("6");
+   }
+   return;
+  bad:
+   VG_(printf)("segments__sanity_check: who=\"%s\", bad=\"%s\"\n", 
+               who, how);
+   tl_assert(0);
+#undef BAD
+}
+
+
+/* Sanity check shadow memory, as far as possible */
+static Int cmp_Addr_for_ssort ( void* p1, void* p2 ) {
+   Addr a1 = *(Addr*)p1;
+   Addr a2 = *(Addr*)p2;
+   if (a1 < a2) return -1;
+   if (a1 > a2) return 1;
+   return 0;
+}
+__attribute__((noinline))
+static void shmem__sanity_check ( Char* who )
+{
+#define BAD(_str) do { how = (_str); goto bad; } while (0)
+   Char*   how = "no error";
+   Word    smga;
+   SecMap* sm;
+   Word    i, j, ws_size, n_valid_tags;
+   Word*   ws_words;
+   Addr*   valid_tags;
+   HG_(initIterFM)( map_shmem );
+   // for sm in SecMaps {
+   while (HG_(nextIterFM)( map_shmem,
+                           (Word*)(void*)&smga, (Word*)(void*)&sm )) {
+      SecMapIter itr;
+      UInt*      w32p;
+      Bool       mbHasShared = False;
+      Bool       allNoAccess = True;
+      if (!is_sane_SecMap(sm)) BAD("1");
+      // sm properly aligned
+      if (smga != shmem__round_to_SecMap_base(smga)) BAD("2");
+      // if any shadow word is ShR or ShM then .mbHasShared == True
+      initSecMapIter( &itr );
+      while (stepSecMapIter( &w32p, &itr, sm )) {
+         UInt w32 = *w32p;
+         if (is_SHVAL_Sh(w32)) 
+            mbHasShared = True;
+         if (!is_SHVAL_NoAccess(w32))
+            allNoAccess = False;
+         if (is_SHVAL_Excl(w32)) {
+            // for each Excl(segid) state
+            // map_segments_lookup maps to a sane Segment(seg)
+            Segment*  seg;
+            SegmentID segid = un_SHVAL_Excl(w32);
+            if (!is_sane_SegmentID(segid)) BAD("3");
+            seg = map_segments_maybe_lookup(segid);
+            if (!is_sane_Segment(seg)) BAD("4");
+         } 
+         else if (is_SHVAL_Sh(w32)) {
+            WordSetID tset = un_SHVAL_Sh_tset(w32);
+            WordSetID lset = un_SHVAL_Sh_lset(w32);
+            if (!HG_(plausibleWS)( univ_tsets, tset )) BAD("5");
+            if (!HG_(saneWS_SLOW)( univ_tsets, tset )) BAD("6");
+            if (HG_(cardinalityWS)( univ_tsets, tset ) < 2) BAD("7");
+            if (!HG_(plausibleWS)( univ_lsets, lset )) BAD("8");
+            if (!HG_(saneWS_SLOW)( univ_lsets, lset )) BAD("9");
+            HG_(getPayloadWS)( &ws_words, &ws_size, univ_lsets, lset );
+            for (j = 0; j < ws_size; j++) {
+               Lock* lk = (Lock*)ws_words[j];
+               // for each ShM/ShR(tsetid,lsetid) state
+               // each lk in lset is a valid Lock
+               if (!is_sane_LockN(lk)) BAD("10");
+            }
+            HG_(getPayloadWS)( &ws_words, &ws_size, univ_tsets, tset );
+            for (j = 0; j < ws_size; j++) {
+               Thread* thr = (Thread*)ws_words[j];
+               //for each ShM/ShR(tsetid,lsetid) state
+               // each thr in tset is a valid thread, which is non-dead
+               if (!is_sane_Thread(thr)) BAD("11");
+            }
+         }
+         else if (is_SHVAL_NoAccess(w32) || is_SHVAL_New(w32)) {
+            /* nothing to check */
+         }
+         else {
+            /* bogus shadow mem value */
+            BAD("12");
+         }
+      } /* iterating over a SecMap */
+      // Check essential safety property
+      if (mbHasShared && !sm->mbHasShared) BAD("13");
+      // This is optional - check that destroyed memory has its hint
+      // bits cleared.  NB won't work properly unless full, eager
+      // GCing of SecMaps is implemented
+      //if (allNoAccess && sm->mbHasLocks) BAD("13a");
+   }
+   HG_(doneIterFM)( map_shmem );
+
+   // check the cache
+   valid_tags   = hg_zalloc(N_WAY_NENT * sizeof(Addr));
+   n_valid_tags = 0;
+   tl_assert(valid_tags);
+   for (i = 0; i < N_WAY_NENT; i++) {
+      CacheLine* cl;
+      Addr       tag; 
+      /* way0, dude */
+      cl  = &cache_shmem.lyns0[i];
+      tag =  cache_shmem.tags0[i];
+      if (tag != 1) {
+         if (!is_valid_scache_tag(tag)) BAD("14-0");
+         if (!is_sane_CacheLine(cl)) BAD("15-0");
+         /* A valid tag should be of the form 
+            X---X line_number:N_WAY_BITS 0:N_LINE_BITS */
+         if (tag & (N_LINE_ARANGE-1)) BAD("16-0");
+         if ( i != ((tag >> N_LINE_BITS) & (N_WAY_NENT-1)) ) BAD("16-1");
+         valid_tags[n_valid_tags++] = tag;
+      }
+   }
+   tl_assert(n_valid_tags <= N_WAY_NENT);
+   if (n_valid_tags > 1) {
+      /* Check that the valid tags are unique */
+      VG_(ssort)( valid_tags, n_valid_tags, sizeof(Addr), cmp_Addr_for_ssort );
+      for (i = 0; i < n_valid_tags-1; i++) {
+         if (valid_tags[i] >= valid_tags[i+1])
+            BAD("16-2");
+      }
+   }
+   hg_free(valid_tags);
+   return;
+  bad:
+   VG_(printf)("shmem__sanity_check: who=\"%s\", bad=\"%s\"\n", who, how);
+   tl_assert(0);
+#undef BAD
+}
+
+static void all_except_Locks__sanity_check ( Char* who ) {
+   stats__sanity_checks++;
+   if (0) VG_(printf)("all_except_Locks__sanity_check(%s)\n", who);
+   threads__sanity_check(who);
+   segments__sanity_check(who);
+   shmem__sanity_check(who);
+   laog__sanity_check(who);
+}
+static void all__sanity_check ( Char* who ) {
+   all_except_Locks__sanity_check(who);
+   locks__sanity_check(who);
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- the core memory state machine (msm__* functions)         ---*/
+/*----------------------------------------------------------------*/
+
+static UWord stats__msm_read_Excl_nochange = 0;
+static UWord stats__msm_read_Excl_transfer = 0;
+static UWord stats__msm_read_Excl_to_ShR   = 0;
+static UWord stats__msm_read_ShR_to_ShR    = 0;
+static UWord stats__msm_read_ShM_to_ShM    = 0;
+static UWord stats__msm_read_New_to_Excl   = 0;
+static UWord stats__msm_read_NoAccess      = 0;
+
+static UWord stats__msm_write_Excl_nochange = 0;
+static UWord stats__msm_write_Excl_transfer = 0;
+static UWord stats__msm_write_Excl_to_ShM   = 0;
+static UWord stats__msm_write_ShR_to_ShM    = 0;
+static UWord stats__msm_write_ShM_to_ShM    = 0;
+static UWord stats__msm_write_New_to_Excl   = 0;
+static UWord stats__msm_write_NoAccess      = 0;
+
+/* fwds */
+static void record_error_Race ( Thread* thr, 
+                                Addr data_addr, Bool isWrite, Int szB,
+                                UInt old_sv, UInt new_sv, 
+                                ExeContext* mb_lastlock );
+
+static void record_error_FreeMemLock ( Thread* thr, Lock* lk );
+
+static void record_error_UnlockUnlocked ( Thread*, Lock* );
+static void record_error_UnlockForeign  ( Thread*, Thread*, Lock* );
+static void record_error_UnlockBogus    ( Thread*, Addr );
+static void record_error_PthAPIerror    ( Thread*, HChar*, Word, HChar* );
+static void record_error_LockOrder      ( Thread*, Addr, Addr,
+                                                   ExeContext*, ExeContext* );
+
+static void record_error_Misc ( Thread*, HChar* );
+static void announce_one_thread ( Thread* thr ); /* fwds */
+
+static WordSetID add_BHL ( WordSetID lockset ) {
+   return HG_(addToWS)( univ_lsets, lockset, (Word)__bus_lock_Lock );
+}
+static WordSetID del_BHL ( WordSetID lockset ) {
+   return HG_(delFromWS)( univ_lsets, lockset, (Word)__bus_lock_Lock );
+}
+
+
+/* Last-lock-lossage records.  This mechanism exists to help explain
+   to programmers why we are complaining about a race.  The idea is to
+   monitor all lockset transitions.  When a previously nonempty
+   lockset becomes empty, the lock(s) that just disappeared (the
+   "lossage") are the locks that have consistently protected the
+   location (ga_of_access) in question for the longest time.  Most of
+   the time the lossage-set is a single lock.  Because the
+   lossage-lock is the one that has survived longest, there is there
+   is a good chance that it is indeed the lock that the programmer
+   intended to use to protect the location.
+
+   Note that we cannot in general just look at the lossage set when we
+   see a transition to ShM(...,empty-set), because a transition to an
+   empty lockset can happen arbitrarily far before the point where we
+   want to report an error.  This is in the case where there are many
+   transitions ShR -> ShR, all with an empty lockset, and only later
+   is there a transition to ShM.  So what we want to do is note the
+   lossage lock at the point where a ShR -> ShR transition empties out
+   the lockset, so we can present it later if there should be a
+   transition to ShM.
+
+   So this function finds such transitions.  For each, it associates
+   in ga_to_lastlock, the guest address and the lossage lock.  In fact
+   we do not record the Lock* directly as that may disappear later,
+   but instead the ExeContext inside the Lock which says where it was
+   initialised or first locked.  ExeContexts are permanent so keeping
+   them indefinitely is safe.
+
+   A boring detail: the hardware bus lock is not interesting in this
+   respect, so we first remove that from the pre/post locksets.
+*/
+
+static UWord stats__ga_LL_adds = 0;
+
+static WordFM* ga_to_lastlock = NULL; /* GuestAddr -> ExeContext* */
+
+static 
+void record_last_lock_lossage ( Addr ga_of_access,
+                                WordSetID lset_old, WordSetID lset_new )
+{
+   Lock* lk;
+   Int   card_old, card_new;
+
+   tl_assert(lset_old != lset_new);
+
+   if (0) VG_(printf)("XX1: %d (card %d) -> %d (card %d) %p\n", 
+                      (Int)lset_old, 
+                      HG_(cardinalityWS)(univ_lsets,lset_old),
+                      (Int)lset_new, 
+                      HG_(cardinalityWS)(univ_lsets,lset_new),
+                      ga_of_access );
+
+   /* This is slow, but at least it's simple.  The bus hardware lock
+      just confuses the logic, so remove it from the locksets we're
+      considering before doing anything else. */
+   lset_new = del_BHL( lset_new );
+
+   if (!HG_(isEmptyWS)( univ_lsets, lset_new )) {
+      /* The post-transition lock set is not empty.  So we are not
+         interested.  We're only interested in spotting transitions
+         that make locksets become empty. */
+      return;
+   }
+
+   /* lset_new is now empty */
+   card_new = HG_(cardinalityWS)( univ_lsets, lset_new );
+   tl_assert(card_new == 0);
+
+   lset_old = del_BHL( lset_old );
+   card_old = HG_(cardinalityWS)( univ_lsets, lset_old );
+
+   if (0) VG_(printf)(" X2: %d (card %d) -> %d (card %d)\n",
+                      (Int)lset_old, card_old, (Int)lset_new, card_new );
+
+   if (card_old == 0) {
+      /* The old lockset was also empty.  Not interesting. */
+      return;
+   }
+
+   tl_assert(card_old > 0);
+   tl_assert(!HG_(isEmptyWS)( univ_lsets, lset_old ));
+
+   /* Now we know we've got a transition from a nonempty lockset to an
+      empty one.  So lset_old must be the set of locks lost.  Record
+      some details.  If there is more than one element in the lossage
+      set, just choose one arbitrarily -- not the best, but at least
+      it's simple. */
+
+   lk = (Lock*)HG_(anyElementOfWS)( univ_lsets, lset_old );
+   if (0) VG_(printf)("lossage %d %p\n", 
+                      HG_(cardinalityWS)( univ_lsets, lset_old), lk );
+   if (lk->appeared_at) {
+      if (ga_to_lastlock == NULL)
+         ga_to_lastlock = HG_(newFM)( hg_zalloc, hg_free, NULL );
+      HG_(addToFM)( ga_to_lastlock, ga_of_access, (Word)lk->appeared_at );
+      stats__ga_LL_adds++;
+   }
+}
+
+/* This queries the table (ga_to_lastlock) made by
+   record_last_lock_lossage, when constructing error messages.  It
+   attempts to find the ExeContext of the allocation or initialisation
+   point for the lossage lock associated with 'ga'. */
+
+static ExeContext* maybe_get_lastlock_initpoint ( Addr ga ) 
+{
+   ExeContext* ec_hint = NULL;
+   if (ga_to_lastlock != NULL 
+       && HG_(lookupFM)(ga_to_lastlock, 
+                        NULL, (Word*)(void*)&ec_hint, ga)) {
+      tl_assert(ec_hint != NULL);
+      return ec_hint;
+   } else {
+      return NULL;
+   }
+}
+
+
+static void msm__show_state_change ( Thread* thr_acc, Addr a, Int szB,
+                                     Char howC,
+                                     UInt sv_old, UInt sv_new )
+{
+   ThreadId tid;
+   UChar txt_old[100], txt_new[100];
+   Char* how = "";
+   tl_assert(is_sane_Thread(thr_acc));
+   tl_assert(clo_trace_level == 1 || clo_trace_level == 2);
+   switch (howC) {
+      case 'r': how = "rd"; break;
+      case 'w': how = "wr"; break;
+      case 'p': how = "pa"; break;
+      default: tl_assert(0);
+   }
+   show_shadow_w32_for_user(txt_old, sizeof(txt_old), sv_old);
+   show_shadow_w32_for_user(txt_new, sizeof(txt_new), sv_new);
+   txt_old[sizeof(txt_old)-1] = 0;
+   txt_new[sizeof(txt_new)-1] = 0;
+   if (clo_trace_level == 2) {
+      /* show everything */
+      VG_(message)(Vg_UserMsg, "");
+      announce_one_thread( thr_acc );
+      VG_(message)(Vg_UserMsg, 
+                   "TRACE: %p %s %d thr#%d :: %s --> %s",
+                   a, how, szB, thr_acc->errmsg_index, txt_old, txt_new );
+      tid = map_threads_maybe_reverse_lookup_SLOW(thr_acc);
+      if (tid != VG_INVALID_THREADID) {
+         VG_(get_and_pp_StackTrace)( tid, 8 );
+      }
+   } else {
+      /* Just print one line */
+      VG_(message)(Vg_UserMsg, 
+                   "TRACE: %p %s %d thr#%d :: %22s --> %22s",
+                   a, how, szB, thr_acc->errmsg_index, txt_old, txt_new );
+   }
+}
+
+
+/* Here are some MSM stats from startup/shutdown of OpenOffice.
+
+     msm:  489,734,723   80,278,862 rd/wr_Excl_nochange
+     msm:    3,171,542       93,738 rd/wr_Excl_transfer
+     msm:       45,036          167 rd/wr_Excl_to_ShR/ShM
+     msm:   13,352,594          285 rd/wr_ShR_to_ShR/ShM
+     msm:    1,125,879      815,779 rd/wr_ShM_to_ShM
+     msm:    7,561,842  250,629,935 rd/wr_New_to_Excl
+     msm:       17,778            0 rd/wr_NoAccess
+
+   This says how the clauses should be ordered for greatest speed:
+
+   * the vast majority of memory reads (490 million out of a total of
+     515 million) are of memory in an exclusive state, and the state
+     is unchanged.  All other read accesses are insignificant by
+     comparison.
+
+   * 75% (251 million out of a total of 332 million) writes are 'first
+     time' writes, which take New memory into exclusive ownership.
+     Almost all the rest (80 million) are accesses to exclusive state,
+     which remains unchanged.  All other write accesses are
+     insignificant. */
+
+/* The core MSM.  If 'wold' is the old 32-bit shadow word for a
+   location, return the new shadow word that would result for a read
+   of the location, and report any errors necessary on the way.  This
+   does not update shadow memory - it merely produces new shadow words
+   from old.  'thr_acc' and 'a' are supplied only so it can produce
+   coherent error messages if necessary. */
+static
+UInt msm__handle_read ( Thread* thr_acc, Addr a, UInt wold, Int szB )
+{
+   UInt wnew = SHVAL_Invalid;
+
+   tl_assert(is_sane_Thread(thr_acc));
+
+   if (0) VG_(printf)("read thr=%p %p\n", thr_acc, a);
+
+   /* Exclusive */
+   if (LIKELY(is_SHVAL_Excl(wold))) {
+      /* read Excl(segid) 
+           |  segid_old == segid-of-thread
+           -> no change
+           |  segid_old `happens_before` segid-of-this-thread
+           -> Excl(segid-of-this-thread)
+           |  otherwise
+           -> ShR
+      */
+      SegmentID segid_old = un_SHVAL_Excl(wold);
+      tl_assert(is_sane_SegmentID(segid_old));
+      if (LIKELY(segid_old == thr_acc->csegid)) {
+         /* no change */
+         stats__msm_read_Excl_nochange++;
+         /*NOCHANGE*/return wold;
+      }
+      if (happens_before(segid_old, thr_acc->csegid)) {
+         /* -> Excl(segid-of-this-thread) */
+         wnew = mk_SHVAL_Excl(thr_acc->csegid);
+         stats__msm_read_Excl_transfer++;
+         goto changed;
+      }
+      /* else */ {
+         /* Enter the shared-readonly (ShR) state. */
+         WordSetID tset, lset;
+         /* This location has been accessed by precisely two threads.
+            Make an appropriate tset. */
+         // FIXME: performance: duplicate map_segments_lookup(segid_old)
+         // since must also be done in happens_before()
+         Segment* seg_old = map_segments_lookup( segid_old );
+         Thread*  thr_old = seg_old->thr;
+         tset = HG_(doubletonWS)( univ_tsets, (Word)thr_old, (Word)thr_acc );
+         lset = add_BHL( thr_acc->locksetA ); /* read ==> use all locks */
+         wnew = mk_SHVAL_ShR( tset, lset );
+         stats__msm_read_Excl_to_ShR++;
+         goto changed;
+      }
+      /*NOTREACHED*/
+   } 
+
+   /* Shared-Readonly */
+   if (is_SHVAL_ShR(wold)) {
+     /* read Shared-Readonly(threadset, lockset)
+        We remain in ShR state, but add this thread to the 
+        threadset and refine the lockset accordingly.  Do not
+        complain if the lockset becomes empty -- that's ok. */
+      WordSetID tset_old = un_SHVAL_ShR_tset(wold);
+      WordSetID lset_old = un_SHVAL_ShR_lset(wold);
+      WordSetID tset_new = HG_(addToWS)( univ_tsets, 
+                                         tset_old, (Word)thr_acc );
+      WordSetID lset_new = HG_(intersectWS)( univ_lsets,
+                                             lset_old, 
+                                             add_BHL(thr_acc->locksetA)
+                                             /* read ==> use all locks */ );
+      /*UInt*/  wnew     = mk_SHVAL_ShR( tset_new, lset_new );
+      if (lset_old != lset_new)
+         record_last_lock_lossage(a,lset_old,lset_new);
+      stats__msm_read_ShR_to_ShR++;
+      goto changed;
+   }
+
+   /* Shared-Modified */
+   if (is_SHVAL_ShM(wold)) {
+      /* read Shared-Modified(threadset, lockset)
+         We remain in ShM state, but add this thread to the 
+         threadset and refine the lockset accordingly.
+         If the lockset becomes empty, complain. */
+      WordSetID tset_old = un_SHVAL_ShM_tset(wold);
+      WordSetID lset_old = un_SHVAL_ShM_lset(wold);
+      WordSetID tset_new = HG_(addToWS)( univ_tsets,
+                                         tset_old, (Word)thr_acc );
+      WordSetID lset_new = HG_(intersectWS)( univ_lsets,
+                                             lset_old,
+                                             add_BHL(thr_acc->locksetA)
+                                             /* read ==> use all locks */ ); 
+      /*UInt*/  wnew     = mk_SHVAL_ShM( tset_new, lset_new );
+      if (lset_old != lset_new)
+         record_last_lock_lossage(a,lset_old,lset_new);
+      if (HG_(isEmptyWS)(univ_lsets, lset_new)
+          && !HG_(isEmptyWS)(univ_lsets, lset_old)) {
+         record_error_Race( thr_acc, a, 
+                            False/*isWrite*/, szB, wold, wnew,
+                            maybe_get_lastlock_initpoint(a) );
+      }
+      stats__msm_read_ShM_to_ShM++;
+      goto changed;
+   }
+ 
+   /* New */
+   if (is_SHVAL_New(wold)) {
+      /* read New -> Excl(segid) */
+      wnew = mk_SHVAL_Excl( thr_acc->csegid );
+      stats__msm_read_New_to_Excl++;
+      goto changed;
+   } 
+
+   /* NoAccess */
+   if (is_SHVAL_NoAccess(wold)) {
+      // FIXME: complain if accessing here
+      // FIXME: transition to Excl?
+      if (0)
+      VG_(printf)(
+         "msm__handle_read_aligned_32(thr=%p, addr=%p): NoAccess\n",
+         thr_acc, (void*)a );
+      stats__msm_read_NoAccess++;
+      /*NOCHANGE*/return wold; /* no change */
+   }
+
+   /* hmm, bogus state */
+   tl_assert(0);
+
+  changed:
+   if (UNLIKELY(clo_trace_level > 0)) {
+      if (a <= clo_trace_addr && clo_trace_addr < a+szB
+          && wold != wnew) {
+         msm__show_state_change( thr_acc, a, szB, 'r', wold, wnew );
+      }
+   }
+   return wnew;
+}
+
+/* Similar to msm__handle_read, compute a new 32-bit shadow word
+   resulting from a write to a location, and report any errors
+   necessary on the way. */
+static
+UInt msm__handle_write ( Thread* thr_acc, Addr a, UInt wold, Int szB )
+{
+   UInt wnew = SHVAL_Invalid;
+
+   tl_assert(is_sane_Thread(thr_acc));
+
+   if (0) VG_(printf)("write32 thr=%p %p\n", thr_acc, a);
+
+   /* New */
+   if (LIKELY(is_SHVAL_New(wold))) {
+      /* write New -> Excl(segid) */
+      wnew = mk_SHVAL_Excl( thr_acc->csegid );
+      stats__msm_write_New_to_Excl++;
+      goto changed;
+   }
+
+   /* Exclusive */
+   if (is_SHVAL_Excl(wold)) {
+      // I believe is identical to case for read Excl
+      // apart from enters ShM rather than ShR 
+      /* read Excl(segid) 
+           |  segid_old == segid-of-thread
+           -> no change
+           |  segid_old `happens_before` segid-of-this-thread
+           -> Excl(segid-of-this-thread)
+           |  otherwise
+           -> ShM
+      */
+      SegmentID segid_old = un_SHVAL_Excl(wold);
+      tl_assert(is_sane_SegmentID(segid_old));
+      if (segid_old == thr_acc->csegid) {
+         /* no change */
+         stats__msm_write_Excl_nochange++;
+         /*NOCHANGE*/return wold;
+      }
+      if (happens_before(segid_old, thr_acc->csegid)) {
+         /* -> Excl(segid-of-this-thread) */
+         wnew = mk_SHVAL_Excl(thr_acc->csegid);
+         stats__msm_write_Excl_transfer++;
+         goto changed;
+      }
+      /* else */ {
+         /* Enter the shared-modified (ShM) state. */
+         WordSetID tset, lset;
+         /* This location has been accessed by precisely two threads.
+            Make an appropriate tset. */
+         // FIXME: performance: duplicate map_segments_lookup(segid_old)
+         // since must also be done in happens_before()
+         Segment* seg_old = map_segments_lookup( segid_old );
+         Thread*  thr_old = seg_old->thr;
+         tset = HG_(doubletonWS)( univ_tsets, (Word)thr_old, (Word)thr_acc );
+         lset = thr_acc->locksetW; /* write ==> use only w-held locks */
+         wnew = mk_SHVAL_ShM( tset, lset );
+         if (HG_(isEmptyWS)(univ_lsets, lset)) {
+            record_error_Race( thr_acc, 
+                               a, True/*isWrite*/, szB, wold, wnew,
+                               maybe_get_lastlock_initpoint(a) );
+         }
+         stats__msm_write_Excl_to_ShM++;
+         goto changed;
+      }
+      /*NOTREACHED*/
+   } 
+
+   /* Shared-Readonly */
+   if (is_SHVAL_ShR(wold)) {
+      /* write Shared-Readonly(threadset, lockset)
+         We move to ShM state, add this thread to the 
+         threadset and refine the lockset accordingly.
+         If the lockset becomes empty, complain. */
+      WordSetID tset_old = un_SHVAL_ShR_tset(wold);
+      WordSetID lset_old = un_SHVAL_ShR_lset(wold);
+      WordSetID tset_new = HG_(addToWS)( univ_tsets, 
+                                         tset_old, (Word)thr_acc );
+      WordSetID lset_new = HG_(intersectWS)(
+                              univ_lsets, 
+                              lset_old, 
+                              thr_acc->locksetW
+                              /* write ==> use only w-held locks */
+                           );
+      /*UInt*/  wnew     = mk_SHVAL_ShM( tset_new, lset_new );
+      if (lset_old != lset_new)
+         record_last_lock_lossage(a,lset_old,lset_new);
+      if (HG_(isEmptyWS)(univ_lsets, lset_new)) {
+         record_error_Race( thr_acc, a, 
+                            True/*isWrite*/, szB, wold, wnew,
+                            maybe_get_lastlock_initpoint(a) );
+      }
+      stats__msm_write_ShR_to_ShM++;
+      goto changed;
+   }
+
+   /* Shared-Modified */
+   else if (is_SHVAL_ShM(wold)) {
+      /* write Shared-Modified(threadset, lockset)
+         We remain in ShM state, but add this thread to the 
+         threadset and refine the lockset accordingly.
+         If the lockset becomes empty, complain. */
+      WordSetID tset_old = un_SHVAL_ShM_tset(wold);
+      WordSetID lset_old = un_SHVAL_ShM_lset(wold);
+      WordSetID tset_new = HG_(addToWS)( univ_tsets,
+                                         tset_old, (Word)thr_acc );
+      WordSetID lset_new = HG_(intersectWS)( 
+                              univ_lsets,
+                              lset_old, 
+                              thr_acc->locksetW 
+                              /* write ==> use only w-held locks */
+                           ); 
+      /*UInt*/  wnew     = mk_SHVAL_ShM( tset_new, lset_new );
+      if (lset_old != lset_new)
+         record_last_lock_lossage(a,lset_old,lset_new);
+      if (HG_(isEmptyWS)(univ_lsets, lset_new)
+          && !HG_(isEmptyWS)(univ_lsets, lset_old)) {
+         record_error_Race( thr_acc, a, 
+                            True/*isWrite*/, szB, wold, wnew,
+                            maybe_get_lastlock_initpoint(a) );
+      }
+      stats__msm_write_ShM_to_ShM++;
+      goto changed;
+   }
+
+   /* NoAccess */
+   if (is_SHVAL_NoAccess(wold)) {
+      // FIXME: complain if accessing here
+      // FIXME: transition to Excl?
+      if (0)
+      VG_(printf)(
+         "msm__handle_write_aligned_32(thr=%p, addr=%p): NoAccess\n",
+         thr_acc, (void*)a );
+      stats__msm_write_NoAccess++;
+      /*NOCHANGE*/return wold;
+   } 
+
+   /* hmm, bogus state */
+   VG_(printf)("msm__handle_write_aligned_32: bogus old state 0x%x\n", 
+               wold);
+   tl_assert(0);
+
+  changed:
+   if (UNLIKELY(clo_trace_level > 0)) {
+      if (a <= clo_trace_addr && clo_trace_addr < a+szB
+          && wold != wnew) {
+         msm__show_state_change( thr_acc, a, szB, 'w', wold, wnew );
+      }
+   }
+   return wnew;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Shadow value and address range handlers                  ---*/
+/*----------------------------------------------------------------*/
+
+static void laog__pre_thread_acquires_lock ( Thread*, Lock* ); /* fwds */
+static void laog__handle_lock_deletions    ( WordSetID ); /* fwds */
+static inline Thread* get_current_Thread ( void ); /* fwds */
+
+/* ------------ CacheLineF and CacheLineZ related ------------ */
+
+static void write_twobit_array ( UChar* arr, UWord ix, UWord b2 ) {
+   Word bix, shft, mask, prep;
+   tl_assert((b2 & ~3) == 0);
+   tl_assert(ix >= 0);
+   bix  = ix >> 2;
+   shft = 2 * (ix & 3); /* 0, 2, 4 or 6 */
+   mask = 3 << shft;
+   prep = b2 << shft;
+   arr[bix] = (arr[bix] & ~mask) | prep;
+}
+
+static UWord read_twobit_array ( UChar* arr, UWord ix ) {
+   Word bix, shft;
+   tl_assert(ix >= 0);
+   bix  = ix >> 2;
+   shft = 2 * (ix & 3); /* 0, 2, 4 or 6 */
+   return (arr[bix] >> shft) & 3;
+}
+
+/* Given a lineZ index and a SecMap, return the CacheLineZ* and CacheLineF*
+   for that index. */
+static void get_ZF_by_index ( /*OUT*/CacheLineZ** zp,
+                              /*OUT*/CacheLineF** fp,
+                              SecMap* sm, Int zix ) {
+   CacheLineZ* lineZ;
+   tl_assert(zp);
+   tl_assert(fp);
+   tl_assert(zix >= 0 && zix < N_SECMAP_ZLINES);
+   tl_assert(is_sane_SecMap(sm));
+   lineZ = &sm->linesZ[zix];
+   if (lineZ->dict[0] == 0) {
+      Int fix = lineZ->dict[1];
+      tl_assert(sm->linesF);
+      tl_assert(sm->linesF_size > 0);
+      tl_assert(fix >= 0 && fix < sm->linesF_size);
+      *zp = NULL;
+      *fp = &sm->linesF[fix];
+      tl_assert(sm->linesF[fix].inUse);
+   } else {
+      *zp = lineZ;
+      *fp = NULL;
+   }
+}
+
+static void find_ZF_for_reading ( /*OUT*/CacheLineZ** zp,
+                                  /*OUT*/CacheLineF** fp, Addr tag ) {
+   CacheLineZ* lineZ;
+   CacheLineF* lineF;
+   UWord   zix;
+   SecMap* sm    = shmem__find_or_alloc_SecMap(tag);
+   UWord   smoff = shmem__get_SecMap_offset(tag);
+   /* since smoff is derived from a valid tag, it should be
+      cacheline-aligned. */
+   tl_assert(0 == (smoff & (N_LINE_ARANGE - 1)));
+   zix = smoff >> N_LINE_BITS;
+   tl_assert(zix < N_SECMAP_ZLINES);
+   lineZ = &sm->linesZ[zix];
+   lineF = NULL;
+   if (lineZ->dict[0] == 0) {
+      Word fix = lineZ->dict[1];
+      tl_assert(sm->linesF);
+      tl_assert(sm->linesF_size > 0);
+      tl_assert(fix >= 0 && fix < sm->linesF_size);
+      lineF = &sm->linesF[fix];
+      tl_assert(lineF->inUse);
+      lineZ = NULL;
+   }
+   *zp = lineZ;
+   *fp = lineF;
+}
+
+static void find_Z_for_writing ( /*OUT*/SecMap** smp,
+                                 /*OUT*/Word* zixp,
+                                 Addr tag ) {
+   CacheLineZ* lineZ;
+   CacheLineF* lineF;
+   UWord   zix;
+   SecMap* sm    = shmem__find_or_alloc_SecMap(tag);
+   UWord   smoff = shmem__get_SecMap_offset(tag);
+   /* since smoff is derived from a valid tag, it should be
+      cacheline-aligned. */
+   tl_assert(0 == (smoff & (N_LINE_ARANGE - 1)));
+   zix = smoff >> N_LINE_BITS;
+   tl_assert(zix < N_SECMAP_ZLINES);
+   lineZ = &sm->linesZ[zix];
+   lineF = NULL;
+   /* If lineZ has an associated lineF, free it up. */
+   if (lineZ->dict[0] == 0) {
+      Word fix = lineZ->dict[1];
+      tl_assert(sm->linesF);
+      tl_assert(sm->linesF_size > 0);
+      tl_assert(fix >= 0 && fix < sm->linesF_size);
+      lineF = &sm->linesF[fix];
+      tl_assert(lineF->inUse);
+      lineF->inUse = False;
+   }
+   *smp  = sm;
+   *zixp = zix;
+}
+
+static 
+void alloc_F_for_writing ( /*MOD*/SecMap* sm, /*OUT*/Word* fixp ) {
+   Word        i, new_size;
+   CacheLineF* nyu;
+
+   if (sm->linesF) {
+      tl_assert(sm->linesF_size > 0);
+   } else {
+      tl_assert(sm->linesF_size == 0);
+   }
+
+   if (sm->linesF) {
+      for (i = 0; i < sm->linesF_size; i++) {
+         if (!sm->linesF[i].inUse) {
+            *fixp = (Word)i;
+            return;
+         }
+      }
+   }
+
+   /* No free F line found.  Expand existing array and try again. */
+   new_size = sm->linesF_size==0 ? 1 : 2 * sm->linesF_size;
+   nyu      = hg_zalloc( new_size * sizeof(CacheLineF) );
+   tl_assert(nyu);
+
+   stats__secmap_linesF_allocd += (new_size - sm->linesF_size);
+   stats__secmap_linesF_bytes  += (new_size - sm->linesF_size)
+                                  * sizeof(CacheLineF);
+
+   if (0)
+   VG_(printf)("SM %p: expand F array from %d to %d\n", 
+               sm, (Int)sm->linesF_size, new_size);
+
+   for (i = 0; i < new_size; i++)
+      nyu[i].inUse = False;
+
+   if (sm->linesF) {
+      for (i = 0; i < sm->linesF_size; i++) {
+         tl_assert(sm->linesF[i].inUse);
+         nyu[i] = sm->linesF[i];
+      }
+      VG_(memset)(sm->linesF, 0, sm->linesF_size * sizeof(CacheLineF) );
+      hg_free(sm->linesF);
+   }
+
+   sm->linesF      = nyu;
+   sm->linesF_size = new_size;
+
+   for (i = 0; i < sm->linesF_size; i++) {
+      if (!sm->linesF[i].inUse) {
+         *fixp = (Word)i;
+         return;
+      }
+    }
+
+    /*NOTREACHED*/
+    tl_assert(0);
+}
+
+
+/* ------------ CacheLine and implicit-tree related ------------ */
+
+__attribute__((unused))
+static void pp_CacheLine ( CacheLine* cl ) {
+   Word i;
+   if (!cl) {
+      VG_(printf)("pp_CacheLine(NULL)\n");
+      return;
+   }
+   for (i = 0; i < N_LINE_TREES; i++) 
+      VG_(printf)("   descr: %04lx\n", (UWord)cl->descrs[i]);
+   for (i = 0; i < N_LINE_ARANGE; i++) 
+      VG_(printf)("    sval: %08lx\n", (UWord)cl->svals[i]);
+}
+
+static UChar descr_to_validbits ( UShort descr )
+{
+   /* a.k.a Party Time for gcc's constant folder */
+#  define DESCR(b8_7, b8_6, b8_5, b8_4, b8_3, b8_2, b8_1, b8_0, \
+                b16_3, b32_1, b16_2, b64, b16_1, b32_0, b16_0)  \
+             ( (UShort) ( ( (b8_7)  << 14) | ( (b8_6)  << 13) | \
+                          ( (b8_5)  << 12) | ( (b8_4)  << 11) | \
+                          ( (b8_3)  << 10) | ( (b8_2)  << 9)  | \
+                          ( (b8_1)  << 8)  | ( (b8_0)  << 7)  | \
+                          ( (b16_3) << 6)  | ( (b32_1) << 5)  | \
+                          ( (b16_2) << 4)  | ( (b64)   << 3)  | \
+                          ( (b16_1) << 2)  | ( (b32_0) << 1)  | \
+                          ( (b16_0) << 0) ) )
+
+#  define BYTE(bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0) \
+             ( (UChar) ( ( (bit7) << 7) | ( (bit6) << 6) | \
+                         ( (bit5) << 5) | ( (bit4) << 4) | \
+                         ( (bit3) << 3) | ( (bit2) << 2) | \
+                         ( (bit1) << 1) | ( (bit0) << 0) ) )
+
+   /* these should all get folded out at compile time */
+   tl_assert(DESCR(1,0,0,0,0,0,0,0, 0,0,0, 0, 0,0,0) == TREE_DESCR_8_7);
+   tl_assert(DESCR(0,0,0,0,0,0,0,1, 0,0,0, 0, 0,0,0) == TREE_DESCR_8_0);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 1,0,0, 0, 0,0,0) == TREE_DESCR_16_3);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 0,1,0, 0, 0,0,0) == TREE_DESCR_32_1);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 0,0,1, 0, 0,0,0) == TREE_DESCR_16_2);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 0,0,0, 1, 0,0,0) == TREE_DESCR_64);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 0,0,0, 0, 1,0,0) == TREE_DESCR_16_1);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 0,0,0, 0, 0,1,0) == TREE_DESCR_32_0);
+   tl_assert(DESCR(0,0,0,0,0,0,0,0, 0,0,0, 0, 0,0,1) == TREE_DESCR_16_0);
+
+   switch (descr) {
+   /*
+              +--------------------------------- TREE_DESCR_8_7
+              |             +------------------- TREE_DESCR_8_0
+              |             |  +---------------- TREE_DESCR_16_3
+              |             |  | +-------------- TREE_DESCR_32_1
+              |             |  | | +------------ TREE_DESCR_16_2
+              |             |  | | |  +--------- TREE_DESCR_64
+              |             |  | | |  |  +------ TREE_DESCR_16_1
+              |             |  | | |  |  | +---- TREE_DESCR_32_0
+              |             |  | | |  |  | | +-- TREE_DESCR_16_0
+              |             |  | | |  |  | | |
+              |             |  | | |  |  | | |   GRANULARITY, 7 -> 0 */
+   case DESCR(1,1,1,1,1,1,1,1, 0,0,0, 0, 0,0,0): /* 8 8 8 8  8 8 8 8 */
+                                                 return BYTE(1,1,1,1,1,1,1,1);
+   case DESCR(1,1,0,0,1,1,1,1, 0,0,1, 0, 0,0,0): /* 8 8 16   8 8 8 8 */
+                                                 return BYTE(1,1,0,1,1,1,1,1);
+   case DESCR(0,0,1,1,1,1,1,1, 1,0,0, 0, 0,0,0): /* 16  8 8  8 8 8 8 */ 
+                                                 return BYTE(0,1,1,1,1,1,1,1);
+   case DESCR(0,0,0,0,1,1,1,1, 1,0,1, 0, 0,0,0): /* 16  16   8 8 8 8 */
+                                                 return BYTE(0,1,0,1,1,1,1,1);
+
+   case DESCR(1,1,1,1,1,1,0,0, 0,0,0, 0, 0,0,1): /* 8 8 8 8  8 8 16 */ 
+                                                 return BYTE(1,1,1,1,1,1,0,1);
+   case DESCR(1,1,0,0,1,1,0,0, 0,0,1, 0, 0,0,1): /* 8 8 16   8 8 16 */
+                                                 return BYTE(1,1,0,1,1,1,0,1);
+   case DESCR(0,0,1,1,1,1,0,0, 1,0,0, 0, 0,0,1): /* 16  8 8  8 8 16 */
+                                                 return BYTE(0,1,1,1,1,1,0,1);
+   case DESCR(0,0,0,0,1,1,0,0, 1,0,1, 0, 0,0,1): /* 16  16   8 8 16 */
+                                                 return BYTE(0,1,0,1,1,1,0,1);
+
+   case DESCR(1,1,1,1,0,0,1,1, 0,0,0, 0, 1,0,0): /* 8 8 8 8  16 8 8 */
+                                                 return BYTE(1,1,1,1,0,1,1,1);
+   case DESCR(1,1,0,0,0,0,1,1, 0,0,1, 0, 1,0,0): /* 8 8 16   16 8 8 */
+                                                 return BYTE(1,1,0,1,0,1,1,1);
+   case DESCR(0,0,1,1,0,0,1,1, 1,0,0, 0, 1,0,0): /* 16  8 8  16 8 8 */
+                                                 return BYTE(0,1,1,1,0,1,1,1);
+   case DESCR(0,0,0,0,0,0,1,1, 1,0,1, 0, 1,0,0): /* 16  16   16 8 8 */
+                                                 return BYTE(0,1,0,1,0,1,1,1);
+
+   case DESCR(1,1,1,1,0,0,0,0, 0,0,0, 0, 1,0,1): /* 8 8 8 8  16 16 */
+                                                 return BYTE(1,1,1,1,0,1,0,1);
+   case DESCR(1,1,0,0,0,0,0,0, 0,0,1, 0, 1,0,1): /* 8 8 16   16 16 */
+                                                 return BYTE(1,1,0,1,0,1,0,1);
+   case DESCR(0,0,1,1,0,0,0,0, 1,0,0, 0, 1,0,1): /* 16  8 8  16 16 */
+                                                 return BYTE(0,1,1,1,0,1,0,1);
+   case DESCR(0,0,0,0,0,0,0,0, 1,0,1, 0, 1,0,1): /* 16  16   16 16 */
+                                                 return BYTE(0,1,0,1,0,1,0,1);
+
+   case DESCR(0,0,0,0,1,1,1,1, 0,1,0, 0, 0,0,0): /* 32  8 8 8 8 */
+                                                 return BYTE(0,0,0,1,1,1,1,1);
+   case DESCR(0,0,0,0,1,1,0,0, 0,1,0, 0, 0,0,1): /* 32  8 8 16  */
+                                                 return BYTE(0,0,0,1,1,1,0,1);
+   case DESCR(0,0,0,0,0,0,1,1, 0,1,0, 0, 1,0,0): /* 32  16  8 8 */
+                                                 return BYTE(0,0,0,1,0,1,1,1);
+   case DESCR(0,0,0,0,0,0,0,0, 0,1,0, 0, 1,0,1): /* 32  16  16  */
+                                                 return BYTE(0,0,0,1,0,1,0,1);
+
+   case DESCR(1,1,1,1,0,0,0,0, 0,0,0, 0, 0,1,0): /* 8 8 8 8  32 */
+                                                 return BYTE(1,1,1,1,0,0,0,1);
+   case DESCR(1,1,0,0,0,0,0,0, 0,0,1, 0, 0,1,0): /* 8 8 16   32 */
+                                                 return BYTE(1,1,0,1,0,0,0,1);
+   case DESCR(0,0,1,1,0,0,0,0, 1,0,0, 0, 0,1,0): /* 16  8 8  32 */
+                                                 return BYTE(0,1,1,1,0,0,0,1);
+   case DESCR(0,0,0,0,0,0,0,0, 1,0,1, 0, 0,1,0): /* 16  16   32 */
+                                                 return BYTE(0,1,0,1,0,0,0,1);
+
+   case DESCR(0,0,0,0,0,0,0,0, 0,1,0, 0, 0,1,0): /* 32 32 */
+                                                 return BYTE(0,0,0,1,0,0,0,1);
+
+   case DESCR(0,0,0,0,0,0,0,0, 0,0,0, 1, 0,0,0): /* 64 */
+                                                 return BYTE(0,0,0,0,0,0,0,1);
+
+   default: return BYTE(0,0,0,0,0,0,0,0); 
+                   /* INVALID - any valid descr produces at least one
+                      valid bit in tree[0..7]*/
+   }
+   /* NOTREACHED*/
+   tl_assert(0);
+
+#  undef DESCR
+#  undef BYTE
+}
+
+__attribute__((unused))
+static Bool is_sane_Descr ( UShort descr ) {
+   return descr_to_validbits(descr) != 0;
+}
+
+static void sprintf_Descr ( /*OUT*/UChar* dst, UShort descr ) {
+   VG_(sprintf)(dst, 
+                "%d%d%d%d%d%d%d%d %d%d%d %d %d%d%d",
+                (Int)((descr & TREE_DESCR_8_7) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_6) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_5) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_4) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_3) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_2) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_1) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_8_0) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_16_3) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_32_1) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_16_2) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_64)   ? 1 : 0),
+                (Int)((descr & TREE_DESCR_16_1) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_32_0) ? 1 : 0),
+                (Int)((descr & TREE_DESCR_16_0) ? 1 : 0)
+   );
+}
+static void sprintf_Byte ( /*OUT*/UChar* dst, UChar byte ) {
+   VG_(sprintf)(dst, "%d%d%d%d%d%d%d%d",
+                     (Int)((byte & 128) ? 1 : 0),
+                     (Int)((byte &  64) ? 1 : 0),
+                     (Int)((byte &  32) ? 1 : 0),
+                     (Int)((byte &  16) ? 1 : 0),
+                     (Int)((byte &   8) ? 1 : 0),
+                     (Int)((byte &   4) ? 1 : 0),
+                     (Int)((byte &   2) ? 1 : 0),
+                     (Int)((byte &   1) ? 1 : 0)
+   );
+}
+
+static Bool is_sane_Descr_and_Tree ( UShort descr, UInt* tree ) {
+   Word  i;
+   UChar validbits = descr_to_validbits(descr);
+   UChar buf[128], buf2[128];
+   if (validbits == 0)
+      goto bad;
+   for (i = 0; i < 8; i++) {
+      if (validbits & (1<<i)) {
+         if (!is_SHVAL_valid(tree[i]))
+            goto bad;
+      } else {
+         if (tree[i] != 0)
+            goto bad;
+      }
+   }
+   return True;
+  bad:
+   sprintf_Descr( buf, descr );
+   sprintf_Byte( buf2, validbits );
+   VG_(printf)("is_sane_Descr_and_Tree: bad tree {\n");
+   VG_(printf)("   validbits 0x%02lx    %s\n", (UWord)validbits, buf2);
+   VG_(printf)("       descr 0x%04lx  %s\n", (UWord)descr, buf);
+   for (i = 0; i < 8; i++)
+      VG_(printf)("   [%ld] 0x%08x\n", i, tree[i]);
+   VG_(printf)("}\n");
+   return 0;
+}
+
+
+static Bool is_sane_CacheLine ( CacheLine* cl )
+{
+   Word tno, cloff;
+
+   if (!cl) goto bad;
+
+   for (tno = 0, cloff = 0;  tno < N_LINE_TREES;  tno++, cloff += 8) {
+      UShort descr = cl->descrs[tno];
+      UInt*  tree  = &cl->svals[cloff];
+      if (!is_sane_Descr_and_Tree(descr, tree))
+         goto bad;
+   }
+   tl_assert(cloff == N_LINE_ARANGE);
+   return True;
+  bad:
+   pp_CacheLine(cl);
+   return False;
+}
+
+
+static UShort normalise_tree ( /*MOD*/UInt* tree ) {
+   Word   i;
+   UShort descr;
+   /* pre: incoming tree[0..7] does not have any invalid shvals, in
+      particular no zeroes. */
+   for (i = 0; i < 8; i++)
+      tl_assert(tree[i] != 0);
+   
+   descr = TREE_DESCR_8_7 | TREE_DESCR_8_6 | TREE_DESCR_8_5
+           | TREE_DESCR_8_4 | TREE_DESCR_8_3 | TREE_DESCR_8_2
+           | TREE_DESCR_8_1 | TREE_DESCR_8_0;
+   /* build 16-bit layer */
+   if (tree[1] == tree[0]) {
+      tree[1] = 0/*INVALID*/;
+      descr &= ~(TREE_DESCR_8_1 | TREE_DESCR_8_0);
+      descr |= TREE_DESCR_16_0;
+   }
+   if (tree[3] == tree[2]) {
+      tree[3] = 0/*INVALID*/;
+      descr &= ~(TREE_DESCR_8_3 | TREE_DESCR_8_2);
+      descr |= TREE_DESCR_16_1;
+   }
+   if (tree[5] == tree[4]) {
+      tree[5] = 0/*INVALID*/;
+      descr &= ~(TREE_DESCR_8_5 | TREE_DESCR_8_4);
+      descr |= TREE_DESCR_16_2;
+   }
+   if (tree[7] == tree[6]) {
+      tree[7] = 0/*INVALID*/;
+      descr &= ~(TREE_DESCR_8_7 | TREE_DESCR_8_6);
+      descr |= TREE_DESCR_16_3;
+   }
+   /* build 32-bit layer */
+   if (tree[2] == tree[0]
+       && (descr & TREE_DESCR_16_1) && (descr & TREE_DESCR_16_0)) {
+      tree[2] = 0; /* [3,1] must already be 0 */
+      descr &= ~(TREE_DESCR_16_1 | TREE_DESCR_16_0);
+      descr |= TREE_DESCR_32_0;
+   }
+   if (tree[6] == tree[4]
+       && (descr & TREE_DESCR_16_3) && (descr & TREE_DESCR_16_2)) {
+      tree[6] = 0; /* [7,5] must already be 0 */
+      descr &= ~(TREE_DESCR_16_3 | TREE_DESCR_16_2);
+      descr |= TREE_DESCR_32_1;
+   }
+   /* build 64-bit layer */
+   if (tree[4] == tree[0]
+       && (descr & TREE_DESCR_32_1) && (descr & TREE_DESCR_32_0)) {
+      tree[4] = 0; /* [7,6,5,3,2,1] must already be 0 */
+      descr &= ~(TREE_DESCR_32_1 | TREE_DESCR_32_0);
+      descr |= TREE_DESCR_64;
+   }
+   return descr;
+}
+
+/* This takes a cacheline where all the data is at the leaves
+   (w8[..]) and builds a correctly normalised tree. */
+static void normalise_CacheLine ( /*MOD*/CacheLine* cl )
+{
+   Word tno, cloff;
+   for (tno = 0, cloff = 0;  tno < N_LINE_TREES;  tno++, cloff += 8) {
+      UInt* tree = &cl->svals[cloff];
+      cl->descrs[tno] = normalise_tree( tree );
+   }
+   tl_assert(cloff == N_LINE_ARANGE);
+   if (SCE_CACHELINE)
+      tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   stats__cline_normalises++;
+}
+
+
+static 
+UInt* sequentialise_tree ( /*MOD*/UInt* dst, /*OUT*/Bool* anyShared,
+                           UShort descr, UInt* tree ) {
+   UInt* dst0 = dst;
+   *anyShared = False;
+
+#  define PUT(_n,_v)                                \
+      do { Word i;                                  \
+           if (is_SHVAL_Sh(_v))                     \
+              *anyShared = True;                    \
+           for (i = 0; i < (_n); i++)               \
+                  *dst++ = (_v);                    \
+      } while (0)
+
+   /* byte 0 */
+   if (descr & TREE_DESCR_64)   PUT(8, tree[0]); else
+   if (descr & TREE_DESCR_32_0) PUT(4, tree[0]); else
+   if (descr & TREE_DESCR_16_0) PUT(2, tree[0]); else
+   if (descr & TREE_DESCR_8_0)  PUT(1, tree[0]);
+   /* byte 1 */
+   if (descr & TREE_DESCR_8_1)  PUT(1, tree[1]);
+   /* byte 2 */
+   if (descr & TREE_DESCR_16_1) PUT(2, tree[2]); else
+   if (descr & TREE_DESCR_8_2)  PUT(1, tree[2]);
+   /* byte 3 */
+   if (descr & TREE_DESCR_8_3)  PUT(1, tree[3]);
+   /* byte 4 */
+   if (descr & TREE_DESCR_32_1) PUT(4, tree[4]); else
+   if (descr & TREE_DESCR_16_2) PUT(2, tree[4]); else
+   if (descr & TREE_DESCR_8_4)  PUT(1, tree[4]);
+   /* byte 5 */
+   if (descr & TREE_DESCR_8_5)  PUT(1, tree[5]);
+   /* byte 6 */
+   if (descr & TREE_DESCR_16_3) PUT(2, tree[6]); else
+   if (descr & TREE_DESCR_8_6)  PUT(1, tree[6]);
+   /* byte 7 */
+   if (descr & TREE_DESCR_8_7)  PUT(1, tree[7]);
+
+#  undef PUT
+
+   tl_assert( (((Char*)dst) - ((Char*)dst0)) == 8 * sizeof(UInt) );
+   return dst;
+}
+
+/* Write the cacheline 'wix' to backing store.  Where it ends up
+   is determined by its tag field. */
+static
+Bool sequentialise_CacheLine ( /*OUT*/UInt* dst, Word nDst, CacheLine* src )
+{
+   Word  tno, cloff;
+   Bool  anyShared = False;
+   UInt* dst0      = dst;
+
+   for (tno = 0, cloff = 0;  tno < N_LINE_TREES;  tno++, cloff += 8) {
+      UShort descr = src->descrs[tno];
+      UInt*  tree  = &src->svals[cloff];
+      Bool   bTmp  = False;
+      dst = sequentialise_tree ( dst, &bTmp, descr, tree );
+      anyShared |= bTmp;
+   }
+   tl_assert(cloff == N_LINE_ARANGE);
+
+   /* Assert we wrote N_LINE_ARANGE shadow values. */
+   tl_assert( ((HChar*)dst) - ((HChar*)dst0) 
+              == nDst * sizeof(UInt) );
+
+   return anyShared;
+}
+
+
+static __attribute__((noinline)) void cacheline_wback ( UWord wix )
+{
+   Word        i, j;
+   Bool        anyShared = False;
+   Addr        tag;
+   SecMap*     sm;
+   CacheLine*  cl;
+   CacheLineZ* lineZ;
+   CacheLineF* lineF;
+   Word        zix, fix;
+   UInt        shvals[N_LINE_ARANGE];
+   UInt        sv;
+
+   if (0)
+   VG_(printf)("scache wback line %d\n", (Int)wix);
+
+   tl_assert(wix >= 0 && wix < N_WAY_NENT);
+
+   tag =  cache_shmem.tags0[wix];
+   cl  = &cache_shmem.lyns0[wix];
+
+   /* The cache line may have been invalidated; if so, ignore it. */
+   if (!is_valid_scache_tag(tag))
+      return;
+
+   /* Where are we going to put it? */
+   sm         = NULL;
+   lineZ      = NULL;
+   lineF      = NULL;
+   zix = fix = -1;
+
+   find_Z_for_writing( &sm, &zix, tag );
+   tl_assert(sm);
+   tl_assert(zix >= 0 && zix < N_SECMAP_ZLINES);
+   lineZ = &sm->linesZ[zix];
+
+   /* Generate the data to be stored */
+   if (SCE_CACHELINE)
+      tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   anyShared = sequentialise_CacheLine( shvals, N_LINE_ARANGE, cl );
+
+   lineZ->dict[0] = lineZ->dict[1] 
+                  = lineZ->dict[2] = lineZ->dict[3] = 0;
+
+   for (i = 0; i < N_LINE_ARANGE; i++) {
+
+      sv = shvals[i];
+      for (j = 0; j < 4; j++) {
+         if (sv == lineZ->dict[j])
+            goto dict_ok;
+      }
+      for (j = 0; j < 4; j++) {
+         if (lineZ->dict[j] == 0)
+            break;
+      }
+      tl_assert(j >= 0 && j <= 4);
+      if (j == 4) break; /* we'll have to use the f rep */
+      tl_assert(is_SHVAL_valid(sv));
+      lineZ->dict[j] = sv;
+     dict_ok:
+      write_twobit_array( lineZ->ix2s, i, j );
+
+   }
+
+   tl_assert(i >= 0 && i <= N_LINE_ARANGE);
+
+   if (i < N_LINE_ARANGE) {
+      /* cannot use the compressed rep.  Use f rep instead. */
+      alloc_F_for_writing( sm, &fix );
+      tl_assert(sm->linesF);
+      tl_assert(sm->linesF_size > 0);
+      tl_assert(fix >= 0 && fix < sm->linesF_size);
+      lineF = &sm->linesF[fix];
+      tl_assert(!lineF->inUse);
+      lineZ->dict[0] = lineZ->dict[2] = lineZ->dict[3] = 0;
+      lineZ->dict[1] = (UInt)fix;
+      lineF->inUse = True;
+      for (i = 0; i < N_LINE_ARANGE; i++) {
+         sv = shvals[i];
+         tl_assert(is_SHVAL_valid(sv));
+         lineF->w32s[i] = sv;
+      }
+      stats__cache_F_wbacks++;
+   } else {
+      stats__cache_Z_wbacks++;
+   }
+
+   if (anyShared)
+      sm->mbHasShared = True;
+
+   /* mb_tidy_one_cacheline(); */
+}
+
+/* Fetch the cacheline 'wix' from the backing store.  The tag
+   associated with 'wix' is assumed to have already been filled in;
+   hence that is used to determine where in the backing store to read
+   from. */
+static __attribute__((noinline)) void cacheline_fetch ( UWord wix )
+{
+   Word        i;
+   Addr        tag;
+   CacheLine*  cl;
+   CacheLineZ* lineZ;
+   CacheLineF* lineF;
+
+   if (0)
+   VG_(printf)("scache fetch line %d\n", (Int)wix);
+
+   tl_assert(wix >= 0 && wix < N_WAY_NENT);
+
+   tag =  cache_shmem.tags0[wix];
+   cl  = &cache_shmem.lyns0[wix];
+
+   /* reject nonsense requests */
+   tl_assert(is_valid_scache_tag(tag));
+
+   lineZ = NULL;
+   lineF = NULL;
+   find_ZF_for_reading( &lineZ, &lineF, tag );
+   tl_assert( (lineZ && !lineF) || (!lineZ && lineF) );
+
+   /* expand the data into the bottom layer of the tree, then get
+      cacheline_normalise to build the descriptor array. */
+   if (lineF) {
+      tl_assert(lineF->inUse);
+      for (i = 0; i < N_LINE_ARANGE; i++) {
+         cl->svals[i] = lineF->w32s[i];
+      }
+      stats__cache_F_fetches++;
+   } else {
+      for (i = 0; i < N_LINE_ARANGE; i++) {
+         UInt sv;
+         UWord ix = read_twobit_array( lineZ->ix2s, i );
+         tl_assert(ix >= 0 && ix <= 3);
+         sv = lineZ->dict[ix];
+         tl_assert(sv != 0);
+         cl->svals[i] = sv;
+      }
+      stats__cache_Z_fetches++;
+   }
+   normalise_CacheLine( cl );
+}
+
+static void shmem__invalidate_scache ( void ) {
+   Word wix;
+   if (0) VG_(printf)("scache inval\n");
+   tl_assert(!is_valid_scache_tag(1));
+   for (wix = 0; wix < N_WAY_NENT; wix++) {
+      cache_shmem.tags0[wix] = 1/*INVALID*/;
+   }
+   stats__cache_invals++;
+}
+
+static void shmem__flush_and_invalidate_scache ( void ) {
+   Word wix;
+   Addr tag;
+   if (0) VG_(printf)("scache flush and invalidate\n");
+   tl_assert(!is_valid_scache_tag(1));
+   for (wix = 0; wix < N_WAY_NENT; wix++) {
+      tag = cache_shmem.tags0[wix];
+      if (tag == 1/*INVALID*/) {
+         /* already invalid; nothing to do */
+      } else {
+         tl_assert(is_valid_scache_tag(tag));
+         cacheline_wback( wix );
+      }
+      cache_shmem.tags0[wix] = 1/*INVALID*/;
+   }
+   stats__cache_flushes++;
+   stats__cache_invals++;
+}
+
+
+/* ------------ Basic shadow memory read/write ops ------------ */
+
+static inline Bool aligned16 ( Addr a ) {
+   return 0 == (a & 1);
+}
+static inline Bool aligned32 ( Addr a ) {
+   return 0 == (a & 3);
+}
+static inline Bool aligned64 ( Addr a ) {
+   return 0 == (a & 7);
+}
+static inline UWord get_cacheline_offset ( Addr a ) {
+   return (UWord)(a & (N_LINE_ARANGE - 1));
+}
+static inline UWord get_treeno ( Addr a ) {
+   return get_cacheline_offset(a) >> 3;
+}
+static inline UWord get_tree_offset ( Addr a ) {
+   return a & 7;
+}
+
+static __attribute__((noinline))
+       CacheLine* get_cacheline_MISS ( Addr a ); /* fwds */
+static inline CacheLine* get_cacheline ( Addr a )
+{
+   /* tag is 'a' with the in-line offset masked out, 
+      eg a[31]..a[4] 0000 */
+   Addr       tag = a & ~(N_LINE_ARANGE - 1);
+   UWord      wix = (a >> N_LINE_BITS) & (N_WAY_NENT - 1);
+   stats__cache_totrefs++;
+   if (LIKELY(tag == cache_shmem.tags0[wix])) {
+      return &cache_shmem.lyns0[wix];
+   } else {
+      return get_cacheline_MISS( a );
+   }
+}
+
+static __attribute__((noinline))
+       CacheLine* get_cacheline_MISS ( Addr a )
+{
+   /* tag is 'a' with the in-line offset masked out, 
+      eg a[31]..a[4] 0000 */
+
+   CacheLine* cl;
+   Addr*      tag_old_p;
+   Addr       tag = a & ~(N_LINE_ARANGE - 1);
+   UWord      wix = (a >> N_LINE_BITS) & (N_WAY_NENT - 1);
+
+   tl_assert(tag != cache_shmem.tags0[wix]);
+
+   /* Dump the old line into the backing store. */
+   stats__cache_totmisses++;
+
+   cl        = &cache_shmem.lyns0[wix];
+   tag_old_p = &cache_shmem.tags0[wix];
+
+   if (is_valid_scache_tag( *tag_old_p )) {
+      /* EXPENSIVE and REDUNDANT: callee does it */
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+      cacheline_wback( wix );
+   }
+   /* and reload the new one */
+   *tag_old_p = tag;
+   cacheline_fetch( wix );
+   if (SCE_CACHELINE)
+      tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   return cl;
+}
+
+static UShort pulldown_to_32 ( /*MOD*/UInt* tree, UWord toff, UShort descr ) {
+   stats__cline_64to32pulldown++;
+   switch (toff) {
+      case 0: case 4:
+         tl_assert(descr & TREE_DESCR_64);
+         tree[4] = tree[0];
+         descr &= ~TREE_DESCR_64;
+         descr |= (TREE_DESCR_32_1 | TREE_DESCR_32_0);
+         break;
+      default:
+         tl_assert(0);
+   }
+   return descr;
+}
+
+static UShort pulldown_to_16 ( /*MOD*/UInt* tree, UWord toff, UShort descr ) {
+   stats__cline_32to16pulldown++;
+   switch (toff) {
+      case 0: case 2:
+         if (!(descr & TREE_DESCR_32_0)) {
+            descr = pulldown_to_32(tree, 0, descr);
+         }
+         tl_assert(descr & TREE_DESCR_32_0);
+         tree[2] = tree[0];
+         descr &= ~TREE_DESCR_32_0;
+         descr |= (TREE_DESCR_16_1 | TREE_DESCR_16_0);
+         break;
+      case 4: case 6:
+         if (!(descr & TREE_DESCR_32_1)) {
+            descr = pulldown_to_32(tree, 4, descr);
+         }
+         tl_assert(descr & TREE_DESCR_32_1);
+         tree[6] = tree[4];
+         descr &= ~TREE_DESCR_32_1;
+         descr |= (TREE_DESCR_16_3 | TREE_DESCR_16_2);
+         break;
+      default:
+         tl_assert(0);
+   }
+   return descr;
+}
+
+static UShort pulldown_to_8 ( /*MOD*/UInt* tree, UWord toff, UShort descr ) {
+   stats__cline_16to8pulldown++;
+   switch (toff) {
+      case 0: case 1:
+         if (!(descr & TREE_DESCR_16_0)) {
+            descr = pulldown_to_16(tree, 0, descr);
+         }
+         tl_assert(descr & TREE_DESCR_16_0);
+         tree[1] = tree[0];
+         descr &= ~TREE_DESCR_16_0;
+         descr |= (TREE_DESCR_8_1 | TREE_DESCR_8_0);
+         break;
+      case 2: case 3:
+         if (!(descr & TREE_DESCR_16_1)) {
+            descr = pulldown_to_16(tree, 2, descr);
+         }
+         tl_assert(descr & TREE_DESCR_16_1);
+         tree[3] = tree[2];
+         descr &= ~TREE_DESCR_16_1;
+         descr |= (TREE_DESCR_8_3 | TREE_DESCR_8_2);
+         break;
+      case 4: case 5:
+         if (!(descr & TREE_DESCR_16_2)) {
+            descr = pulldown_to_16(tree, 4, descr);
+         }
+         tl_assert(descr & TREE_DESCR_16_2);
+         tree[5] = tree[4];
+         descr &= ~TREE_DESCR_16_2;
+         descr |= (TREE_DESCR_8_5 | TREE_DESCR_8_4);
+         break;
+      case 6: case 7:
+         if (!(descr & TREE_DESCR_16_3)) {
+            descr = pulldown_to_16(tree, 6, descr);
+         }
+         tl_assert(descr & TREE_DESCR_16_3);
+         tree[7] = tree[6];
+         descr &= ~TREE_DESCR_16_3;
+         descr |= (TREE_DESCR_8_7 | TREE_DESCR_8_6);
+         break;
+      default:
+         tl_assert(0);
+   }
+   return descr;
+}
+
+
+static UShort pullup_descr_to_16 ( UShort descr, UWord toff ) {
+   UShort mask;
+   switch (toff) {
+      case 0:
+         mask = TREE_DESCR_8_1 | TREE_DESCR_8_0;
+         tl_assert( (descr & mask) == mask );
+         descr &= ~mask;
+         descr |= TREE_DESCR_16_0;
+         break;
+      case 2:
+         mask = TREE_DESCR_8_3 | TREE_DESCR_8_2;
+         tl_assert( (descr & mask) == mask );
+         descr &= ~mask;
+         descr |= TREE_DESCR_16_1;
+         break;
+      case 4:
+         mask = TREE_DESCR_8_5 | TREE_DESCR_8_4;
+         tl_assert( (descr & mask) == mask );
+         descr &= ~mask;
+         descr |= TREE_DESCR_16_2;
+         break;
+      case 6:
+         mask = TREE_DESCR_8_7 | TREE_DESCR_8_6;
+         tl_assert( (descr & mask) == mask );
+         descr &= ~mask;
+         descr |= TREE_DESCR_16_3;
+         break;
+      default:
+         tl_assert(0);
+   }
+   return descr;
+}
+
+static UShort pullup_descr_to_32 ( UShort descr, UWord toff ) {
+   UShort mask;
+   switch (toff) {
+      case 0:
+         if (!(descr & TREE_DESCR_16_0))
+            descr = pullup_descr_to_16(descr, 0);
+         if (!(descr & TREE_DESCR_16_1))
+            descr = pullup_descr_to_16(descr, 2);
+         mask = TREE_DESCR_16_1 | TREE_DESCR_16_0;
+         tl_assert( (descr & mask) == mask );
+         descr &= ~mask;
+         descr |= TREE_DESCR_32_0;
+         break;
+      case 4:
+         if (!(descr & TREE_DESCR_16_2))
+            descr = pullup_descr_to_16(descr, 4);
+         if (!(descr & TREE_DESCR_16_3))
+            descr = pullup_descr_to_16(descr, 6);
+         mask = TREE_DESCR_16_3 | TREE_DESCR_16_2;
+         tl_assert( (descr & mask) == mask );
+         descr &= ~mask;
+         descr |= TREE_DESCR_32_1;
+         break;
+      default:
+         tl_assert(0);
+   }
+   return descr;
+}
+
+static Bool valid_value_is_above_me_32 ( UShort descr, UWord toff ) {
+   switch (toff) {
+      case 0: case 4:
+         return 0 != (descr & TREE_DESCR_64);
+      default:
+         tl_assert(0);
+   }
+}
+
+static Bool valid_value_is_below_me_16 ( UShort descr, UWord toff ) {
+   switch (toff) {
+      case 0:
+         return 0 != (descr & (TREE_DESCR_8_1 | TREE_DESCR_8_0));
+      case 2:
+         return 0 != (descr & (TREE_DESCR_8_3 | TREE_DESCR_8_2));
+      case 4:
+         return 0 != (descr & (TREE_DESCR_8_5 | TREE_DESCR_8_4));
+      case 6:
+         return 0 != (descr & (TREE_DESCR_8_7 | TREE_DESCR_8_6));
+      default:
+         tl_assert(0);
+   }
+}
+
+static void shadow_mem_read8 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   stats__cline_read8s++;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 .. 7 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_8_0 << toff)) )) {
+      UInt* tree = &cl->svals[tno << 3];
+      cl->descrs[tno] = pulldown_to_8(tree, toff, descr);
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_read( thr_acc, a, svOld, 1 );
+   cl->svals[cloff] = svNew;
+}
+static void shadow_mem_read16 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   stats__cline_read16s++;
+   if (UNLIKELY(!aligned16(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0, 2, 4 or 6 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_16_0 << toff)) )) {
+      if (valid_value_is_below_me_16(descr, toff)) {
+         goto slowcase;
+      } else {
+         UInt* tree = &cl->svals[tno << 3];
+         cl->descrs[tno] = pulldown_to_16(tree, toff, descr);
+      }
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_read( thr_acc, a, svOld, 2 );
+   cl->svals[cloff] = svNew;
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   stats__cline_16to8splits++;
+   shadow_mem_read8( thr_acc, a + 0, 0/*unused*/ );
+   shadow_mem_read8( thr_acc, a + 1, 0/*unused*/ );
+}
+
+__attribute__((noinline))
+static void shadow_mem_read32_SLOW ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   if (UNLIKELY(!aligned32(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 or 4 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_32_0 << toff)) )) {
+      if (valid_value_is_above_me_32(descr, toff)) {
+         UInt* tree = &cl->svals[tno << 3];
+         cl->descrs[tno] = pulldown_to_32(tree, toff, descr);
+      } else {
+         goto slowcase;
+      }
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_read( thr_acc, a, svOld, 4 );
+   cl->svals[cloff] = svNew;
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   stats__cline_32to16splits++;
+   shadow_mem_read16( thr_acc, a + 0, 0/*unused*/ );
+   shadow_mem_read16( thr_acc, a + 2, 0/*unused*/ );
+}
+inline
+static void shadow_mem_read32 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UShort     descr;
+   stats__cline_read32s++;
+   if (UNLIKELY(!aligned32(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 or 4 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_32_0 << toff)) )) goto slowcase;
+   { UInt* p = &cl->svals[cloff];
+     *p = msm__handle_read( thr_acc, a, *p, 4 );
+   }
+   return;
+  slowcase: /* misaligned, or not at this level in the tree */
+   shadow_mem_read32_SLOW( thr_acc, a, uuOpaque );
+}
+
+inline
+static void shadow_mem_read64 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   stats__cline_read64s++;
+   if (UNLIKELY(!aligned64(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0, unused */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & TREE_DESCR_64) )) {
+      goto slowcase;
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_read( thr_acc, a, svOld, 8 );
+   cl->svals[cloff] = svNew;
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   stats__cline_64to32splits++;
+   shadow_mem_read32( thr_acc, a + 0, 0/*unused*/ );
+   shadow_mem_read32( thr_acc, a + 4, 0/*unused*/ );
+}
+
+static void shadow_mem_write8 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   stats__cline_write8s++;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 .. 7 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_8_0 << toff)) )) {
+      UInt* tree = &cl->svals[tno << 3];
+      cl->descrs[tno] = pulldown_to_8(tree, toff, descr);
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_write( thr_acc, a, svOld, 1 );
+   cl->svals[cloff] = svNew;
+}
+static void shadow_mem_write16 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   stats__cline_write16s++;
+   if (UNLIKELY(!aligned16(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0, 2, 4 or 6 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_16_0 << toff)) )) {
+      if (valid_value_is_below_me_16(descr, toff)) {
+         goto slowcase;
+      } else {
+         UInt* tree = &cl->svals[tno << 3];
+         cl->descrs[tno] = pulldown_to_16(tree, toff, descr);
+      }
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_write( thr_acc, a, svOld, 2 );
+   cl->svals[cloff] = svNew;
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   stats__cline_16to8splits++;
+   shadow_mem_write8( thr_acc, a + 0, 0/*unused*/ );
+   shadow_mem_write8( thr_acc, a + 1, 0/*unused*/ );
+}
+
+__attribute__((noinline))
+static void shadow_mem_write32_SLOW ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   if (UNLIKELY(!aligned32(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 or 4 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_32_0 << toff)) )) {
+      if (valid_value_is_above_me_32(descr, toff)) {
+         UInt* tree = &cl->svals[tno << 3];
+         cl->descrs[tno] = pulldown_to_32(tree, toff, descr);
+      } else {
+         goto slowcase;
+      }
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_write( thr_acc, a, svOld, 4 );
+   cl->svals[cloff] = svNew;
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   stats__cline_32to16splits++;
+   shadow_mem_write16( thr_acc, a + 0, 0/*unused*/ );
+   shadow_mem_write16( thr_acc, a + 2, 0/*unused*/ );
+}
+inline
+static void shadow_mem_write32 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UShort     descr;
+   stats__cline_write32s++;
+   if (UNLIKELY(!aligned32(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 or 4 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_32_0 << toff)) )) goto slowcase;
+   { UInt* p = &cl->svals[cloff];
+     *p = msm__handle_write( thr_acc, a, *p, 4 );
+   }
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   shadow_mem_write32_SLOW( thr_acc, a, uuOpaque );
+}
+
+inline
+static void shadow_mem_write64 ( Thread* thr_acc, Addr a, UInt uuOpaque ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UInt       svOld, svNew;
+   UShort     descr;
+   stats__cline_write64s++;
+   if (UNLIKELY(!aligned64(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0, unused */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & TREE_DESCR_64) )) {
+      goto slowcase;
+   }
+   svOld = cl->svals[cloff];
+   svNew = msm__handle_write( thr_acc, a, svOld, 8 );
+   cl->svals[cloff] = svNew;
+   return;
+  slowcase: /* misaligned, or must go further down the tree */
+   stats__cline_64to32splits++;
+   shadow_mem_write32( thr_acc, a + 0, 0/*unused*/ );
+   shadow_mem_write32( thr_acc, a + 4, 0/*unused*/ );
+}
+
+static void shadow_mem_set8 ( Thread* uu_thr_acc, Addr a, UInt svNew ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UShort     descr;
+   stats__cline_set8s++;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 .. 7 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_8_0 << toff)) )) {
+      UInt* tree = &cl->svals[tno << 3];
+      cl->descrs[tno] = pulldown_to_8(tree, toff, descr);
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+   }
+   cl->svals[cloff] = svNew;
+}
+static void shadow_mem_set16 ( Thread* uu_thr_acc, Addr a, UInt svNew ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UShort     descr;
+   stats__cline_set16s++;
+   if (UNLIKELY(!aligned16(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0, 2, 4 or 6 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_16_0 << toff)) )) {
+      if (valid_value_is_below_me_16(descr, toff)) {
+         /* Writing at this level.  Need to fix up 'descr'. */
+         cl->descrs[tno] = pullup_descr_to_16(descr, toff);
+         /* At this point, the tree does not match cl->descr[tno] any
+            more.  The assignments below will fix it up. */
+      } else {
+         /* We can't indiscriminately write on the w16 node as in the
+            w64 case, as that might make the node inconsistent with
+            its parent.  So first, pull down to this level. */
+         UInt* tree = &cl->svals[tno << 3];
+         cl->descrs[tno] = pulldown_to_16(tree, toff, descr);
+      if (SCE_CACHELINE)
+         tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+      }
+   }
+   cl->svals[cloff + 0] = svNew;
+   cl->svals[cloff + 1] = 0;
+   return;
+  slowcase: /* misaligned */
+   stats__cline_16to8splits++;
+   shadow_mem_set8( uu_thr_acc, a + 0, svNew );
+   shadow_mem_set8( uu_thr_acc, a + 1, svNew );
+}
+static void shadow_mem_set32 ( Thread* uu_thr_acc, Addr a, UInt svNew ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UShort     descr;
+   stats__cline_set32s++;
+   if (UNLIKELY(!aligned32(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 or 4 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_32_0 << toff)) )) {
+      if (valid_value_is_above_me_32(descr, toff)) {
+         /* We can't indiscriminately write on the w32 node as in the
+            w64 case, as that might make the node inconsistent with
+            its parent.  So first, pull down to this level. */
+         UInt* tree = &cl->svals[tno << 3];
+         cl->descrs[tno] = pulldown_to_32(tree, toff, descr);
+         if (SCE_CACHELINE)
+            tl_assert(is_sane_CacheLine(cl)); /* EXPENSIVE */
+      } else {
+         /* Writing at this level.  Need to fix up 'descr'. */
+         cl->descrs[tno] = pullup_descr_to_32(descr, toff);
+         /* At this point, the tree does not match cl->descr[tno] any
+            more.  The assignments below will fix it up. */
+      }
+   }
+   cl->svals[cloff + 0] = svNew;
+   cl->svals[cloff + 1] = 0;
+   cl->svals[cloff + 2] = 0;
+   cl->svals[cloff + 3] = 0;
+   return;
+  slowcase: /* misaligned */
+   stats__cline_32to16splits++;
+   shadow_mem_set16( uu_thr_acc, a + 0, svNew );
+   shadow_mem_set16( uu_thr_acc, a + 2, svNew );
+}
+inline
+static void shadow_mem_set64 ( Thread* uu_thr_acc, Addr a, UInt svNew ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   stats__cline_set64s++;
+   if (UNLIKELY(!aligned64(a))) goto slowcase;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 */
+   cl->descrs[tno] = TREE_DESCR_64;
+   cl->svals[cloff + 0] = svNew;
+   cl->svals[cloff + 1] = 0;
+   cl->svals[cloff + 2] = 0;
+   cl->svals[cloff + 3] = 0;
+   cl->svals[cloff + 4] = 0;
+   cl->svals[cloff + 5] = 0;
+   cl->svals[cloff + 6] = 0;
+   cl->svals[cloff + 7] = 0;
+   return;
+  slowcase: /* misaligned */
+   stats__cline_64to32splits++;
+   shadow_mem_set32( uu_thr_acc, a + 0, svNew );
+   shadow_mem_set32( uu_thr_acc, a + 4, svNew );
+}
+
+static UInt shadow_mem_get8 ( Addr a ) {
+   CacheLine* cl; 
+   UWord      cloff, tno, toff;
+   UShort     descr;
+   stats__cline_get8s++;
+   cl    = get_cacheline(a);
+   cloff = get_cacheline_offset(a);
+   tno   = get_treeno(a);
+   toff  = get_tree_offset(a); /* == 0 .. 7 */
+   descr = cl->descrs[tno];
+   if (UNLIKELY( !(descr & (TREE_DESCR_8_0 << toff)) )) {
+      UInt* tree = &cl->svals[tno << 3];
+      cl->descrs[tno] = pulldown_to_8(tree, toff, descr);
+   }
+   return cl->svals[cloff];
+}
+
+static void shadow_mem_copy8 ( Addr src, Addr dst, Bool normalise ) {
+   UInt       sv;
+   stats__cline_copy8s++;
+   sv = shadow_mem_get8( src );
+
+   if (UNLIKELY(clo_trace_level > 0)) {
+      if (dst == clo_trace_addr) {
+         Thread* thr    = get_current_Thread();
+         UInt    sv_old = shadow_mem_get8( dst );
+         msm__show_state_change( thr, dst, 1, 'w', sv_old, sv );
+      }
+   }
+
+   shadow_mem_set8( NULL/*unused*/, dst, sv );
+}
+
+
+/* ------------ Shadow memory range setting ops ------------ */
+
+static void shadow_mem_modify_range(
+               Thread* thr, 
+               Addr    a, 
+               SizeT   len,
+               void    (*fn8) (Thread*,Addr,UInt),
+               void    (*fn16)(Thread*,Addr,UInt),
+               void    (*fn32)(Thread*,Addr,UInt),
+               void    (*fn64)(Thread*,Addr,UInt),
+               UInt    opaque
+            )
+{
+   /* fast track a couple of common cases */
+   if (len == 4 && aligned32(a)) {
+      fn32( thr, a, opaque );
+      return;
+   }
+   if (len == 8 && aligned64(a)) {
+      fn64( thr, a, opaque );
+      return;
+   }
+
+   /* be completely general (but as efficient as possible) */
+   if (len == 0) return;
+
+   if (!aligned16(a) && len >= 1) {
+      fn8( thr, a, opaque );
+      a += 1;
+      len -= 1;
+      tl_assert(aligned16(a));
+   }
+   if (len == 0) return;
+
+   if (!aligned32(a) && len >= 2) {
+      fn16( thr, a, opaque );
+      a += 2;
+      len -= 2;
+      tl_assert(aligned32(a));
+   }
+   if (len == 0) return;
+
+   if (!aligned64(a) && len >= 4) {
+      fn32( thr, a, opaque );
+      a += 4;
+      len -= 4;
+      tl_assert(aligned64(a));
+   }
+   if (len == 0) return;
+
+   if (len >= 8) {
+      tl_assert(aligned64(a));
+      while (len >= 8) {
+         fn64( thr, a, opaque );
+         a += 8;
+         len -= 8;
+      }
+      tl_assert(aligned64(a));
+   }
+   if (len == 0) return;
+
+   if (len >= 4)
+      tl_assert(aligned32(a));
+   if (len >= 4) {
+      fn32( thr, a, opaque );
+      a += 4;
+      len -= 4;
+   }
+   if (len == 0) return;
+
+   if (len >= 2)
+      tl_assert(aligned16(a));
+   if (len >= 2) {
+      fn16( thr, a, opaque );
+      a += 2;
+      len -= 2;
+   }
+   if (len == 0) return;
+
+   if (len >= 1) {
+      fn8( thr, a, opaque );
+      a += 1;
+      len -= 1;
+   }
+   tl_assert(len == 0);
+}
+
+/* Block-copy states (needed for implementing realloc()). */
+static void shadow_mem_copy_range ( Addr src, Addr dst, SizeT len )
+{
+   SizeT i;
+   if (len == 0)
+      return;
+   /* To be simple, just copy byte by byte.  But so as not to wreck
+      performance for later accesses to dst[0 .. len-1], normalise
+      destination lines as we finish with them, and also normalise the
+      line containing the first and last address. */
+   for (i = 0; i < len; i++) {
+      Bool normalise
+         = get_cacheline_offset( dst+i+1 ) == 0 /* last in line */
+           || i == 0       /* first in range */
+           || i == len-1;  /* last in range */
+      shadow_mem_copy8( src+i, dst+i, normalise );
+   }
+}
+
+static void shadow_mem_read_range ( Thread* thr, Addr a, SizeT len ) {
+   shadow_mem_modify_range( thr, a, len, 
+                            shadow_mem_read8,
+                            shadow_mem_read16,
+                            shadow_mem_read32,
+                            shadow_mem_read64,
+                            0/*opaque,ignored*/ );
+}
+
+static void shadow_mem_write_range ( Thread* thr, Addr a, SizeT len ) {
+   shadow_mem_modify_range( thr, a, len, 
+                            shadow_mem_write8,
+                            shadow_mem_write16,
+                            shadow_mem_write32,
+                            shadow_mem_write64,
+                            0/*opaque,ignored*/ );
+}
+
+static void shadow_mem_make_New ( Thread* thr, Addr a, SizeT len )
+{
+   if (UNLIKELY(clo_trace_level > 0)) {
+      if (len > 0 && a <= clo_trace_addr && clo_trace_addr < a+len) {
+         UInt sv_old = shadow_mem_get8( clo_trace_addr );
+         msm__show_state_change( thr, a, (Int)len, 'p', sv_old, SHVAL_New );
+      }
+   }
+   shadow_mem_modify_range( thr, a, len, 
+                            shadow_mem_set8,
+                            shadow_mem_set16,
+                            shadow_mem_set32,
+                            shadow_mem_set64,
+                            SHVAL_New/*opaque*/ );
+}
+
+
+/* Putting memory into the NoAccess state.  This is hugely complicated
+   by the problem of memory that contains locks.
+
+   1. Examine the .mbHasLocks fields in all SecMaps in the range to be
+      deleted.  This quickly indicates if there are or might be any
+      locks in the range to be deleted.  Note that .mbHasLocks fields on
+      SecMaps are not subject to scaching, so it safe to look at them
+      without flushing the scache.
+
+   2. Set the range to NoAccess.  Clear the .mbHasShared and
+      .mbHasLocks hint bits for any completely vacated SecMaps.
+      Clearing the hint bits isn't necessary for correctness, but it
+      is important to avoid ending up with hint bits being permanently
+      set, which would render them pointless.
+
+   3. If (1) indicated "definitely no locks", we're done.  This is
+      the fast and hopefully common case.
+
+   Otherwise, the range contains some locks (or may do), so we have to
+   go to considerable effort to tidy up.
+
+   4. Make up a set containing the locks which are deleted:
+
+      ToDelete = NULL
+
+      for each lk in map_locks {
+         if lk's guest addr falls in the range to memory be deleted
+            add lk to ToDelete
+
+         if lk is held, issue an error message - freeing memory
+            containing a held lock
+      }
+
+   5. If ToDelete is empty, there were in fact no locks in the range,
+      despite what the .mbHasLocks hint bits indicated.  We're done.
+
+   6. Flush the scache.  This is necessary both to bring the SecMap
+      .mbHasShared fields up to date, and to bring the actual shadow
+      values up to date.  We will need to examine both of these.
+
+      Invalidate the scache.  This is necessary because we will be
+      modifying values in the backing store (SecMaps) and need
+      subsequent shmem accesses to get the new values.
+
+   7. Modify all shadow words, by removing ToDelete from the lockset
+      of all ShM and ShR states.  Note this involves a complete scan
+      over map_shmem, which is very expensive according to OProfile.
+      Hence it depends critically on the size of each entry in
+      map_shmem.  See comments on definition of N_SECMAP_BITS above.
+
+      Why is it safe to do (7) after (2) ?  Because we're not
+      interested in messing with ShR/M states which are going to be
+      set to NoAccess anyway.
+
+      Optimisation 1 (implemented): skip this step for SecMaps which
+      do not have .mbHasShared set
+
+      Optimisation 2 (not implemented): for each SecMap, have a
+      summary lock set which is the union of all locks mentioned in
+      locksets on this page (or any superset of it).  Then skip step
+      (2) if the summary lockset does not intersect with ToDelete.
+
+      That's potentially cheap, since the usual lockset refinement
+      only shrinks locksets; hence there is no point in updating the
+      summary lockset for ShM/R -> ShM/R transitions.  Therefore only
+      need to do this for Excl->ShM/R transitions.
+
+   8. Tell laog that these locks have disappeared.
+*/
+static void shadow_mem_make_NoAccess ( Thread* thr, Addr aIN, SizeT len )
+{
+   Lock*     lk;
+   Addr      gla, sma, firstSM, lastSM, firstA, lastA;
+   WordSetID locksToDelete;
+   Bool      mbHasLocks;
+
+   if (0 && len > 500)
+      VG_(printf)("make NoAccess ( %p, %d )\n", aIN, len );
+
+   if (len == 0) 
+      return;
+
+   /* --- Step 1 --- */
+
+   firstA  = aIN;
+   lastA   = aIN + len - 1;
+
+   firstSM = shmem__round_to_SecMap_base( firstA );
+   lastSM  = shmem__round_to_SecMap_base( lastA );
+   tl_assert(firstSM <= lastSM);
+
+   mbHasLocks = False;
+   for (sma = firstSM; sma <= lastSM; sma += N_SECMAP_ARANGE) {
+      if (shmem__get_mbHasLocks(sma)) {
+         mbHasLocks = True;
+         break;
+      }
+   }
+
+   /* --- Step 2 --- */
+
+   if (UNLIKELY(clo_trace_level > 0)) {
+      if (len > 0 && firstA <= clo_trace_addr && clo_trace_addr <= lastA) {
+         UInt sv_old = shadow_mem_get8( clo_trace_addr );
+         msm__show_state_change( thr, firstA, (Int)len, 'p',
+                                      sv_old, SHVAL_NoAccess );
+      }
+   }
+   shadow_mem_modify_range( thr, firstA, len, 
+                            shadow_mem_set8,
+                            shadow_mem_set16,
+                            shadow_mem_set32,
+                            shadow_mem_set64,
+                            SHVAL_NoAccess/*opaque*/ );
+
+   for (sma = firstSM; sma <= lastSM; sma += N_SECMAP_ARANGE) {
+      /* Is this sm entirely within the deleted range? */
+      if (firstA <= sma && sma + N_SECMAP_ARANGE - 1 <= lastA) {
+         /* Yes.  Clear the hint bits. */
+         shmem__set_mbHasLocks( sma, False );
+         shmem__set_mbHasShared( sma, False );
+      }
+   }
+
+   /* --- Step 3 --- */
+
+   if (!mbHasLocks)
+      return;
+
+   /* --- Step 4 --- */
+
+   if (0) 
+   VG_(printf)("shadow_mem_make_NoAccess(%p, %u, %p): maybe slow case\n",
+               (void*)firstA, (UWord)len, (void*)lastA);
+   locksToDelete = HG_(emptyWS)( univ_lsets );
+   
+   /* FIXME: don't iterate over the complete lock set */
+   HG_(initIterFM)( map_locks );
+   while (HG_(nextIterFM)( map_locks,
+                           (Word*)(void*)&gla, (Word*)(void*)&lk )) {
+      tl_assert(is_sane_LockN(lk));
+      if (gla < firstA || gla > lastA)
+         continue;
+      locksToDelete = HG_(addToWS)( univ_lsets, locksToDelete, (Word)lk );
+      /* If the lock is held, we must remove it from the currlock sets
+         of all threads that hold it.  Also take the opportunity to
+         report an error.  To report an error we need to know at least
+         one of the threads that holds it; really we should mention
+         them all, but that's too much hassle.  So choose one
+         arbitrarily. */
+      if (lk->heldBy) {
+         tl_assert(!HG_(isEmptyBag)(lk->heldBy));
+         record_error_FreeMemLock( (Thread*)HG_(anyElementOfBag)(lk->heldBy),
+                                   lk );
+         /* remove lock from locksets of all owning threads */
+         remove_Lock_from_locksets_of_all_owning_Threads( lk );
+         /* Leave lk->heldBy in place; del_Lock below will free it up. */
+      }
+   }
+   HG_(doneIterFM)( map_locks );
+
+   /* --- Step 5 --- */
+
+   if (HG_(isEmptyWS)( univ_lsets, locksToDelete ))
+      return;
+
+   /* --- Step 6 --- */
+
+   shmem__flush_and_invalidate_scache();
+
+   /* --- Step 7 --- */
+
+   if (0) 
+   VG_(printf)("shadow_mem_make_NoAccess(%p, %u, %p): definitely slow case\n",
+               (void*)firstA, (UWord)len, (void*)lastA);
+
+   /* Modify all shadow words, by removing locksToDelete from the lockset
+      of all ShM and ShR states.
+      Optimisation 1: skip SecMaps which do not have .mbHasShared set
+   */
+   { Int        stats_SMs = 0, stats_SMs_scanned = 0;
+     Addr       ga;
+     SecMap*    sm;
+     SecMapIter itr;
+     UInt*      w32p;
+
+     HG_(initIterFM)( map_shmem );
+     while (HG_(nextIterFM)( map_shmem,
+                             (Word*)(void*)&ga, (Word*)(void*)&sm )) {
+        tl_assert(sm);
+        stats_SMs++;
+        /* Skip this SecMap if the summary bit indicates it is safe to
+           do so. */
+        if (!sm->mbHasShared)
+           continue;
+        stats_SMs_scanned++;
+        initSecMapIter( &itr );
+        while (stepSecMapIter( &w32p, &itr, sm )) {
+           Bool isM;
+           UInt wold, wnew, lset_old, tset_old, lset_new;
+           wold = *w32p;
+           if (LIKELY( !is_SHVAL_Sh(wold) ))
+              continue;
+           isM      = is_SHVAL_ShM(wold);
+           lset_old = un_SHVAL_Sh_lset(wold);
+           tset_old = un_SHVAL_Sh_tset(wold);
+           lset_new = HG_(minusWS)( univ_lsets, lset_old, locksToDelete );
+           wnew     = isM ? mk_SHVAL_ShM(tset_old, lset_new)
+                          : mk_SHVAL_ShR(tset_old, lset_new);
+           if (wnew != wold)
+              *w32p = wnew;
+        }
+     }
+     HG_(doneIterFM)( map_shmem );
+     if (SHOW_EXPENSIVE_STUFF)
+        VG_(printf)("shadow_mem_make_NoAccess: %d SMs, %d scanned\n", 
+                    stats_SMs, stats_SMs_scanned);
+   }
+
+   /* Now we have to free up the Locks in locksToDelete and remove
+      any mention of them from admin_locks and map_locks.  This is
+      inefficient. */
+   { Lock* lkprev = NULL;
+     lk = admin_locks;
+     while (True) {
+        if (lk == NULL) break;
+        if (lkprev) tl_assert(lkprev->admin == lk);
+
+        if (!HG_(elemWS)(univ_lsets, locksToDelete, (Word)lk)) {
+           lkprev = lk;
+           lk = lk->admin;
+           continue;
+        }
+        /* Need to delete 'lk' */
+        if (lkprev == NULL) {
+           admin_locks = lk->admin;
+        } else {
+           lkprev->admin = lk->admin;
+        }
+        /* and get it out of map_locks */
+        map_locks_delete(lk->guestaddr);
+        /* release storage (incl. associated .heldBy Bag) */
+        { Lock* tmp = lk->admin;
+          del_LockN(lk);
+          lk = tmp;
+        }
+     }
+   }
+
+   /* --- Step 8 --- */
+
+   /* update lock order acquisition graph */
+   laog__handle_lock_deletions( locksToDelete );
+
+   if (0) all__sanity_check("Make NoAccess");
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Event handlers (evh__* functions)                        ---*/
+/*--- plus helpers (evhH__* functions)                         ---*/
+/*----------------------------------------------------------------*/
+
+/*--------- Event handler helpers (evhH__* functions) ---------*/
+
+/* Create a new segment for 'thr', making it depend (.prev) on its
+   existing segment, bind together the SegmentID and Segment, and
+   return both of them.  Also update 'thr' so it references the new
+   Segment. */
+static 
+void evhH__start_new_segment_for_thread ( /*OUT*/SegmentID* new_segidP,
+                                          /*OUT*/Segment** new_segP,
+                                          Thread* thr )
+{
+   Segment* cur_seg;
+   tl_assert(new_segP);
+   tl_assert(new_segidP);
+   tl_assert(is_sane_Thread(thr));
+   cur_seg = map_segments_lookup( thr->csegid );
+   tl_assert(cur_seg);
+   tl_assert(cur_seg->thr == thr); /* all sane segs should point back
+                                      at their owner thread. */
+   *new_segP = mk_Segment( thr, cur_seg, NULL/*other*/ );
+   *new_segidP = alloc_SegmentID();
+   map_segments_add( *new_segidP, *new_segP );
+   thr->csegid = *new_segidP;
+}
+
+
+/* The lock at 'lock_ga' has acquired a writer.  Make all necessary
+   updates, and also do all possible error checks. */
+static 
+void evhH__post_thread_w_acquires_lock ( Thread* thr, 
+                                         LockKind lkk, Addr lock_ga )
+{
+   Lock* lk; 
+
+   /* Basically what we need to do is call lockN_acquire_writer.
+      However, that will barf if any 'invalid' lock states would
+      result.  Therefore check before calling.  Side effect is that
+      'is_sane_LockN(lk)' is both a pre- and post-condition of this
+      routine. 
+
+      Because this routine is only called after successful lock
+      acquisition, we should not be asked to move the lock into any
+      invalid states.  Requests to do so are bugs in libpthread, since
+      that should have rejected any such requests. */
+
+   /* be paranoid w.r.t hint bits, even if lock_ga is complete
+      nonsense */
+   shmem__set_mbHasLocks( lock_ga, True );
+
+   tl_assert(is_sane_Thread(thr));
+   /* Try to find the lock.  If we can't, then create a new one with
+      kind 'lkk'. */
+   lk = map_locks_lookup_or_create( 
+           lkk, lock_ga, map_threads_reverse_lookup_SLOW(thr) );
+   tl_assert( is_sane_LockN(lk) );
+   shmem__set_mbHasLocks( lock_ga, True );
+
+   if (lk->heldBy == NULL) {
+      /* the lock isn't held.  Simple. */
+      tl_assert(!lk->heldW);
+      lockN_acquire_writer( lk, thr );
+      goto noerror;
+   }
+
+   /* So the lock is already held.  If held as a r-lock then
+      libpthread must be buggy. */
+   tl_assert(lk->heldBy);
+   if (!lk->heldW) {
+      record_error_Misc( thr, "Bug in libpthread: write lock "
+                              "granted on rwlock which is currently rd-held");
+      goto error;
+   }
+
+   /* So the lock is held in w-mode.  If it's held by some other
+      thread, then libpthread must be buggy. */
+   tl_assert(HG_(sizeUniqueBag)(lk->heldBy) == 1); /* from precondition */
+
+   if (thr != (Thread*)HG_(anyElementOfBag)(lk->heldBy)) {
+      record_error_Misc( thr, "Bug in libpthread: write lock "
+                              "granted on mutex/rwlock which is currently "
+                              "wr-held by a different thread");
+      goto error;
+   }
+
+   /* So the lock is already held in w-mode by 'thr'.  That means this
+      is an attempt to lock it recursively, which is only allowable
+      for LK_mbRec kinded locks.  Since this routine is called only
+      once the lock has been acquired, this must also be a libpthread
+      bug. */
+   if (lk->kind != LK_mbRec) {
+      record_error_Misc( thr, "Bug in libpthread: recursive write lock "
+                              "granted on mutex/wrlock which does not "
+                              "support recursion");
+      goto error;
+   }
+
+   /* So we are recursively re-locking a lock we already w-hold. */
+   lockN_acquire_writer( lk, thr );
+   goto noerror;
+
+  noerror:
+   /* check lock order acquisition graph, and update.  This has to
+      happen before the lock is added to the thread's locksetA/W. */
+   laog__pre_thread_acquires_lock( thr, lk );
+   /* update the thread's held-locks set */
+   thr->locksetA = HG_(addToWS)( univ_lsets, thr->locksetA, (Word)lk );
+   thr->locksetW = HG_(addToWS)( univ_lsets, thr->locksetW, (Word)lk );
+   /* fall through */
+
+  error:
+   tl_assert(is_sane_LockN(lk));
+}
+
+
+/* The lock at 'lock_ga' has acquired a reader.  Make all necessary
+   updates, and also do all possible error checks. */
+static 
+void evhH__post_thread_r_acquires_lock ( Thread* thr, 
+                                         LockKind lkk, Addr lock_ga )
+{
+   Lock* lk; 
+
+   /* Basically what we need to do is call lockN_acquire_reader.
+      However, that will barf if any 'invalid' lock states would
+      result.  Therefore check before calling.  Side effect is that
+      'is_sane_LockN(lk)' is both a pre- and post-condition of this
+      routine. 
+
+      Because this routine is only called after successful lock
+      acquisition, we should not be asked to move the lock into any
+      invalid states.  Requests to do so are bugs in libpthread, since
+      that should have rejected any such requests. */
+
+   /* be paranoid w.r.t hint bits, even if lock_ga is complete
+      nonsense */
+   shmem__set_mbHasLocks( lock_ga, True );
+
+   tl_assert(is_sane_Thread(thr));
+   /* Try to find the lock.  If we can't, then create a new one with
+      kind 'lkk'.  Only a reader-writer lock can be read-locked,
+      hence the first assertion. */
+   tl_assert(lkk == LK_rdwr);
+   lk = map_locks_lookup_or_create( 
+           lkk, lock_ga, map_threads_reverse_lookup_SLOW(thr) );
+   tl_assert( is_sane_LockN(lk) );
+   shmem__set_mbHasLocks( lock_ga, True );
+
+   if (lk->heldBy == NULL) {
+      /* the lock isn't held.  Simple. */
+      tl_assert(!lk->heldW);
+      lockN_acquire_reader( lk, thr );
+      goto noerror;
+   }
+
+   /* So the lock is already held.  If held as a w-lock then
+      libpthread must be buggy. */
+   tl_assert(lk->heldBy);
+   if (lk->heldW) {
+      record_error_Misc( thr, "Bug in libpthread: read lock "
+                              "granted on rwlock which is "
+                              "currently wr-held");
+      goto error;
+   }
+
+   /* Easy enough.  In short anybody can get a read-lock on a rwlock
+      provided it is either unlocked or already in rd-held. */
+   lockN_acquire_reader( lk, thr );
+   goto noerror;
+
+  noerror:
+   /* check lock order acquisition graph, and update.  This has to
+      happen before the lock is added to the thread's locksetA/W. */
+   laog__pre_thread_acquires_lock( thr, lk );
+   /* update the thread's held-locks set */
+   thr->locksetA = HG_(addToWS)( univ_lsets, thr->locksetA, (Word)lk );
+   /* but don't update thr->locksetW, since lk is only rd-held */
+   /* fall through */
+
+  error:
+   tl_assert(is_sane_LockN(lk));
+}
+
+
+/* The lock at 'lock_ga' is just about to be unlocked.  Make all
+   necessary updates, and also do all possible error checks. */
+static 
+void evhH__pre_thread_releases_lock ( Thread* thr,
+                                      Addr lock_ga, Bool isRDWR )
+{
+   Lock* lock;
+   Word  n;
+
+   /* This routine is called prior to a lock release, before
+      libpthread has had a chance to validate the call.  Hence we need
+      to detect and reject any attempts to move the lock into an
+      invalid state.  Such attempts are bugs in the client.
+
+      isRDWR is True if we know from the wrapper context that lock_ga
+      should refer to a reader-writer lock, and is False if [ditto]
+      lock_ga should refer to a standard mutex. */
+
+   /* be paranoid w.r.t hint bits, even if lock_ga is complete
+      nonsense */
+   shmem__set_mbHasLocks( lock_ga, True );
+
+   tl_assert(is_sane_Thread(thr));
+   lock = map_locks_maybe_lookup( lock_ga );
+
+   if (!lock) {
+      /* We know nothing about a lock at 'lock_ga'.  Nevertheless
+         the client is trying to unlock it.  So complain, then ignore
+         the attempt. */
+      record_error_UnlockBogus( thr, lock_ga );
+      return;
+   }
+
+   tl_assert(lock->guestaddr == lock_ga);
+   tl_assert(is_sane_LockN(lock));
+
+   if (isRDWR && lock->kind != LK_rdwr) {
+      record_error_Misc( thr, "pthread_rwlock_unlock with a "
+                              "pthread_mutex_t* argument " );
+   }
+   if ((!isRDWR) && lock->kind == LK_rdwr) {
+      record_error_Misc( thr, "pthread_mutex_unlock with a "
+                              "pthread_rwlock_t* argument " );
+   }
+
+   if (!lock->heldBy) {
+      /* The lock is not held.  This indicates a serious bug in the
+         client. */
+      tl_assert(!lock->heldW);
+      record_error_UnlockUnlocked( thr, lock );
+      tl_assert(!HG_(elemWS)( univ_lsets, thr->locksetA, (Word)lock ));
+      tl_assert(!HG_(elemWS)( univ_lsets, thr->locksetW, (Word)lock ));
+      goto error;
+   }
+
+   /* The lock is held.  Is this thread one of the holders?  If not,
+      report a bug in the client. */
+   n = HG_(elemBag)( lock->heldBy, (Word)thr );
+   tl_assert(n >= 0);
+   if (n == 0) {
+      /* We are not a current holder of the lock.  This is a bug in
+         the guest, and (per POSIX pthread rules) the unlock
+         attempt will fail.  So just complain and do nothing
+         else. */
+      Thread* realOwner = (Thread*)HG_(anyElementOfBag)( lock->heldBy );
+      tl_assert(is_sane_Thread(realOwner));
+      tl_assert(realOwner != thr);
+      tl_assert(!HG_(elemWS)( univ_lsets, thr->locksetA, (Word)lock ));
+      tl_assert(!HG_(elemWS)( univ_lsets, thr->locksetW, (Word)lock ));
+      record_error_UnlockForeign( thr, realOwner, lock );
+      goto error;
+   }
+
+   /* Ok, we hold the lock 'n' times. */
+   tl_assert(n >= 1);
+
+   lockN_release( lock, thr );
+
+   n--;
+   tl_assert(n >= 0);
+
+   if (n > 0) {
+      tl_assert(lock->heldBy);
+      tl_assert(n == HG_(elemBag)( lock->heldBy, (Word)thr )); 
+      /* We still hold the lock.  So either it's a recursive lock 
+         or a rwlock which is currently r-held. */
+      tl_assert(lock->kind == LK_mbRec
+                || (lock->kind == LK_rdwr && !lock->heldW));
+      tl_assert(HG_(elemWS)( univ_lsets, thr->locksetA, (Word)lock ));
+      if (lock->heldW)
+         tl_assert(HG_(elemWS)( univ_lsets, thr->locksetW, (Word)lock ));
+      else
+         tl_assert(!HG_(elemWS)( univ_lsets, thr->locksetW, (Word)lock ));
+   } else {
+      /* We no longer hold the lock. */
+      if (lock->heldBy) {
+         tl_assert(0 == HG_(elemBag)( lock->heldBy, (Word)thr ));
+      }
+      /* update this thread's lockset accordingly. */
+      thr->locksetA
+         = HG_(delFromWS)( univ_lsets, thr->locksetA, (Word)lock );
+      thr->locksetW
+         = HG_(delFromWS)( univ_lsets, thr->locksetW, (Word)lock );
+   }
+   /* fall through */
+
+  error:
+   tl_assert(is_sane_LockN(lock));
+}
+
+
+/*--------- Event handlers proper (evh__* functions) ---------*/
+
+/* What is the Thread* for the currently running thread?  This is
+   absolutely performance critical.  We receive notifications from the
+   core for client code starts/stops, and cache the looked-up result
+   in 'current_Thread'.  Hence, for the vast majority of requests,
+   finding the current thread reduces to a read of a global variable,
+   provided get_current_Thread_in_C_C is inlined.
+
+   Outside of client code, current_Thread is NULL, and presumably
+   any uses of it will cause a segfault.  Hence:
+
+   - for uses definitely within client code, use
+     get_current_Thread_in_C_C.
+
+   - for all other uses, use get_current_Thread.
+*/
+
+static Thread* current_Thread = NULL;
+
+static void evh__start_client_code ( ThreadId tid, ULong nDisp ) {
+   if (0) VG_(printf)("start %d %llu\n", (Int)tid, nDisp);
+   tl_assert(current_Thread == NULL);
+   current_Thread = map_threads_lookup( tid );
+   tl_assert(current_Thread != NULL);
+}
+static void evh__stop_client_code ( ThreadId tid, ULong nDisp ) {
+   if (0) VG_(printf)(" stop %d %llu\n", (Int)tid, nDisp);
+   tl_assert(current_Thread != NULL);
+   current_Thread = NULL;
+}
+static inline Thread* get_current_Thread_in_C_C ( void ) {
+   return current_Thread;
+}
+static inline Thread* get_current_Thread ( void ) {
+   ThreadId coretid;
+   Thread*  thr;
+   thr = get_current_Thread_in_C_C();
+   if (LIKELY(thr))
+      return thr;
+   /* evidently not in client code.  Do it the slow way. */
+   coretid = VG_(get_running_tid)();
+   /* FIXME: get rid of the following kludge.  It exists because
+      evim__new_mem is called during initialisation (as notification
+      of initial memory layout) and VG_(get_running_tid)() returns
+      VG_INVALID_THREADID at that point. */
+   if (coretid == VG_INVALID_THREADID)
+      coretid = 1; /* KLUDGE */
+   thr = map_threads_lookup( coretid );
+   return thr;
+}
+
+static
+void evh__new_mem ( Addr a, SizeT len ) {
+   if (SHOW_EVENTS >= 2)
+      VG_(printf)("evh__new_mem(%p, %lu)\n", (void*)a, len );
+   shadow_mem_make_New( get_current_Thread(), a, len );
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__new_mem-post");
+}
+
+static
+void evh__new_mem_w_perms ( Addr a, SizeT len, 
+                            Bool rr, Bool ww, Bool xx ) {
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__new_mem_w_perms(%p, %lu, %d,%d,%d)\n",
+                  (void*)a, len, (Int)rr, (Int)ww, (Int)xx );
+   if (rr || ww || xx)
+      shadow_mem_make_New( get_current_Thread(), a, len );
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__new_mem_w_perms-post");
+}
+
+static
+void evh__set_perms ( Addr a, SizeT len,
+                      Bool rr, Bool ww, Bool xx ) {
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__set_perms(%p, %lu, %d,%d,%d)\n",
+                  (void*)a, len, (Int)rr, (Int)ww, (Int)xx );
+   /* Hmm.  What should we do here, that actually makes any sense?
+      Let's say: if neither readable nor writable, then declare it
+      NoAccess, else leave it alone. */
+   if (!(rr || ww))
+      shadow_mem_make_NoAccess( get_current_Thread(), a, len );
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__set_perms-post");
+}
+
+static
+void evh__die_mem ( Addr a, SizeT len ) {
+   if (SHOW_EVENTS >= 2)
+      VG_(printf)("evh__die_mem(%p, %lu)\n", (void*)a, len );
+   shadow_mem_make_NoAccess( get_current_Thread(), a, len );
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__die_mem-post");
+}
+
+static
+void evh__pre_thread_ll_create ( ThreadId parent, ThreadId child )
+{
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__pre_thread_ll_create(p=%d, c=%d)\n",
+                  (Int)parent, (Int)child );
+
+   if (parent != VG_INVALID_THREADID) {
+      Thread*   thr_p;
+      Thread*   thr_c;
+      SegmentID segid_c;
+      Segment*  seg_c;
+
+      tl_assert(is_sane_ThreadId(parent));
+      tl_assert(is_sane_ThreadId(child));
+      tl_assert(parent != child);
+
+      thr_p = map_threads_maybe_lookup( parent );
+      thr_c = map_threads_maybe_lookup( child );
+
+      tl_assert(thr_p != NULL);
+      tl_assert(thr_c == NULL);
+
+      /* Create a new thread record for the child. */
+      // FIXME: code duplication from init_data_structures
+      segid_c = alloc_SegmentID();
+      seg_c   = mk_Segment( NULL/*thr*/, NULL/*prev*/, NULL/*other*/ );
+      map_segments_add( segid_c, seg_c );
+
+      /* a Thread for the new thread ... */
+      thr_c = mk_Thread( segid_c );
+      seg_c->thr = thr_c;
+
+      /* and bind it in the thread-map table */
+      map_threads[child] = thr_c;
+
+      /* Record where the parent is so we can later refer to this in
+         error messages.
+
+         On amd64-linux, this entails a nasty glibc-2.5 specific hack.
+         The stack snapshot is taken immediately after the parent has
+         returned from its sys_clone call.  Unfortunately there is no
+         unwind info for the insn following "syscall" - reading the
+         glibc sources confirms this.  So we ask for a snapshot to be
+         taken as if RIP was 3 bytes earlier, in a place where there
+         is unwind info.  Sigh.
+      */
+      { Word first_ip_delta = 0;
+#       if defined(VGP_amd64_linux)
+        first_ip_delta = -3;
+#       endif
+        thr_c->created_at = VG_(record_ExeContext)(parent, first_ip_delta);
+      }
+
+      /* Now, mess with segments. */ 
+      if (clo_happens_before >= 1) {
+         /* Make the child's new segment depend on the parent */
+         seg_c->other = map_segments_lookup( thr_p->csegid );
+         seg_c->other_hint = 'c';
+         seg_c->vts = tick_VTS( thr_c, seg_c->other->vts );
+         tl_assert(seg_c->prev == NULL);
+         /* and start a new segment for the parent. */
+         { SegmentID new_segid = 0; /* bogus */
+           Segment*  new_seg   = NULL;
+           evhH__start_new_segment_for_thread( &new_segid, &new_seg, 
+                                               thr_p );
+           tl_assert(is_sane_SegmentID(new_segid));
+           tl_assert(is_sane_Segment(new_seg));
+           new_seg->vts = tick_VTS( thr_p, new_seg->prev->vts );
+           tl_assert(new_seg->other == NULL);
+         }
+      }
+   }
+
+   if (clo_sanity_flags & SCE_THREADS)
+      all__sanity_check("evh__pre_thread_create-post");
+}
+
+static
+void evh__pre_thread_ll_exit ( ThreadId quit_tid )
+{
+   Int     nHeld;
+   Thread* thr_q;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__pre_thread_ll_exit(thr=%d)\n",
+                  (Int)quit_tid );
+
+   /* quit_tid has disappeared without joining to any other thread.
+      Therefore there is no synchronisation event associated with its
+      exit and so we have to pretty much treat it as if it was still
+      alive but mysteriously making no progress.  That is because, if
+      we don't know when it really exited, then we can never say there
+      is a point in time when we're sure the thread really has
+      finished, and so we need to consider the possibility that it
+      lingers indefinitely and continues to interact with other
+      threads. */
+   /* However, it might have rendezvous'd with a thread that called
+      pthread_join with this one as arg, prior to this point (that's
+      how NPTL works).  In which case there has already been a prior
+      sync event.  So in any case, just let the thread exit.  On NPTL,
+      all thread exits go through here. */
+   tl_assert(is_sane_ThreadId(quit_tid));
+   thr_q = map_threads_maybe_lookup( quit_tid );
+   tl_assert(thr_q != NULL);
+
+   /* Complain if this thread holds any locks. */
+   nHeld = HG_(cardinalityWS)( univ_lsets, thr_q->locksetA );
+   tl_assert(nHeld >= 0);
+   if (nHeld > 0) {
+      HChar buf[80];
+      VG_(sprintf)(buf, "Exiting thread still holds %d lock%s",
+                        nHeld, nHeld > 1 ? "s" : "");
+      record_error_Misc( thr_q, buf );
+   }
+
+   /* About the only thing we do need to do is clear the map_threads
+      entry, in order that the Valgrind core can re-use it. */
+   map_threads_delete( quit_tid );
+
+   if (clo_sanity_flags & SCE_THREADS)
+      all__sanity_check("evh__pre_thread_ll_exit-post");
+}
+
+static
+void evh__HG_PTHREAD_JOIN_POST ( ThreadId stay_tid, Thread* quit_thr )
+{
+   Int      stats_SMs, stats_SMs_scanned, stats_reExcls;
+   Addr     ga;
+   SecMap*  sm;
+   Thread*  thr_s;
+   Thread*  thr_q;
+
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__post_thread_join(stayer=%d, quitter=%p)\n",
+                  (Int)stay_tid, quit_thr );
+
+   tl_assert(is_sane_ThreadId(stay_tid));
+
+   thr_s = map_threads_maybe_lookup( stay_tid );
+   thr_q = quit_thr;
+   tl_assert(thr_s != NULL);
+   tl_assert(thr_q != NULL);
+   tl_assert(thr_s != thr_q);
+
+   if (clo_happens_before >= 1) {
+      /* Start a new segment for the stayer */
+      SegmentID new_segid = 0; /* bogus */
+      Segment*  new_seg   = NULL;
+      evhH__start_new_segment_for_thread( &new_segid, &new_seg, thr_s );
+      tl_assert(is_sane_SegmentID(new_segid));
+      tl_assert(is_sane_Segment(new_seg));
+      /* and make it depend on the quitter's last segment */
+      tl_assert(new_seg->other == NULL);
+      new_seg->other = map_segments_lookup( thr_q->csegid );
+      new_seg->other_hint = 'j';
+      tl_assert(new_seg->thr == thr_s);
+      new_seg->vts = tickL_and_joinR_VTS( thr_s, new_seg->prev->vts,
+                                                 new_seg->other->vts );
+   }
+
+   // FIXME: error-if: exiting thread holds any locks
+   //        or should evh__pre_thread_ll_exit do that?
+
+   /* Delete thread from ShM/ShR thread sets and restore Excl states
+      where appropriate */
+
+   /* When Thread(t) joins to Thread(u):
+
+      scan all shadow memory.  For each ShM/ShR thread set, replace
+      't' in each set with 'u'.  If this results in a singleton 'u',
+      change the state to Excl(u->csegid).
+
+      Optimisation: tag each SecMap with a superset of the union of
+      the thread sets in the SecMap.  Then if the tag set does not
+      include 't' then the SecMap can be skipped, because there is no
+      't' to change to anything else.
+
+      Problem is that the tag set needs to be updated often, after
+      every ShR/ShM store.  (that increases the thread set of the
+      shadow value.)
+
+      --> Compromise.  Tag each SecMap with a .mbHasShared bit which
+          must be set true if any ShR/ShM on the page.  Set this for
+          any transitions into ShR/ShM on the page.  Then skip page if
+          not set.
+
+      .mbHasShared bits are (effectively) cached in cache_shmem.
+      Hence that must be flushed before we can safely consult them.
+
+      Since we're modifying the backing store, we also need to
+      invalidate cache_shmem, so that subsequent memory references get
+      up to date shadow values.
+   */
+   shmem__flush_and_invalidate_scache();
+
+   stats_SMs = stats_SMs_scanned = stats_reExcls = 0;
+   HG_(initIterFM)( map_shmem );
+   while (HG_(nextIterFM)( map_shmem,
+                           (Word*)(void*)&ga, (Word*)(void*)&sm )) {
+      SecMapIter itr;
+      UInt*      w32p;
+      tl_assert(sm);
+      stats_SMs++;
+      /* Skip this SecMap if the summary bit indicates it is safe to
+         do so. */
+      if (!sm->mbHasShared)
+         continue;
+      stats_SMs_scanned++;
+      initSecMapIter( &itr );
+      while (stepSecMapIter( &w32p, &itr, sm )) {
+         Bool isM;
+         UInt wnew, wold, lset_old, tset_old, tset_new;
+         wold = *w32p;
+         if (!is_SHVAL_Sh(wold))
+            continue;
+         isM = is_SHVAL_ShM(wold);
+         lset_old = un_SHVAL_Sh_lset(wold);
+         tset_old = un_SHVAL_Sh_tset(wold);
+         /* Subst thr_q -> thr_s in the thread set.  Longwindedly, if
+            thr_q is in the set, delete it and add thr_s; else leave
+            it alone.  FIXME: is inefficient - make a special
+            substInWS method for this. */
+         tset_new 
+            = HG_(elemWS)( univ_tsets, tset_old, (Word)thr_q )
+              ? HG_(addToWS)(
+                   univ_tsets, 
+                   HG_(delFromWS)( univ_tsets, tset_old, (Word)thr_q ),
+                   (Word)thr_s 
+                )
+              : tset_old;
+
+         tl_assert(HG_(cardinalityWS)(univ_tsets, tset_new) 
+                   <= HG_(cardinalityWS)(univ_tsets, tset_old));
+
+         if (0) {
+            VG_(printf)("smga %p: old 0x%x new 0x%x   ",
+                        ga, tset_old, tset_new);
+            HG_(ppWS)( univ_tsets, tset_old );
+            VG_(printf)("  -->  ");
+            HG_(ppWS)( univ_tsets, tset_new );
+            VG_(printf)("\n");
+         }
+         if (HG_(isSingletonWS)( univ_tsets, tset_new, (Word)thr_s )) {
+            /* This word returns to Excl state */
+            wnew = mk_SHVAL_Excl(thr_s->csegid);
+            stats_reExcls++;
+         } else {
+            wnew = isM ? mk_SHVAL_ShM(tset_new, lset_old)
+                       : mk_SHVAL_ShR(tset_new, lset_old);
+         }
+         *w32p = wnew;
+      }
+   }
+   HG_(doneIterFM)( map_shmem );
+
+   if (SHOW_EXPENSIVE_STUFF)
+      VG_(printf)("evh__post_thread_join: %d SMs, "
+                  "%d scanned, %d re-Excls\n", 
+                  stats_SMs, stats_SMs_scanned, stats_reExcls);
+
+   /* This holds because, at least when using NPTL as the thread
+      library, we should be notified the low level thread exit before
+      we hear of any join event on it.  The low level exit
+      notification feeds through into evh__pre_thread_ll_exit,
+      which should clear the map_threads entry for it.  Hence we
+      expect there to be no map_threads entry at this point. */
+   tl_assert( map_threads_maybe_reverse_lookup_SLOW(thr_q)
+              == VG_INVALID_THREADID);
+
+   if (clo_sanity_flags & SCE_THREADS)
+      all__sanity_check("evh__post_thread_join-post");
+}
+
+static
+void evh__pre_mem_read ( CorePart part, ThreadId tid, Char* s, 
+                         Addr a, SizeT size) {
+   if (SHOW_EVENTS >= 2
+       || (SHOW_EVENTS >= 1 && size != 1))
+      VG_(printf)("evh__pre_mem_read(ctid=%d, \"%s\", %p, %lu)\n", 
+                  (Int)tid, s, (void*)a, size );
+   shadow_mem_read_range( map_threads_lookup(tid), a, size);
+   if (size >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__pre_mem_read-post");
+}
+
+static
+void evh__pre_mem_read_asciiz ( CorePart part, ThreadId tid,
+                                Char* s, Addr a ) {
+   Int len;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__pre_mem_asciiz(ctid=%d, \"%s\", %p)\n", 
+                  (Int)tid, s, (void*)a );
+   // FIXME: think of a less ugly hack
+   len = VG_(strlen)( (Char*) a );
+   shadow_mem_read_range( map_threads_lookup(tid), a, len+1 );
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__pre_mem_read_asciiz-post");
+}
+
+static
+void evh__pre_mem_write ( CorePart part, ThreadId tid, Char* s,
+                          Addr a, SizeT size ) {
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__pre_mem_write(ctid=%d, \"%s\", %p, %lu)\n", 
+                  (Int)tid, s, (void*)a, size );
+   shadow_mem_write_range( map_threads_lookup(tid), a, size);
+   if (size >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__pre_mem_write-post");
+}
+
+static
+void evh__new_mem_heap ( Addr a, SizeT len, Bool is_inited ) {
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__new_mem_heap(%p, %lu, inited=%d)\n", 
+                  (void*)a, len, (Int)is_inited );
+   // FIXME: this is kinda stupid
+   if (is_inited) {
+      shadow_mem_make_New(get_current_Thread(), a, len);
+   } else {
+      shadow_mem_make_New(get_current_Thread(), a, len);
+   }
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__pre_mem_read-post");
+}
+
+static
+void evh__die_mem_heap ( Addr a, SizeT len ) {
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__die_mem_heap(%p, %lu)\n", (void*)a, len );
+   shadow_mem_make_NoAccess( get_current_Thread(), a, len );
+   if (len >= SCE_BIGRANGE_T && (clo_sanity_flags & SCE_BIGRANGE))
+      all__sanity_check("evh__pre_mem_read-post");
+}
+
+// thread async exit?
+
+static VG_REGPARM(1)
+void evh__mem_help_read_1(Addr a) {
+   shadow_mem_read8( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(1)
+void evh__mem_help_read_2(Addr a) {
+   shadow_mem_read16( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(1)
+void evh__mem_help_read_4(Addr a) {
+   shadow_mem_read32( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(1)
+void evh__mem_help_read_8(Addr a) {
+   shadow_mem_read64( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(2)
+void evh__mem_help_read_N(Addr a, SizeT size) {
+   shadow_mem_read_range( get_current_Thread_in_C_C(), a, size );
+}
+
+static VG_REGPARM(1)
+void evh__mem_help_write_1(Addr a) {
+   shadow_mem_write8( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(1)
+void evh__mem_help_write_2(Addr a) {
+   shadow_mem_write16( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(1)
+void evh__mem_help_write_4(Addr a) {
+   shadow_mem_write32( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(1)
+void evh__mem_help_write_8(Addr a) {
+   shadow_mem_write64( get_current_Thread_in_C_C(), a, 0/*unused*/ );
+}
+static VG_REGPARM(2)
+void evh__mem_help_write_N(Addr a, SizeT size) {
+   shadow_mem_write_range( get_current_Thread_in_C_C(), a, size );
+}
+
+static void evh__bus_lock(void) {
+   Thread* thr;
+   if (0) VG_(printf)("evh__bus_lock()\n");
+   thr = get_current_Thread();
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+   evhH__post_thread_w_acquires_lock( thr, LK_nonRec, (Addr)&__bus_lock );
+}
+static void evh__bus_unlock(void) {
+   Thread* thr;
+   if (0) VG_(printf)("evh__bus_unlock()\n");
+   thr = get_current_Thread();
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+   evhH__pre_thread_releases_lock( thr, (Addr)&__bus_lock, False/*!isRDWR*/ );
+}
+
+
+/* -------------- events to do with mutexes -------------- */
+
+/* EXPOSITION only: by intercepting lock init events we can show the
+   user where the lock was initialised, rather than only being able to
+   show where it was first locked.  Intercepting lock initialisations
+   is not necessary for the basic operation of the race checker. */
+static
+void evh__HG_PTHREAD_MUTEX_INIT_POST( ThreadId tid, 
+                                      void* mutex, Word mbRec )
+{
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_MUTEX_INIT_POST(ctid=%d, mbRec=%ld, %p)\n", 
+                  (Int)tid, mbRec, (void*)mutex );
+   tl_assert(mbRec == 0 || mbRec == 1);
+   map_locks_lookup_or_create( mbRec ? LK_mbRec : LK_nonRec,
+                               (Addr)mutex, tid );
+   if (clo_sanity_flags & SCE_LOCKS)
+      all__sanity_check("evh__hg_PTHREAD_MUTEX_INIT_POST");
+}
+
+static
+void evh__HG_PTHREAD_MUTEX_DESTROY_PRE( ThreadId tid, void* mutex )
+{
+   Thread* thr;
+   Lock*   lk;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_MUTEX_DESTROY_PRE(ctid=%d, %p)\n", 
+                  (Int)tid, (void*)mutex );
+
+   thr = map_threads_maybe_lookup( tid );
+   /* cannot fail - Thread* must already exist */
+   tl_assert( is_sane_Thread(thr) );
+
+   lk = map_locks_maybe_lookup( (Addr)mutex );
+
+   if (lk == NULL || (lk->kind != LK_nonRec && lk->kind != LK_mbRec)) {
+      record_error_Misc( thr,
+                         "pthread_mutex_destroy with invalid argument" );
+   }
+
+   if (lk) {
+      tl_assert( is_sane_LockN(lk) );
+      tl_assert( lk->guestaddr == (Addr)mutex );
+      if (lk->heldBy) {
+         /* Basically act like we unlocked the lock */
+         record_error_Misc( thr, "pthread_mutex_destroy of a locked mutex" );
+         /* remove lock from locksets of all owning threads */
+         remove_Lock_from_locksets_of_all_owning_Threads( lk );
+         HG_(deleteBag)( lk->heldBy );
+         lk->heldBy = NULL;
+         lk->heldW = False;
+         lk->acquired_at = NULL;
+      }
+      tl_assert( !lk->heldBy );
+      tl_assert( is_sane_LockN(lk) );
+   }
+
+   if (clo_sanity_flags & SCE_LOCKS)
+      all__sanity_check("evh__hg_PTHREAD_MUTEX_DESTROY_PRE");
+}
+
+static void evh__HG_PTHREAD_MUTEX_LOCK_PRE ( ThreadId tid,
+                                             void* mutex, Word isTryLock )
+{
+   /* Just check the mutex is sane; nothing else to do. */
+   // 'mutex' may be invalid - not checked by wrapper
+   Thread* thr;
+   Lock*   lk;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_MUTEX_LOCK_PRE(ctid=%d, mutex=%p)\n", 
+                  (Int)tid, (void*)mutex );
+
+   tl_assert(isTryLock == 0 || isTryLock == 1);
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   lk = map_locks_maybe_lookup( (Addr)mutex );
+
+   if (lk && (lk->kind == LK_rdwr)) {
+      record_error_Misc( thr, "pthread_mutex_lock with a "
+                              "pthread_rwlock_t* argument " );
+   }
+
+   if ( lk 
+        && isTryLock == 0
+        && (lk->kind == LK_nonRec || lk->kind == LK_rdwr)
+        && lk->heldBy
+        && lk->heldW
+        && HG_(elemBag)( lk->heldBy, (Word)thr ) > 0 ) {
+      /* uh, it's a non-recursive lock and we already w-hold it, and
+         this is a real lock operation (not a speculative "tryLock"
+         kind of thing).  Duh.  Deadlock coming up; but at least
+         produce an error message. */
+      record_error_Misc( thr, "Attempt to re-lock a "
+                              "non-recursive lock I already hold" );
+   }
+}
+
+static void evh__HG_PTHREAD_MUTEX_LOCK_POST ( ThreadId tid, void* mutex )
+{
+   // only called if the real library call succeeded - so mutex is sane
+   Thread* thr;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_PTHREAD_MUTEX_LOCK_POST(ctid=%d, mutex=%p)\n", 
+                  (Int)tid, (void*)mutex );
+
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   evhH__post_thread_w_acquires_lock( 
+      thr, 
+      LK_mbRec, /* if not known, create new lock with this LockKind */
+      (Addr)mutex
+   );
+}
+
+static void evh__HG_PTHREAD_MUTEX_UNLOCK_PRE ( ThreadId tid, void* mutex )
+{
+   // 'mutex' may be invalid - not checked by wrapper
+   Thread* thr;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_PTHREAD_MUTEX_UNLOCK_PRE(ctid=%d, mutex=%p)\n", 
+                  (Int)tid, (void*)mutex );
+
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   evhH__pre_thread_releases_lock( thr, (Addr)mutex, False/*!isRDWR*/ );
+}
+
+static void evh__HG_PTHREAD_MUTEX_UNLOCK_POST ( ThreadId tid, void* mutex )
+{
+   // only called if the real library call succeeded - so mutex is sane
+   Thread* thr;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_MUTEX_UNLOCK_POST(ctid=%d, mutex=%p)\n", 
+                  (Int)tid, (void*)mutex );
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   // anything we should do here?
+}
+
+
+/* --------------- events to do with CVs --------------- */
+
+/* A mapping from CV to the thread segment which has most recently
+   signalled/broadcasted on it.  This makes it possible to create
+   thread segments to model happens-before events arising from CV
+   signallings/broadcasts.
+*/
+
+/* pthread_mutex_cond* -> Segment* */
+static WordFM* map_cond_to_Segment = NULL;
+
+static void map_cond_to_Segment_INIT ( void ) {
+   if (UNLIKELY(map_cond_to_Segment == NULL)) {
+      map_cond_to_Segment = HG_(newFM)( hg_zalloc, hg_free, NULL );
+      tl_assert(map_cond_to_Segment != NULL);
+   }
+}
+
+static void evh__HG_PTHREAD_COND_SIGNAL_PRE ( ThreadId tid, void* cond )
+{
+   /* 'tid' has signalled on 'cond'.  Start a new segment for this
+      thread, and make a binding from 'cond' to our old segment in the
+      mapping.  This is later used by other thread(s) which
+      successfully exit from a pthread_cond_wait on the same cv; then
+      they know what the signalling segment was, so a dependency edge
+      back to it can be constructed. */
+
+   Thread*   thr;
+   SegmentID new_segid;
+   Segment*  new_seg;
+
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_PTHREAD_COND_SIGNAL_PRE(ctid=%d, cond=%p)\n", 
+                  (Int)tid, (void*)cond );
+
+   map_cond_to_Segment_INIT();
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   // error-if: mutex is bogus
+   // error-if: mutex is not locked
+
+   if (clo_happens_before >= 2) {
+      /* create a new segment ... */
+      new_segid = 0; /* bogus */
+      new_seg   = NULL;
+      evhH__start_new_segment_for_thread( &new_segid, &new_seg, thr );
+      tl_assert( is_sane_SegmentID(new_segid) );
+      tl_assert( is_sane_Segment(new_seg) );
+      tl_assert( new_seg->thr == thr );
+      tl_assert( is_sane_Segment(new_seg->prev) );
+      tl_assert( new_seg->prev->vts );
+      new_seg->vts = tick_VTS( new_seg->thr, new_seg->prev->vts );
+
+      /* ... and add the binding. */
+      HG_(addToFM)( map_cond_to_Segment, (Word)cond,
+                                         (Word)(new_seg->prev) );
+   }
+}
+
+/* returns True if it reckons 'mutex' is valid and held by this
+   thread, else False */
+static Bool evh__HG_PTHREAD_COND_WAIT_PRE ( ThreadId tid,
+                                            void* cond, void* mutex )
+{
+   Thread* thr;
+   Lock*   lk;
+   Bool    lk_valid = True;
+
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_COND_WAIT_PRE"
+                  "(ctid=%d, cond=%p, mutex=%p)\n", 
+                  (Int)tid, (void*)cond, (void*)mutex );
+
+   map_cond_to_Segment_INIT();
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   lk = map_locks_maybe_lookup( (Addr)mutex );
+
+   /* Check for stupid mutex arguments.  There are various ways to be
+      a bozo.  Only complain once, though, even if more than one thing
+      is wrong. */
+   if (lk == NULL) {
+      lk_valid = False;
+      record_error_Misc( 
+         thr, 
+         "pthread_cond_{timed}wait called with invalid mutex" );
+   } else {
+      tl_assert( is_sane_LockN(lk) );
+      if (lk->kind == LK_rdwr) {
+         lk_valid = False;
+         record_error_Misc( 
+            thr, "pthread_cond_{timed}wait called with mutex "
+                 "of type pthread_rwlock_t*" );
+      } else
+         if (lk->heldBy == NULL) {
+         lk_valid = False;
+         record_error_Misc( 
+            thr, "pthread_cond_{timed}wait called with un-held mutex");
+      } else
+      if (lk->heldBy != NULL
+          && HG_(elemBag)( lk->heldBy, (Word)thr ) == 0) {
+         lk_valid = False;
+         record_error_Misc( 
+            thr, "pthread_cond_{timed}wait called with mutex "
+                 "held by a different thread" );
+      }
+   }
+
+   // error-if: cond is also associated with a different mutex
+
+   return lk_valid;
+}
+
+static void evh__HG_PTHREAD_COND_WAIT_POST ( ThreadId tid,
+                                             void* cond, void* mutex )
+{
+   /* A pthread_cond_wait(cond, mutex) completed successfully.  Start
+      a new segment for this thread.  Look up the signalling-segment
+      for the 'cond' in the mapping, and add a dependency edge from
+      the new segment back to it. */
+
+   Thread*   thr;
+   SegmentID new_segid;
+   Segment*  new_seg;
+   Segment*  signalling_seg;
+   Bool      found;
+
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_PTHREAD_COND_WAIT_POST"
+                  "(ctid=%d, cond=%p, mutex=%p)\n", 
+                  (Int)tid, (void*)cond, (void*)mutex );
+
+   map_cond_to_Segment_INIT();
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   // error-if: cond is also associated with a different mutex
+
+   if (clo_happens_before >= 2) {
+      /* create a new segment ... */
+      new_segid = 0; /* bogus */
+      new_seg   = NULL;
+      evhH__start_new_segment_for_thread( &new_segid, &new_seg, thr );
+      tl_assert( is_sane_SegmentID(new_segid) );
+      tl_assert( is_sane_Segment(new_seg) );
+      tl_assert( new_seg->thr == thr );
+      tl_assert( is_sane_Segment(new_seg->prev) );
+      tl_assert( new_seg->other == NULL);
+
+      /* and find out which thread signalled us; then add a dependency
+         edge back to it. */
+      signalling_seg = NULL;
+      found = HG_(lookupFM)( map_cond_to_Segment, 
+                             NULL, (Word*)(void*)&signalling_seg,
+                                   (Word)cond );
+      if (found) {
+         tl_assert(is_sane_Segment(signalling_seg));
+         tl_assert(new_seg->prev);
+         tl_assert(new_seg->prev->vts);
+         new_seg->other      = signalling_seg;
+         new_seg->other_hint = 's';
+         tl_assert(new_seg->other->vts);
+         new_seg->vts = tickL_and_joinR_VTS( 
+                           new_seg->thr, 
+                           new_seg->prev->vts,
+                           new_seg->other->vts );
+      } else {
+         /* Hmm.  How can a wait on 'cond' succeed if nobody signalled
+            it?  If this happened it would surely be a bug in the
+            threads library.  Or one of those fabled "spurious
+            wakeups". */
+         record_error_Misc( thr, "Bug in libpthread: pthread_cond_wait "
+                                 "succeeded on"
+                                 " without prior pthread_cond_post");
+         tl_assert(new_seg->prev->vts);
+         new_seg->vts = tick_VTS( new_seg->thr, new_seg->prev->vts );
+      }
+   }
+}
+
+
+/* -------------- events to do with rwlocks -------------- */
+
+/* EXPOSITION only */
+static
+void evh__HG_PTHREAD_RWLOCK_INIT_POST( ThreadId tid, void* rwl )
+{
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_RWLOCK_INIT_POST(ctid=%d, %p)\n", 
+                  (Int)tid, (void*)rwl );
+   map_locks_lookup_or_create( LK_rdwr, (Addr)rwl, tid );
+   if (clo_sanity_flags & SCE_LOCKS)
+      all__sanity_check("evh__hg_PTHREAD_RWLOCK_INIT_POST");
+}
+
+static
+void evh__HG_PTHREAD_RWLOCK_DESTROY_PRE( ThreadId tid, void* rwl )
+{
+   Thread* thr;
+   Lock*   lk;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_RWLOCK_DESTROY_PRE(ctid=%d, %p)\n", 
+                  (Int)tid, (void*)rwl );
+
+   thr = map_threads_maybe_lookup( tid );
+   /* cannot fail - Thread* must already exist */
+   tl_assert( is_sane_Thread(thr) );
+
+   lk = map_locks_maybe_lookup( (Addr)rwl );
+
+   if (lk == NULL || lk->kind != LK_rdwr) {
+      record_error_Misc( thr,
+                         "pthread_rwlock_destroy with invalid argument" );
+   }
+
+   if (lk) {
+      tl_assert( is_sane_LockN(lk) );
+      tl_assert( lk->guestaddr == (Addr)rwl );
+      if (lk->heldBy) {
+         /* Basically act like we unlocked the lock */
+         record_error_Misc( thr, "pthread_rwlock_destroy of a locked mutex" );
+         /* remove lock from locksets of all owning threads */
+         remove_Lock_from_locksets_of_all_owning_Threads( lk );
+         HG_(deleteBag)( lk->heldBy );
+         lk->heldBy = NULL;
+         lk->heldW = False;
+      }
+      tl_assert( !lk->heldBy );
+      tl_assert( is_sane_LockN(lk) );
+   }
+
+   if (clo_sanity_flags & SCE_LOCKS)
+      all__sanity_check("evh__hg_PTHREAD_RWLOCK_DESTROY_PRE");
+}
+
+static 
+void evh__HG_PTHREAD_RWLOCK_LOCK_PRE ( ThreadId tid, void* rwl, Word isW )
+{
+   /* Just check the rwl is sane; nothing else to do. */
+   // 'rwl' may be invalid - not checked by wrapper
+   Thread* thr;
+   Lock*   lk;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_RWLOCK_LOCK_PRE(ctid=%d, isW=%d, %p)\n", 
+                  (Int)tid, (Int)isW, (void*)rwl );
+
+   tl_assert(isW == 0 || isW == 1); /* assured us by wrapper */
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   lk = map_locks_maybe_lookup( (Addr)rwl );
+   if ( lk 
+        && (lk->kind == LK_nonRec || lk->kind == LK_mbRec) ) {
+      /* Wrong kind of lock.  Duh.  */
+      record_error_Misc( thr, "pthread_rwlock_{rd,rw}lock with a "
+                              "pthread_mutex_t* argument " );
+   }
+}
+
+static 
+void evh__HG_PTHREAD_RWLOCK_LOCK_POST ( ThreadId tid, void* rwl, Word isW )
+{
+   // only called if the real library call succeeded - so mutex is sane
+   Thread* thr;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_RWLOCK_LOCK_POST(ctid=%d, isW=%d, %p)\n", 
+                  (Int)tid, (Int)isW, (void*)rwl );
+
+   tl_assert(isW == 0 || isW == 1); /* assured us by wrapper */
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   (isW ? evhH__post_thread_w_acquires_lock 
+        : evhH__post_thread_r_acquires_lock)( 
+      thr, 
+      LK_rdwr, /* if not known, create new lock with this LockKind */
+      (Addr)rwl
+   );
+}
+
+static void evh__HG_PTHREAD_RWLOCK_UNLOCK_PRE ( ThreadId tid, void* rwl )
+{
+   // 'rwl' may be invalid - not checked by wrapper
+   Thread* thr;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_PTHREAD_RWLOCK_UNLOCK_PRE(ctid=%d, rwl=%p)\n", 
+                  (Int)tid, (void*)rwl );
+
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   evhH__pre_thread_releases_lock( thr, (Addr)rwl, True/*isRDWR*/ );
+}
+
+static void evh__HG_PTHREAD_RWLOCK_UNLOCK_POST ( ThreadId tid, void* rwl )
+{
+   // only called if the real library call succeeded - so mutex is sane
+   Thread* thr;
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__hg_PTHREAD_RWLOCK_UNLOCK_POST(ctid=%d, rwl=%p)\n", 
+                  (Int)tid, (void*)rwl );
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   // anything we should do here?
+}
+
+
+/* --------------- events to do with semaphores --------------- */
+
+/* This is similar but not identical the handling for condition
+   variables. */
+
+/* For each semaphore, we maintain a stack of Segments.  When a 'post'
+   operation is done on a semaphore (unlocking, essentially), a new
+   segment is created for the posting thread, and the old segment is
+   pushed on the semaphore's stack.
+
+   Later, when a (probably different) thread completes 'wait' on the
+   semaphore, we pop a Segment off the semaphore's stack (which should
+   be nonempty).  We start a new segment for the thread and make it
+   also depend on the just-popped segment.  This mechanism creates
+   dependencies between posters and waiters of the semaphore.
+
+   It may not be necessary to use a stack - perhaps a bag of Segments
+   would do.  But we do need to keep track of how many unused-up posts
+   have happened for the semaphore.
+
+   Imagine T1 and T2 both post once on a semphore S, and T3 waits
+   twice on S.  T3 cannot complete its waits without both T1 and T2
+   posting.  The above mechanism will ensure that T3 acquires
+   dependencies on both T1 and T2.
+*/
+
+/* sem_t* -> XArray* Segment* */
+static WordFM* map_sem_to_Segment_stack = NULL;
+
+static void map_sem_to_Segment_stack_INIT ( void ) {
+   if (map_sem_to_Segment_stack == NULL) {
+      map_sem_to_Segment_stack = HG_(newFM)( hg_zalloc, hg_free, NULL );
+      tl_assert(map_sem_to_Segment_stack != NULL);
+   }
+}
+
+static void push_Segment_for_sem ( void* sem, Segment* seg ) {
+   XArray* xa;
+   tl_assert(seg);
+   map_sem_to_Segment_stack_INIT();
+   if (HG_(lookupFM)( map_sem_to_Segment_stack, 
+                      NULL, (Word*)(void*)&xa, (Word)sem )) {
+      tl_assert(xa);
+      VG_(addToXA)( xa, &seg );
+   } else {
+      xa = VG_(newXA)( hg_zalloc, hg_free, sizeof(Segment*) );
+      VG_(addToXA)( xa, &seg );
+      HG_(addToFM)( map_sem_to_Segment_stack, (Word)sem, (Word)xa );
+   }
+}
+
+static Segment* mb_pop_Segment_for_sem ( void* sem ) {
+   XArray*  xa;
+   Segment* seg;
+   map_sem_to_Segment_stack_INIT();
+   if (HG_(lookupFM)( map_sem_to_Segment_stack, 
+                      NULL, (Word*)(void*)&xa, (Word)sem )) {
+      /* xa is the stack for this semaphore. */
+      Word sz = VG_(sizeXA)( xa );
+      tl_assert(sz >= 0);
+      if (sz == 0)
+         return NULL; /* odd, the stack is empty */
+      seg = *(Segment**)VG_(indexXA)( xa, sz-1 );
+      tl_assert(seg);
+      VG_(dropTailXA)( xa, 1 );
+      return seg;
+   } else {
+      /* hmm, that's odd.  No stack for this semaphore. */
+      return NULL;
+   }
+}
+
+static void evh__HG_POSIX_SEM_ZAPSTACK ( ThreadId tid, void* sem )
+{
+   Segment* seg;
+
+   /* Empty out the semaphore's segment stack.  Occurs at
+      sem_init and sem_destroy time. */
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_POSIX_SEM_ZAPSTACK(ctid=%d, sem=%p)\n", 
+                  (Int)tid, (void*)sem );
+
+   /* This is stupid, but at least it's easy. */
+   do {
+     seg = mb_pop_Segment_for_sem( sem );
+   } while (seg);
+
+   tl_assert(!seg);
+}
+
+static void evh__HG_POSIX_SEMPOST_PRE ( ThreadId tid, void* sem )
+{
+   /* 'tid' has posted on 'sem'.  Start a new segment for this thread,
+      and push the old segment on a stack of segments associated with
+      'sem'.  This is later used by other thread(s) which successfully
+      exit from a sem_wait on the same sem; then they know what the
+      posting segment was, so a dependency edge back to it can be
+      constructed. */
+
+   Thread*   thr;
+   SegmentID new_segid;
+   Segment*  new_seg;
+
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_POSIX_SEMPOST_PRE(ctid=%d, sem=%p)\n", 
+                  (Int)tid, (void*)sem );
+
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   // error-if: sem is bogus
+
+   if (clo_happens_before >= 2) {
+      /* create a new segment ... */
+      new_segid = 0; /* bogus */
+      new_seg   = NULL;
+      evhH__start_new_segment_for_thread( &new_segid, &new_seg, thr );
+      tl_assert( is_sane_SegmentID(new_segid) );
+      tl_assert( is_sane_Segment(new_seg) );
+      tl_assert( new_seg->thr == thr );
+      tl_assert( is_sane_Segment(new_seg->prev) );
+      tl_assert( new_seg->prev->vts );
+      new_seg->vts = tick_VTS( new_seg->thr, new_seg->prev->vts );
+
+      /* ... and add the binding. */
+      push_Segment_for_sem( sem, new_seg->prev );
+   }
+}
+
+static void evh__HG_POSIX_SEMWAIT_POST ( ThreadId tid, void* sem )
+{
+   /* A sem_wait(sem) completed successfully.  Start a new segment for
+      this thread.  Pop the posting-segment for the 'sem' in the
+      mapping, and add a dependency edge from the new segment back to
+      it. */
+
+   Thread*   thr;
+   SegmentID new_segid;
+   Segment*  new_seg;
+   Segment*  posting_seg;
+
+   if (SHOW_EVENTS >= 1)
+      VG_(printf)("evh__HG_POSIX_SEMWAIT_POST(ctid=%d, sem=%p)\n", 
+                  (Int)tid, (void*)sem );
+
+   thr = map_threads_maybe_lookup( tid );
+   tl_assert(thr); /* cannot fail - Thread* must already exist */
+
+   // error-if: sem is bogus
+
+   if (clo_happens_before >= 2) {
+      /* create a new segment ... */
+      new_segid = 0; /* bogus */
+      new_seg   = NULL;
+      evhH__start_new_segment_for_thread( &new_segid, &new_seg, thr );
+      tl_assert( is_sane_SegmentID(new_segid) );
+      tl_assert( is_sane_Segment(new_seg) );
+      tl_assert( new_seg->thr == thr );
+      tl_assert( is_sane_Segment(new_seg->prev) );
+      tl_assert( new_seg->other == NULL);
+
+      /* and find out which thread posted last on sem; then add a
+         dependency edge back to it. */
+      posting_seg = mb_pop_Segment_for_sem( sem );
+      if (posting_seg) {
+         tl_assert(is_sane_Segment(posting_seg));
+         tl_assert(new_seg->prev);
+         tl_assert(new_seg->prev->vts);
+         new_seg->other      = posting_seg;
+         new_seg->other_hint = 'S';
+         tl_assert(new_seg->other->vts);
+         new_seg->vts = tickL_and_joinR_VTS( 
+                           new_seg->thr, 
+                           new_seg->prev->vts,
+                           new_seg->other->vts );
+      } else {
+         /* Hmm.  How can a wait on 'sem' succeed if nobody posted to
+            it?  If this happened it would surely be a bug in the
+            threads library. */
+         record_error_Misc( thr, "Bug in libpthread: sem_wait succeeded on"
+                                 " semaphore without prior sem_post");
+         tl_assert(new_seg->prev->vts);
+         new_seg->vts = tick_VTS( new_seg->thr, new_seg->prev->vts );
+      }
+   }
+}
+
+
+/*--------------------------------------------------------------*/
+/*--- Lock acquisition order monitoring                      ---*/
+/*--------------------------------------------------------------*/
+
+/* FIXME: here are some optimisations still to do in
+          laog__pre_thread_acquires_lock.
+
+   The graph is structured so that if L1 --*--> L2 then L1 must be
+   acquired before L2.
+
+   The common case is that some thread T holds (eg) L1 L2 and L3 and
+   is repeatedly acquiring and releasing Ln, and there is no ordering
+   error in what it is doing.  Hence it repeatly:
+
+   (1) searches laog to see if Ln --*--> {L1,L2,L3}, which always 
+       produces the answer No (because there is no error).
+
+   (2) adds edges {L1,L2,L3} --> Ln to laog, which are already present
+       (because they already got added the first time T acquired Ln).
+
+   Hence cache these two events:
+
+   (1) Cache result of the query from last time.  Invalidate the cache
+       any time any edges are added to or deleted from laog.
+
+   (2) Cache these add-edge requests and ignore them if said edges
+       have already been added to laog.  Invalidate the cache any time
+       any edges are deleted from laog.
+*/
+
+typedef
+   struct {
+      WordSetID inns; /* in univ_laog */
+      WordSetID outs; /* in univ_laog */
+   }
+   LAOGLinks;
+
+/* lock order acquisition graph */
+static WordFM* laog = NULL; /* WordFM Lock* LAOGLinks* */
+
+/* EXPOSITION ONLY: for each edge in 'laog', record the two places
+   where that edge was created, so that we can show the user later if
+   we need to. */
+typedef
+   struct {
+      Addr        src_ga; /* Lock guest addresses for */
+      Addr        dst_ga; /* src/dst of the edge */
+      ExeContext* src_ec; /* And corresponding places where that */
+      ExeContext* dst_ec; /* ordering was established */
+   }
+   LAOGLinkExposition;
+
+static Word cmp_LAOGLinkExposition ( Word llx1W, Word llx2W ) {
+   /* Compare LAOGLinkExposition*s by (src_ga,dst_ga) field pair. */
+   LAOGLinkExposition* llx1 = (LAOGLinkExposition*)llx1W;
+   LAOGLinkExposition* llx2 = (LAOGLinkExposition*)llx2W;
+   if (llx1->src_ga < llx2->src_ga) return -1;
+   if (llx1->src_ga > llx2->src_ga) return  1;
+   if (llx1->dst_ga < llx2->dst_ga) return -1;
+   if (llx1->dst_ga > llx2->dst_ga) return  1;
+   return 0;
+}
+
+static WordFM* laog_exposition = NULL; /* WordFM LAOGLinkExposition* NULL */
+/* end EXPOSITION ONLY */
+
+
+static void laog__show ( Char* who ) {
+   Word i, ws_size;
+   Word* ws_words;
+   Lock* me;
+   LAOGLinks* links;
+   VG_(printf)("laog (requested by %s) {\n", who);
+   HG_(initIterFM)( laog );
+   me = NULL;
+   links = NULL;
+   while (HG_(nextIterFM)( laog, (Word*)(void*)&me,
+                                 (Word*)(void*)&links )) {
+      tl_assert(me);
+      tl_assert(links);
+      VG_(printf)("   node %p:\n", me);
+      HG_(getPayloadWS)( &ws_words, &ws_size, univ_laog, links->inns );
+      for (i = 0; i < ws_size; i++)
+         VG_(printf)("      inn %p\n", ws_words[i] );
+      HG_(getPayloadWS)( &ws_words, &ws_size, univ_laog, links->outs );
+      for (i = 0; i < ws_size; i++)
+         VG_(printf)("      out %p\n", ws_words[i] );
+      me = NULL;
+      links = NULL;
+   }
+   HG_(doneIterFM)( laog );
+   VG_(printf)("}\n");
+}
+
+__attribute__((noinline))
+static void laog__add_edge ( Lock* src, Lock* dst ) {
+   Word       keyW;
+   LAOGLinks* links;
+   Bool       presentF, presentR;
+   if (0) VG_(printf)("laog__add_edge %p %p\n", src, dst);
+
+   /* Take the opportunity to sanity check the graph.  Record in
+      presentF if there is already a src->dst mapping in this node's
+      forwards links, and presentR if there is already a src->dst
+      mapping in this node's backwards links.  They should agree!
+      Also, we need to know whether the edge was already present so as
+      to decide whether or not to update the link details mapping.  We
+      can compute presentF and presentR essentially for free, so may
+      as well do this always. */
+   presentF = presentR = False;
+
+   /* Update the out edges for src */
+   keyW  = 0;
+   links = NULL;
+   if (HG_(lookupFM)( laog, &keyW, (Word*)(void*)&links, (Word)src )) {
+      WordSetID outs_new;
+      tl_assert(links);
+      tl_assert(keyW == (Word)src);
+      outs_new = HG_(addToWS)( univ_laog, links->outs, (Word)dst );
+      presentF = outs_new == links->outs;
+      links->outs = outs_new;
+   } else {
+      links = hg_zalloc(sizeof(LAOGLinks));
+      links->inns = HG_(emptyWS)( univ_laog );
+      links->outs = HG_(singletonWS)( univ_laog, (Word)dst );
+      HG_(addToFM)( laog, (Word)src, (Word)links );
+   }
+   /* Update the in edges for dst */
+   keyW  = 0;
+   links = NULL;
+   if (HG_(lookupFM)( laog, &keyW, (Word*)(void*)&links, (Word)dst )) {
+      WordSetID inns_new;
+      tl_assert(links);
+      tl_assert(keyW == (Word)dst);
+      inns_new = HG_(addToWS)( univ_laog, links->inns, (Word)src );
+      presentR = inns_new == links->inns;
+      links->inns = inns_new;
+   } else {
+      links = hg_zalloc(sizeof(LAOGLinks));
+      links->inns = HG_(singletonWS)( univ_laog, (Word)src );
+      links->outs = HG_(emptyWS)( univ_laog );
+      HG_(addToFM)( laog, (Word)dst, (Word)links );
+   }
+
+   tl_assert( (presentF && presentR) || (!presentF && !presentR) );
+
+   if (!presentF && src->acquired_at && dst->acquired_at) {
+      LAOGLinkExposition expo;
+      /* If this edge is entering the graph, and we have acquired_at
+         information for both src and dst, record those acquisition
+         points.  Hence, if there is later a violation of this
+         ordering, we can show the user the two places in which the
+         required src-dst ordering was previously established. */
+      if (0) VG_(printf)("acquire edge %p %p\n", 
+                         src->guestaddr, dst->guestaddr);
+      expo.src_ga = src->guestaddr;
+      expo.dst_ga = dst->guestaddr;
+      expo.src_ec = NULL;
+      expo.dst_ec = NULL;
+      tl_assert(laog_exposition);
+      if (HG_(lookupFM)( laog_exposition, NULL, NULL, (Word)&expo )) {
+         /* we already have it; do nothing */
+      } else {
+         LAOGLinkExposition* expo2 = hg_zalloc(sizeof(LAOGLinkExposition));
+         expo2->src_ga = src->guestaddr;
+         expo2->dst_ga = dst->guestaddr;
+         expo2->src_ec = src->acquired_at;
+         expo2->dst_ec = dst->acquired_at;
+         HG_(addToFM)( laog_exposition, (Word)expo2, (Word)NULL );
+      }
+   }
+}
+
+__attribute__((noinline))
+static void laog__del_edge ( Lock* src, Lock* dst ) {
+   Word       keyW;
+   LAOGLinks* links;
+   if (0) VG_(printf)("laog__del_edge %p %p\n", src, dst);
+   /* Update the out edges for src */
+   keyW  = 0;
+   links = NULL;
+   if (HG_(lookupFM)( laog, &keyW, (Word*)(void*)&links, (Word)src )) {
+      tl_assert(links);
+      tl_assert(keyW == (Word)src);
+      links->outs = HG_(delFromWS)( univ_laog, links->outs, (Word)dst );
+   }
+   /* Update the in edges for dst */
+   keyW  = 0;
+   links = NULL;
+   if (HG_(lookupFM)( laog, &keyW, (Word*)(void*)&links, (Word)dst )) {
+      tl_assert(links);
+      tl_assert(keyW == (Word)dst);
+      links->inns = HG_(delFromWS)( univ_laog, links->inns, (Word)src );
+   }
+}
+
+__attribute__((noinline))
+static WordSetID /* in univ_laog */ laog__succs ( Lock* lk ) {
+   Word       keyW;
+   LAOGLinks* links;
+   keyW  = 0;
+   links = NULL;
+   if (HG_(lookupFM)( laog, &keyW, (Word*)(void*)&links, (Word)lk )) {
+      tl_assert(links);
+      tl_assert(keyW == (Word)lk);
+      return links->outs;
+   } else {
+      return HG_(emptyWS)( univ_laog );
+   }
+}
+
+__attribute__((noinline))
+static WordSetID /* in univ_laog */ laog__preds ( Lock* lk ) {
+   Word       keyW;
+   LAOGLinks* links;
+   keyW  = 0;
+   links = NULL;
+   if (HG_(lookupFM)( laog, &keyW, (Word*)(void*)&links, (Word)lk )) {
+      tl_assert(links);
+      tl_assert(keyW == (Word)lk);
+      return links->inns;
+   } else {
+      return HG_(emptyWS)( univ_laog );
+   }
+}
+
+__attribute__((noinline))
+static void laog__sanity_check ( Char* who ) {
+   Word i, ws_size;
+   Word* ws_words;
+   Lock* me;
+   LAOGLinks* links;
+   if ( !laog )
+      return; /* nothing much we can do */
+   HG_(initIterFM)( laog );
+   me = NULL;
+   links = NULL;
+   if (0) VG_(printf)("laog sanity check\n");
+   while (HG_(nextIterFM)( laog, (Word*)(void*)&me,
+                                 (Word*)(void*)&links )) {
+      tl_assert(me);
+      tl_assert(links);
+      HG_(getPayloadWS)( &ws_words, &ws_size, univ_laog, links->inns );
+      for (i = 0; i < ws_size; i++) {
+         if ( ! HG_(elemWS)( univ_laog, 
+                             laog__succs( (Lock*)ws_words[i] ), 
+                             (Word)me ))
+            goto bad;
+      }
+      HG_(getPayloadWS)( &ws_words, &ws_size, univ_laog, links->outs );
+      for (i = 0; i < ws_size; i++) {
+         if ( ! HG_(elemWS)( univ_laog, 
+                             laog__preds( (Lock*)ws_words[i] ), 
+                             (Word)me ))
+            goto bad;
+      }
+      me = NULL;
+      links = NULL;
+   }
+   HG_(doneIterFM)( laog );
+   return;
+
+  bad:
+   VG_(printf)("laog__sanity_check(%s) FAILED\n", who);
+   laog__show(who);
+   tl_assert(0);
+}
+
+/* If there is a path in laog from 'src' to any of the elements in
+   'dst', return an arbitrarily chosen element of 'dst' reachable from
+   'src'.  If no path exist from 'src' to any element in 'dst', return
+   NULL. */
+__attribute__((noinline))
+static
+Lock* laog__do_dfs_from_to ( Lock* src, WordSetID dsts /* univ_lsets */ )
+{
+   Lock*     ret;
+   Word      i, ssz;
+   XArray*   stack;   /* of Lock* */
+   WordFM*   visited; /* Lock* -> void, iow, Set(Lock*) */
+   Lock*     here;
+   WordSetID succs;
+   Word      succs_size;
+   Word*     succs_words;
+   //laog__sanity_check();
+
+   /* If the destination set is empty, we can never get there from
+      'src' :-), so don't bother to try */
+   if (HG_(isEmptyWS)( univ_lsets, dsts ))
+      return NULL;
+
+   ret     = NULL;
+   stack   = VG_(newXA)( hg_zalloc, hg_free, sizeof(Lock*) );
+   visited = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxedcmp*/ );
+
+   (void) VG_(addToXA)( stack, &src );
+
+   while (True) {
+
+      ssz = VG_(sizeXA)( stack );
+
+      if (ssz == 0) { ret = NULL; break; }
+
+      here = *(Lock**) VG_(indexXA)( stack, ssz-1 );
+      VG_(dropTailXA)( stack, 1 );
+
+      if (HG_(elemWS)( univ_lsets, dsts, (Word)here )) { ret = here; break; }
+
+      if (HG_(lookupFM)( visited, NULL, NULL, (Word)here ))
+         continue;
+
+      HG_(addToFM)( visited, (Word)here, 0 );
+
+      succs = laog__succs( here );
+      HG_(getPayloadWS)( &succs_words, &succs_size, univ_laog, succs );
+      for (i = 0; i < succs_size; i++)
+         (void) VG_(addToXA)( stack, &succs_words[i] );
+   }
+
+   HG_(deleteFM)( visited, NULL, NULL );
+   VG_(deleteXA)( stack );
+   return ret;
+}
+
+
+/* Thread 'thr' is acquiring 'lk'.  Check for inconsistent ordering
+   between 'lk' and the locks already held by 'thr' and issue a
+   complaint if so.  Also, update the ordering graph appropriately.
+*/
+__attribute__((noinline))
+static void laog__pre_thread_acquires_lock ( 
+               Thread* thr, /* NB: BEFORE lock is added */
+               Lock*   lk
+            )
+{
+   Word*    ls_words;
+   Word     ls_size, i;
+   Lock*    other;
+
+   /* It may be that 'thr' already holds 'lk' and is recursively
+      relocking in.  In this case we just ignore the call. */
+   /* NB: univ_lsets really is correct here */
+   if (HG_(elemWS)( univ_lsets, thr->locksetA, (Word)lk ))
+      return;
+
+   if (!laog)
+      laog = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxedcmp*/ );
+   if (!laog_exposition)
+      laog_exposition = HG_(newFM)( hg_zalloc, hg_free, 
+                                    cmp_LAOGLinkExposition );
+
+   /* First, the check.  Complain if there is any path in laog from lk
+      to any of the locks already held by thr, since if any such path
+      existed, it would mean that previously lk was acquired before
+      (rather than after, as we are doing here) at least one of those
+      locks.
+   */
+   other = laog__do_dfs_from_to(lk, thr->locksetA);
+   if (other) {
+      LAOGLinkExposition key, *found;
+      /* So we managed to find a path lk --*--> other in the graph,
+         which implies that 'lk' should have been acquired before
+         'other' but is in fact being acquired afterwards.  We present
+         the lk/other arguments to record_error_LockOrder in the order
+         in which they should have been acquired. */
+      /* Go look in the laog_exposition mapping, to find the allocation
+         points for this edge, so we can show the user. */
+      key.src_ga = lk->guestaddr;
+      key.dst_ga = other->guestaddr;
+      key.src_ec = NULL;
+      key.dst_ec = NULL;
+      found = NULL;
+      if (HG_(lookupFM)( laog_exposition,
+                         (Word*)(void*)&found, NULL, (Word)&key )) {
+         tl_assert(found != &key);
+         tl_assert(found->src_ga == key.src_ga);
+         tl_assert(found->dst_ga == key.dst_ga);
+         tl_assert(found->src_ec);
+         tl_assert(found->dst_ec);
+         record_error_LockOrder( thr, 
+                                 lk->guestaddr, other->guestaddr,
+                                 found->src_ec, found->dst_ec );
+      } else {
+         /* Hmm.  This can't happen (can it?) */
+         record_error_LockOrder( thr, 
+                                 lk->guestaddr,        other->guestaddr,
+                                 NULL, NULL );
+      }
+   }
+
+   /* Second, add to laog the pairs
+        (old, lk)  |  old <- locks already held by thr
+      Since both old and lk are currently held by thr, their acquired_at
+      fields must be non-NULL.
+   */
+   tl_assert(lk->acquired_at);
+   HG_(getPayloadWS)( &ls_words, &ls_size, univ_lsets, thr->locksetA );
+   for (i = 0; i < ls_size; i++) {
+      Lock* old = (Lock*)ls_words[i];
+      tl_assert(old->acquired_at);
+      laog__add_edge( old, lk );
+   }
+
+   /* Why "except_Locks" ?  We're here because a lock is being
+      acquired by a thread, and we're in an inconsistent state here.
+      See the call points in evhH__post_thread_{r,w}_acquires_lock.
+      When called in this inconsistent state, locks__sanity_check duly
+      barfs. */
+   if (clo_sanity_flags & SCE_LAOG)
+      all_except_Locks__sanity_check("laog__pre_thread_acquires_lock-post");
+}
+
+
+/* Delete from 'laog' any pair mentioning a lock in locksToDelete */
+
+__attribute__((noinline))
+static void laog__handle_one_lock_deletion ( Lock* lk )
+{
+   WordSetID preds, succs;
+   Word preds_size, succs_size, i, j;
+   Word *preds_words, *succs_words;
+
+   preds = laog__preds( lk );
+   succs = laog__succs( lk );
+
+   HG_(getPayloadWS)( &preds_words, &preds_size, univ_laog, preds );
+   for (i = 0; i < preds_size; i++)
+      laog__del_edge( (Lock*)preds_words[i], lk );
+
+   HG_(getPayloadWS)( &succs_words, &succs_size, univ_laog, succs );
+   for (j = 0; j < succs_size; j++)
+      laog__del_edge( lk, (Lock*)succs_words[j] );
+
+   for (i = 0; i < preds_size; i++) {
+      for (j = 0; j < succs_size; j++) {
+         if (preds_words[i] != succs_words[j]) {
+            /* This can pass unlocked locks to laog__add_edge, since
+               we're deleting stuff.  So their acquired_at fields may
+               be NULL. */
+            laog__add_edge( (Lock*)preds_words[i], (Lock*)succs_words[j] );
+         }
+      }
+   }
+}
+
+__attribute__((noinline))
+static void laog__handle_lock_deletions (
+               WordSetID /* in univ_laog */ locksToDelete
+            )
+{
+   Word  i, ws_size;
+   Word* ws_words;
+
+   if (!laog)
+      laog = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxedcmp*/ );
+   if (!laog_exposition)
+      laog_exposition = HG_(newFM)( hg_zalloc, hg_free, 
+                                    cmp_LAOGLinkExposition );
+
+   HG_(getPayloadWS)( &ws_words, &ws_size, univ_lsets, locksToDelete );
+   for (i = 0; i < ws_size; i++)
+      laog__handle_one_lock_deletion( (Lock*)ws_words[i] );
+
+   if (clo_sanity_flags & SCE_LAOG)
+      all__sanity_check("laog__handle_lock_deletions-post");
+}
+
+
+/*--------------------------------------------------------------*/
+/*--- Malloc/free replacements                               ---*/
+/*--------------------------------------------------------------*/
+
+typedef
+   struct {
+      void*       next;    /* required by m_hashtable */
+      Addr        payload; /* ptr to actual block    */
+      SizeT       szB;     /* size requested         */
+      ExeContext* where;   /* where it was allocated */
+      Thread*     thr;     /* allocating thread      */
+   }
+   MallocMeta;
+
+/* A hash table of MallocMetas, used to track malloc'd blocks
+   (obviously). */
+static VgHashTable hg_mallocmeta_table = NULL;
+
+
+static MallocMeta* new_MallocMeta ( void ) {
+   MallocMeta* md = hg_zalloc( sizeof(MallocMeta) );
+   tl_assert(md);
+   return md;
+}
+static void delete_MallocMeta ( MallocMeta* md ) {
+   hg_free(md);
+}
+
+
+/* Allocate a client block and set up the metadata for it. */
+
+static
+void* handle_alloc ( ThreadId tid, 
+                     SizeT szB, SizeT alignB, Bool is_zeroed )
+{
+   Addr        p;
+   MallocMeta* md;
+
+   tl_assert( ((SSizeT)szB) >= 0 );
+   p = (Addr)VG_(cli_malloc)(alignB, szB);
+   if (!p) {
+      return NULL;
+   }
+   if (is_zeroed)
+      VG_(memset)((void*)p, 0, szB);
+
+   /* Note that map_threads_lookup must succeed (cannot assert), since
+      memory can only be allocated by currently alive threads, hence
+      they must have an entry in map_threads. */
+   md = new_MallocMeta();
+   md->payload = p;
+   md->szB     = szB;
+   md->where   = VG_(record_ExeContext)( tid, 0 );
+   md->thr     = map_threads_lookup( tid );
+
+   VG_(HT_add_node)( hg_mallocmeta_table, (VgHashNode*)md );
+
+   /* Tell the lower level memory wranglers. */
+   evh__new_mem_heap( p, szB, is_zeroed );
+
+   return (void*)p;
+}
+
+/* Re the checks for less-than-zero (also in hg_cli__realloc below):
+   Cast to a signed type to catch any unexpectedly negative args.
+   We're assuming here that the size asked for is not greater than
+   2^31 bytes (for 32-bit platforms) or 2^63 bytes (for 64-bit
+   platforms). */
+static void* hg_cli__malloc ( ThreadId tid, SizeT n ) {
+   if (((SSizeT)n) < 0) return NULL;
+   return handle_alloc ( tid, n, VG_(clo_alignment),
+                         /*is_zeroed*/False );
+}
+static void* hg_cli____builtin_new ( ThreadId tid, SizeT n ) {
+   if (((SSizeT)n) < 0) return NULL;
+   return handle_alloc ( tid, n, VG_(clo_alignment),
+                         /*is_zeroed*/False );
+}
+static void* hg_cli____builtin_vec_new ( ThreadId tid, SizeT n ) {
+   if (((SSizeT)n) < 0) return NULL;
+   return handle_alloc ( tid, n, VG_(clo_alignment), 
+                         /*is_zeroed*/False );
+}
+static void* hg_cli__memalign ( ThreadId tid, SizeT align, SizeT n ) {
+   if (((SSizeT)n) < 0) return NULL;
+   return handle_alloc ( tid, n, align, 
+                         /*is_zeroed*/False );
+}
+static void* hg_cli__calloc ( ThreadId tid, SizeT nmemb, SizeT size1 ) {
+   if ( ((SSizeT)nmemb) < 0 || ((SSizeT)size1) < 0 ) return NULL;
+   return handle_alloc ( tid, nmemb*size1, VG_(clo_alignment),
+                         /*is_zeroed*/True );
+}
+
+
+/* Free a client block, including getting rid of the relevant
+   metadata. */
+
+static void handle_free ( ThreadId tid, void* p )
+{
+   MallocMeta *md, *old_md;
+   SizeT      szB;
+
+   /* First see if we can find the metadata for 'p'. */
+   md = (MallocMeta*) VG_(HT_lookup)( hg_mallocmeta_table, (UWord)p );
+   if (!md)
+      return; /* apparently freeing a bogus address.  Oh well. */
+
+   tl_assert(md->payload == (Addr)p);
+   szB = md->szB;
+
+   /* Nuke the metadata block */
+   old_md = (MallocMeta*)
+            VG_(HT_remove)( hg_mallocmeta_table, (UWord)p );
+   tl_assert(old_md); /* it must be present - we just found it */
+   tl_assert(old_md == md);
+   tl_assert(old_md->payload == (Addr)p);
+
+   VG_(cli_free)((void*)old_md->payload);
+   delete_MallocMeta(old_md);
+
+   /* Tell the lower level memory wranglers. */
+   evh__die_mem_heap( (Addr)p, szB );
+}
+
+static void hg_cli__free ( ThreadId tid, void* p ) {
+   handle_free(tid, p);
+}
+static void hg_cli____builtin_delete ( ThreadId tid, void* p ) {
+   handle_free(tid, p);
+}
+static void hg_cli____builtin_vec_delete ( ThreadId tid, void* p ) {
+   handle_free(tid, p);
+}
+
+
+static void* hg_cli__realloc ( ThreadId tid, void* payloadV, SizeT new_size )
+{
+   MallocMeta *md, *md_new, *md_tmp;
+   SizeT      i;
+
+   Addr payload = (Addr)payloadV;
+
+   if (((SSizeT)new_size) < 0) return NULL;
+
+   md = (MallocMeta*) VG_(HT_lookup)( hg_mallocmeta_table, (UWord)payload );
+   if (!md)
+      return NULL; /* apparently realloc-ing a bogus address.  Oh well. */
+  
+   tl_assert(md->payload == payload);
+
+   if (md->szB == new_size) {
+      /* size unchanged */
+      md->where = VG_(record_ExeContext)(tid, 0);
+      return payloadV;
+   }
+
+   if (md->szB > new_size) {
+      /* new size is smaller */
+      md->szB   = new_size;
+      md->where = VG_(record_ExeContext)(tid, 0);
+      evh__die_mem_heap( md->payload + new_size, md->szB - new_size );
+      return payloadV;
+   }
+
+   /* else */ {
+      /* new size is bigger */
+      Addr p_new = (Addr)VG_(cli_malloc)(VG_(clo_alignment), new_size);
+
+      /* First half kept and copied, second half new */
+      // FIXME: shouldn't we use a copier which implements the
+      // memory state machine?
+      shadow_mem_copy_range( payload, p_new, md->szB );
+      evh__new_mem_heap ( p_new + md->szB, new_size - md->szB,
+                           /*inited*/False );
+      /* FIXME: can anything funny happen here?  specifically, if the
+         old range contained a lock, then die_mem_heap will complain.
+         Is that the correct behaviour?  Not sure. */
+      evh__die_mem_heap( payload, md->szB );
+
+      /* Copy from old to new */
+      for (i = 0; i < md->szB; i++)
+         ((UChar*)p_new)[i] = ((UChar*)payload)[i];
+
+      /* Because the metadata hash table is index by payload address,
+         we have to get rid of the old hash table entry and make a new
+         one.  We can't just modify the existing metadata in place,
+         because then it would (almost certainly) be in the wrong hash
+         chain. */
+      md_new = new_MallocMeta();
+      *md_new = *md;
+
+      md_tmp = VG_(HT_remove)( hg_mallocmeta_table, payload );
+      tl_assert(md_tmp);
+      tl_assert(md_tmp == md);
+
+      VG_(cli_free)((void*)md->payload);
+      delete_MallocMeta(md);
+
+      /* Update fields */
+      md_new->where   = VG_(record_ExeContext)( tid, 0 );
+      md_new->szB     = new_size;
+      md_new->payload = p_new;
+      md_new->thr     = map_threads_lookup( tid );
+
+      /* and add */
+      VG_(HT_add_node)( hg_mallocmeta_table, (VgHashNode*)md_new );
+
+      return (void*)p_new;
+   }  
+}
+
+
+/*--------------------------------------------------------------*/
+/*--- Instrumentation                                        ---*/
+/*--------------------------------------------------------------*/
+
+static void instrument_mem_access ( IRSB*   bbOut, 
+                                    IRExpr* addr,
+                                    Int     szB,
+                                    Bool    isStore,
+                                    Int     hWordTy_szB )
+{
+   IRType   tyAddr   = Ity_INVALID;
+   HChar*   hName    = NULL;
+   void*    hAddr    = NULL;
+   Int      regparms = 0;
+   IRExpr** argv     = NULL;
+   IRDirty* di       = NULL;
+
+   tl_assert(isIRAtom(addr));
+   tl_assert(hWordTy_szB == 4 || hWordTy_szB == 8);
+
+   tyAddr = typeOfIRExpr( bbOut->tyenv, addr );
+   tl_assert(tyAddr == Ity_I32 || tyAddr == Ity_I64);
+
+   /* So the effective address is in 'addr' now. */
+   regparms = 1; // unless stated otherwise
+   if (isStore) {
+      switch (szB) {
+         case 1:
+            hName = "evh__mem_help_write_1";
+            hAddr = &evh__mem_help_write_1;
+            argv = mkIRExprVec_1( addr );
+            break;
+         case 2:
+            hName = "evh__mem_help_write_2";
+            hAddr = &evh__mem_help_write_2;
+            argv = mkIRExprVec_1( addr );
+            break;
+         case 4:
+            hName = "evh__mem_help_write_4";
+            hAddr = &evh__mem_help_write_4;
+            argv = mkIRExprVec_1( addr );
+            break;
+         case 8:
+            hName = "evh__mem_help_write_8";
+            hAddr = &evh__mem_help_write_8;
+            argv = mkIRExprVec_1( addr );
+            break;
+         default:
+            tl_assert(szB > 8 && szB <= 512); /* stay sane */
+            regparms = 2;
+            hName = "evh__mem_help_write_N";
+            hAddr = &evh__mem_help_write_N;
+            argv = mkIRExprVec_2( addr, mkIRExpr_HWord( szB ));
+            break;
+      }
+   } else {
+      switch (szB) {
+         case 1:
+            hName = "evh__mem_help_read_1";
+            hAddr = &evh__mem_help_read_1;
+            argv = mkIRExprVec_1( addr );
+            break;
+         case 2:
+            hName = "evh__mem_help_read_2";
+            hAddr = &evh__mem_help_read_2;
+            argv = mkIRExprVec_1( addr );
+            break;
+         case 4:
+            hName = "evh__mem_help_read_4";
+            hAddr = &evh__mem_help_read_4;
+            argv = mkIRExprVec_1( addr );
+            break;
+         case 8:
+            hName = "evh__mem_help_read_8";
+            hAddr = &evh__mem_help_read_8;
+            argv = mkIRExprVec_1( addr );
+            break;
+         default: 
+            tl_assert(szB > 8 && szB <= 512); /* stay sane */
+            regparms = 2;
+            hName = "evh__mem_help_read_N";
+            hAddr = &evh__mem_help_read_N;
+            argv = mkIRExprVec_2( addr, mkIRExpr_HWord( szB ));
+            break;
+      }
+   }
+
+   /* Add the helper. */
+   tl_assert(hName);
+   tl_assert(hAddr);
+   tl_assert(argv);
+   di = unsafeIRDirty_0_N( regparms,
+                           hName, VG_(fnptr_to_fnentry)( hAddr ),
+                           argv );
+   addStmtToIRSB( bbOut, IRStmt_Dirty(di) );
+}
+
+
+static void instrument_memory_bus_event ( IRSB* bbOut, IRMBusEvent event )
+{
+   switch (event) {
+      case Imbe_Fence:
+         break; /* not interesting */
+      case Imbe_BusLock:
+      case Imbe_BusUnlock:
+         addStmtToIRSB(
+            bbOut,
+            IRStmt_Dirty(
+               unsafeIRDirty_0_N( 
+                  0/*regparms*/, 
+                  event == Imbe_BusLock ? "evh__bus_lock"
+                                        : "evh__bus_unlock",
+                  VG_(fnptr_to_fnentry)(
+                     event == Imbe_BusLock ? &evh__bus_lock 
+                                           : &evh__bus_unlock 
+                  ),
+                  mkIRExprVec_0() 
+               )
+            )
+         );
+         break;
+      default:
+         tl_assert(0);
+   }
+}
+
+
+static
+IRSB* hg_instrument ( VgCallbackClosure* closure,
+                      IRSB* bbIn,
+                      VexGuestLayout* layout,
+                      VexGuestExtents* vge,
+                      IRType gWordTy, IRType hWordTy )
+{
+   Int   i;
+   IRSB* bbOut;
+
+   if (gWordTy != hWordTy) {
+      /* We don't currently support this case. */
+      VG_(tool_panic)("host/guest word size mismatch");
+   }
+
+   /* Set up BB */
+   bbOut           = emptyIRSB();
+   bbOut->tyenv    = deepCopyIRTypeEnv(bbIn->tyenv);
+   bbOut->next     = deepCopyIRExpr(bbIn->next);
+   bbOut->jumpkind = bbIn->jumpkind;
+
+   // Copy verbatim any IR preamble preceding the first IMark
+   i = 0;
+   while (i < bbIn->stmts_used && bbIn->stmts[i]->tag != Ist_IMark) {
+      addStmtToIRSB( bbOut, bbIn->stmts[i] );
+      i++;
+   }
+
+   for (/*use current i*/; i < bbIn->stmts_used; i++) {
+      IRStmt* st = bbIn->stmts[i];
+      tl_assert(st);
+      tl_assert(isFlatIRStmt(st));
+      switch (st->tag) {
+         case Ist_NoOp:
+         case Ist_AbiHint:
+         case Ist_Put:
+         case Ist_PutI:
+         case Ist_IMark:
+         case Ist_Exit:
+            /* None of these can contain any memory references. */
+            break;
+
+         case Ist_MBE:
+            instrument_memory_bus_event( bbOut, st->Ist.MBE.event );
+            break;
+
+         case Ist_Store:
+            instrument_mem_access( 
+               bbOut, 
+               st->Ist.Store.addr, 
+               sizeofIRType(typeOfIRExpr(bbIn->tyenv, st->Ist.Store.data)),
+               True/*isStore*/,
+               sizeofIRType(hWordTy)
+            );
+            break;
+
+         case Ist_WrTmp: {
+            IRExpr* data = st->Ist.WrTmp.data;
+            if (data->tag == Iex_Load) {
+               instrument_mem_access(
+                  bbOut,
+                  data->Iex.Load.addr,
+                  sizeofIRType(data->Iex.Load.ty),
+                  False/*!isStore*/,
+                  sizeofIRType(hWordTy)
+               );
+            }
+            break;
+         }
+
+         case Ist_Dirty: {
+            Int      dataSize;
+            IRDirty* d = st->Ist.Dirty.details;
+            if (d->mFx != Ifx_None) {
+               /* This dirty helper accesses memory.  Collect the
+                  details. */
+               tl_assert(d->mAddr != NULL);
+               tl_assert(d->mSize != 0);
+               dataSize = d->mSize;
+               if (d->mFx == Ifx_Read || d->mFx == Ifx_Modify) {
+                  instrument_mem_access( 
+                     bbOut, d->mAddr, dataSize, False/*!isStore*/,
+                     sizeofIRType(hWordTy)
+                  );
+               }
+               if (d->mFx == Ifx_Write || d->mFx == Ifx_Modify) {
+                  instrument_mem_access( 
+                     bbOut, d->mAddr, dataSize, True/*isStore*/,
+                     sizeofIRType(hWordTy)
+                  );
+               }
+            } else {
+               tl_assert(d->mAddr == NULL);
+               tl_assert(d->mSize == 0);
+            }
+            break;
+         }
+
+         default:
+            tl_assert(0);
+
+      } /* switch (st->tag) */
+
+      addStmtToIRSB( bbOut, st );
+   } /* iterate over bbIn->stmts */
+
+   return bbOut;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Client requests                                          ---*/
+/*----------------------------------------------------------------*/
+
+/* Sheesh.  Yet another goddam finite map. */
+static WordFM* map_pthread_t_to_Thread = NULL; /* pthread_t -> Thread* */
+
+static void map_pthread_t_to_Thread_INIT ( void ) {
+   if (UNLIKELY(map_pthread_t_to_Thread == NULL)) {
+      map_pthread_t_to_Thread = HG_(newFM)( hg_zalloc, hg_free, NULL );
+      tl_assert(map_pthread_t_to_Thread != NULL);
+   }
+}
+
+
+static 
+Bool hg_handle_client_request ( ThreadId tid, UWord* args, UWord* ret)
+{
+   if (!VG_IS_TOOL_USERREQ('H','G',args[0]))
+      return False;
+
+   /* Anything that gets past the above check is one of ours, so we
+      should be able to handle it. */
+
+   /* default, meaningless return value, unless otherwise set */
+   *ret = 0;
+
+   switch (args[0]) {
+
+      /* --- --- User-visible client requests --- --- */
+
+      case VG_USERREQ__HG_CLEAN_MEMORY:
+         if (0) VG_(printf)("VG_USERREQ__HG_CLEAN_MEMORY(%p,%d)\n",
+                            args[1], args[2]);
+         /* Call die_mem to (expensively) tidy up properly, if there
+            are any held locks etc in the area */
+         if (args[2] > 0) { /* length */
+            evh__die_mem(args[1], args[2]);
+            /* and then set it to New */
+            evh__new_mem(args[1], args[2]);
+         }
+         break;
+
+      /* --- --- Client requests for Helgrind's use only --- --- */
+
+      /* Some thread is telling us its pthread_t value.  Record the
+         binding between that and the associated Thread*, so we can
+         later find the Thread* again when notified of a join by the
+         thread. */
+      case _VG_USERREQ__HG_SET_MY_PTHREAD_T: {
+         Thread* my_thr = NULL;
+         if (0)
+         VG_(printf)("SET_MY_PTHREAD_T (tid %d): pthread_t = %p\n", (Int)tid,
+                     (void*)args[1]);
+         map_pthread_t_to_Thread_INIT();
+         my_thr = map_threads_maybe_lookup( tid );
+         /* This assertion should hold because the map_threads (tid to
+            Thread*) binding should have been made at the point of
+            low-level creation of this thread, which should have
+            happened prior to us getting this client request for it.
+            That's because this client request is sent from
+            client-world from the 'thread_wrapper' function, which
+            only runs once the thread has been low-level created. */
+         tl_assert(my_thr != NULL);
+         /* So now we know that (pthread_t)args[1] is associated with
+            (Thread*)my_thr.  Note that down. */
+         if (0)
+         VG_(printf)("XXXX: bind pthread_t %p to Thread* %p\n",
+                     (void*)args[1], (void*)my_thr );
+         HG_(addToFM)( map_pthread_t_to_Thread, (Word)args[1], (Word)my_thr );
+         break;
+      }
+
+      case _VG_USERREQ__HG_PTH_API_ERROR: {
+         Thread* my_thr = NULL;
+         map_pthread_t_to_Thread_INIT();
+         my_thr = map_threads_maybe_lookup( tid );
+         tl_assert(my_thr); /* See justification above in SET_MY_PTHREAD_T */
+         record_error_PthAPIerror( my_thr, (HChar*)args[1], 
+                                           (Word)args[2], (HChar*)args[3] );
+         break;
+      }
+
+      /* This thread (tid) has completed a join with the quitting
+         thread whose pthread_t is in args[1]. */
+      case _VG_USERREQ__HG_PTHREAD_JOIN_POST: {
+         Thread* thr_q = NULL; /* quitter Thread* */
+         Bool    found = False;
+         if (0)
+         VG_(printf)("NOTIFY_JOIN_COMPLETE (tid %d): quitter = %p\n", (Int)tid,
+                     (void*)args[1]);
+         map_pthread_t_to_Thread_INIT();
+         found = HG_(lookupFM)( map_pthread_t_to_Thread, 
+                                NULL, (Word*)(void*)&thr_q, (Word)args[1] );
+          /* Can this fail?  It would mean that our pthread_join
+             wrapper observed a successful join on args[1] yet that
+             thread never existed (or at least, it never lodged an
+             entry in the mapping (via SET_MY_PTHREAD_T)).  Which
+             sounds like a bug in the threads library. */
+         // FIXME: get rid of this assertion; handle properly
+         tl_assert(found);
+         if (found) {
+            if (0)
+            VG_(printf)(".................... quitter Thread* = %p\n", 
+                        thr_q);
+            evh__HG_PTHREAD_JOIN_POST( tid, thr_q );
+         }
+         break;
+      }
+
+      /* EXPOSITION only: by intercepting lock init events we can show
+         the user where the lock was initialised, rather than only
+         being able to show where it was first locked.  Intercepting
+         lock initialisations is not necessary for the basic operation
+         of the race checker. */
+      case _VG_USERREQ__HG_PTHREAD_MUTEX_INIT_POST:
+         evh__HG_PTHREAD_MUTEX_INIT_POST( tid, (void*)args[1], args[2] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_MUTEX_DESTROY_PRE:
+         evh__HG_PTHREAD_MUTEX_DESTROY_PRE( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_PRE:   // pth_mx_t*
+         evh__HG_PTHREAD_MUTEX_UNLOCK_PRE( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_MUTEX_UNLOCK_POST:  // pth_mx_t*
+         evh__HG_PTHREAD_MUTEX_UNLOCK_POST( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_PRE:     // pth_mx_t*, Word
+         evh__HG_PTHREAD_MUTEX_LOCK_PRE( tid, (void*)args[1], args[2] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_MUTEX_LOCK_POST:    // pth_mx_t*
+         evh__HG_PTHREAD_MUTEX_LOCK_POST( tid, (void*)args[1] );
+         break;
+
+      /* This thread is about to do pthread_cond_signal on the
+         pthread_cond_t* in arg[1].  Ditto pthread_cond_broadcast. */
+      case _VG_USERREQ__HG_PTHREAD_COND_SIGNAL_PRE:
+      case _VG_USERREQ__HG_PTHREAD_COND_BROADCAST_PRE:
+         evh__HG_PTHREAD_COND_SIGNAL_PRE( tid, (void*)args[1] );
+         break;
+
+      /* Entry into pthread_cond_wait, cond=arg[1], mutex=arg[2].
+         Returns a flag indicating whether or not the mutex is believed to be
+         valid for this operation. */
+      case _VG_USERREQ__HG_PTHREAD_COND_WAIT_PRE: {
+         Bool mutex_is_valid
+            = evh__HG_PTHREAD_COND_WAIT_PRE( tid, (void*)args[1], 
+                                                  (void*)args[2] );
+         *ret = mutex_is_valid ? 1 : 0;
+         break;
+      }
+
+      /* Thread successfully completed pthread_cond_wait, cond=arg[1],
+         mutex=arg[2] */
+      case _VG_USERREQ__HG_PTHREAD_COND_WAIT_POST:
+         evh__HG_PTHREAD_COND_WAIT_POST( tid,
+                                         (void*)args[1], (void*)args[2] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_RWLOCK_INIT_POST:
+         evh__HG_PTHREAD_RWLOCK_INIT_POST( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_RWLOCK_DESTROY_PRE:
+         evh__HG_PTHREAD_RWLOCK_DESTROY_PRE( tid, (void*)args[1] );
+         break;
+
+      /* rwlock=arg[1], isW=arg[2] */
+      case _VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_PRE:
+         evh__HG_PTHREAD_RWLOCK_LOCK_PRE( tid, (void*)args[1], args[2] );
+         break;
+
+      /* rwlock=arg[1], isW=arg[2] */
+      case _VG_USERREQ__HG_PTHREAD_RWLOCK_LOCK_POST:
+         evh__HG_PTHREAD_RWLOCK_LOCK_POST( tid, (void*)args[1], args[2] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_PRE:
+         evh__HG_PTHREAD_RWLOCK_UNLOCK_PRE( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_PTHREAD_RWLOCK_UNLOCK_POST:
+         evh__HG_PTHREAD_RWLOCK_UNLOCK_POST( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_POSIX_SEMPOST_PRE: /* sem_t* */
+         evh__HG_POSIX_SEMPOST_PRE( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_POSIX_SEMWAIT_POST: /* sem_t* */
+         evh__HG_POSIX_SEMWAIT_POST( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_POSIX_SEM_ZAPSTACK: /* sem_t* */
+         evh__HG_POSIX_SEM_ZAPSTACK( tid, (void*)args[1] );
+         break;
+
+      case _VG_USERREQ__HG_GET_MY_SEGMENT: { // -> Segment*
+         Thread*   thr;
+         SegmentID segid;
+         Segment*  seg;
+         thr = map_threads_maybe_lookup( tid );
+         tl_assert(thr); /* cannot fail */
+         segid = thr->csegid;
+         tl_assert(is_sane_SegmentID(segid));
+         seg = map_segments_lookup( segid );
+         tl_assert(seg);
+         *ret = (UWord)seg;
+         break;
+      }
+
+      default:
+         /* Unhandled Helgrind client request! */
+        tl_assert2(0, "unhandled Helgrind client request!");
+   }
+
+   return True;
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Error management                                         ---*/
+/*----------------------------------------------------------------*/
+
+/* maps (by value) strings to a copy of them in ARENA_TOOL */
+static UWord stats__string_table_queries = 0;
+static WordFM* string_table = NULL;
+static Word string_table_cmp ( Word s1, Word s2 ) {
+   return (Word)VG_(strcmp)( (HChar*)s1, (HChar*)s2 );
+}
+static HChar* string_table_strdup ( HChar* str ) {
+   HChar* copy = NULL;
+   stats__string_table_queries++;
+   if (!str)
+      str = "(null)";
+   if (!string_table) {
+      string_table = HG_(newFM)( hg_zalloc, hg_free, string_table_cmp );
+      tl_assert(string_table);
+   }
+   if (HG_(lookupFM)( string_table,
+                      NULL, (Word*)(void*)&copy, (Word)str )) {
+      tl_assert(copy);
+      if (0) VG_(printf)("string_table_strdup: %p -> %p\n", str, copy );
+      return copy;
+   } else {
+      copy = VG_(strdup)(str);
+      tl_assert(copy);
+      HG_(addToFM)( string_table, (Word)copy, (Word)copy );
+      return copy;
+   }
+}
+
+/* maps from Lock .unique fields to LockP*s */
+static UWord stats__ga_LockN_to_P_queries = 0;
+static WordFM* yaWFM = NULL;
+static Word lock_unique_cmp ( Word lk1W, Word lk2W )
+{
+   Lock* lk1 = (Lock*)lk1W;
+   Lock* lk2 = (Lock*)lk2W;
+   tl_assert( is_sane_LockNorP(lk1) );
+   tl_assert( is_sane_LockNorP(lk2) );
+   if (lk1->unique < lk2->unique) return -1;
+   if (lk1->unique > lk2->unique) return 1;
+   return 0;
+}
+static Lock* mk_LockP_from_LockN ( Lock* lkn )
+{
+   Lock* lkp = NULL;
+   stats__ga_LockN_to_P_queries++;
+   tl_assert( is_sane_LockN(lkn) );
+   if (!yaWFM) {
+      yaWFM = HG_(newFM)( hg_zalloc, hg_free, lock_unique_cmp );
+      tl_assert(yaWFM);
+   }
+   if (!HG_(lookupFM)( yaWFM, NULL, (Word*)(void*)&lkp, (Word)lkn)) {
+      lkp = hg_zalloc( sizeof(Lock) );
+      *lkp = *lkn;
+      lkp->admin = NULL;
+      lkp->magic = LockP_MAGIC;
+      /* Forget about the bag of lock holders - don't copy that.
+         Also, acquired_at should be NULL whenever heldBy is, and vice
+         versa. */
+      lkp->heldW  = False;
+      lkp->heldBy = NULL;
+      lkp->acquired_at = NULL;
+      HG_(addToFM)( yaWFM, (Word)lkp, (Word)lkp );
+   }
+   tl_assert( is_sane_LockP(lkp) );
+   return lkp;
+}
+
+/* Errors:
+
+      race: program counter
+            read or write
+            data size
+            previous state
+            current state
+
+      FIXME: how does state printing interact with lockset gc?
+      Are the locksets in prev/curr state always valid?
+      Ditto question for the threadsets
+          ThreadSets - probably are always valid if Threads
+          are never thrown away.
+          LockSets - could at least print the lockset elements that
+          correspond to actual locks at the time of printing.  Hmm.
+*/
+
+/* Error kinds */
+typedef
+   enum {
+      XE_Race=1101,      // race
+      XE_FreeMemLock,    // freeing memory containing a locked lock
+      XE_UnlockUnlocked, // unlocking a not-locked lock
+      XE_UnlockForeign,  // unlocking a lock held by some other thread
+      XE_UnlockBogus,    // unlocking an address not known to be a lock
+      XE_PthAPIerror,    // error from the POSIX pthreads API
+      XE_LockOrder,      // lock order error
+      XE_Misc            // misc other error (w/ string to describe it)
+   }
+   XErrorTag;
+
+/* Extra contexts for kinds */
+typedef
+   struct  {
+      XErrorTag tag;
+      union {
+         struct {
+            Addr  data_addr;
+            Int   szB;
+            Bool  isWrite;
+            UInt  new_state;
+            UInt  old_state;
+            ExeContext* mb_lastlock;
+            Thread* thr;
+         } Race;
+         struct {
+            Thread* thr;  /* doing the freeing */
+            Lock*   lock; /* lock which is locked */
+         } FreeMemLock;
+         struct {
+            Thread* thr;  /* doing the unlocking */
+            Lock*   lock; /* lock (that is already unlocked) */
+         } UnlockUnlocked;
+         struct {
+            Thread* thr;    /* doing the unlocking */
+            Thread* owner;  /* thread that actually holds the lock */
+            Lock*   lock;   /* lock (that is held by 'owner') */
+         } UnlockForeign;
+         struct {
+            Thread* thr;     /* doing the unlocking */
+            Addr    lock_ga; /* purported address of the lock */
+         } UnlockBogus;
+         struct {
+            Thread* thr; 
+            HChar*  fnname; /* persistent, in tool-arena */
+            Word    err;    /* pth error code */
+            HChar*  errstr; /* persistent, in tool-arena */
+         } PthAPIerror;
+         struct {
+            Thread*     thr;
+            Addr        before_ga; /* always locked first in prog. history */
+            Addr        after_ga;
+            ExeContext* before_ec;
+            ExeContext* after_ec;
+         } LockOrder;
+         struct {
+            Thread* thr;
+            HChar*  errstr; /* persistent, in tool-arena */
+         } Misc;
+      } XE;
+   }
+   XError;
+
+static void init_XError ( XError* xe ) {
+   VG_(memset)(xe, 0, sizeof(*xe) );
+   xe->tag = XE_Race-1; /* bogus */
+}
+
+
+/* Extensions of suppressions */
+typedef
+   enum {
+      XS_Race=1201, /* race */
+      XS_FreeMemLock,
+      XS_UnlockUnlocked,
+      XS_UnlockForeign,
+      XS_UnlockBogus,
+      XS_PthAPIerror,
+      XS_LockOrder,
+      XS_Misc
+   }
+   XSuppTag;
+
+
+/* Updates the copy with address info if necessary. */
+static UInt hg_update_extra ( Error* err )
+{
+   XError* extra = (XError*)VG_(get_error_extra)(err);
+   tl_assert(extra);
+   //if (extra != NULL && Undescribed == extra->addrinfo.akind) {
+   //   describe_addr ( VG_(get_error_address)(err), &(extra->addrinfo) );
+   //}
+   return sizeof(XError);
+}
+
+static void record_error_Race ( Thread* thr, 
+                                Addr data_addr, Bool isWrite, Int szB,
+                                UInt old_sv, UInt new_sv,
+                                ExeContext* mb_lastlock ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   init_XError(&xe);
+   xe.tag = XE_Race;
+   xe.XE.Race.data_addr   = data_addr;
+   xe.XE.Race.szB         = szB;
+   xe.XE.Race.isWrite     = isWrite;
+   xe.XE.Race.new_state   = new_sv;
+   xe.XE.Race.old_state   = old_sv;
+   xe.XE.Race.mb_lastlock = mb_lastlock;
+   xe.XE.Race.thr         = thr;
+   // FIXME: tid vs thr
+   tl_assert(isWrite == False || isWrite == True);
+   tl_assert(szB == 8 || szB == 4 || szB == 2 || szB == 1);
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_Race, data_addr, NULL, &xe );
+}
+
+static void record_error_FreeMemLock ( Thread* thr, Lock* lk ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   tl_assert( is_sane_LockN(lk) );
+   init_XError(&xe);
+   xe.tag = XE_FreeMemLock;
+   xe.XE.FreeMemLock.thr  = thr;
+   xe.XE.FreeMemLock.lock = mk_LockP_from_LockN(lk);
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_FreeMemLock, 0, NULL, &xe );
+}
+
+static void record_error_UnlockUnlocked ( Thread* thr, Lock* lk ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   tl_assert( is_sane_LockN(lk) );
+   init_XError(&xe);
+   xe.tag = XE_UnlockUnlocked;
+   xe.XE.UnlockUnlocked.thr  = thr;
+   xe.XE.UnlockUnlocked.lock = mk_LockP_from_LockN(lk);
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_UnlockUnlocked, 0, NULL, &xe );
+}
+
+static void record_error_UnlockForeign ( Thread* thr,
+                                         Thread* owner, Lock* lk ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   tl_assert( is_sane_Thread(owner) );
+   tl_assert( is_sane_LockN(lk) );
+   init_XError(&xe);
+   xe.tag = XE_UnlockForeign;
+   xe.XE.UnlockForeign.thr   = thr;
+   xe.XE.UnlockForeign.owner = owner;
+   xe.XE.UnlockForeign.lock  = mk_LockP_from_LockN(lk);
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_UnlockForeign, 0, NULL, &xe );
+}
+
+static void record_error_UnlockBogus ( Thread* thr, Addr lock_ga ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   init_XError(&xe);
+   xe.tag = XE_UnlockBogus;
+   xe.XE.UnlockBogus.thr     = thr;
+   xe.XE.UnlockBogus.lock_ga = lock_ga;
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_UnlockBogus, 0, NULL, &xe );
+}
+
+static 
+void record_error_LockOrder ( Thread* thr, Addr before_ga, Addr after_ga,
+                              ExeContext* before_ec, ExeContext* after_ec ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   init_XError(&xe);
+   xe.tag = XE_LockOrder;
+   xe.XE.LockOrder.thr       = thr;
+   xe.XE.LockOrder.before_ga = before_ga;
+   xe.XE.LockOrder.before_ec = before_ec;
+   xe.XE.LockOrder.after_ga  = after_ga;
+   xe.XE.LockOrder.after_ec  = after_ec;
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_LockOrder, 0, NULL, &xe );
+}
+
+static 
+void record_error_PthAPIerror ( Thread* thr, HChar* fnname, 
+                                Word err, HChar* errstr ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   tl_assert(fnname);
+   tl_assert(errstr);
+   init_XError(&xe);
+   xe.tag = XE_PthAPIerror;
+   xe.XE.PthAPIerror.thr    = thr;
+   xe.XE.PthAPIerror.fnname = string_table_strdup(fnname);
+   xe.XE.PthAPIerror.err    = err;
+   xe.XE.PthAPIerror.errstr = string_table_strdup(errstr);
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_PthAPIerror, 0, NULL, &xe );
+}
+
+static void record_error_Misc ( Thread* thr, HChar* errstr ) {
+   XError xe;
+   tl_assert( is_sane_Thread(thr) );
+   tl_assert(errstr);
+   init_XError(&xe);
+   xe.tag = XE_Misc;
+   xe.XE.Misc.thr    = thr;
+   xe.XE.Misc.errstr = string_table_strdup(errstr);
+   // FIXME: tid vs thr
+   VG_(maybe_record_error)( map_threads_reverse_lookup_SLOW(thr),
+                            XE_Misc, 0, NULL, &xe );
+}
+
+static Bool hg_eq_Error ( VgRes not_used, Error* e1, Error* e2 )
+{
+   XError *xe1, *xe2;
+
+   tl_assert(VG_(get_error_kind)(e1) == VG_(get_error_kind)(e2));
+
+   xe1 = (XError*)VG_(get_error_extra)(e1);
+   xe2 = (XError*)VG_(get_error_extra)(e2);
+   tl_assert(xe1);
+   tl_assert(xe2);
+
+   switch (VG_(get_error_kind)(e1)) {
+      case XE_Race:
+         return xe1->XE.Race.szB == xe2->XE.Race.szB
+                && xe1->XE.Race.isWrite == xe2->XE.Race.isWrite
+                && (clo_cmp_race_err_addrs 
+                       ? xe1->XE.Race.data_addr == xe2->XE.Race.data_addr
+                       : True);
+      case XE_FreeMemLock:
+         return xe1->XE.FreeMemLock.thr == xe2->XE.FreeMemLock.thr
+                && xe1->XE.FreeMemLock.lock == xe2->XE.FreeMemLock.lock;
+      case XE_UnlockUnlocked:
+         return xe1->XE.UnlockUnlocked.thr == xe2->XE.UnlockUnlocked.thr
+                && xe1->XE.UnlockUnlocked.lock == xe2->XE.UnlockUnlocked.lock;
+      case XE_UnlockForeign:
+         return xe1->XE.UnlockForeign.thr == xe2->XE.UnlockForeign.thr
+                && xe1->XE.UnlockForeign.owner == xe2->XE.UnlockForeign.owner
+                && xe1->XE.UnlockForeign.lock == xe2->XE.UnlockForeign.lock;
+      case XE_UnlockBogus:
+         return xe1->XE.UnlockBogus.thr == xe2->XE.UnlockBogus.thr
+                && xe1->XE.UnlockBogus.lock_ga == xe2->XE.UnlockBogus.lock_ga;
+      case XE_PthAPIerror:
+         return xe1->XE.PthAPIerror.thr == xe2->XE.PthAPIerror.thr
+                && 0==VG_(strcmp)(xe1->XE.PthAPIerror.fnname,
+                                  xe2->XE.PthAPIerror.fnname)
+                && xe1->XE.PthAPIerror.err == xe2->XE.PthAPIerror.err;
+      case XE_LockOrder:
+         return xe1->XE.LockOrder.thr == xe2->XE.LockOrder.thr;
+      case XE_Misc:
+         return xe1->XE.Misc.thr == xe2->XE.Misc.thr
+                && 0==VG_(strcmp)(xe1->XE.Misc.errstr, xe2->XE.Misc.errstr);
+      default:
+         tl_assert(0);
+   }
+
+   /*NOTREACHED*/
+   tl_assert(0);
+}
+
+/* Given a WordSetID in univ_tsets (that is, a Thread set ID), produce
+   an XArray* with the corresponding Thread*'s sorted by their
+   errmsg_index fields.  This is for printing out thread sets in
+   repeatable orders, which is important for for repeatable regression
+   testing.  The returned XArray* is dynamically allocated (of course)
+   and so must be hg_freed by the caller. */
+static Int cmp_Thread_by_errmsg_index ( void* thr1V, void* thr2V ) {
+   Thread* thr1 = *(Thread**)thr1V;
+   Thread* thr2 = *(Thread**)thr2V;
+   if (thr1->errmsg_index < thr2->errmsg_index) return -1;
+   if (thr1->errmsg_index > thr2->errmsg_index) return  1;
+   return 0;
+}
+static XArray* /* of Thread* */ get_sorted_thread_set ( WordSetID tset )
+{
+   XArray* xa;
+   Word*   ts_words;
+   Word    ts_size, i;
+   xa = VG_(newXA)( hg_zalloc, hg_free, sizeof(Thread*) );
+   tl_assert(xa);
+   HG_(getPayloadWS)( &ts_words, &ts_size, univ_tsets, tset );
+   tl_assert(ts_words);
+   tl_assert(ts_size >= 0);
+   /* This isn't a very clever scheme, but we don't expect this to be
+      called very often. */
+   for (i = 0; i < ts_size; i++) {
+      Thread* thr = (Thread*)ts_words[i];
+      tl_assert(is_sane_Thread(thr));
+      VG_(addToXA)( xa, (void*)&thr );
+   }
+   tl_assert(ts_size == VG_(sizeXA)( xa ));
+   VG_(setCmpFnXA)( xa, cmp_Thread_by_errmsg_index );
+   VG_(sortXA)( xa );
+   return xa;
+}
+
+
+/* Announce (that is, print the point-of-creation) of the threads in
+   'tset'.  Only do this once, as we only want to see these
+   announcements once each.  Also, first sort the threads by their
+   errmsg_index fields, and show only the first N_THREADS_TO_ANNOUNCE.
+   That's because we only want to bother to announce threads
+   enumerated by summarise_threadset() below, and that in turn does
+   the same: it sorts them and then only shows the first
+   N_THREADS_TO_ANNOUNCE. */
+
+static void announce_threadset ( WordSetID tset )
+{
+   const Word limit = N_THREADS_TO_ANNOUNCE;
+   Thread* thr;
+   XArray* sorted;
+   Word    ts_size, i, loopmax;
+   sorted = get_sorted_thread_set( tset );
+   ts_size = VG_(sizeXA)( sorted );
+   tl_assert(ts_size >= 0);
+   loopmax = limit < ts_size  ? limit  : ts_size; /* min(limit, ts_size) */
+   tl_assert(loopmax >= 0 && loopmax <= limit);
+   for (i = 0; i < loopmax; i++) {
+      thr = *(Thread**)VG_(indexXA)( sorted, i );
+      tl_assert(is_sane_Thread(thr));
+      tl_assert(thr->errmsg_index >= 1);
+      if (thr->announced)
+         continue;
+      if (thr->errmsg_index == 1/*FIXME: this hardwires an assumption
+                                  about the identity of the root
+                                  thread*/) {
+         tl_assert(thr->created_at == NULL);
+         VG_(message)(Vg_UserMsg, "Thread #%d is the program's root thread",
+                                  thr->errmsg_index);
+      } else {
+         tl_assert(thr->created_at != NULL);
+         VG_(message)(Vg_UserMsg, "Thread #%d was created",
+                                  thr->errmsg_index);
+         VG_(pp_ExeContext)( thr->created_at );
+      }
+      VG_(message)(Vg_UserMsg, "");
+      thr->announced = True;
+   }
+   VG_(deleteXA)( sorted );
+}
+static void announce_one_thread ( Thread* thr ) {
+   announce_threadset( HG_(singletonWS)(univ_tsets, (Word)thr ));
+}
+
+/* Generate into buf[0 .. nBuf-1] a 1-line summary of a thread set, of
+   the form "#1, #3, #77, #78, #79 and 42 others".  The first
+   N_THREADS_TO_ANNOUNCE are listed explicitly (as '#n') and the
+   leftovers lumped into the 'and n others' bit. */
+
+static void summarise_threadset ( WordSetID tset, Char* buf, UInt nBuf )
+{
+   const Word limit = N_THREADS_TO_ANNOUNCE;
+   Thread* thr;
+   XArray* sorted;
+   Word    ts_size, i, loopmax;
+   UInt    off = 0;
+   tl_assert(nBuf > 0);
+   tl_assert(nBuf >= 40 + 20*limit);
+   tl_assert(buf);
+   sorted = get_sorted_thread_set( tset );
+   ts_size = VG_(sizeXA)( sorted );
+   tl_assert(ts_size >= 0);
+   loopmax = limit < ts_size  ? limit  : ts_size; /* min(limit, ts_size) */
+   tl_assert(loopmax >= 0 && loopmax <= limit);
+   VG_(memset)(buf, 0, nBuf);
+   for (i = 0; i < loopmax; i++) {
+      thr = *(Thread**)VG_(indexXA)( sorted, i );
+      tl_assert(is_sane_Thread(thr));
+      tl_assert(thr->errmsg_index >= 1);
+      off += VG_(sprintf)(&buf[off], "#%d", (Int)thr->errmsg_index);
+      if (i < loopmax-1)
+         off += VG_(sprintf)(&buf[off], ", ");
+   }
+   if (limit < ts_size) {
+      Word others = ts_size - limit;
+      off += VG_(sprintf)(&buf[off], " and %d other%s", 
+                                     (Int)others, others > 1 ? "s" : "");
+   }
+   tl_assert(off < nBuf);
+   tl_assert(buf[nBuf-1] == 0);
+   VG_(deleteXA)( sorted );
+}
+
+static void hg_pp_Error ( Error* err )
+{
+   const Bool show_raw_states = False;
+   XError *xe = (XError*)VG_(get_error_extra)(err);
+
+   switch (VG_(get_error_kind)(err)) {
+
+   case XE_Misc: {
+      tl_assert(xe);
+      tl_assert( is_sane_Thread( xe->XE.Misc.thr ) );
+      announce_one_thread( xe->XE.Misc.thr );
+      VG_(message)(Vg_UserMsg,
+                  "Thread #%d: %s",
+                  (Int)xe->XE.Misc.thr->errmsg_index,
+                  xe->XE.Misc.errstr);
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      break;
+   }
+
+   case XE_LockOrder: {
+      tl_assert(xe);
+      tl_assert( is_sane_Thread( xe->XE.LockOrder.thr ) );
+      announce_one_thread( xe->XE.LockOrder.thr );
+      VG_(message)(Vg_UserMsg,
+                  "Thread #%d: lock order \"%p before %p\" violated",
+                  (Int)xe->XE.LockOrder.thr->errmsg_index,
+                  (void*)xe->XE.LockOrder.before_ga,
+                  (void*)xe->XE.LockOrder.after_ga);
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      if (xe->XE.LockOrder.before_ec && xe->XE.LockOrder.after_ec) {
+         VG_(message)(Vg_UserMsg,
+            "  Required order was established by acquisition of lock at %p",
+            (void*)xe->XE.LockOrder.before_ga);
+         VG_(pp_ExeContext)( xe->XE.LockOrder.before_ec );
+         VG_(message)(Vg_UserMsg,
+            "  followed by a later acquisition of lock at %p", 
+            (void*)xe->XE.LockOrder.after_ga);
+         VG_(pp_ExeContext)( xe->XE.LockOrder.after_ec );
+      }
+      break;
+   }
+
+   case XE_PthAPIerror: {
+      tl_assert(xe);
+      tl_assert( is_sane_Thread( xe->XE.PthAPIerror.thr ) );
+      announce_one_thread( xe->XE.PthAPIerror.thr );
+      VG_(message)(Vg_UserMsg,
+                  "Thread #%d's call to %s failed",
+                  (Int)xe->XE.PthAPIerror.thr->errmsg_index,
+                  xe->XE.PthAPIerror.fnname);
+      VG_(message)(Vg_UserMsg,
+                  "   with error code %ld (%s)",
+                  xe->XE.PthAPIerror.err,
+                  xe->XE.PthAPIerror.errstr);
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      break;
+   }
+
+   case XE_UnlockBogus: {
+      tl_assert(xe);
+      tl_assert( is_sane_Thread( xe->XE.UnlockBogus.thr ) );
+      announce_one_thread( xe->XE.UnlockBogus.thr );
+      VG_(message)(Vg_UserMsg,
+                   "Thread #%d unlocked an invalid lock at %p ",
+                   (Int)xe->XE.UnlockBogus.thr->errmsg_index,
+                   (void*)xe->XE.UnlockBogus.lock_ga);
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      break;
+   }
+
+   case XE_UnlockForeign: {
+      tl_assert(xe);
+      tl_assert( is_sane_LockP( xe->XE.UnlockForeign.lock ) );
+      tl_assert( is_sane_Thread( xe->XE.UnlockForeign.owner ) );
+      tl_assert( is_sane_Thread( xe->XE.UnlockForeign.thr ) );
+      announce_one_thread( xe->XE.UnlockForeign.thr );
+      announce_one_thread( xe->XE.UnlockForeign.owner );
+      VG_(message)(Vg_UserMsg,
+                   "Thread #%d unlocked lock at %p "
+                   "currently held by thread #%d",
+                   (Int)xe->XE.UnlockForeign.thr->errmsg_index,
+                   (void*)xe->XE.UnlockForeign.lock->guestaddr,
+                   (Int)xe->XE.UnlockForeign.owner->errmsg_index );
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      if (xe->XE.UnlockForeign.lock->appeared_at) {
+         VG_(message)(Vg_UserMsg,
+                      "  Lock at %p was first observed",
+                      (void*)xe->XE.UnlockForeign.lock->guestaddr);
+         VG_(pp_ExeContext)( xe->XE.UnlockForeign.lock->appeared_at );
+      }
+      break;
+   }
+
+   case XE_UnlockUnlocked: {
+      tl_assert(xe);
+      tl_assert( is_sane_LockP( xe->XE.UnlockUnlocked.lock ) );
+      tl_assert( is_sane_Thread( xe->XE.UnlockUnlocked.thr ) );
+      announce_one_thread( xe->XE.UnlockUnlocked.thr );
+      VG_(message)(Vg_UserMsg,
+                   "Thread #%d unlocked a not-locked lock at %p ",
+                   (Int)xe->XE.UnlockUnlocked.thr->errmsg_index,
+                   (void*)xe->XE.UnlockUnlocked.lock->guestaddr);
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      if (xe->XE.UnlockUnlocked.lock->appeared_at) {
+         VG_(message)(Vg_UserMsg,
+                      "  Lock at %p was first observed",
+                      (void*)xe->XE.UnlockUnlocked.lock->guestaddr);
+         VG_(pp_ExeContext)( xe->XE.UnlockUnlocked.lock->appeared_at );
+      }
+      break;
+   }
+
+   case XE_FreeMemLock: {
+      tl_assert(xe);
+      tl_assert( is_sane_LockP( xe->XE.FreeMemLock.lock ) );
+      tl_assert( is_sane_Thread( xe->XE.FreeMemLock.thr ) );
+      announce_one_thread( xe->XE.FreeMemLock.thr );
+      VG_(message)(Vg_UserMsg,
+                   "Thread #%d deallocated location %p "
+                   "containing a locked lock",
+                   (Int)xe->XE.FreeMemLock.thr->errmsg_index,
+                   (void*)xe->XE.FreeMemLock.lock->guestaddr);
+      VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+      if (xe->XE.FreeMemLock.lock->appeared_at) {
+         VG_(message)(Vg_UserMsg,
+                      "  Lock at %p was first observed",
+                      (void*)xe->XE.FreeMemLock.lock->guestaddr);
+         VG_(pp_ExeContext)( xe->XE.FreeMemLock.lock->appeared_at );
+      }
+      break;
+   }
+
+   case XE_Race: {
+      Addr      err_ga;
+      Char      old_buf[100], new_buf[100];
+      Char      old_tset_buf[140], new_tset_buf[140];
+      UInt      old_state, new_state;
+      Thread*   thr_acc;
+      HChar*    what;
+      Int       szB;
+      WordSetID tset_to_announce = HG_(emptyWS)( univ_tsets );
+
+      /* First extract some essential info */
+      tl_assert(xe);
+      old_state = xe->XE.Race.old_state;
+      new_state = xe->XE.Race.new_state;
+      thr_acc   = xe->XE.Race.thr;
+      what      = xe->XE.Race.isWrite ? "write" : "read";
+      szB       = xe->XE.Race.szB;
+      tl_assert(is_sane_Thread(thr_acc));
+      err_ga = VG_(get_error_address)(err);
+
+      /* Format the low level state print descriptions */
+      show_shadow_w32(old_buf, sizeof(old_buf), old_state);
+      show_shadow_w32(new_buf, sizeof(new_buf), new_state);
+
+      /* Now we have to 'announce' the threadset mentioned in the
+         error message, if it hasn't already been announced.
+         Unfortunately the precise threadset and error message text
+         depends on the nature of the transition involved.  So now
+         fall into a case analysis of the error state transitions. */
+
+      /* CASE of Excl -> ShM */
+      if (is_SHVAL_Excl(old_state) && is_SHVAL_ShM(new_state)) {
+         SegmentID old_segid;
+         Segment*  old_seg;
+         Thread*   old_thr; 
+         WordSetID new_tset;
+         old_segid = un_SHVAL_Excl( old_state );
+         tl_assert(is_sane_SegmentID(old_segid));
+         old_seg = map_segments_lookup( old_segid );
+         tl_assert(is_sane_Segment(old_seg));
+         tl_assert(old_seg->thr);
+         old_thr = old_seg->thr;
+         tl_assert(is_sane_Thread(old_thr));
+
+         new_tset = un_SHVAL_ShM_tset(new_state);
+         tset_to_announce = HG_(addToWS)( univ_tsets,
+                                          new_tset, (Word)old_thr );
+         announce_threadset( tset_to_announce );
+
+         VG_(message)(Vg_UserMsg,
+                      "Possible data race during %s of size %d at %p",
+                      what, szB, err_ga);
+         VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+         /* pp_AddrInfo(err_addr, &extra->addrinfo); */
+         if (show_raw_states)
+         VG_(message)(Vg_UserMsg,
+                      "  Old state 0x%08x=%s, new state 0x%08x=%s",
+                      old_state, old_buf, new_state, new_buf);
+         VG_(message)(Vg_UserMsg,
+                      "  Old state: owned exclusively by thread #%d",
+                      old_thr->errmsg_index);
+         // This should always show exactly 2 threads
+         summarise_threadset( new_tset, new_tset_buf, sizeof(new_tset_buf) );
+         VG_(message)(Vg_UserMsg,
+                      "  New state: shared-modified by threads %s",
+                      new_tset_buf );
+         VG_(message)(Vg_UserMsg,
+                      "  Reason:    this thread, #%d, holds no locks at all",
+                      thr_acc->errmsg_index);
+      }
+      else 
+      /* Case of ShR/M -> ShM */
+      if (is_SHVAL_Sh(old_state) && is_SHVAL_ShM(new_state)) {
+         WordSetID old_tset = un_SHVAL_Sh_tset(old_state);
+         WordSetID new_tset = un_SHVAL_Sh_tset(new_state);
+
+         tset_to_announce = HG_(unionWS)( univ_tsets, old_tset, new_tset );
+         announce_threadset( tset_to_announce );
+
+         VG_(message)(Vg_UserMsg,
+                      "Possible data race during %s of size %d at %p",
+                      what, szB, err_ga);
+         VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+         /* pp_AddrInfo(err_addr, &extra->addrinfo); */
+         if (show_raw_states)
+         VG_(message)(Vg_UserMsg,
+                      "  Old state 0x%08x=%s, new state 0x%08x=%s",
+                      old_state, old_buf, new_state, new_buf);
+
+         summarise_threadset( old_tset, old_tset_buf, sizeof(old_tset_buf) );
+         summarise_threadset( new_tset, new_tset_buf, sizeof(new_tset_buf) );
+
+         VG_(message)(Vg_UserMsg,
+                      "  Old state: shared-%s by threads %s", 
+                      is_SHVAL_ShM(old_state) ? "modified" : "readonly", 
+                      old_tset_buf);
+         VG_(message)(Vg_UserMsg,
+                      "  New state: shared-modified by threads %s", 
+                      new_tset_buf);
+         VG_(message)(Vg_UserMsg,
+                      "  Reason:    this thread, #%d, holds no "
+                      "consistent locks",
+                      thr_acc->errmsg_index);
+         if (xe->XE.Race.mb_lastlock) {
+            VG_(message)(Vg_UserMsg, "  Last consistently used lock for %p was "
+                                     "first observed", err_ga);
+            VG_(pp_ExeContext)(xe->XE.Race.mb_lastlock);
+         } else {
+            VG_(message)(Vg_UserMsg, "  Location %p has never been protected "
+                                     "by any lock", err_ga);
+         }
+      }
+      /* Hmm, unknown transition.  Just print what we do know. */
+      else {
+         VG_(message)(Vg_UserMsg,
+                      "Possible data race during %s of size %d at %p",
+                      what, szB, err_ga);
+         VG_(pp_ExeContext)( VG_(get_error_where)(err) );
+
+         //pp_AddrInfo(err_addr, &extra->addrinfo);
+         VG_(message)(Vg_UserMsg,
+                      "  Old state 0x%08x=%s, new state 0x%08x=%s",
+                      old_state, old_buf, new_state, new_buf);
+      }
+
+      break; /* case XE_Race */
+   } /* case XE_Race */
+
+   default:
+      tl_assert(0);
+   } /* switch (VG_(get_error_kind)(err)) */
+}
+
+static Char* hg_get_error_name ( Error* err )
+{
+   switch (VG_(get_error_kind)(err)) {
+      case XE_Race:           return "Race";
+      case XE_FreeMemLock:    return "FreeMemLock";
+      case XE_UnlockUnlocked: return "UnlockUnlocked";
+      case XE_UnlockForeign:  return "UnlockForeign";
+      case XE_UnlockBogus:    return "UnlockBogus";
+      case XE_PthAPIerror:    return "PthAPIerror";
+      case XE_LockOrder:      return "LockOrder";
+      case XE_Misc:           return "Misc";
+      default: tl_assert(0); /* fill in missing case */
+   }
+}
+
+static Bool hg_recognised_suppression ( Char* name, Supp *su )
+{
+#  define TRY(_name,_xskind)                   \
+      if (0 == VG_(strcmp)(name, (_name))) {   \
+         VG_(set_supp_kind)(su, (_xskind));    \
+         return True;                          \
+      }
+   TRY("Race",           XS_Race);
+   TRY("FreeMemLock",    XS_FreeMemLock);
+   TRY("UnlockUnlocked", XS_UnlockUnlocked);
+   TRY("UnlockForeign",  XS_UnlockForeign);
+   TRY("UnlockBogus",    XS_UnlockBogus);
+   TRY("PthAPIerror",    XS_PthAPIerror);
+   TRY("LockOrder",      XS_LockOrder);
+   TRY("Misc",           XS_Misc);
+   return False;
+#  undef TRY
+}
+
+static Bool hg_read_extra_suppression_info ( Int fd, Char* buf, Int nBuf,
+                                             Supp* su )
+{
+   /* do nothing -- no extra suppression info present.  Return True to
+      indicate nothing bad happened. */
+   return True;
+}
+
+static Bool hg_error_matches_suppression ( Error* err, Supp* su )
+{
+   switch (VG_(get_supp_kind)(su)) {
+   case XS_Race:           return VG_(get_error_kind)(err) == XE_Race;
+   case XS_FreeMemLock:    return VG_(get_error_kind)(err) == XE_FreeMemLock;
+   case XS_UnlockUnlocked: return VG_(get_error_kind)(err) == XE_UnlockUnlocked;
+   case XS_UnlockForeign:  return VG_(get_error_kind)(err) == XE_UnlockForeign;
+   case XS_UnlockBogus:    return VG_(get_error_kind)(err) == XE_UnlockBogus;
+   case XS_PthAPIerror:    return VG_(get_error_kind)(err) == XE_PthAPIerror;
+   case XS_LockOrder:      return VG_(get_error_kind)(err) == XE_LockOrder;
+   case XS_Misc:           return VG_(get_error_kind)(err) == XE_Misc;
+   //case XS_: return VG_(get_error_kind)(err) == XE_;
+   default: tl_assert(0); /* fill in missing cases */
+   }
+}
+
+static void hg_print_extra_suppression_info ( Error* err )
+{
+   /* Do nothing */
+}
+
+
+/*----------------------------------------------------------------*/
+/*--- Setup                                                    ---*/
+/*----------------------------------------------------------------*/
+
+static Bool hg_process_cmd_line_option ( Char* arg )
+{
+   if      (VG_CLO_STREQ(arg, "--happens-before=none"))
+      clo_happens_before = 0;
+   else if (VG_CLO_STREQ(arg, "--happens-before=threads"))
+      clo_happens_before = 1;
+   else if (VG_CLO_STREQ(arg, "--happens-before=all"))
+      clo_happens_before = 2;
+
+   else if (VG_CLO_STREQ(arg, "--gen-vcg=no"))
+      clo_gen_vcg = 0;
+   else if (VG_CLO_STREQ(arg, "--gen-vcg=yes"))
+      clo_gen_vcg = 1;
+   else if (VG_CLO_STREQ(arg, "--gen-vcg=yes-w-vts"))
+      clo_gen_vcg = 2;
+
+   else if (VG_CLO_STREQ(arg, "--cmp-race-err-addrs=no"))
+      clo_cmp_race_err_addrs = False;
+   else if (VG_CLO_STREQ(arg, "--cmp-race-err-addrs=yes"))
+      clo_cmp_race_err_addrs = True;
+
+   else if (VG_CLO_STREQN(13, arg, "--trace-addr=")) {
+      clo_trace_addr = VG_(atoll16)(&arg[13]);
+      if (clo_trace_level == 0)
+         clo_trace_level = 1;
+   }
+   else VG_BNUM_CLO(arg, "--trace-level", clo_trace_level, 0, 2)
+
+   /* "stuvw" --> stuvw (binary) */
+   else if (VG_CLO_STREQN(18, arg, "--tc-sanity-flags=")) {
+      Int j;
+      char* opt = & arg[18];
+   
+      if (5 != VG_(strlen)(opt)) {
+         VG_(message)(Vg_UserMsg, 
+                      "--tc-sanity-flags argument must have 5 digits");
+         return False;
+      }
+      for (j = 0; j < 5; j++) {
+         if      ('0' == opt[j]) { /* do nothing */ }
+         else if ('1' == opt[j]) clo_sanity_flags |= (1 << (5-1-j));
+         else {
+            VG_(message)(Vg_UserMsg, "--tc-sanity-flags argument can "
+                                     "only contain 0s and 1s");
+            return False;
+         }
+      }
+      if (0) VG_(printf)("XXX sanity flags: 0x%x\n", clo_sanity_flags);
+   }
+
+   else 
+      return VG_(replacement_malloc_process_cmd_line_option)(arg);
+
+   return True;
+}
+
+static void hg_print_usage ( void )
+{
+   VG_(printf)(
+"    --happens-before=none|threads|all   [all] consider no events, thread\n"
+"      create/join, create/join/cvsignal/cvwait/semwait/post as sync points\n"
+"    --trace-addr=0xXXYYZZ     show all state changes for address 0xXXYYZZ\n"
+"    --trace-level=0|1|2       verbosity level of --trace-addr [1]\n"
+   );
+   VG_(replacement_malloc_print_usage)();
+}
+
+static void hg_print_debug_usage ( void )
+{
+   VG_(replacement_malloc_print_debug_usage)();
+   VG_(printf)("    --gen-vcg=no|yes|yes-w-vts   show happens-before graph "
+               "in .vcg format [no]\n");
+   VG_(printf)("    --cmp-race-err-addrs=no|yes  are data addresses in "
+               "race errors significant? [no]\n");
+   VG_(printf)("    --tc-sanity-flags=<XXXXX> sanity check "
+               "  at events (X = 0|1) [00000]\n");
+   VG_(printf)("    --tc-sanity-flags values:\n");
+   VG_(printf)("       10000   after changes to "
+               "lock-order-acquisition-graph\n");
+   VG_(printf)("       01000   at memory accesses (NB: not curently used)\n");
+   VG_(printf)("       00100   at mem permission setting for "
+               "ranges >= %d bytes\n", SCE_BIGRANGE_T);
+   VG_(printf)("       00010   at lock/unlock events\n");
+   VG_(printf)("       00001   at thread create/join events\n");
+}
+
+static void hg_post_clo_init ( void )
+{
+}
+
+static void hg_fini ( Int exitcode )
+{
+   if (SHOW_DATA_STRUCTURES)
+      pp_everything( PP_ALL, "SK_(fini)" );
+   if (clo_sanity_flags)
+      all__sanity_check("SK_(fini)");
+
+   if (clo_gen_vcg > 0)
+      segments__generate_vcg();
+
+   if (VG_(clo_verbosity) >= 2) {
+
+      if (1) {
+         VG_(printf)("\n");
+         HG_(ppWSUstats)( univ_tsets, "univ_tsets" );
+         VG_(printf)("\n");
+         HG_(ppWSUstats)( univ_lsets, "univ_lsets" );
+         VG_(printf)("\n");
+         HG_(ppWSUstats)( univ_laog,  "univ_laog" );
+      }
+
+      VG_(printf)("\n");
+      VG_(printf)(" hbefore: %,10lu queries\n",        stats__hbefore_queries);
+      VG_(printf)(" hbefore: %,10lu cache 0 hits\n",   stats__hbefore_cache0s);
+      VG_(printf)(" hbefore: %,10lu cache > 0 hits\n", stats__hbefore_cacheNs);
+      VG_(printf)(" hbefore: %,10lu graph searches\n", stats__hbefore_gsearches);
+      VG_(printf)(" hbefore: %,10lu   of which slow\n",
+                  stats__hbefore_gsearches - stats__hbefore_gsearchFs);
+      VG_(printf)(" hbefore: %,10lu stack high water mark\n",
+                  stats__hbefore_stk_hwm);
+      VG_(printf)(" hbefore: %,10lu cache invals\n",   stats__hbefore_invals);
+      VG_(printf)(" hbefore: %,10lu probes\n",         stats__hbefore_probes);
+
+      VG_(printf)("\n");
+      VG_(printf)("        segments: %,8lu Segment objects allocated\n", 
+                  stats__mk_Segment);
+      VG_(printf)("        locksets: %,8d unique lock sets\n",
+                  (Int)HG_(cardinalityWSU)( univ_lsets ));
+      VG_(printf)("      threadsets: %,8d unique thread sets\n",
+                  (Int)HG_(cardinalityWSU)( univ_tsets ));
+      VG_(printf)("       univ_laog: %,8d unique lock sets\n",
+                  (Int)HG_(cardinalityWSU)( univ_laog ));
+
+      VG_(printf)("L(ast)L(ock) map: %,8lu inserts (%d map size)\n", 
+                  stats__ga_LL_adds,
+                  (Int)(ga_to_lastlock ? HG_(sizeFM)( ga_to_lastlock ) : 0) );
+
+      VG_(printf)("  LockN-to-P map: %,8lu queries (%d map size)\n", 
+                  stats__ga_LockN_to_P_queries,
+                  (Int)(yaWFM ? HG_(sizeFM)( yaWFM ) : 0) );
+
+      VG_(printf)("string table map: %,8lu queries (%d map size)\n", 
+                  stats__string_table_queries,
+                  (Int)(string_table ? HG_(sizeFM)( string_table ) : 0) );
+      VG_(printf)("            LAOG: %,8d map size\n", 
+                  (Int)(laog ? HG_(sizeFM)( laog ) : 0));
+      VG_(printf)(" LAOG exposition: %,8d map size\n", 
+                  (Int)(laog_exposition ? HG_(sizeFM)( laog_exposition ) : 0));
+      VG_(printf)("           locks: %,8lu acquires, "
+                  "%,lu releases\n",
+                  stats__lockN_acquires,
+                  stats__lockN_releases
+                 );
+      VG_(printf)("   sanity checks: %,8lu\n", stats__sanity_checks);
+
+      VG_(printf)("\n");
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_Excl_nochange\n",
+                  stats__msm_read_Excl_nochange, stats__msm_write_Excl_nochange);
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_Excl_transfer\n",
+                  stats__msm_read_Excl_transfer, stats__msm_write_Excl_transfer);
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_Excl_to_ShR/ShM\n",
+                  stats__msm_read_Excl_to_ShR,   stats__msm_write_Excl_to_ShM);
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_ShR_to_ShR/ShM\n",
+                  stats__msm_read_ShR_to_ShR,    stats__msm_write_ShR_to_ShM);
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_ShM_to_ShM\n",
+                  stats__msm_read_ShM_to_ShM,    stats__msm_write_ShM_to_ShM);
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_New_to_Excl\n",
+                  stats__msm_read_New_to_Excl,   stats__msm_write_New_to_Excl);
+      VG_(printf)("     msm: %,12lu %,12lu rd/wr_NoAccess\n",
+                  stats__msm_read_NoAccess,      stats__msm_write_NoAccess);
+
+      VG_(printf)("\n");
+      VG_(printf)(" secmaps: %,10lu allocd (%,12lu g-a-range)\n",
+                  stats__secmaps_allocd,
+                  stats__secmap_ga_space_covered);
+      VG_(printf)("  linesZ: %,10lu allocd (%,12lu bytes occupied)\n",
+                  stats__secmap_linesZ_allocd,
+                  stats__secmap_linesZ_bytes);
+      VG_(printf)("  linesF: %,10lu allocd (%,12lu bytes occupied)\n",
+                  stats__secmap_linesF_allocd,
+                  stats__secmap_linesF_bytes);
+      VG_(printf)(" secmaps: %,10lu iterator steppings\n",
+                  stats__secmap_iterator_steppings);
+
+      VG_(printf)("\n");
+      VG_(printf)("   cache: %,lu totrefs (%,lu misses)\n",
+                  stats__cache_totrefs, stats__cache_totmisses );
+      VG_(printf)("   cache: %,12lu Z-fetch, %,12lu F-fetch\n",
+                  stats__cache_Z_fetches, stats__cache_F_fetches );
+      VG_(printf)("   cache: %,12lu Z-wback, %,12lu F-wback\n",
+                  stats__cache_Z_wbacks, stats__cache_F_wbacks );
+      VG_(printf)("   cache: %,12lu invals,  %,12lu flushes\n",
+                  stats__cache_invals, stats__cache_flushes );
+
+      VG_(printf)("\n");
+      VG_(printf)("   cline: %,10lu normalises\n",
+                  stats__cline_normalises );
+      VG_(printf)("   cline:  reads 8/4/2/1: %,12lu %,12lu %,12lu %,12lu\n",
+                  stats__cline_read64s,
+                  stats__cline_read32s,
+                  stats__cline_read16s,
+                  stats__cline_read8s );
+      VG_(printf)("   cline: writes 8/4/2/1: %,12lu %,12lu %,12lu %,12lu\n",
+                  stats__cline_write64s,
+                  stats__cline_write32s,
+                  stats__cline_write16s,
+                  stats__cline_write8s );
+      VG_(printf)("   cline:   sets 8/4/2/1: %,12lu %,12lu %,12lu %,12lu\n",
+                  stats__cline_set64s,
+                  stats__cline_set32s,
+                  stats__cline_set16s,
+                  stats__cline_set8s );
+      VG_(printf)("   cline: get1s %,lu, copy1s %,lu\n",
+                  stats__cline_get8s, stats__cline_copy8s );
+      VG_(printf)("   cline:    splits: 8to4 %,12lu    4to2 %,12lu    2to1 %,12lu\n",
+                 stats__cline_64to32splits,
+                 stats__cline_32to16splits,
+                 stats__cline_16to8splits );
+      VG_(printf)("   cline: pulldowns: 8to4 %,12lu    4to2 %,12lu    2to1 %,12lu\n",
+                 stats__cline_64to32pulldown,
+                 stats__cline_32to16pulldown,
+                 stats__cline_16to8pulldown );
+
+      VG_(printf)("\n");
+   }
+}
+
+static void hg_pre_clo_init ( void )
+{
+   VG_(details_name)            ("Helgrind");
+   VG_(details_version)         (NULL);
+   VG_(details_description)     ("a thread error detector");
+   VG_(details_copyright_author)(
+      "Copyright (C) 2007-2007, and GNU GPL'd, by OpenWorks LLP et al.");
+   VG_(details_bug_reports_to)  (VG_BUGS_TO);
+   VG_(details_avg_translation_sizeB) ( 200 );
+
+   VG_(basic_tool_funcs)          (hg_post_clo_init,
+                                   hg_instrument,
+                                   hg_fini);
+
+   VG_(needs_core_errors)         ();
+   VG_(needs_tool_errors)         (hg_eq_Error,
+                                   hg_pp_Error,
+                                   False,/*show TIDs for errors*/
+                                   hg_update_extra,
+                                   hg_recognised_suppression,
+                                   hg_read_extra_suppression_info,
+                                   hg_error_matches_suppression,
+                                   hg_get_error_name,
+                                   hg_print_extra_suppression_info);
+
+   VG_(needs_command_line_options)(hg_process_cmd_line_option,
+                                   hg_print_usage,
+                                   hg_print_debug_usage);
+   VG_(needs_client_requests)     (hg_handle_client_request);
+
+   // FIXME?
+   //VG_(needs_sanity_checks)       (hg_cheap_sanity_check,
+   //                                hg_expensive_sanity_check);
+
+   VG_(needs_malloc_replacement)  (hg_cli__malloc,
+                                   hg_cli____builtin_new,
+                                   hg_cli____builtin_vec_new,
+                                   hg_cli__memalign,
+                                   hg_cli__calloc,
+                                   hg_cli__free,
+                                   hg_cli____builtin_delete,
+                                   hg_cli____builtin_vec_delete,
+                                   hg_cli__realloc,
+                                   HG_CLI__MALLOC_REDZONE_SZB );
+
+   VG_(needs_data_syms)();
+
+   //VG_(needs_xml_output)          ();
+
+   VG_(track_new_mem_startup)     ( evh__new_mem_w_perms );
+   VG_(track_new_mem_stack_signal)( evh__die_mem );
+   VG_(track_new_mem_brk)         ( evh__new_mem );
+   VG_(track_new_mem_mmap)        ( evh__new_mem_w_perms );
+   VG_(track_new_mem_stack)       ( evh__new_mem );
+
+   // FIXME: surely this isn't thread-aware
+   VG_(track_copy_mem_remap)      ( shadow_mem_copy_range );
+
+   VG_(track_change_mem_mprotect) ( evh__set_perms );
+
+   VG_(track_die_mem_stack_signal)( evh__die_mem );
+   VG_(track_die_mem_brk)         ( evh__die_mem );
+   VG_(track_die_mem_munmap)      ( evh__die_mem );
+   VG_(track_die_mem_stack)       ( evh__die_mem );
+
+   // FIXME: what is this for?
+   VG_(track_ban_mem_stack)       (NULL);
+
+   VG_(track_pre_mem_read)        ( evh__pre_mem_read );
+   VG_(track_pre_mem_read_asciiz) ( evh__pre_mem_read_asciiz );
+   VG_(track_pre_mem_write)       ( evh__pre_mem_write );
+   VG_(track_post_mem_write)      (NULL);
+
+   /////////////////
+
+   VG_(track_pre_thread_ll_create)( evh__pre_thread_ll_create );
+   VG_(track_pre_thread_ll_exit)  ( evh__pre_thread_ll_exit );
+
+   VG_(track_start_client_code)( evh__start_client_code );
+   VG_(track_stop_client_code)( evh__stop_client_code );
+
+   initialise_data_structures();
+
+   /* Ensure that requirements for "dodgy C-as-C++ style inheritance"
+      as described in comments at the top of pub_tool_hashtable.h, are
+      met.  Blargh. */
+   tl_assert( sizeof(void*) == sizeof(struct _MallocMeta*) );
+   tl_assert( sizeof(UWord) == sizeof(Addr) );
+   hg_mallocmeta_table
+      = VG_(HT_construct)( "hg_malloc_metadata_table" );
+
+   /* a SecMap must contain an integral number of CacheLines */
+   tl_assert(0 == (N_SECMAP_ARANGE % N_LINE_ARANGE));
+   /* also ... a CacheLine holds an integral number of trees */
+   tl_assert(0 == (N_LINE_ARANGE % 8));
+}
+
+VG_DETERMINE_INTERFACE_VERSION(hg_pre_clo_init)
+
+/*--------------------------------------------------------------------*/
+/*--- end                                                hg_main.c ---*/
+/*--------------------------------------------------------------------*/
diff --git a/helgrind/hg_wordfm.c b/helgrind/hg_wordfm.c
new file mode 100644
index 0000000..b839a38
--- /dev/null
+++ b/helgrind/hg_wordfm.c
@@ -0,0 +1,834 @@
+
+/*--------------------------------------------------------------------*/
+/*--- An AVL tree based finite map for word keys and word values.  ---*/
+/*--- Inspired by Haskell's "FiniteMap" library.                   ---*/
+/*---                                                  hg_wordfm.c ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 Julian Seward
+      jseward@acm.org
+
+   This code is based on previous work by Nicholas Nethercote
+   (coregrind/m_oset.c) which is
+
+   Copyright (C) 2005-2007 Nicholas Nethercote
+       njn@valgrind.org
+
+   which in turn was derived partially from:
+
+      AVL C library
+      Copyright (C) 2000,2002  Daniel Nagy
+
+      This program is free software; you can redistribute it and/or
+      modify it under the terms of the GNU General Public License as
+      published by the Free Software Foundation; either version 2 of
+      the License, or (at your option) any later version.
+      [...]
+
+      (taken from libavl-0.4/debian/copyright)
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+*/
+
+#include "pub_tool_basics.h"
+#include "pub_tool_libcassert.h"
+#include "pub_tool_libcbase.h"
+
+#define HG_(str) VGAPPEND(vgHelgrind_,str)
+#include "hg_wordfm.h"
+
+//------------------------------------------------------------------//
+//---                           WordFM                           ---//
+//---                       Implementation                       ---//
+//------------------------------------------------------------------//
+
+/* One element of the AVL tree */
+typedef
+   struct _AvlNode {
+      Word key;
+      Word val;
+      struct _AvlNode* child[2]; /* [0] is left subtree, [1] is right */
+      Char balance; /* do not make this unsigned */
+   }
+   AvlNode;
+
+typedef 
+   struct {
+      Word w;
+      Bool b;
+   }
+   MaybeWord;
+
+#define WFM_STKMAX    32    // At most 2**32 entries can be iterated over
+
+struct _WordFM {
+   AvlNode* root;
+   void*    (*alloc_nofail)( SizeT );
+   void     (*dealloc)(void*);
+   Word     (*kCmp)(Word,Word);
+   AvlNode* nodeStack[WFM_STKMAX]; // Iterator node stack
+   Int      numStack[WFM_STKMAX];  // Iterator num stack
+   Int      stackTop;              // Iterator stack pointer, one past end
+}; 
+
+/* forward */
+static Bool avl_removeroot_wrk(AvlNode** t, Word(*kCmp)(Word,Word));
+
+/* Swing to the left.  Warning: no balance maintainance. */
+static void avl_swl ( AvlNode** root )
+{
+   AvlNode* a  = *root;
+   AvlNode* b  = a->child[1];
+   *root       = b;
+   a->child[1] = b->child[0];
+   b->child[0] = a;
+}
+
+/* Swing to the right.  Warning: no balance maintainance. */
+static void avl_swr ( AvlNode** root )
+{
+   AvlNode* a  = *root;
+   AvlNode* b  = a->child[0];
+   *root       = b;
+   a->child[0] = b->child[1];
+   b->child[1] = a;
+}
+
+/* Balance maintainance after especially nasty swings. */
+static void avl_nasty ( AvlNode* root )
+{
+   switch (root->balance) {
+      case -1: 
+         root->child[0]->balance = 0;
+         root->child[1]->balance = 1;
+         break;
+      case 1:
+         root->child[0]->balance = -1;
+         root->child[1]->balance = 0;
+         break;
+      case 0:
+         root->child[0]->balance = 0;
+         root->child[1]->balance = 0;
+         break;
+      default:
+         tl_assert(0);
+   }
+   root->balance=0;
+}
+
+/* Find size of a non-NULL tree. */
+static Word size_avl_nonNull ( AvlNode* nd )
+{
+   return 1 + (nd->child[0] ? size_avl_nonNull(nd->child[0]) : 0)
+            + (nd->child[1] ? size_avl_nonNull(nd->child[1]) : 0);
+}
+
+/* Insert element a into the AVL tree t.  Returns True if the depth of
+   the tree has grown.  If element with that key is already present,
+   just copy a->val to existing node, first returning old ->val field
+   of existing node in *oldV, so that the caller can finalize it
+   however it wants.
+*/
+static 
+Bool avl_insert_wrk ( AvlNode**         rootp, 
+                      /*OUT*/MaybeWord* oldV,
+                      AvlNode*          a, 
+                      Word              (*kCmp)(Word,Word) )
+{
+   Word cmpres;
+
+   /* initialize */
+   a->child[0] = 0;
+   a->child[1] = 0;
+   a->balance  = 0;
+   oldV->b     = False;
+
+   /* insert into an empty tree? */
+   if (!(*rootp)) {
+      (*rootp) = a;
+      return True;
+   }
+
+   cmpres = kCmp ? /*boxed*/   kCmp( (*rootp)->key, a->key )
+                 : /*unboxed*/ ((Word)(*rootp)->key) - ((Word)a->key);
+
+   if (cmpres > 0) {
+      /* insert into the left subtree */
+      if ((*rootp)->child[0]) {
+         AvlNode* left_subtree = (*rootp)->child[0];
+         if (avl_insert_wrk(&left_subtree, oldV, a, kCmp)) {
+            switch ((*rootp)->balance--) {
+               case  1: return False;
+               case  0: return True;
+               case -1: break;
+               default: tl_assert(0);
+            }
+            if ((*rootp)->child[0]->balance < 0) {
+               avl_swr( rootp );
+               (*rootp)->balance = 0;
+               (*rootp)->child[1]->balance = 0;
+            } else {
+               avl_swl( &((*rootp)->child[0]) );
+               avl_swr( rootp );
+               avl_nasty( *rootp );
+            }
+         } else {
+            (*rootp)->child[0] = left_subtree;
+         }
+         return False;
+      } else {
+         (*rootp)->child[0] = a;
+         if ((*rootp)->balance--) 
+            return False;
+         return True;
+      }
+      tl_assert(0);/*NOTREACHED*/
+   }
+   else 
+   if (cmpres < 0) {
+      /* insert into the right subtree */
+      if ((*rootp)->child[1]) {
+         AvlNode* right_subtree = (*rootp)->child[1];
+         if (avl_insert_wrk(&right_subtree, oldV, a, kCmp)) {
+            switch((*rootp)->balance++){
+               case -1: return False;
+               case  0: return True;
+               case  1: break;
+               default: tl_assert(0);
+            }
+            if ((*rootp)->child[1]->balance > 0) {
+               avl_swl( rootp );
+               (*rootp)->balance = 0;
+               (*rootp)->child[0]->balance = 0;
+            } else {
+               avl_swr( &((*rootp)->child[1]) );
+               avl_swl( rootp );
+               avl_nasty( *rootp );
+            }
+         } else {
+            (*rootp)->child[1] = right_subtree;
+         }
+         return False;
+      } else {
+         (*rootp)->child[1] = a;
+         if ((*rootp)->balance++) 
+            return False;
+         return True;
+      }
+      tl_assert(0);/*NOTREACHED*/
+   }
+   else {
+      /* cmpres == 0, a duplicate - replace the val, but don't
+         incorporate the node in the tree */
+      oldV->b = True;
+      oldV->w = (*rootp)->val;
+      (*rootp)->val = a->val;
+      return False;
+   }
+}
+
+/* Remove an element a from the AVL tree t.  a must be part of
+   the tree.  Returns True if the depth of the tree has shrunk. 
+*/
+static
+Bool avl_remove_wrk ( AvlNode** rootp, 
+                      AvlNode*  a, 
+                      Word(*kCmp)(Word,Word) )
+{
+   Bool ch;
+   Word cmpres;
+   cmpres = kCmp ? /*boxed*/   kCmp( (*rootp)->key, a->key )
+                 : /*unboxed*/ ((Word)(*rootp)->key) - ((Word)a->key);
+
+   if (cmpres > 0){
+      /* remove from the left subtree */
+      AvlNode* left_subtree = (*rootp)->child[0];
+      tl_assert(left_subtree);
+      ch = avl_remove_wrk(&left_subtree, a, kCmp);
+      (*rootp)->child[0]=left_subtree;
+      if (ch) {
+         switch ((*rootp)->balance++) {
+            case -1: return True;
+            case  0: return False;
+            case  1: break;
+            default: tl_assert(0);
+         }
+         switch ((*rootp)->child[1]->balance) {
+            case 0:
+               avl_swl( rootp );
+               (*rootp)->balance = -1;
+               (*rootp)->child[0]->balance = 1;
+               return False;
+            case 1: 
+               avl_swl( rootp );
+               (*rootp)->balance = 0;
+               (*rootp)->child[0]->balance = 0;
+               return True;
+            case -1:
+               break;
+            default:
+               tl_assert(0);
+         }
+         avl_swr( &((*rootp)->child[1]) );
+         avl_swl( rootp );
+         avl_nasty( *rootp );
+         return True;
+      }
+   }
+   else
+   if (cmpres < 0) {
+      /* remove from the right subtree */
+      AvlNode* right_subtree = (*rootp)->child[1];
+      tl_assert(right_subtree);
+      ch = avl_remove_wrk(&right_subtree, a, kCmp);
+      (*rootp)->child[1] = right_subtree;
+      if (ch) {
+         switch ((*rootp)->balance--) {
+            case  1: return True;
+            case  0: return False;
+            case -1: break;
+            default: tl_assert(0);
+         }
+         switch ((*rootp)->child[0]->balance) {
+            case 0:
+               avl_swr( rootp );
+               (*rootp)->balance = 1;
+               (*rootp)->child[1]->balance = -1;
+               return False;
+            case -1:
+               avl_swr( rootp );
+               (*rootp)->balance = 0;
+               (*rootp)->child[1]->balance = 0;
+               return True;
+            case 1:
+               break;
+            default:
+               tl_assert(0);
+         }
+         avl_swl( &((*rootp)->child[0]) );
+         avl_swr( rootp );
+         avl_nasty( *rootp );
+         return True;
+      }
+   }
+   else {
+      tl_assert(cmpres == 0);
+      tl_assert((*rootp)==a);
+      return avl_removeroot_wrk(rootp, kCmp);
+   }
+   return 0;
+}
+
+/* Remove the root of the AVL tree *rootp.
+ * Warning: dumps core if *rootp is empty
+ */
+static 
+Bool avl_removeroot_wrk ( AvlNode** rootp, 
+                          Word(*kCmp)(Word,Word) )
+{
+   Bool     ch;
+   AvlNode* a;
+   if (!(*rootp)->child[0]) {
+      if (!(*rootp)->child[1]) {
+         (*rootp) = 0;
+         return True;
+      }
+      (*rootp) = (*rootp)->child[1];
+      return True;
+   }
+   if (!(*rootp)->child[1]) {
+      (*rootp) = (*rootp)->child[0];
+      return True;
+   }
+   if ((*rootp)->balance < 0) {
+      /* remove from the left subtree */
+      a = (*rootp)->child[0];
+      while (a->child[1]) a = a->child[1];
+   } else {
+      /* remove from the right subtree */
+      a = (*rootp)->child[1];
+      while (a->child[0]) a = a->child[0];
+   }
+   ch = avl_remove_wrk(rootp, a, kCmp);
+   a->child[0] = (*rootp)->child[0];
+   a->child[1] = (*rootp)->child[1];
+   a->balance  = (*rootp)->balance;
+   (*rootp)    = a;
+   if(a->balance == 0) return ch;
+   return False;
+}
+
+static 
+AvlNode* avl_find_node ( AvlNode* t, Word k, Word(*kCmp)(Word,Word) )
+{
+   if (kCmp) {
+      /* Boxed comparisons */
+      Word cmpres;
+      while (True) {
+         if (t == NULL) return NULL;
+         cmpres = kCmp(t->key, k);
+         if (cmpres > 0) t = t->child[0];  else
+         if (cmpres < 0) t = t->child[1]; else
+         return t;
+      }
+   } else {
+      /* Unboxed comparisons */
+      Word  cmpres; /* signed */
+      UWord cmpresU; /* unsigned */
+      while (True) {
+         if (t == NULL) return NULL; /* unlikely ==> predictable */
+         cmpres = ((Word)t->key) - ((Word)k);
+         if (cmpres == 0) return t; /* unlikely ==> predictable */
+         cmpresU = (UWord)cmpres;
+         cmpresU >>=/*unsigned*/ (8 * sizeof(cmpres) - 1);
+         t = t->child[cmpresU];
+      }
+   }
+}
+
+// Clear the iterator stack.
+static void stackClear(WordFM* fm)
+{
+   Int i;
+   tl_assert(fm);
+   for (i = 0; i < WFM_STKMAX; i++) {
+      fm->nodeStack[i] = NULL;
+      fm->numStack[i]  = 0;
+   }
+   fm->stackTop = 0;
+}
+
+// Push onto the iterator stack.
+static inline void stackPush(WordFM* fm, AvlNode* n, Int i)
+{
+   tl_assert(fm->stackTop < WFM_STKMAX);
+   tl_assert(1 <= i && i <= 3);
+   fm->nodeStack[fm->stackTop] = n;
+   fm-> numStack[fm->stackTop] = i;
+   fm->stackTop++;
+}
+
+// Pop from the iterator stack.
+static inline Bool stackPop(WordFM* fm, AvlNode** n, Int* i)
+{
+   tl_assert(fm->stackTop <= WFM_STKMAX);
+
+   if (fm->stackTop > 0) {
+      fm->stackTop--;
+      *n = fm->nodeStack[fm->stackTop];
+      *i = fm-> numStack[fm->stackTop];
+      tl_assert(1 <= *i && *i <= 3);
+      fm->nodeStack[fm->stackTop] = NULL;
+      fm-> numStack[fm->stackTop] = 0;
+      return True;
+   } else {
+      return False;
+   }
+}
+
+static 
+AvlNode* avl_dopy ( AvlNode* nd, 
+                    Word(*dopyK)(Word), 
+                    Word(*dopyV)(Word),
+                    void*(alloc_nofail)(SizeT) )
+{
+   AvlNode* nyu;
+   if (! nd)
+      return NULL;
+   nyu = alloc_nofail(sizeof(AvlNode));
+   tl_assert(nyu);
+   
+   nyu->child[0] = nd->child[0];
+   nyu->child[1] = nd->child[1];
+   nyu->balance = nd->balance;
+
+   /* Copy key */
+   if (dopyK) {
+      nyu->key = dopyK( nd->key );
+      if (nd->key != 0 && nyu->key == 0)
+         return NULL; /* oom in key dcopy */
+   } else {
+      /* copying assumedly unboxed keys */
+      nyu->key = nd->key;
+   }
+
+   /* Copy val */
+   if (dopyV) {
+      nyu->val = dopyV( nd->val );
+      if (nd->val != 0 && nyu->val == 0)
+         return NULL; /* oom in val dcopy */
+   } else {
+      /* copying assumedly unboxed vals */
+      nyu->val = nd->val;
+   }
+
+   /* Copy subtrees */
+   if (nyu->child[0]) {
+      nyu->child[0] = avl_dopy( nyu->child[0], dopyK, dopyV, alloc_nofail );
+      if (! nyu->child[0])
+         return NULL;
+   }
+   if (nyu->child[1]) {
+      nyu->child[1] = avl_dopy( nyu->child[1], dopyK, dopyV, alloc_nofail );
+      if (! nyu->child[1])
+         return NULL;
+   }
+
+   return nyu;
+}
+
+/* Initialise a WordFM. */
+static void initFM ( WordFM* fm,
+                     void*   (*alloc_nofail)( SizeT ),
+                     void    (*dealloc)(void*),
+                     Word    (*kCmp)(Word,Word) )
+{
+   fm->root         = 0;
+   fm->kCmp         = kCmp;
+   fm->alloc_nofail = alloc_nofail;
+   fm->dealloc      = dealloc;
+   fm->stackTop     = 0;
+}
+
+/* --- Public interface functions --- */
+
+/* Allocate and Initialise a WordFM. */
+WordFM* HG_(newFM) ( void* (*alloc_nofail)( SizeT ),
+                     void  (*dealloc)(void*),
+                     Word  (*kCmp)(Word,Word) )
+{
+   WordFM* fm = alloc_nofail(sizeof(WordFM));
+   tl_assert(fm);
+   initFM(fm, alloc_nofail, dealloc, kCmp);
+   return fm;
+}
+
+static void avl_free ( AvlNode* nd, 
+                       void(*kFin)(Word),
+                       void(*vFin)(Word),
+                       void(*dealloc)(void*) )
+{
+   if (!nd)
+      return;
+   if (nd->child[0])
+      avl_free(nd->child[0], kFin, vFin, dealloc);
+   if (nd->child[1])
+      avl_free(nd->child[1], kFin, vFin, dealloc);
+   if (kFin)
+      kFin( nd->key );
+   if (vFin)
+      vFin( nd->val );
+   VG_(memset)(nd, 0, sizeof(AvlNode));
+   dealloc(nd);
+}
+
+/* Free up the FM.  If kFin is non-NULL, it is applied to keys
+   before the FM is deleted; ditto with vFin for vals. */
+void HG_(deleteFM) ( WordFM* fm, void(*kFin)(Word), void(*vFin)(Word) )
+{
+   void(*dealloc)(void*) = fm->dealloc;
+   avl_free( fm->root, kFin, vFin, dealloc );
+   VG_(memset)(fm, 0, sizeof(WordFM) );
+   dealloc(fm);
+}
+
+/* Add (k,v) to fm. */
+void HG_(addToFM) ( WordFM* fm, Word k, Word v )
+{
+   MaybeWord oldV;
+   AvlNode* node;
+   node = fm->alloc_nofail( sizeof(struct _AvlNode) );
+   node->key = k;
+   node->val = v;
+   oldV.b = False;
+   oldV.w = 0;
+   avl_insert_wrk( &fm->root, &oldV, node, fm->kCmp );
+   //if (oldV.b && fm->vFin)
+   //   fm->vFin( oldV.w );
+   if (oldV.b)
+      fm->dealloc(node);
+}
+
+// Delete key from fm, returning associated key and val if found
+Bool HG_(delFromFM) ( WordFM* fm,
+                      /*OUT*/Word* oldK, /*OUT*/Word* oldV, Word key )
+{
+   AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
+   if (node) {
+      avl_remove_wrk( &fm->root, node, fm->kCmp );
+      if (oldK)
+         *oldK = node->key;
+      if (oldV)
+         *oldV = node->val;
+      fm->dealloc(node);
+      return True;
+   } else {
+      return False;
+   }
+}
+
+// Look up in fm, assigning found key & val at spec'd addresses
+Bool HG_(lookupFM) ( WordFM* fm, 
+                     /*OUT*/Word* keyP, /*OUT*/Word* valP, Word key )
+{
+   AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
+   if (node) {
+      if (keyP)
+         *keyP = node->key;
+      if (valP)
+         *valP = node->val;
+      return True;
+   } else {
+      return False;
+   }
+}
+
+Word HG_(sizeFM) ( WordFM* fm )
+{
+   // Hmm, this is a bad way to do this
+   return fm->root ? size_avl_nonNull( fm->root ) : 0;
+}
+
+// set up FM for iteration
+void HG_(initIterFM) ( WordFM* fm )
+{
+   tl_assert(fm);
+   stackClear(fm);
+   if (fm->root)
+      stackPush(fm, fm->root, 1);
+}
+
+// get next key/val pair.  Will tl_assert if fm has been modified
+// or looked up in since initIterFM was called.
+Bool HG_(nextIterFM) ( WordFM* fm, /*OUT*/Word* pKey, /*OUT*/Word* pVal )
+{
+   Int i = 0;
+   AvlNode* n = NULL;
+   
+   tl_assert(fm);
+
+   // This in-order traversal requires each node to be pushed and popped
+   // three times.  These could be avoided by updating nodes in-situ on the
+   // top of the stack, but the push/pop cost is so small that it's worth
+   // keeping this loop in this simpler form.
+   while (stackPop(fm, &n, &i)) {
+      switch (i) {
+      case 1: case_1:
+         stackPush(fm, n, 2);
+         /* if (n->child[0])  stackPush(fm, n->child[0], 1); */
+         if (n->child[0]) { n = n->child[0]; goto case_1; }
+         break;
+      case 2: 
+         stackPush(fm, n, 3);
+         if (pKey) *pKey = n->key;
+         if (pVal) *pVal = n->val;
+         return True;
+      case 3:
+         /* if (n->child[1]) stackPush(fm, n->child[1], 1); */
+         if (n->child[1]) { n = n->child[1]; goto case_1; }
+         break;
+      default:
+         tl_assert(0);
+      }
+   }
+
+   // Stack empty, iterator is exhausted, return NULL
+   return False;
+}
+
+// clear the I'm iterating flag
+void HG_(doneIterFM) ( WordFM* fm )
+{
+}
+
+WordFM* HG_(dopyFM) ( WordFM* fm, Word(*dopyK)(Word), Word(*dopyV)(Word) )
+{
+   WordFM* nyu; 
+
+   /* can't clone the fm whilst iterating on it */
+   tl_assert(fm->stackTop == 0);
+
+   nyu = fm->alloc_nofail( sizeof(WordFM) );
+   tl_assert(nyu);
+
+   *nyu = *fm;
+
+   fm->stackTop = 0;
+   VG_(memset)(fm->nodeStack, 0, sizeof(fm->nodeStack));
+   VG_(memset)(fm->numStack, 0,  sizeof(fm->numStack));
+
+   if (nyu->root) {
+      nyu->root = avl_dopy( nyu->root, dopyK, dopyV, fm->alloc_nofail );
+      if (! nyu->root)
+         return NULL;
+   }
+
+   return nyu;
+}
+
+//------------------------------------------------------------------//
+//---                         end WordFM                         ---//
+//---                       Implementation                       ---//
+//------------------------------------------------------------------//
+
+//------------------------------------------------------------------//
+//---                WordBag (unboxed words only)                ---//
+//---                       Implementation                       ---//
+//------------------------------------------------------------------//
+
+/* A trivial container, to make it opaque. */
+struct _WordBag { 
+   WordFM* fm; 
+};
+
+WordBag* HG_(newBag) ( void* (*alloc_nofail)( SizeT ),
+                       void  (*dealloc)(void*) )
+{
+   WordBag* bag = alloc_nofail(sizeof(WordBag));
+   bag->fm = HG_(newFM)( alloc_nofail, dealloc, NULL );
+   return bag;
+}
+
+void HG_(deleteBag) ( WordBag* bag )
+{
+   void (*dealloc)(void*) = bag->fm->dealloc;
+   HG_(deleteFM)( bag->fm, NULL, NULL );
+   VG_(memset)(bag, 0, sizeof(WordBag));
+   dealloc(bag);
+}
+
+void HG_(addToBag)( WordBag* bag, Word w )
+{
+   Word key, count;
+   if (HG_(lookupFM)(bag->fm, &key, &count, w)) {
+      tl_assert(key == w);
+      tl_assert(count >= 1);
+      HG_(addToFM)(bag->fm, w, count+1);
+   } else {
+      HG_(addToFM)(bag->fm, w, 1);
+   }
+}
+
+Word HG_(elemBag) ( WordBag* bag, Word w )
+{
+   Word key, count;
+   if (HG_(lookupFM)( bag->fm, &key, &count, w)) {
+      tl_assert(key == w);
+      tl_assert(count >= 1);
+      return count;
+   } else {
+      return 0;
+   }
+}
+
+Word HG_(sizeUniqueBag) ( WordBag* bag )
+{
+   return HG_(sizeFM)( bag->fm );
+}
+
+static Word sizeTotalBag_wrk ( AvlNode* nd )
+{
+   /* unchecked pre: nd is non-NULL */
+   Word w = nd->val;
+   tl_assert(w >= 1);
+   if (nd->child[0])
+      w += sizeTotalBag_wrk(nd->child[0]);
+   if (nd->child[1])
+      w += sizeTotalBag_wrk(nd->child[1]);
+   return w;
+}
+Word HG_(sizeTotalBag)( WordBag* bag )
+{
+   if (bag->fm->root)
+      return sizeTotalBag_wrk(bag->fm->root);
+   else
+      return 0;
+}
+
+Bool HG_(delFromBag)( WordBag* bag, Word w )
+{
+   Word key, count;
+   if (HG_(lookupFM)(bag->fm, &key, &count, w)) {
+      tl_assert(key == w);
+      tl_assert(count >= 1);
+      if (count > 1) {
+         HG_(addToFM)(bag->fm, w, count-1);
+      } else {
+         tl_assert(count == 1);
+         HG_(delFromFM)( bag->fm, NULL, NULL, w );
+      }
+      return True;
+   } else {
+      return False;
+   }
+}
+
+Bool HG_(isEmptyBag)( WordBag* bag )
+{
+   return HG_(sizeFM)(bag->fm) == 0;
+}
+
+Bool HG_(isSingletonTotalBag)( WordBag* bag )
+{
+   AvlNode* nd;
+   if (HG_(sizeFM)(bag->fm) != 1)
+      return False;
+   nd = bag->fm->root;
+   tl_assert(nd);
+   tl_assert(!nd->child[0]);
+   tl_assert(!nd->child[1]);
+   return nd->val == 1;
+}
+
+Word HG_(anyElementOfBag)( WordBag* bag )
+{
+   /* Return an arbitrarily chosen element in the bag.  We might as
+      well return the one at the root of the underlying AVL tree. */
+   AvlNode* nd = bag->fm->root;
+   tl_assert(nd); /* if this fails, 'bag' is empty - caller is in error. */
+   tl_assert(nd->val >= 1);
+   return nd->key;
+}
+
+void HG_(initIterBag)( WordBag* bag )
+{
+   HG_(initIterFM)(bag->fm);
+}
+
+Bool HG_(nextIterBag)( WordBag* bag, /*OUT*/Word* pVal, /*OUT*/Word* pCount )
+{
+   return HG_(nextIterFM)( bag->fm, pVal, pCount );
+}
+
+void HG_(doneIterBag)( WordBag* bag )
+{
+   HG_(doneIterFM)( bag->fm );
+}
+
+//------------------------------------------------------------------//
+//---             end WordBag (unboxed words only)               ---//
+//---                       Implementation                       ---//
+//------------------------------------------------------------------//
+
+/*--------------------------------------------------------------------*/
+/*--- end                                              hg_wordfm.c ---*/
+/*--------------------------------------------------------------------*/
diff --git a/helgrind/hg_wordfm.h b/helgrind/hg_wordfm.h
new file mode 100644
index 0000000..cd8f542
--- /dev/null
+++ b/helgrind/hg_wordfm.h
@@ -0,0 +1,162 @@
+
+/*--------------------------------------------------------------------*/
+/*--- An AVL tree based finite map for word keys and word values.  ---*/
+/*--- Inspired by Haskell's "FiniteMap" library.                   ---*/
+/*---                                                  hg_wordfm.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 Julian Seward
+      jseward@acm.org
+
+   This code is based on previous work by Nicholas Nethercote
+   (coregrind/m_oset.c) which is
+
+   Copyright (C) 2005-2007 Nicholas Nethercote
+       njn@valgrind.org
+
+   which in turn was derived partially from:
+
+      AVL C library
+      Copyright (C) 2000,2002  Daniel Nagy
+
+      This program is free software; you can redistribute it and/or
+      modify it under the terms of the GNU General Public License as
+      published by the Free Software Foundation; either version 2 of
+      the License, or (at your option) any later version.
+      [...]
+
+      (taken from libavl-0.4/debian/copyright)
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+*/
+
+#ifndef __HG_WORDFM_H
+#define __HG_WORDFM_H
+
+//------------------------------------------------------------------//
+//---                           WordFM                           ---//
+//---                      Public interface                      ---//
+//------------------------------------------------------------------//
+
+typedef  struct _WordFM  WordFM; /* opaque */
+
+/* Allocate and initialise a WordFM */
+WordFM* HG_(newFM) ( void* (*alloc_nofail)( SizeT ),
+                     void  (*dealloc)(void*),
+                     Word  (*kCmp)(Word,Word) );
+
+/* Free up the FM.  If kFin is non-NULL, it is applied to keys
+   before the FM is deleted; ditto with vFin for vals. */
+void HG_(deleteFM) ( WordFM*, void(*kFin)(Word), void(*vFin)(Word) );
+
+/* Add (k,v) to fm.  If a binding for k already exists, it is updated
+   to map to this new v.  In that case we should really return the
+   previous v so that caller can finalise it.  Oh well. */
+void HG_(addToFM) ( WordFM* fm, Word k, Word v );
+
+// Delete key from fm, returning associated key and val if found
+Bool HG_(delFromFM) ( WordFM* fm,
+                      /*OUT*/Word* oldK, /*OUT*/Word* oldV, Word key );
+
+// Look up in fm, assigning found key & val at spec'd addresses
+Bool HG_(lookupFM) ( WordFM* fm, 
+                     /*OUT*/Word* keyP, /*OUT*/Word* valP, Word key );
+
+// How many elements are there in fm?
+Word HG_(sizeFM) ( WordFM* fm );
+
+// set up FM for iteration
+void HG_(initIterFM) ( WordFM* fm );
+
+// get next key/val pair.  Will assert if fm has been modified
+// or looked up in since initIterFM was called.
+Bool HG_(nextIterFM) ( WordFM* fm,
+                       /*OUT*/Word* pKey, /*OUT*/Word* pVal );
+
+// clear the I'm iterating flag
+void HG_(doneIterFM) ( WordFM* fm );
+
+// Deep copy a FM.  If dopyK is NULL, keys are copied verbatim.
+// If non-null, dopyK is applied to each key to generate the
+// version in the new copy.  In that case, if the argument to dopyK
+// is non-NULL but the result is NULL, it is assumed that dopyK
+// could not allocate memory, in which case the copy is abandoned
+// and NULL is returned.  Ditto with dopyV for values.
+WordFM* HG_(dopyFM) ( WordFM* fm,
+                      Word(*dopyK)(Word), Word(*dopyV)(Word) );
+
+//------------------------------------------------------------------//
+//---                         end WordFM                         ---//
+//---                      Public interface                      ---//
+//------------------------------------------------------------------//
+
+//------------------------------------------------------------------//
+//---                WordBag (unboxed words only)                ---//
+//---                      Public interface                      ---//
+//------------------------------------------------------------------//
+
+typedef  struct _WordBag  WordBag; /* opaque */
+
+/* Allocate and initialise a WordBag */
+WordBag* HG_(newBag) ( void* (*alloc_nofail)( SizeT ),
+                       void  (*dealloc)(void*) );
+
+/* Free up the Bag. */
+void HG_(deleteBag) ( WordBag* );
+
+/* Add a word. */
+void HG_(addToBag)( WordBag*, Word );
+
+/* Find out how many times the given word exists in the bag. */
+Word HG_(elemBag) ( WordBag*, Word );
+
+/* Delete a word from the bag. */
+Bool HG_(delFromBag)( WordBag*, Word );
+
+/* Is the bag empty? */
+Bool HG_(isEmptyBag)( WordBag* );
+
+/* Does the bag have exactly one element? */
+Bool HG_(isSingletonTotalBag)( WordBag* );
+
+/* Return an arbitrary element from the bag. */
+Word HG_(anyElementOfBag)( WordBag* );
+
+/* How many different / total elements are in the bag? */
+Word HG_(sizeUniqueBag)( WordBag* ); /* fast */
+Word HG_(sizeTotalBag)( WordBag* );  /* warning: slow */
+
+/* Iterating over the elements of a bag. */
+void HG_(initIterBag)( WordBag* );
+Bool HG_(nextIterBag)( WordBag*, /*OUT*/Word* pVal, /*OUT*/Word* pCount );
+void HG_(doneIterBag)( WordBag* );
+
+//------------------------------------------------------------------//
+//---             end WordBag (unboxed words only)               ---//
+//---                      Public interface                      ---//
+//------------------------------------------------------------------//
+
+#endif /* ! __HG_WORDFM_H */
+
+/*--------------------------------------------------------------------*/
+/*--- end                                              hg_wordfm.h ---*/
+/*--------------------------------------------------------------------*/
diff --git a/helgrind/hg_wordset.c b/helgrind/hg_wordset.c
new file mode 100644
index 0000000..ed9a5b8
--- /dev/null
+++ b/helgrind/hg_wordset.c
@@ -0,0 +1,854 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Sets of words, with unique set identifiers.                  ---*/
+/*---                                                 hg_wordset.c ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 OpenWorks LLP
+       info@open-works.co.uk
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+
+   Neither the names of the U.S. Department of Energy nor the
+   University of California nor the names of its contributors may be
+   used to endorse or promote products derived from this software
+   without prior written permission.
+*/
+
+#include "pub_tool_basics.h"
+#include "pub_tool_libcassert.h"
+#include "pub_tool_libcbase.h"
+#include "pub_tool_libcprint.h"
+
+#define HG_(str) VGAPPEND(vgHelgrind_,str)
+#include "hg_wordfm.h"
+#include "hg_wordset.h"
+
+//------------------------------------------------------------------//
+//--- Word Cache                                                 ---//
+//------------------------------------------------------------------//
+
+typedef
+   struct { UWord arg1; UWord arg2; UWord res; }
+   WCacheEnt;
+
+/* Each cache is a fixed sized array of N_WCACHE_STAT_MAX entries.
+   However only the first .dynMax are used.  This is because at some
+   point, expanding the cache further overall gives a slowdown because
+   searching more entries more than negates any performance advantage
+   from caching those entries in the first place.  Hence use .dynMax
+   to allow the size of the cache(s) to be set differently for each
+   different WordSetU. */
+#define N_WCACHE_STAT_MAX 32
+typedef
+   struct {
+      WCacheEnt ent[N_WCACHE_STAT_MAX];
+      Word      dynMax; /* 1 .. N_WCACHE_STAT_MAX inclusive */
+      Word      inUse;  /* 0 .. dynMax inclusive */
+   }
+   WCache;
+
+#define WCache_INIT(_zzcache,_zzdynmax)                              \
+   do {                                                              \
+      tl_assert((_zzdynmax) >= 1);                                   \
+      tl_assert((_zzdynmax) <= N_WCACHE_STAT_MAX);                   \
+      (_zzcache).dynMax = (_zzdynmax);                               \
+      (_zzcache).inUse = 0;                                          \
+   } while (0)
+
+#define WCache_LOOKUP_AND_RETURN(_retty,_zzcache,_zzarg1,_zzarg2)    \
+   do {                                                              \
+      Word    _i;                                                    \
+      UWord   _arg1  = (UWord)(_zzarg1);                             \
+      UWord   _arg2  = (UWord)(_zzarg2);                             \
+      WCache* _cache = &(_zzcache);                                  \
+      tl_assert(_cache->dynMax >= 1);                                \
+      tl_assert(_cache->dynMax <= N_WCACHE_STAT_MAX);                \
+      tl_assert(_cache->inUse >= 0);                                 \
+      tl_assert(_cache->inUse <= _cache->dynMax);                    \
+      if (_cache->inUse > 0) {                                       \
+         if (_cache->ent[0].arg1 == _arg1                            \
+             && _cache->ent[0].arg2 == _arg2)                        \
+            return (_retty)_cache->ent[0].res;                       \
+         for (_i = 1; _i < _cache->inUse; _i++) {                    \
+            if (_cache->ent[_i].arg1 == _arg1                        \
+                && _cache->ent[_i].arg2 == _arg2) {                  \
+               WCacheEnt tmp     = _cache->ent[_i-1];                \
+               _cache->ent[_i-1] = _cache->ent[_i];                  \
+               _cache->ent[_i]   = tmp;                              \
+               return (_retty)_cache->ent[_i-1].res;                 \
+            }                                                        \
+         }                                                           \
+      }                                                              \
+   } while (0)
+
+#define WCache_UPDATE(_zzcache,_zzarg1,_zzarg2,_zzresult)            \
+   do {                                                              \
+      Word    _i;                                                    \
+      UWord   _arg1  = (UWord)(_zzarg1);                             \
+      UWord   _arg2  = (UWord)(_zzarg2);                             \
+      UWord   _res   = (UWord)(_zzresult);                           \
+      WCache* _cache = &(_zzcache);                                  \
+      tl_assert(_cache->dynMax >= 1);                                \
+      tl_assert(_cache->dynMax <= N_WCACHE_STAT_MAX);                \
+      tl_assert(_cache->inUse >= 0);                                 \
+      tl_assert(_cache->inUse <= _cache->dynMax);                    \
+      if (_cache->inUse < _cache->dynMax)                            \
+         _cache->inUse++;                                            \
+      for (_i = _cache->inUse-1; _i >= 1; _i--)                      \
+         _cache->ent[_i] = _cache->ent[_i-1];                        \
+      _cache->ent[0].arg1 = _arg1;                                   \
+      _cache->ent[0].arg2 = _arg2;                                   \
+      _cache->ent[0].res  = _res;                                    \
+   } while (0)
+
+
+//------------------------------------------------------------------//
+//---                          WordSet                           ---//
+//---                       Implementation                       ---//
+//------------------------------------------------------------------//
+
+typedef
+   struct {
+      WordSetU* owner; /* for sanity checking */
+      Word*     words;
+      Int       size; /* Really this should be SizeT */
+   }
+   WordVec;
+
+/* ix2vec[0 .. ix2vec_used-1] are pointers to the lock sets (WordVecs)
+   really.  vec2ix is the inverse mapping, mapping WordVec* to the
+   corresponding ix2vec entry number.  The two mappings are mutually
+   redundant. */
+struct _WordSetU {
+      void*     (*alloc)(SizeT);
+      void      (*dealloc)(void*);
+      WordFM*   vec2ix; /* WordVec-to-WordSet mapping tree */
+      WordVec** ix2vec; /* WordSet-to-WordVec mapping array */
+      UInt      ix2vec_size;
+      UInt      ix2vec_used;
+      WordSet   empty; /* cached, for speed */
+      /* Caches for some operations */
+      WCache    cache_addTo;
+      WCache    cache_delFrom;
+      WCache    cache_intersect;
+      WCache    cache_minus;
+      /* Stats */
+      UWord     n_add;
+      UWord     n_add_uncached;
+      UWord     n_del;
+      UWord     n_del_uncached;
+      UWord     n_union;
+      UWord     n_intersect;
+      UWord     n_intersect_uncached;
+      UWord     n_minus;
+      UWord     n_minus_uncached;
+      UWord     n_elem;
+      UWord     n_doubleton;
+      UWord     n_isEmpty;
+      UWord     n_isSingleton;
+      UWord     n_anyElementOf;
+      UWord     n_isSubsetOf;
+   };
+
+/* Create a new WordVec of the given size. */
+
+static WordVec* new_WV_of_size ( WordSetU* wsu, Int sz )
+{
+   WordVec* wv;
+   tl_assert(sz >= 0);
+   wv = wsu->alloc( sizeof(WordVec) );
+   wv->owner = wsu;
+   wv->words = NULL;
+   wv->size = sz;
+   if (sz > 0) {
+     wv->words = wsu->alloc( (SizeT)sz * sizeof(Word) );
+   }
+   return wv;
+}
+
+static void delete_WV ( WordVec* wv )
+{
+   void (*dealloc)(void*) = wv->owner->dealloc;
+   if (wv->words) {
+      dealloc(wv->words);
+   }
+   dealloc(wv);
+}
+static void delete_WV_for_FM ( Word wv ) {
+   delete_WV( (WordVec*)wv );
+}
+
+static Word cmp_WordVecs_for_FM ( Word wv1W, Word wv2W )
+{
+   Int      i;
+   WordVec* wv1    = (WordVec*)wv1W;
+   WordVec* wv2    = (WordVec*)wv2W;
+   Int      common = wv1->size < wv2->size ? wv1->size : wv2->size;
+   for (i = 0; i < common; i++) {
+      if (wv1->words[i] == wv2->words[i])
+         continue;
+      if (wv1->words[i] < wv2->words[i])
+         return -1;
+      if (wv1->words[i] > wv2->words[i])
+         return 1;
+      tl_assert(0);
+   }
+   /* Ok, the common sections are identical.  So now consider the
+      tails.  Both sets are considered to finish in an implied
+      sequence of -infinity. */
+   if (wv1->size < wv2->size) {
+      tl_assert(common == wv1->size);
+      return -1; /* impliedly, wv1 contains some -infinitys in places
+                    where wv2 doesn't. */
+   }
+   if (wv1->size > wv2->size) {
+      tl_assert(common == wv2->size);
+      return 1;
+   }
+   tl_assert(common == wv1->size);
+   return 0; /* identical */
+}
+
+static void ensure_ix2vec_space ( WordSetU* wsu )
+{
+   UInt      i, new_sz;
+   WordVec** new_vec;
+   tl_assert(wsu->ix2vec_used <= wsu->ix2vec_size);
+   if (wsu->ix2vec_used < wsu->ix2vec_size)
+      return;
+   new_sz = 2 * wsu->ix2vec_size;
+   if (new_sz == 0) new_sz = 2;
+   new_vec = wsu->alloc( new_sz * sizeof(WordVec*) );
+   tl_assert(new_vec);
+   for (i = 0; i < wsu->ix2vec_size; i++)
+      new_vec[i] = wsu->ix2vec[i];
+   if (wsu->ix2vec)
+      wsu->dealloc(wsu->ix2vec);
+   wsu->ix2vec = new_vec;
+   wsu->ix2vec_size = new_sz;
+}
+
+/* Index into a WordSetU, doing the obvious range check.  Failure of
+   the assertions marked XXX and YYY is an indication of passing the
+   wrong WordSetU* in the public API of this module. */
+static WordVec* do_ix2vec ( WordSetU* wsu, WordSet ws )
+{
+   WordVec* wv;
+   tl_assert(wsu->ix2vec_used <= wsu->ix2vec_size);
+   if (wsu->ix2vec_used > 0)
+      tl_assert(wsu->ix2vec);
+   /* If this assertion fails, it may mean you supplied a 'ws'
+      that does not come from the 'wsu' universe. */
+   tl_assert(ws < wsu->ix2vec_used); /* XXX */
+   wv = wsu->ix2vec[ws];
+   /* Make absolutely sure that 'ws' is a member of 'wsu'. */
+   tl_assert(wv);
+   tl_assert(wv->owner == wsu); /* YYY */
+   return wv;
+}
+
+/* See if wv is contained within wsu.  If so, deallocate wv and return
+   the index of the already-present copy.  If not, add wv to both the
+   vec2ix and ix2vec mappings and return its index. 
+*/
+static WordSet add_or_dealloc_WordVec( WordSetU* wsu, WordVec* wv_new )
+{
+   Bool     have;
+   WordVec* wv_old;
+   Word/*Set*/ ix_old = -1;
+   /* Really WordSet, but need something that can safely be casted to
+      a Word* in the lookupFM.  Making it WordSet (which is 32 bits)
+      causes failures on a 64-bit platform. */
+   tl_assert(wv_new->owner == wsu);
+   have = HG_(lookupFM)( wsu->vec2ix, 
+                         (Word*)(void*)&wv_old, (Word*)&ix_old,
+                         (Word)wv_new );
+   if (have) {
+      tl_assert(wv_old != wv_new);
+      tl_assert(wv_old);
+      tl_assert(wv_old->owner == wsu);
+      tl_assert(ix_old < wsu->ix2vec_used);
+      tl_assert(wsu->ix2vec[ix_old] == wv_old);
+      delete_WV( wv_new );
+      return (WordSet)ix_old;
+   } else {
+      ensure_ix2vec_space( wsu );
+      tl_assert(wsu->ix2vec);
+      tl_assert(wsu->ix2vec_used < wsu->ix2vec_size);
+      wsu->ix2vec[wsu->ix2vec_used] = wv_new;
+      HG_(addToFM)( wsu->vec2ix, (Word)wv_new, (Word)wsu->ix2vec_used );
+      if (0) VG_(printf)("aodW %d\n", (Int)wsu->ix2vec_used );
+      wsu->ix2vec_used++;
+      tl_assert(wsu->ix2vec_used <= wsu->ix2vec_size);
+      return (WordSet)(wsu->ix2vec_used - 1);
+   }
+}
+
+
+WordSetU* HG_(newWordSetU) ( void* (*alloc_nofail)( SizeT ),
+                             void  (*dealloc)(void*),
+                             Word  cacheSize )
+{
+   WordSetU* wsu;
+   WordVec*  empty;
+
+   wsu          = alloc_nofail( sizeof(WordSetU) );
+   VG_(memset)( wsu, 0, sizeof(WordSetU) );
+   wsu->alloc   = alloc_nofail;
+   wsu->dealloc = dealloc;
+   wsu->vec2ix  = HG_(newFM)( alloc_nofail, dealloc, cmp_WordVecs_for_FM );
+   wsu->ix2vec_used = 0;
+   wsu->ix2vec_size = 0;
+   wsu->ix2vec      = NULL;
+   WCache_INIT(wsu->cache_addTo,     cacheSize);
+   WCache_INIT(wsu->cache_delFrom,   cacheSize);
+   WCache_INIT(wsu->cache_intersect, cacheSize);
+   WCache_INIT(wsu->cache_minus,     cacheSize);
+   empty = new_WV_of_size( wsu, 0 );
+   wsu->empty = add_or_dealloc_WordVec( wsu, empty );
+
+   return wsu;
+}
+
+void HG_(deleteWordSetU) ( WordSetU* wsu )
+{
+   void (*dealloc)(void*) = wsu->dealloc;
+   tl_assert(wsu->vec2ix);
+   HG_(deleteFM)( wsu->vec2ix, delete_WV_for_FM, NULL/*val-finalizer*/ );
+   if (wsu->ix2vec)
+      dealloc(wsu->ix2vec);
+   dealloc(wsu);
+}
+
+WordSet HG_(emptyWS) ( WordSetU* wsu )
+{
+   return wsu->empty;
+}
+
+Bool HG_(isEmptyWS) ( WordSetU* wsu, WordSet ws )
+{
+   WordVec* wv = do_ix2vec( wsu, ws );
+   wsu->n_isEmpty++;
+   if (wv->size == 0) {
+      tl_assert(ws == wsu->empty);
+      return True;
+   } else {
+      tl_assert(ws != wsu->empty);
+      return False;
+   }
+}
+
+Bool HG_(isSingletonWS) ( WordSetU* wsu, WordSet ws, Word w )
+{
+   WordVec* wv;
+   tl_assert(wsu);
+   wsu->n_isSingleton++;
+   wv = do_ix2vec( wsu, ws );
+   return (Bool)(wv->size == 1 && wv->words[0] == w);
+}
+
+Int HG_(cardinalityWS) ( WordSetU* wsu, WordSet ws )
+{
+   WordVec* wv;
+   tl_assert(wsu);
+   wv = do_ix2vec( wsu, ws );
+   tl_assert(wv->size >= 0);
+   return wv->size;
+}
+
+Word HG_(anyElementOfWS) ( WordSetU* wsu, WordSet ws )
+{
+   WordVec* wv;
+   tl_assert(wsu);
+   wsu->n_anyElementOf++;
+   wv = do_ix2vec( wsu, ws );
+   tl_assert(wv->size >= 1);
+   return wv->words[0];
+}
+
+Int HG_(cardinalityWSU) ( WordSetU* wsu )
+{
+   tl_assert(wsu);
+   return (Int)wsu->ix2vec_used;
+}
+
+void HG_(getPayloadWS) ( /*OUT*/Word** words, /*OUT*/Word* nWords, 
+                         WordSetU* wsu, WordSet ws )
+{
+   WordVec* wv;
+   tl_assert(wsu);
+   wv = do_ix2vec( wsu, ws );
+   tl_assert(wv->size >= 0);
+   *nWords = wv->size;
+   *words  = wv->words;
+}
+
+Bool HG_(plausibleWS) ( WordSetU* wsu, WordSet ws )
+{
+   if (wsu == NULL) return False;
+   if (ws < 0 || ws >= wsu->ix2vec_used)
+      return False;
+   return True;
+}
+
+Bool HG_(saneWS_SLOW) ( WordSetU* wsu, WordSet ws )
+{
+   WordVec* wv;
+   Int      i;
+   if (wsu == NULL) return False;
+   if (ws < 0 || ws >= wsu->ix2vec_used)
+      return False;
+   wv = do_ix2vec( wsu, ws );
+   /* can never happen .. do_ix2vec will assert instead.  Oh well. */
+   if (wv->owner != wsu) return False;
+   if (wv->size < 0) return False;
+   if (wv->size > 0) {
+      for (i = 0; i < wv->size-1; i++) {
+         if (wv->words[i] >= wv->words[i+1])
+            return False;
+      }
+   }
+   return True;
+}
+
+Bool HG_(elemWS) ( WordSetU* wsu, WordSet ws, Word w )
+{
+   Int      i;
+   WordVec* wv = do_ix2vec( wsu, ws );
+   wsu->n_elem++;
+   for (i = 0; i < wv->size; i++) {
+      if (wv->words[i] == w)
+         return True;
+   }
+   return False;
+}
+
+WordSet HG_(doubletonWS) ( WordSetU* wsu, Word w1, Word w2 )
+{
+   WordVec* wv;
+   wsu->n_doubleton++;
+   if (w1 == w2) {
+      wv = new_WV_of_size(wsu, 1);
+      wv->words[0] = w1;
+   }
+   else if (w1 < w2) {
+      wv = new_WV_of_size(wsu, 2);
+      wv->words[0] = w1;
+      wv->words[1] = w2;
+   }
+   else {
+      tl_assert(w1 > w2);
+      wv = new_WV_of_size(wsu, 2);
+      wv->words[0] = w2;
+      wv->words[1] = w1;
+   }
+   return add_or_dealloc_WordVec( wsu, wv );
+}
+
+WordSet HG_(singletonWS) ( WordSetU* wsu, Word w )
+{
+   return HG_(doubletonWS)( wsu, w, w );
+}
+
+WordSet HG_(isSubsetOf) ( WordSetU* wsu, WordSet small, WordSet big )
+{
+   wsu->n_isSubsetOf++;
+   return small == HG_(intersectWS)( wsu, small, big );
+}
+
+void HG_(ppWS) ( WordSetU* wsu, WordSet ws )
+{
+   Int      i;
+   WordVec* wv;
+   tl_assert(wsu);
+   wv = do_ix2vec( wsu, ws );
+   VG_(printf)("{");
+   for (i = 0; i < wv->size; i++) {
+      VG_(printf)("%p", (void*)wv->words[i]);
+      if (i < wv->size-1)
+         VG_(printf)(",");
+   }
+   VG_(printf)("}");
+}
+
+void HG_(ppWSUstats) ( WordSetU* wsu, HChar* name )
+{
+   VG_(printf)("   WordSet \"%s\":\n", name);
+   VG_(printf)("      addTo        %10u (%u uncached)\n",
+               wsu->n_add, wsu->n_add_uncached);
+   VG_(printf)("      delFrom      %10u (%u uncached)\n", 
+               wsu->n_del, wsu->n_del_uncached);
+   VG_(printf)("      union        %10u\n", wsu->n_union);
+   VG_(printf)("      intersect    %10u (%u uncached) [nb. incl isSubsetOf]\n", 
+               wsu->n_intersect, wsu->n_intersect_uncached);
+   VG_(printf)("      minus        %10u (%u uncached)\n",
+               wsu->n_minus, wsu->n_minus_uncached);
+   VG_(printf)("      elem         %10u\n",   wsu->n_elem);
+   VG_(printf)("      doubleton    %10u\n",   wsu->n_doubleton);
+   VG_(printf)("      isEmpty      %10u\n",   wsu->n_isEmpty);
+   VG_(printf)("      isSingleton  %10u\n",   wsu->n_isSingleton);
+   VG_(printf)("      anyElementOf %10u\n",   wsu->n_anyElementOf);
+   VG_(printf)("      isSubsetOf   %10u\n",   wsu->n_isSubsetOf);
+}
+
+WordSet HG_(addToWS) ( WordSetU* wsu, WordSet ws, Word w )
+{
+   Int      k, j;
+   WordVec* wv_new;
+   WordVec* wv;
+   WordSet  result = (WordSet)(-1); /* bogus */
+
+   wsu->n_add++;
+   WCache_LOOKUP_AND_RETURN(WordSet, wsu->cache_addTo, ws, w);
+   wsu->n_add_uncached++;
+
+   /* If already present, this is a no-op. */
+   wv = do_ix2vec( wsu, ws );
+   for (k = 0; k < wv->size; k++) {
+      if (wv->words[k] == w) {
+         result = ws;
+         goto out;
+      }
+   }
+   /* Ok, not present.  Build a new one ... */
+   wv_new = new_WV_of_size( wsu, wv->size + 1 );
+   k = j = 0;
+   for (; k < wv->size && wv->words[k] < w; k++) {
+      wv_new->words[j++] = wv->words[k];
+   }
+   wv_new->words[j++] = w;
+   for (; k < wv->size; k++) {
+      tl_assert(wv->words[k] > w);
+      wv_new->words[j++] = wv->words[k];
+   }
+   tl_assert(j == wv_new->size);
+
+   /* Find any existing copy, or add the new one. */
+   result = add_or_dealloc_WordVec( wsu, wv_new );
+   tl_assert(result != (WordSet)(-1));
+
+  out:
+   WCache_UPDATE(wsu->cache_addTo, ws, w, result);
+   return result;
+}
+
+WordSet HG_(delFromWS) ( WordSetU* wsu, WordSet ws, Word w )
+{
+   Int      i, j, k;
+   WordVec* wv_new;
+   WordSet  result = (WordSet)(-1); /* bogus */
+   WordVec* wv = do_ix2vec( wsu, ws );
+
+   wsu->n_del++;
+
+   /* special case empty set */
+   if (wv->size == 0) {
+      tl_assert(ws == wsu->empty);
+      return ws;
+   }
+
+   WCache_LOOKUP_AND_RETURN(WordSet, wsu->cache_delFrom, ws, w);
+   wsu->n_del_uncached++;
+
+   /* If not already present, this is a no-op. */
+   for (i = 0; i < wv->size; i++) {
+      if (wv->words[i] == w)
+         break;
+   }
+   if (i == wv->size) {
+      result = ws;
+      goto out;
+   }
+   /* So w is present in ws, and the new set will be one element
+      smaller. */
+   tl_assert(i >= 0 && i < wv->size);
+   tl_assert(wv->size > 0);
+
+   wv_new = new_WV_of_size( wsu, wv->size - 1 );
+   j = k = 0;
+   for (; j < wv->size; j++) {
+      if (j == i)
+         continue;
+      wv_new->words[k++] = wv->words[j];
+   }
+   tl_assert(k == wv_new->size);
+
+   result = add_or_dealloc_WordVec( wsu, wv_new );
+   if (wv->size == 1) {
+      tl_assert(result == wsu->empty);
+   }
+
+  out:
+   WCache_UPDATE(wsu->cache_delFrom, ws, w, result);
+   return result;
+}
+
+WordSet HG_(unionWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
+{
+   Int      i1, i2, k, sz;
+   WordVec* wv_new;
+   WordVec* wv1 = do_ix2vec( wsu, ws1 );
+   WordVec* wv2 = do_ix2vec( wsu, ws2 );
+   wsu->n_union++;
+   sz = 0;
+   i1 = i2 = 0;
+   while (1) {
+      if (i1 >= wv1->size || i2 >= wv2->size)
+         break;
+      sz++;
+      if (wv1->words[i1] < wv2->words[i2]) {
+         i1++;
+      } else 
+      if (wv1->words[i1] > wv2->words[i2]) {
+         i2++;
+      } else {
+         i1++;
+         i2++;
+      }
+   }
+   tl_assert(i1 <= wv1->size);
+   tl_assert(i2 <= wv2->size);
+   tl_assert(i1 == wv1->size || i2 == wv2->size);
+   if (i1 == wv1->size && i2 < wv2->size) {
+      sz += (wv2->size - i2);
+   }
+   if (i2 == wv2->size && i1 < wv1->size) {
+      sz += (wv1->size - i1);
+   }
+
+   wv_new = new_WV_of_size( wsu, sz );
+   k = 0;
+
+   i1 = i2 = 0;
+   while (1) {
+      if (i1 >= wv1->size || i2 >= wv2->size)
+         break;
+      if (wv1->words[i1] < wv2->words[i2]) {
+         wv_new->words[k++] = wv1->words[i1];
+         i1++;
+      } else 
+      if (wv1->words[i1] > wv2->words[i2]) {
+         wv_new->words[k++] = wv2->words[i2];
+         i2++;
+      } else {
+         wv_new->words[k++] = wv1->words[i1];
+         i1++;
+         i2++;
+      }
+   }
+   tl_assert(i1 <= wv1->size);
+   tl_assert(i2 <= wv2->size);
+   tl_assert(i1 == wv1->size || i2 == wv2->size);
+   if (i1 == wv1->size && i2 < wv2->size) {
+      while (i2 < wv2->size)
+         wv_new->words[k++] = wv2->words[i2++];
+   }
+   if (i2 == wv2->size && i1 < wv1->size) {
+      while (i1 < wv1->size)
+         wv_new->words[k++] = wv1->words[i1++];
+   }
+
+   tl_assert(k == sz);
+
+   return add_or_dealloc_WordVec( wsu, wv_new );
+}
+
+WordSet HG_(intersectWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
+{
+   Int      i1, i2, k, sz;
+   WordSet  ws_new = (WordSet)(-1); /* bogus */
+   WordVec* wv_new;
+   WordVec* wv1; 
+   WordVec* wv2; 
+
+   wsu->n_intersect++;
+
+   /* Deal with an obvious case fast. */
+   if (ws1 == ws2)
+      return ws1;
+
+   /* Since intersect(x,y) == intersect(y,x), convert both variants to
+      the same query.  This reduces the number of variants the cache
+      has to deal with. */
+   if (ws1 > ws2) {
+      WordSet wst = ws1; ws1 = ws2; ws2 = wst;
+   }
+
+   WCache_LOOKUP_AND_RETURN(WordSet, wsu->cache_intersect, ws1, ws2);
+   wsu->n_intersect_uncached++;
+
+   wv1 = do_ix2vec( wsu, ws1 );
+   wv2 = do_ix2vec( wsu, ws2 );
+   sz = 0;
+   i1 = i2 = 0;
+   while (1) {
+      if (i1 >= wv1->size || i2 >= wv2->size)
+         break;
+      if (wv1->words[i1] < wv2->words[i2]) {
+         i1++;
+      } else 
+      if (wv1->words[i1] > wv2->words[i2]) {
+         i2++;
+      } else {
+         sz++;
+         i1++;
+         i2++;
+      }
+   }
+   tl_assert(i1 <= wv1->size);
+   tl_assert(i2 <= wv2->size);
+   tl_assert(i1 == wv1->size || i2 == wv2->size);
+
+   wv_new = new_WV_of_size( wsu, sz );
+   k = 0;
+
+   i1 = i2 = 0;
+   while (1) {
+      if (i1 >= wv1->size || i2 >= wv2->size)
+         break;
+      if (wv1->words[i1] < wv2->words[i2]) {
+         i1++;
+      } else 
+      if (wv1->words[i1] > wv2->words[i2]) {
+         i2++;
+      } else {
+         wv_new->words[k++] = wv1->words[i1];
+         i1++;
+         i2++;
+      }
+   }
+   tl_assert(i1 <= wv1->size);
+   tl_assert(i2 <= wv2->size);
+   tl_assert(i1 == wv1->size || i2 == wv2->size);
+
+   tl_assert(k == sz);
+
+   ws_new = add_or_dealloc_WordVec( wsu, wv_new );
+   if (sz == 0) {
+      tl_assert(ws_new == wsu->empty);
+   }
+
+   tl_assert(ws_new != (WordSet)(-1));
+   WCache_UPDATE(wsu->cache_intersect, ws1, ws2, ws_new);
+
+   return ws_new;
+}
+
+WordSet HG_(minusWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
+{
+   Int      i1, i2, k, sz;
+   WordSet  ws_new = (WordSet)(-1); /* bogus */
+   WordVec* wv_new;
+   WordVec* wv1;
+   WordVec* wv2;
+   
+   wsu->n_minus++;
+   WCache_LOOKUP_AND_RETURN(WordSet, wsu->cache_minus, ws1, ws2);
+   wsu->n_minus_uncached++;
+
+   wv1 = do_ix2vec( wsu, ws1 );
+   wv2 = do_ix2vec( wsu, ws2 );
+   sz = 0;
+   i1 = i2 = 0;
+   while (1) {
+      if (i1 >= wv1->size || i2 >= wv2->size)
+         break;
+      if (wv1->words[i1] < wv2->words[i2]) {
+         sz++;
+         i1++;
+      } else 
+      if (wv1->words[i1] > wv2->words[i2]) {
+         i2++;
+      } else {
+         i1++;
+         i2++;
+      }
+   }
+   tl_assert(i1 <= wv1->size);
+   tl_assert(i2 <= wv2->size);
+   tl_assert(i1 == wv1->size || i2 == wv2->size);
+   if (i2 == wv2->size && i1 < wv1->size) {
+      sz += (wv1->size - i1);
+   }
+
+   wv_new = new_WV_of_size( wsu, sz );
+   k = 0;
+
+   i1 = i2 = 0;
+   while (1) {
+      if (i1 >= wv1->size || i2 >= wv2->size)
+         break;
+      if (wv1->words[i1] < wv2->words[i2]) {
+         wv_new->words[k++] = wv1->words[i1];
+         i1++;
+      } else 
+      if (wv1->words[i1] > wv2->words[i2]) {
+         i2++;
+      } else {
+         i1++;
+         i2++;
+      }
+   }
+   tl_assert(i1 <= wv1->size);
+   tl_assert(i2 <= wv2->size);
+   tl_assert(i1 == wv1->size || i2 == wv2->size);
+   if (i2 == wv2->size && i1 < wv1->size) {
+      while (i1 < wv1->size)
+         wv_new->words[k++] = wv1->words[i1++];
+   }
+
+   tl_assert(k == sz);
+
+   ws_new = add_or_dealloc_WordVec( wsu, wv_new );
+   if (sz == 0) {
+      tl_assert(ws_new == wsu->empty);
+   }
+
+   tl_assert(ws_new != (WordSet)(-1));
+   WCache_UPDATE(wsu->cache_minus, ws1, ws2, ws_new);
+
+   return ws_new;
+}
+
+static __attribute__((unused))
+void show_WS ( WordSetU* wsu, WordSet ws )
+{
+   Int i;
+   WordVec* wv = do_ix2vec( wsu, ws );
+   VG_(printf)("#%u{", ws);
+   for (i = 0; i < wv->size; i++) {
+      VG_(printf)("%lu", wv->words[i]);
+      if (i < wv->size-1)
+         VG_(printf)(",");
+   }
+   VG_(printf)("}\n");
+}
+
+//------------------------------------------------------------------//
+//---                        end WordSet                         ---//
+//---                       Implementation                       ---//
+//------------------------------------------------------------------//
+
+/*--------------------------------------------------------------------*/
+/*--- end                                             hg_wordset.c ---*/
+/*--------------------------------------------------------------------*/
diff --git a/helgrind/hg_wordset.h b/helgrind/hg_wordset.h
new file mode 100644
index 0000000..5c40ef4
--- /dev/null
+++ b/helgrind/hg_wordset.h
@@ -0,0 +1,100 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Sets of words, with unique set identifiers.                  ---*/
+/*---                                                 hg_wordset.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+   This file is part of Helgrind, a Valgrind tool for detecting errors
+   in threaded programs.
+
+   Copyright (C) 2007-2007 OpenWorks LLP
+       info@open-works.co.uk
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307, USA.
+
+   The GNU General Public License is contained in the file COPYING.
+
+   Neither the names of the U.S. Department of Energy nor the
+   University of California nor the names of its contributors may be
+   used to endorse or promote products derived from this software
+   without prior written permission.
+*/
+
+#ifndef __HG_WORDSET_H
+#define __HG_WORDSET_H
+
+//------------------------------------------------------------------//
+//---                          WordSet                           ---//
+//---                      Public Interface                      ---//
+//------------------------------------------------------------------//
+
+typedef  struct _WordSetU  WordSetU;  /* opaque */
+
+typedef  UInt              WordSet;   /* opaque, small int index */
+
+/* Allocate and initialise a WordSetU */
+WordSetU* HG_(newWordSetU) ( void* (*alloc_nofail)( SizeT ),
+                             void  (*dealloc)(void*),
+                             Word  cacheSize );
+
+/* Free up the WordSetU. */
+void HG_(deleteWordSetU) ( WordSetU* );
+
+/* Get the number of elements in this WordSetU. */
+Int HG_(cardinalityWSU) ( WordSetU* );
+
+/* Show performance stats for this WordSetU. */
+void HG_(ppWSUstats) ( WordSetU* wsu, HChar* name );
+
+
+/* Element-level operations on WordSets.  Note that the WordSet
+   numbers given out are 0, 1, 2, 3, etc, and as it happens 0 always
+   represents the empty set. */
+
+WordSet HG_(emptyWS)        ( WordSetU* );
+WordSet HG_(addToWS)        ( WordSetU*, WordSet, Word );
+WordSet HG_(delFromWS)      ( WordSetU*, WordSet, Word );
+WordSet HG_(unionWS)        ( WordSetU*, WordSet, WordSet );
+WordSet HG_(intersectWS)    ( WordSetU*, WordSet, WordSet );
+WordSet HG_(minusWS)        ( WordSetU*, WordSet, WordSet );
+Bool    HG_(isEmptyWS)      ( WordSetU*, WordSet );
+Bool    HG_(isSingletonWS)  ( WordSetU*, WordSet, Word );
+Word    HG_(anyElementOfWS) ( WordSetU*, WordSet );
+Int     HG_(cardinalityWS)  ( WordSetU*, WordSet );
+Bool    HG_(elemWS)         ( WordSetU*, WordSet, Word );
+WordSet HG_(doubletonWS)    ( WordSetU*, Word, Word );
+WordSet HG_(singletonWS)    ( WordSetU*, Word );
+WordSet HG_(isSubsetOf)     ( WordSetU*, WordSet, WordSet );
+
+Bool    HG_(plausibleWS)    ( WordSetU*, WordSet );
+Bool    HG_(saneWS_SLOW)    ( WordSetU*, WordSet );
+
+void    HG_(ppWS)           ( WordSetU*, WordSet );
+void    HG_(getPayloadWS)   ( /*OUT*/Word** words, /*OUT*/Word* nWords, 
+                             WordSetU*, WordSet );
+
+
+//------------------------------------------------------------------//
+//---                        end WordSet                         ---//
+//---                      Public Interface                      ---//
+//------------------------------------------------------------------//
+
+#endif /* ! __HG_WORDSET_H */
+
+/*--------------------------------------------------------------------*/
+/*--- end                                             hg_wordset.h ---*/
+/*--------------------------------------------------------------------*/
diff --git a/helgrind/tests/Makefile.am b/helgrind/tests/Makefile.am
new file mode 100644
index 0000000..ac84a96
--- /dev/null
+++ b/helgrind/tests/Makefile.am
@@ -0,0 +1,124 @@
+
+# For AM_FLAG_M3264_PRI
+include $(top_srcdir)/Makefile.flags.am
+
+noinst_SCRIPTS = filter_stderr
+
+EXTRA_DIST = $(noinst_SCRIPTS) \
+	hg01_all_ok.vgtest hg01_all_ok.stdout.exp \
+		hg01_all_ok.stderr.exp-glibc25-amd64 \
+	hg02_deadlock.vgtest hg02_deadlock.stdout.exp \
+		hg02_deadlock.stderr.exp-glibc25-amd64 \
+		hg02_deadlock.stderr.exp-glibc25-x86 \
+	hg03_inherit.vgtest hg03_inherit.stdout.exp \
+		hg03_inherit.stderr.exp-glibc25-amd64 \
+		hg03_inherit.stderr.exp-glibc25-x86 \
+	hg04_race.vgtest hg04_race.stdout.exp \
+		hg04_race.stderr.exp-glibc25-amd64 \
+		hg04_race.stderr.exp-glibc25-x86 \
+	hg05_race2.vgtest hg05_race2.stdout.exp \
+		hg05_race2.stderr.exp-glibc25-amd64 \
+		hg05_race2.stderr.exp-glibc25-x86 \
+	hg06_readshared.vgtest hg06_readshared.stdout.exp \
+		hg06_readshared.stderr.exp-glibc25-amd64 \
+	tc01_simple_race.vgtest tc01_simple_race.stdout.exp \
+		tc01_simple_race.stderr.exp-glibc25-amd64 \
+		tc01_simple_race.stderr.exp-glibc25-x86 \
+	tc02_simple_tls.vgtest tc02_simple_tls.stdout.exp \
+		tc02_simple_tls.stderr.exp-glibc25-amd64 \
+	tc03_re_excl.vgtest tc03_re_excl.stdout.exp \
+		tc03_re_excl.stderr.exp-glibc25-amd64 \
+	tc04_free_lock.vgtest tc04_free_lock.stdout.exp \
+		tc04_free_lock.stderr.exp-glibc25-amd64 \
+	tc05_simple_race.vgtest tc05_simple_race.stdout.exp \
+		tc05_simple_race.stderr.exp-glibc25-amd64 \
+		tc05_simple_race.stderr.exp-glibc25-x86 \
+	tc06_two_races.vgtest tc06_two_races.stdout.exp \
+		tc06_two_races.stderr.exp-glibc25-amd64 \
+		tc06_two_races.stderr.exp-glibc25-x86 \
+	tc07_hbl1.vgtest tc07_hbl1.stdout.exp \
+		tc07_hbl1.stderr.exp-glibc25-amd64 \
+	tc08_hbl2.vgtest tc08_hbl2.stdout.exp \
+		tc08_hbl2.stderr.exp-glibc25-amd64 \
+	tc09_bad_unlock.vgtest tc09_bad_unlock.stdout.exp \
+		tc09_bad_unlock.stderr.exp-glibc23-amd64 \
+		tc09_bad_unlock.stderr.exp-glibc25-amd64 \
+		tc09_bad_unlock.stderr.exp-glibc25-x86 \
+	tc10_rec_lock.vgtest tc10_rec_lock.stdout.exp \
+		tc10_rec_lock.stderr.exp-glibc25-amd64 \
+	tc11_XCHG.vgtest tc11_XCHG.stdout.exp \
+		tc11_XCHG.stderr.exp-glibc25-amd64 \
+	tc12_rwl_trivial.vgtest tc12_rwl_trivial.stdout.exp \
+		tc12_rwl_trivial.stderr.exp-glibc25-amd64 \
+	tc13_laog1.vgtest tc13_laog1.stdout.exp \
+		tc13_laog1.stderr.exp-glibc25-amd64 \
+	tc14_laog_dinphils.vgtest tc14_laog_dinphils.stdout.exp \
+		tc14_laog_dinphils.stderr.exp-glibc25-amd64 \
+		tc14_laog_dinphils.stderr.exp-glibc25-x86 \
+	tc15_laog_lockdel.vgtest tc15_laog_lockdel.stdout.exp \
+		tc15_laog_lockdel.stderr.exp-glibc25-amd64 \
+	tc16_byterace.vgtest tc16_byterace.stdout.exp \
+		tc16_byterace.stderr.exp-glibc25-amd64 \
+		tc16_byterace.stderr.exp-glibc25-x86 \
+	tc17_sembar.vgtest tc17_sembar.stdout.exp \
+		tc17_sembar.stderr.exp-glibc25-amd64 \
+		tc17_sembar.stderr.exp-glibc25-x86 \
+	tc18_semabuse.vgtest tc18_semabuse.stdout.exp \
+		tc18_semabuse.stderr.exp-glibc25-amd64 \
+		tc18_semabuse.stderr.exp-glibc25-x86 \
+	tc19_shadowmem.vgtest tc19_shadowmem.stdout.exp \
+		tc19_shadowmem.stderr.exp-glibc25-amd64 \
+		tc19_shadowmem.stderr.exp-glibc25-x86 \
+	tc20_verifywrap.vgtest tc20_verifywrap.stdout.exp \
+		tc20_verifywrap.stderr.exp-glibc23-amd64 \
+		tc20_verifywrap.stderr.exp-glibc25-amd64 \
+		tc20_verifywrap.stderr.exp-glibc25-x86 \
+	tc21_pthonce.vgtest tc21_pthonce.stdout.exp \
+		tc21_pthonce.stderr.exp-glibc25-amd64 \
+		tc21_pthonce.stderr.exp-glibc25-x86 \
+	tc22_exit_w_lock.vgtest tc22_exit_w_lock.stdout.exp \
+		tc22_exit_w_lock.stderr.exp-glibc25-amd64 \
+		tc22_exit_w_lock.stderr.exp-glibc25-x86 \
+	tc23_bogus_condwait.vgtest tc23_bogus_condwait.stdout.exp \
+		tc23_bogus_condwait.stderr.exp-glibc25-amd64 \
+		tc23_bogus_condwait.stderr.exp-glibc25-x86
+
+check_PROGRAMS = \
+	hg01_all_ok \
+	hg02_deadlock \
+	hg03_inherit \
+	hg04_race \
+	hg05_race2 \
+	hg06_readshared \
+	tc01_simple_race \
+	tc02_simple_tls \
+	tc03_re_excl \
+	tc04_free_lock \
+	tc05_simple_race \
+	tc06_two_races \
+	tc07_hbl1 \
+	tc08_hbl2 \
+	tc09_bad_unlock \
+	tc10_rec_lock \
+	tc11_XCHG \
+	tc12_rwl_trivial \
+	tc13_laog1 \
+	tc14_laog_dinphils \
+	tc15_laog_lockdel \
+	tc16_byterace \
+	tc17_sembar \
+	tc18_semabuse \
+	tc19_shadowmem \
+	tc20_verifywrap \
+	tc21_pthonce \
+	tc22_exit_w_lock \
+	tc23_bogus_condwait
+
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/include \
+                -I$(top_srcdir)/coregrind -I$(top_builddir)/include \
+                -I@VEX_DIR@/pub
+
+# are these necessary?
+AM_CFLAGS	= $(WERROR) -Winline -Wall -Wshadow -g $(AM_FLAG_M3264_PRI)
+
+LDADD		= -lpthread
diff --git a/helgrind/tests/filter_stderr b/helgrind/tests/filter_stderr
new file mode 100755
index 0000000..f2b45d7
--- /dev/null
+++ b/helgrind/tests/filter_stderr
@@ -0,0 +1,30 @@
+#! /bin/sh
+
+dir=`dirname $0`
+
+$dir/../../tests/filter_stderr_basic                    |
+
+# Anonymise addresses
+$dir/../../tests/filter_addresses                       |
+
+# Remove "Helgrind, ..." line and the following copyright line.
+sed "/^Helgrind, a thread error detector/ , /./ d" |
+
+# Anonymise line numbers in hg_intercepts.c
+sed "s/hg_intercepts.c:[0-9]*/hg_intercepts.c:.../g"  |
+
+# Change (eg) "/lib64/libpthread-2.5.so" into "/lib/libpthread..."
+sed "s/lib64/lib/g" | 
+sed "s/libpthread.*so/libpthread\.\.\./g" |
+
+# Change (eg) "pthread_create@@GLIBC_2.2.5" into "pthread_create@GLIBC"
+#    and (eg) "pthread_create@GLIBC_2.1"    into "pthread_create@GLIBC"
+sed "s/@@*GLIBC_2[0123456789\.]*/@GLIBC_/g" |
+
+# Tidy up in cases where glibc (+ libdl + libpthread + ld) have
+# been built with debugging information, hence source locs are present
+sed "s/(createthread.c:[0-9]*)/(in \/lib\/libpthread...)/g" |
+sed "s/(clone.S:[0-9]*)/(in \/...libc...)/g" |
+sed "s/start_thread (pthread_create.c:[0-9]*)$/start_thread (in \/lib\/libpthread...)/g" |
+
+$dir/../../tests/filter_test_paths
diff --git a/helgrind/tests/hg01_all_ok.c b/helgrind/tests/hg01_all_ok.c
new file mode 100644
index 0000000..144ce60
--- /dev/null
+++ b/helgrind/tests/hg01_all_ok.c
@@ -0,0 +1,32 @@
+/* All OK */
+
+#include <pthread.h>
+
+static pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER;
+
+static int shared;
+
+static void *th(void *v)
+{
+	pthread_mutex_lock(&mx);
+	shared++;
+	pthread_mutex_unlock(&mx);
+
+	return 0;
+}
+
+int main()
+{
+	pthread_t a, b;
+
+	pthread_mutex_lock(&mx);
+	pthread_mutex_unlock(&mx);
+
+	pthread_create(&a, NULL, th, NULL);	
+	pthread_create(&b, NULL, th, NULL);
+
+	pthread_join(a, NULL);
+	pthread_join(b, NULL);
+
+	return 0;
+}
diff --git a/helgrind/tests/hg01_all_ok.stderr.exp-glibc25-amd64 b/helgrind/tests/hg01_all_ok.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/hg01_all_ok.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg01_all_ok.stdout.exp b/helgrind/tests/hg01_all_ok.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/hg01_all_ok.stdout.exp
diff --git a/helgrind/tests/hg01_all_ok.vgtest b/helgrind/tests/hg01_all_ok.vgtest
new file mode 100644
index 0000000..9524976
--- /dev/null
+++ b/helgrind/tests/hg01_all_ok.vgtest
@@ -0,0 +1 @@
+prog: hg01_all_ok
diff --git a/helgrind/tests/hg02_deadlock.c b/helgrind/tests/hg02_deadlock.c
new file mode 100644
index 0000000..1142f5c
--- /dev/null
+++ b/helgrind/tests/hg02_deadlock.c
@@ -0,0 +1,43 @@
+/* Simple possible deadlock */
+#include <pthread.h>
+
+static pthread_mutex_t m1 = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t m2 = PTHREAD_MUTEX_INITIALIZER;
+
+static void *t1(void *v)
+{
+	pthread_mutex_lock(&m1);
+	pthread_mutex_lock(&m2);
+	pthread_mutex_unlock(&m1);
+	pthread_mutex_unlock(&m2);
+
+	return 0;
+}
+
+static void *t2(void *v)
+{
+	pthread_mutex_lock(&m2);
+	pthread_mutex_lock(&m1);
+	pthread_mutex_unlock(&m1);
+	pthread_mutex_unlock(&m2);
+
+	return 0;
+}
+
+int main()
+{
+	pthread_t a, b;
+	
+	/* prevent spurious messages from the dynamic linker */
+	pthread_mutex_lock(&m1);
+	pthread_mutex_unlock(&m1);
+
+	pthread_create(&a, NULL, t1, NULL);	
+	pthread_create(&b, NULL, t2, NULL);
+
+	pthread_join(a, NULL);
+	pthread_join(b, NULL);
+
+	return 0;
+}
+
diff --git a/helgrind/tests/hg02_deadlock.stderr.exp-glibc25-amd64 b/helgrind/tests/hg02_deadlock.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..8fe4ea4
--- /dev/null
+++ b/helgrind/tests/hg02_deadlock.stderr.exp-glibc25-amd64
@@ -0,0 +1,28 @@
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg02_deadlock.c:36)
+
+Thread #3: lock order "0x........ before 0x........" violated
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: t2 (hg02_deadlock.c:20)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Required order was established by acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: t1 (hg02_deadlock.c:9)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  followed by a later acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: t1 (hg02_deadlock.c:10)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg02_deadlock.stderr.exp-glibc25-x86 b/helgrind/tests/hg02_deadlock.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..6f7fa48
--- /dev/null
+++ b/helgrind/tests/hg02_deadlock.stderr.exp-glibc25-x86
@@ -0,0 +1,27 @@
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg02_deadlock.c:36)
+
+Thread #3: lock order "0x........ before 0x........" violated
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: t2 (hg02_deadlock.c:20)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Required order was established by acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: t1 (hg02_deadlock.c:9)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  followed by a later acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: t1 (hg02_deadlock.c:10)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg02_deadlock.stdout.exp b/helgrind/tests/hg02_deadlock.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/hg02_deadlock.stdout.exp
diff --git a/helgrind/tests/hg02_deadlock.vgtest b/helgrind/tests/hg02_deadlock.vgtest
new file mode 100644
index 0000000..ff0deb7
--- /dev/null
+++ b/helgrind/tests/hg02_deadlock.vgtest
@@ -0,0 +1 @@
+prog: hg02_deadlock
diff --git a/helgrind/tests/hg03_inherit.c b/helgrind/tests/hg03_inherit.c
new file mode 100644
index 0000000..7c429f8
--- /dev/null
+++ b/helgrind/tests/hg03_inherit.c
@@ -0,0 +1,67 @@
+
+/* I don't think this is a very good test .. all this
+   sleepery is highly confusing. */
+
+/* test child thread inheriting data */
+
+#include <stdio.h>
+#include <pthread.h>
+#include <unistd.h>
+
+static volatile int shared[2];
+
+static void *t1(void *v)
+{
+	volatile int *ip = (int *)v;
+	if (0) printf("ta W\n");
+	*ip += 44;
+	*ip *= 2;
+	sleep(1);
+	return 0;
+}
+
+static void *t2(void *v)
+{
+	volatile int *ip = (int *)v;
+	sleep(2);
+	if (0) printf("tb W\n");
+	*ip += 88;
+	*ip *= 3;
+	sleep(1);
+	return 0;
+}
+
+int main(void)
+{
+	pthread_t a, b;
+	volatile int ret = 0;
+
+	sleep(0);
+
+	shared[0] = 22;
+	shared[1] = 77;
+
+	pthread_create(&a, NULL, t1, (void *)&shared[0]);
+	// a steals shared[0] from root thread, so is excl(a)	
+	pthread_create(&b, NULL, t2, (void *)&shared[1]);
+	// b steals shared[1] from root thread, so is excl(b)	
+
+	pthread_join(a, NULL);
+	// b's stuff (shared[1]) still belongs to b, so is excl(b)
+
+	// ret is excl(root), and shared[0] is re-acquired as excl(root)
+	// since a joined to root
+	if (0) printf("r R1\n");
+	ret += shared[0];	/* no error - a is finished */
+
+	// but shared[1] is excl(b); hence we're reading excl(b)
+	// without a lock and without a dependency edge
+	if (0) printf("r R2\n");
+	ret += shared[1];	/* expect error - b has not finished,
+				   so we can't touch shared[1] yet */
+
+	pthread_join(b, NULL);
+
+
+	return ret;
+}
diff --git a/helgrind/tests/hg03_inherit.stderr.exp-glibc25-amd64 b/helgrind/tests/hg03_inherit.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..3cf4b5e
--- /dev/null
+++ b/helgrind/tests/hg03_inherit.stderr.exp-glibc25-amd64
@@ -0,0 +1,21 @@
+
+Thread #1 is the program's root thread
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg03_inherit.c:46)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: t2 (hg03_inherit.c:28)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #1, #3
+  New state: shared-modified by threads #1, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg03_inherit.stderr.exp-glibc25-x86 b/helgrind/tests/hg03_inherit.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..a7e4407
--- /dev/null
+++ b/helgrind/tests/hg03_inherit.stderr.exp-glibc25-x86
@@ -0,0 +1,20 @@
+
+Thread #1 is the program's root thread
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg03_inherit.c:46)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: t2 (hg03_inherit.c:28)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #1, #3
+  New state: shared-modified by threads #1, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg03_inherit.stdout.exp b/helgrind/tests/hg03_inherit.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/hg03_inherit.stdout.exp
diff --git a/helgrind/tests/hg03_inherit.vgtest b/helgrind/tests/hg03_inherit.vgtest
new file mode 100644
index 0000000..b3ac039
--- /dev/null
+++ b/helgrind/tests/hg03_inherit.vgtest
@@ -0,0 +1 @@
+prog: hg03_inherit
diff --git a/helgrind/tests/hg04_race.c b/helgrind/tests/hg04_race.c
new file mode 100644
index 0000000..111195b
--- /dev/null
+++ b/helgrind/tests/hg04_race.c
@@ -0,0 +1,27 @@
+/* A simple race */
+
+#include <pthread.h>
+#include <unistd.h>
+
+static int shared;
+
+static void *th(void *v)
+{
+	shared++;
+
+	return 0;
+}
+
+int main()
+{
+	pthread_t a, b;
+
+	pthread_create(&a, NULL, th, NULL);	
+	sleep(1);		/* force ordering */
+	pthread_create(&b, NULL, th, NULL);
+
+	pthread_join(a, NULL);
+	pthread_join(b, NULL);
+
+	return 0;
+}
diff --git a/helgrind/tests/hg04_race.stderr.exp-glibc25-amd64 b/helgrind/tests/hg04_race.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..6ec1ac3
--- /dev/null
+++ b/helgrind/tests/hg04_race.stderr.exp-glibc25-amd64
@@ -0,0 +1,26 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg04_race.c:19)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg04_race.c:21)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: th (hg04_race.c:10)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #2, #3
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg04_race.stderr.exp-glibc25-x86 b/helgrind/tests/hg04_race.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..3d28bd8
--- /dev/null
+++ b/helgrind/tests/hg04_race.stderr.exp-glibc25-x86
@@ -0,0 +1,24 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg04_race.c:19)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg04_race.c:21)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: th (hg04_race.c:10)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #2, #3
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg04_race.stdout.exp b/helgrind/tests/hg04_race.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/hg04_race.stdout.exp
diff --git a/helgrind/tests/hg04_race.vgtest b/helgrind/tests/hg04_race.vgtest
new file mode 100644
index 0000000..92b7099
--- /dev/null
+++ b/helgrind/tests/hg04_race.vgtest
@@ -0,0 +1 @@
+prog: hg04_race
diff --git a/helgrind/tests/hg05_race2.c b/helgrind/tests/hg05_race2.c
new file mode 100644
index 0000000..de01f2c
--- /dev/null
+++ b/helgrind/tests/hg05_race2.c
@@ -0,0 +1,35 @@
+/* A simple race - test symaddr */
+
+#include <pthread.h>
+#include <unistd.h>
+
+struct foo {
+	struct bar {
+		int plop[22];
+		char biff;
+	} poot[11];
+};
+
+static void *th(void *v)
+{
+	struct foo *f = (struct foo *)v;
+
+	f->poot[5].plop[11]++;
+
+	return 0;
+}
+
+int main()
+{
+	struct foo foo;
+	pthread_t a, b;
+
+	pthread_create(&a, NULL, th, &foo);	
+	sleep(1);		/* force ordering */
+	pthread_create(&b, NULL, th, &foo);
+
+	pthread_join(a, NULL);
+	pthread_join(b, NULL);
+
+	return 0;
+}
diff --git a/helgrind/tests/hg05_race2.stderr.exp-glibc25-amd64 b/helgrind/tests/hg05_race2.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..b6dc2e9
--- /dev/null
+++ b/helgrind/tests/hg05_race2.stderr.exp-glibc25-amd64
@@ -0,0 +1,26 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg05_race2.c:27)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg05_race2.c:29)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: th (hg05_race2.c:17)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #2, #3
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg05_race2.stderr.exp-glibc25-x86 b/helgrind/tests/hg05_race2.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..285efeb
--- /dev/null
+++ b/helgrind/tests/hg05_race2.stderr.exp-glibc25-x86
@@ -0,0 +1,24 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg05_race2.c:27)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (hg05_race2.c:29)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: th (hg05_race2.c:17)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #2, #3
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg05_race2.stdout.exp b/helgrind/tests/hg05_race2.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/hg05_race2.stdout.exp
diff --git a/helgrind/tests/hg05_race2.vgtest b/helgrind/tests/hg05_race2.vgtest
new file mode 100644
index 0000000..a93db5e
--- /dev/null
+++ b/helgrind/tests/hg05_race2.vgtest
@@ -0,0 +1 @@
+prog: hg05_race2
diff --git a/helgrind/tests/hg06_readshared.c b/helgrind/tests/hg06_readshared.c
new file mode 100644
index 0000000..3904b44
--- /dev/null
+++ b/helgrind/tests/hg06_readshared.c
@@ -0,0 +1,33 @@
+/* All OK - test allowed read sharing */
+
+#include <pthread.h>
+#include <assert.h>
+
+static int shared;
+
+static void *t1(void *v)
+{
+	return (void *)(long)(shared + 44);
+}
+
+static void *t2(void *v)
+{
+	return (void *)(long)(shared + 55);
+}
+
+int main()
+{
+	pthread_t a, b;
+
+	shared = 22;
+
+	pthread_create(&a, NULL, t1, NULL);	
+	pthread_create(&b, NULL, t2, NULL);
+
+	pthread_join(a, NULL);
+	pthread_join(b, NULL);
+
+	assert(shared == 22);
+
+	return 0;
+}
diff --git a/helgrind/tests/hg06_readshared.stderr.exp-glibc25-amd64 b/helgrind/tests/hg06_readshared.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/hg06_readshared.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/hg06_readshared.stdout.exp b/helgrind/tests/hg06_readshared.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/hg06_readshared.stdout.exp
diff --git a/helgrind/tests/hg06_readshared.vgtest b/helgrind/tests/hg06_readshared.vgtest
new file mode 100644
index 0000000..c5accee
--- /dev/null
+++ b/helgrind/tests/hg06_readshared.vgtest
@@ -0,0 +1 @@
+prog: hg06_readshared
diff --git a/helgrind/tests/tc01_simple_race.c b/helgrind/tests/tc01_simple_race.c
new file mode 100644
index 0000000..abf37b5
--- /dev/null
+++ b/helgrind/tests/tc01_simple_race.c
@@ -0,0 +1,36 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple test program, has a race.  Parent and child both modify x
+   with no locking. */
+
+int x = 0;
+
+void* child_fn ( void* arg )
+{
+   /* Unprotected relative to parent */
+   x++;
+   return NULL;
+}
+
+int main ( void )
+{
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   /* Unprotected relative to child */
+   x++;
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   return 0;
+}
diff --git a/helgrind/tests/tc01_simple_race.stderr.exp-glibc25-amd64 b/helgrind/tests/tc01_simple_race.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..a5b31c3
--- /dev/null
+++ b/helgrind/tests/tc01_simple_race.stderr.exp-glibc25-amd64
@@ -0,0 +1,18 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc01_simple_race.c:22)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc01_simple_race.c:28)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc01_simple_race.stderr.exp-glibc25-x86 b/helgrind/tests/tc01_simple_race.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..ba37641
--- /dev/null
+++ b/helgrind/tests/tc01_simple_race.stderr.exp-glibc25-x86
@@ -0,0 +1,17 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc01_simple_race.c:22)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc01_simple_race.c:28)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc01_simple_race.stdout.exp b/helgrind/tests/tc01_simple_race.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc01_simple_race.stdout.exp
diff --git a/helgrind/tests/tc01_simple_race.vgtest b/helgrind/tests/tc01_simple_race.vgtest
new file mode 100644
index 0000000..44f3045
--- /dev/null
+++ b/helgrind/tests/tc01_simple_race.vgtest
@@ -0,0 +1 @@
+prog: tc01_simple_race
diff --git a/helgrind/tests/tc02_simple_tls.c b/helgrind/tests/tc02_simple_tls.c
new file mode 100644
index 0000000..a23b14c
--- /dev/null
+++ b/helgrind/tests/tc02_simple_tls.c
@@ -0,0 +1,39 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple test program, no race: parent only modified x after child
+   has modified it and then joined with the parent.  Tests simple
+   thread lifetime segment handling. */
+
+int x = 0;
+
+void* child_fn ( void* arg )
+{
+   /* Unprotected relative to parent, but in child's segment only */
+   x++;
+   return NULL;
+}
+
+int main ( void )
+{
+   pthread_t child;
+
+   x++; /* happens in parent's segment */
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   /* Now back in parent's segment */
+   x++;
+
+   return 0;
+}
diff --git a/helgrind/tests/tc02_simple_tls.stderr.exp-glibc25-amd64 b/helgrind/tests/tc02_simple_tls.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/tc02_simple_tls.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc02_simple_tls.stdout.exp b/helgrind/tests/tc02_simple_tls.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc02_simple_tls.stdout.exp
diff --git a/helgrind/tests/tc02_simple_tls.vgtest b/helgrind/tests/tc02_simple_tls.vgtest
new file mode 100644
index 0000000..57db35c
--- /dev/null
+++ b/helgrind/tests/tc02_simple_tls.vgtest
@@ -0,0 +1 @@
+prog: tc02_simple_tls
diff --git a/helgrind/tests/tc03_re_excl.c b/helgrind/tests/tc03_re_excl.c
new file mode 100644
index 0000000..4f3ce51
--- /dev/null
+++ b/helgrind/tests/tc03_re_excl.c
@@ -0,0 +1,44 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple test program, no race: parent only modifies x after child
+   has modified it and then joined with the parent.  Tests simple
+   thread lifetime segment handling. */
+
+/* A simple function to "use" a value, so that gcc can't
+   possibly optimise it into nothing. */
+static void use ( int x ) {
+   __asm__ __volatile__( "nop" : : "r"(x) : "cc","memory" );
+}
+
+static void* worker_thread ( void* argV )
+{
+  int* arg = (int*)argV;
+  use(arg[5]); /* read access */
+  return NULL;
+}
+
+int main ( void )
+{
+   pthread_t thread_id;
+   volatile int* x = malloc(10 * sizeof(int));
+   x[5] = 1;
+   /* x[5] is Excl(parent) */
+
+   pthread_create(&thread_id, 0, worker_thread, (void*)x);
+
+   use(x[5]); /* read access */
+
+   /* Just before the threads join, x[5] is ShR (read by both parent
+      and child) */
+   pthread_join(thread_id, 0);
+   /* x[5] is Excl(parent), because only parent and child accessed it
+      and child has merged to parent.  So now it's ok for parent to
+      access it without locking. */
+
+   x[5] = 0; /* write access */
+
+   return x[5];
+}
diff --git a/helgrind/tests/tc03_re_excl.stderr.exp-glibc25-amd64 b/helgrind/tests/tc03_re_excl.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/tc03_re_excl.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc03_re_excl.stdout.exp b/helgrind/tests/tc03_re_excl.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc03_re_excl.stdout.exp
diff --git a/helgrind/tests/tc03_re_excl.vgtest b/helgrind/tests/tc03_re_excl.vgtest
new file mode 100644
index 0000000..e12924a
--- /dev/null
+++ b/helgrind/tests/tc03_re_excl.vgtest
@@ -0,0 +1 @@
+prog: tc03_re_excl
diff --git a/helgrind/tests/tc04_free_lock.c b/helgrind/tests/tc04_free_lock.c
new file mode 100644
index 0000000..c1ffa25
--- /dev/null
+++ b/helgrind/tests/tc04_free_lock.c
@@ -0,0 +1,50 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* Delete memory that has a held lock and see what happens. */
+
+typedef struct { int stuff[2000]; 
+                 pthread_mutex_t lock; int morestuff[2000]; } XX;
+
+void bar ( void );
+void foo ( void );
+
+int main ( void )
+{
+   XX* xx = malloc(sizeof(XX));
+   assert(xx);
+
+   pthread_mutex_init( &xx->lock, NULL );
+
+   pthread_mutex_lock( &xx->lock );
+
+   free(xx);
+
+   bar();
+   foo();
+   bar();
+
+   return 0;
+}
+
+/* Try the same, on the stack */
+void bar ( void )
+{
+  pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER;
+  //  pthread_mutex_init( &mx, NULL );
+  pthread_mutex_lock( &mx );
+  /* now just abandon mx */
+}
+
+/* and again ... */
+void foo ( void )
+{
+  pthread_mutex_t mx;
+  pthread_mutex_init( &mx, NULL );
+  pthread_mutex_lock( &mx );
+  /* now just abandon mx */
+}
+
diff --git a/helgrind/tests/tc04_free_lock.stderr.exp-glibc25-amd64 b/helgrind/tests/tc04_free_lock.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..b14e3b6
--- /dev/null
+++ b/helgrind/tests/tc04_free_lock.stderr.exp-glibc25-amd64
@@ -0,0 +1,35 @@
+
+Thread #1 is the program's root thread
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: free (vg_replace_malloc.c:...)
+   by 0x........: main (tc04_free_lock.c:24)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: main (tc04_free_lock.c:20)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: bar (tc04_free_lock.c:40)
+   by 0x........: main (tc04_free_lock.c:26)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: bar (tc04_free_lock.c:38)
+   by 0x........: main (tc04_free_lock.c:26)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: foo (tc04_free_lock.c:49)
+   by 0x........: main (tc04_free_lock.c:27)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: foo (tc04_free_lock.c:46)
+   by 0x........: main (tc04_free_lock.c:27)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: bar (tc04_free_lock.c:40)
+   by 0x........: main (tc04_free_lock.c:28)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: bar (tc04_free_lock.c:38)
+   by 0x........: main (tc04_free_lock.c:28)
+
+ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc04_free_lock.stdout.exp b/helgrind/tests/tc04_free_lock.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc04_free_lock.stdout.exp
diff --git a/helgrind/tests/tc04_free_lock.vgtest b/helgrind/tests/tc04_free_lock.vgtest
new file mode 100644
index 0000000..27d28bf
--- /dev/null
+++ b/helgrind/tests/tc04_free_lock.vgtest
@@ -0,0 +1 @@
+prog: tc04_free_lock
diff --git a/helgrind/tests/tc05_simple_race.c b/helgrind/tests/tc05_simple_race.c
new file mode 100644
index 0000000..287c12c
--- /dev/null
+++ b/helgrind/tests/tc05_simple_race.c
@@ -0,0 +1,44 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple test program, has a race.  Parent and child both modify y
+   with no locking.  This is the program shown in Fig 2 of the
+   original Eraser paper by Savage et al. */
+
+int y = 0, v = 0;
+pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
+
+void* child_fn ( void* arg )
+{
+   /* "Thread 2" in the paper */
+   pthread_mutex_lock( &mu );
+   v = v + 1;
+   pthread_mutex_unlock( &mu );
+   y = y + 1;
+   return NULL;
+}
+
+int main ( void )
+{
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   /* "Thread 1" in the paper */
+   y = y + 1;
+   pthread_mutex_lock( &mu );
+   v = v + 1;
+   pthread_mutex_unlock( &mu );
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   return 0;
+}
diff --git a/helgrind/tests/tc05_simple_race.stderr.exp-glibc25-amd64 b/helgrind/tests/tc05_simple_race.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..8c15d1a
--- /dev/null
+++ b/helgrind/tests/tc05_simple_race.stderr.exp-glibc25-amd64
@@ -0,0 +1,18 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc05_simple_race.c:27)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc05_simple_race.c:33)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc05_simple_race.stderr.exp-glibc25-x86 b/helgrind/tests/tc05_simple_race.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..fb6dccf
--- /dev/null
+++ b/helgrind/tests/tc05_simple_race.stderr.exp-glibc25-x86
@@ -0,0 +1,17 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc05_simple_race.c:27)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc05_simple_race.c:33)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc05_simple_race.stdout.exp b/helgrind/tests/tc05_simple_race.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc05_simple_race.stdout.exp
diff --git a/helgrind/tests/tc05_simple_race.vgtest b/helgrind/tests/tc05_simple_race.vgtest
new file mode 100644
index 0000000..27f3881
--- /dev/null
+++ b/helgrind/tests/tc05_simple_race.vgtest
@@ -0,0 +1 @@
+prog: tc05_simple_race
diff --git a/helgrind/tests/tc06_two_races.c b/helgrind/tests/tc06_two_races.c
new file mode 100644
index 0000000..65c83ef
--- /dev/null
+++ b/helgrind/tests/tc06_two_races.c
@@ -0,0 +1,43 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple test program, has two races.  A happens-before detector can only
+   ever detect one of them, though. */
+
+int unprot1 = 0, unprot2 = 0, prot = 0;
+pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
+
+void* child_fn ( void* arg )
+{
+   unprot1 ++;
+   pthread_mutex_lock( &mu );
+   prot ++;
+   pthread_mutex_unlock( &mu );
+   unprot2 ++;
+   return NULL;
+}
+
+int main ( void )
+{
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   unprot1 ++;
+   pthread_mutex_lock( &mu );
+   prot ++;
+   pthread_mutex_unlock( &mu );
+   unprot2 ++;
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   return 0;
+}
diff --git a/helgrind/tests/tc06_two_races.stderr.exp-glibc25-amd64 b/helgrind/tests/tc06_two_races.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..db74a70
--- /dev/null
+++ b/helgrind/tests/tc06_two_races.stderr.exp-glibc25-amd64
@@ -0,0 +1,25 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc06_two_races.c:26)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc06_two_races.c:31)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc06_two_races.c:35)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc06_two_races.stderr.exp-glibc25-x86 b/helgrind/tests/tc06_two_races.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..34874fc
--- /dev/null
+++ b/helgrind/tests/tc06_two_races.stderr.exp-glibc25-x86
@@ -0,0 +1,24 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc06_two_races.c:26)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc06_two_races.c:31)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: main (tc06_two_races.c:35)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc06_two_races.stdout.exp b/helgrind/tests/tc06_two_races.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc06_two_races.stdout.exp
diff --git a/helgrind/tests/tc06_two_races.vgtest b/helgrind/tests/tc06_two_races.vgtest
new file mode 100644
index 0000000..f6f5247
--- /dev/null
+++ b/helgrind/tests/tc06_two_races.vgtest
@@ -0,0 +1 @@
+prog: tc06_two_races
diff --git a/helgrind/tests/tc07_hbl1.c b/helgrind/tests/tc07_hbl1.c
new file mode 100644
index 0000000..58e6564
--- /dev/null
+++ b/helgrind/tests/tc07_hbl1.c
@@ -0,0 +1,77 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple test program, no race.  Parent and child both modify x and
+   use the hardware bus lock. */
+
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_ppc32_aix5
+#undef PLAT_ppc64_aix5
+
+#if !defined(_AIX) && defined(__i386__)
+#  define PLAT_x86_linux 1
+#elif !defined(_AIX) && defined(__x86_64__)
+#  define PLAT_amd64_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__)
+#  define PLAT_ppc32_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__)
+#  define PLAT_ppc64_linux 1
+#elif defined(_AIX) && defined(__64BIT__)
+#  define PLAT_ppc64_aix5 1
+#elif defined(_AIX) && !defined(__64BIT__)
+#  define PLAT_ppc32_aix5 1
+#endif
+
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
+#  define INC(_lval) \
+      __asm__ __volatile__ ( \
+      "lock ; incl (%0)" : /*out*/ : /*in*/"r"(&(_lval)) : "memory", "cc" )
+#elif defined(PLAT_ppc32_linux) || defined(PLAT_ppc64_linux)
+#  define INC(_lval)                      \
+   __asm__ __volatile__(                  \
+      "1:\n"                              \
+      "        lwarx 15,0,%0\n"           \
+      "        addi 15,15,1\n"            \
+      "        stwcx. 15,0,%0\n"          \
+      "        bne- 1b"                   \
+      : /*out*/ : /*in*/ "b"(&(_lval))    \
+      : /*trash*/ "r15", "cr0", "memory"  \
+   )
+#else
+#  error "Fix Me for this platform"
+#endif
+
+
+int x = 0;
+
+void* child_fn ( void* arg )
+{
+   INC(x);
+   return NULL;
+}
+
+int main ( void )
+{
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   INC(x);
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   printf("x = %d\n", x);
+   return 0;
+}
diff --git a/helgrind/tests/tc07_hbl1.stderr.exp-glibc25-amd64 b/helgrind/tests/tc07_hbl1.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/tc07_hbl1.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc07_hbl1.stdout.exp b/helgrind/tests/tc07_hbl1.stdout.exp
new file mode 100644
index 0000000..407de30
--- /dev/null
+++ b/helgrind/tests/tc07_hbl1.stdout.exp
@@ -0,0 +1 @@
+x = 2
diff --git a/helgrind/tests/tc07_hbl1.vgtest b/helgrind/tests/tc07_hbl1.vgtest
new file mode 100644
index 0000000..71c463f
--- /dev/null
+++ b/helgrind/tests/tc07_hbl1.vgtest
@@ -0,0 +1 @@
+prog: tc07_hbl1
diff --git a/helgrind/tests/tc08_hbl2.c b/helgrind/tests/tc08_hbl2.c
new file mode 100644
index 0000000..5362faa
--- /dev/null
+++ b/helgrind/tests/tc08_hbl2.c
@@ -0,0 +1,117 @@
+
+/* FIXME: this is basically a bad test as it is scheduling-
+   sensitive.  Sometimes the output is:
+
+   child: new value 6
+   child: new value 10
+   done, x = 10
+
+   and sometimes
+
+   child: new value 10
+   done, x = 10
+*/
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Simple test program, no race.  Parent writes atomically to a counter
+   whilst child reads it.  When counter reaches a prearranged value, 
+   child joins back to parent.  Parent (writer) uses hardware bus lock;
+   child is only reading and so does not need to use a bus lock. */
+
+
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_ppc32_aix5
+#undef PLAT_ppc64_aix5
+
+#if !defined(_AIX) && defined(__i386__)
+#  define PLAT_x86_linux 1
+#elif !defined(_AIX) && defined(__x86_64__)
+#  define PLAT_amd64_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__)
+#  define PLAT_ppc32_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__)
+#  define PLAT_ppc64_linux 1
+#elif defined(_AIX) && defined(__64BIT__)
+#  define PLAT_ppc64_aix5 1
+#elif defined(_AIX) && !defined(__64BIT__)
+#  define PLAT_ppc32_aix5 1
+#endif
+
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
+#  define INC(_lval) \
+      __asm__ __volatile__ ( \
+      "lock ; incl (%0)" : /*out*/ : /*in*/"r"(&(_lval)) : "memory", "cc" )
+#elif defined(PLAT_ppc32_linux) || defined(PLAT_ppc64_linux)
+#  define INC(_lval)                      \
+   __asm__ __volatile__(                  \
+      "1:\n"                              \
+      "        lwarx 15,0,%0\n"           \
+      "        addi 15,15,1\n"            \
+      "        stwcx. 15,0,%0\n"          \
+      "        bne- 1b"                   \
+      : /*out*/ : /*in*/ "b"(&(_lval))    \
+      : /*trash*/ "r15", "cr0", "memory"  \
+   )
+#else
+#  error "Fix Me for this platform"
+#endif
+
+
+
+#define LIMIT 10
+
+volatile int x = 0;
+
+void* child_fn ( void* arg )
+{
+   int q = 0;
+   int oldx = 0;
+   int ctr = 0;
+   while (1) {
+      q = (x >= LIMIT);
+      if (x != oldx) {
+         oldx = x;
+         printf("child: new value %d\n", oldx);
+         fflush(stdout);
+      }
+      if (q) break;
+      /* Make sure the parent doesn't starve.  Seems to be a problem
+	 on very slow machines. */
+      ctr++;
+      if (ctr == 2000000) sleep(1);
+   }
+   return NULL;
+}
+
+int main ( void )
+{
+   pthread_t child;
+   int i;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   for (i = 0; i < LIMIT; i++) {
+      INC(x);
+      if (i == 5) sleep(1); /* make sure child doesn't starve */
+   }
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   printf("done, x = %d\n", x);
+
+   return 0;
+}
diff --git a/helgrind/tests/tc08_hbl2.stderr.exp-glibc25-amd64 b/helgrind/tests/tc08_hbl2.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/tc08_hbl2.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc08_hbl2.stdout.exp b/helgrind/tests/tc08_hbl2.stdout.exp
new file mode 100644
index 0000000..ce39ad5
--- /dev/null
+++ b/helgrind/tests/tc08_hbl2.stdout.exp
@@ -0,0 +1,3 @@
+child: new value 6
+child: new value 10
+done, x = 10
diff --git a/helgrind/tests/tc08_hbl2.vgtest b/helgrind/tests/tc08_hbl2.vgtest
new file mode 100644
index 0000000..6d0a2cb
--- /dev/null
+++ b/helgrind/tests/tc08_hbl2.vgtest
@@ -0,0 +1 @@
+prog: tc08_hbl2
diff --git a/helgrind/tests/tc09_bad_unlock.c b/helgrind/tests/tc09_bad_unlock.c
new file mode 100644
index 0000000..bb44eb3
--- /dev/null
+++ b/helgrind/tests/tc09_bad_unlock.c
@@ -0,0 +1,52 @@
+
+/* Check that an error is reported for various kinds of bogus
+   pthread_mutex_unlock calls. */
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void* child_fn ( void* arg )
+{
+   pthread_mutex_unlock( (pthread_mutex_t*)arg ); /* ERROR */
+   return NULL;
+}
+
+void nearly_main ( void )
+{
+   pthread_t child;
+   pthread_mutex_t mx1, mx2;
+   int bogus[100], i;
+   /* fill bogus with values which will cause glibc's pth_mx_unlock to fail */
+   for (i = 0; i < 100; i++) bogus[i] = 0xFFFFFFFF;
+   /* Unlocking a lock that is already unlocked */
+   pthread_mutex_init( &mx1, NULL );
+   pthread_mutex_lock( &mx1 );
+   pthread_mutex_unlock( &mx1 );
+
+   pthread_mutex_unlock( &mx1 ); /* ERROR */
+
+   /* Unlocking a lock that is held by a different thread */
+
+   pthread_mutex_init( &mx2, NULL );
+   pthread_mutex_lock( &mx2 );
+   // start child and get it to unlock this lock
+
+   pthread_create( &child, NULL, child_fn, (void*)&mx2 );
+      /* child runs and attempts to unlock our lock.  Error 
+         is reported in child_fn. */
+   pthread_join(child, NULL );
+
+   /* Unlocking a totally bogus lock. */
+   pthread_mutex_unlock( (pthread_mutex_t*) &bogus[50] ); /* ERROR */
+
+   /* Now we get a freeing-locked-lock error, since the stack
+      frame is removed whilst mx2 is still locked. */
+}
+
+int main ( void )
+{
+   nearly_main();
+   nearly_main();
+   return 0;
+}
diff --git a/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc23-amd64 b/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc23-amd64
new file mode 100644
index 0000000..dc6bf41
--- /dev/null
+++ b/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc23-amd64
@@ -0,0 +1,86 @@
+
+Thread #1 is the program's root thread
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:27)
+   by 0x........: main (tc09_bad_unlock.c:49)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:23)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:35)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #2 unlocked lock at 0x........ currently held by thread #1
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: child_fn (tc09_bad_unlock.c:11)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: nearly_main (tc09_bad_unlock.c:45)
+   by 0x........: main (tc09_bad_unlock.c:49)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:27)
+   by 0x........: main (tc09_bad_unlock.c:50)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:23)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:35)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #3 unlocked lock at 0x........ currently held by thread #1
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: child_fn (tc09_bad_unlock.c:11)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: nearly_main (tc09_bad_unlock.c:45)
+   by 0x........: main (tc09_bad_unlock.c:50)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+ERROR SUMMARY: 8 errors from 8 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc25-amd64 b/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..e851dc2
--- /dev/null
+++ b/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc25-amd64
@@ -0,0 +1,98 @@
+
+Thread #1 is the program's root thread
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:27)
+   by 0x........: main (tc09_bad_unlock.c:49)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:23)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:35)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #2 unlocked lock at 0x........ currently held by thread #1
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: child_fn (tc09_bad_unlock.c:11)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: nearly_main (tc09_bad_unlock.c:45)
+   by 0x........: main (tc09_bad_unlock.c:49)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:27)
+   by 0x........: main (tc09_bad_unlock.c:50)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:23)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:35)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #3 unlocked lock at 0x........ currently held by thread #1
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: child_fn (tc09_bad_unlock.c:11)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: nearly_main (tc09_bad_unlock.c:45)
+   by 0x........: main (tc09_bad_unlock.c:50)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc25-x86 b/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..84601c4
--- /dev/null
+++ b/helgrind/tests/tc09_bad_unlock.stderr.exp-glibc25-x86
@@ -0,0 +1,96 @@
+
+Thread #1 is the program's root thread
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:27)
+   by 0x........: main (tc09_bad_unlock.c:49)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:23)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:35)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #2 unlocked lock at 0x........ currently held by thread #1
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: child_fn (tc09_bad_unlock.c:11)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: nearly_main (tc09_bad_unlock.c:45)
+   by 0x........: main (tc09_bad_unlock.c:49)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:49)
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:27)
+   by 0x........: main (tc09_bad_unlock.c:50)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:23)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:35)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #3 unlocked lock at 0x........ currently held by thread #1
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: child_fn (tc09_bad_unlock.c:11)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:41)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: nearly_main (tc09_bad_unlock.c:45)
+   by 0x........: main (tc09_bad_unlock.c:50)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc09_bad_unlock.c:31)
+   by 0x........: main (tc09_bad_unlock.c:50)
+
+ERROR SUMMARY: 10 errors from 10 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc09_bad_unlock.stdout.exp b/helgrind/tests/tc09_bad_unlock.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc09_bad_unlock.stdout.exp
diff --git a/helgrind/tests/tc09_bad_unlock.vgtest b/helgrind/tests/tc09_bad_unlock.vgtest
new file mode 100644
index 0000000..d09a702
--- /dev/null
+++ b/helgrind/tests/tc09_bad_unlock.vgtest
@@ -0,0 +1 @@
+prog: tc09_bad_unlock
diff --git a/helgrind/tests/tc10_rec_lock.c b/helgrind/tests/tc10_rec_lock.c
new file mode 100644
index 0000000..648305c
--- /dev/null
+++ b/helgrind/tests/tc10_rec_lock.c
@@ -0,0 +1,49 @@
+
+/* Do simple things with a recursive mutex. */
+
+/* Needed for older glibcs (2.3 and older, at least) who don't
+   otherwise "know" about pthread_rwlock_anything or about
+   PTHREAD_MUTEX_RECURSIVE (amongst things). */
+#define _GNU_SOURCE 1
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <pthread.h>
+
+void nearly_main ( void )
+{
+   pthread_mutex_t mx1;
+   pthread_mutexattr_t attr;
+   int r;
+
+   r = pthread_mutexattr_init( &attr );
+   assert(r==0);
+   r = pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE );
+   assert(r==0);
+   r = pthread_mutex_init( &mx1, &attr );
+   assert(r==0);
+
+   fprintf(stderr, "before lock #1\n");
+   r = pthread_mutex_lock( &mx1 ); assert(r == 0);
+   fprintf(stderr, "before lock #2\n");
+   r = pthread_mutex_lock( &mx1 ); assert(r == 0);
+   fprintf(stderr, "before lock #3\n");
+   r = pthread_mutex_lock( &mx1 ); assert(r == 0);
+
+   fprintf(stderr, "before unlock #1\n");
+   r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
+   fprintf(stderr, "before unlock #2\n");
+   r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
+   fprintf(stderr, "before unlock #3\n");
+   r = pthread_mutex_unlock( &mx1 ); assert(r == 0);
+
+   fprintf(stderr, "before unlock #4\n");
+   r = pthread_mutex_unlock( &mx1 ); /* FAILS: assert(r == 0); */
+}
+
+int main ( void )
+{
+   nearly_main();
+   return 0;
+}
diff --git a/helgrind/tests/tc10_rec_lock.stderr.exp-glibc25-amd64 b/helgrind/tests/tc10_rec_lock.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..a301ee7
--- /dev/null
+++ b/helgrind/tests/tc10_rec_lock.stderr.exp-glibc25-amd64
@@ -0,0 +1,26 @@
+
+before lock #1
+before lock #2
+before lock #3
+before unlock #1
+before unlock #2
+before unlock #3
+before unlock #4
+Thread #1 is the program's root thread
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc10_rec_lock.c:42)
+   by 0x........: main (tc10_rec_lock.c:47)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc10_rec_lock.c:24)
+   by 0x........: main (tc10_rec_lock.c:47)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 1 (EPERM: Operation not permitted)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: nearly_main (tc10_rec_lock.c:42)
+   by 0x........: main (tc10_rec_lock.c:47)
+
+ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc10_rec_lock.stdout.exp b/helgrind/tests/tc10_rec_lock.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc10_rec_lock.stdout.exp
diff --git a/helgrind/tests/tc10_rec_lock.vgtest b/helgrind/tests/tc10_rec_lock.vgtest
new file mode 100644
index 0000000..bfd0f89
--- /dev/null
+++ b/helgrind/tests/tc10_rec_lock.vgtest
@@ -0,0 +1 @@
+prog: tc10_rec_lock
diff --git a/helgrind/tests/tc11_XCHG.c b/helgrind/tests/tc11_XCHG.c
new file mode 100644
index 0000000..5b46c7e
--- /dev/null
+++ b/helgrind/tests/tc11_XCHG.c
@@ -0,0 +1,92 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* Simple test program, no race.  Parent and child both modify x and
+   use the hardware bus lock (implicitly, since XCHG r,m on x86/amd64
+   does not require an explicit LOCK prefix.). */
+
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_ppc32_aix5
+#undef PLAT_ppc64_aix5
+
+#if !defined(_AIX) && defined(__i386__)
+#  define PLAT_x86_linux 1
+#elif !defined(_AIX) && defined(__x86_64__)
+#  define PLAT_amd64_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && !defined(__powerpc64__)
+#  define PLAT_ppc32_linux 1
+#elif !defined(_AIX) && defined(__powerpc__) && defined(__powerpc64__)
+#  define PLAT_ppc64_linux 1
+#elif defined(_AIX) && defined(__64BIT__)
+#  define PLAT_ppc64_aix5 1
+#elif defined(_AIX) && !defined(__64BIT__)
+#  define PLAT_ppc32_aix5 1
+#endif
+
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
+#  define XCHG_M_R(_addr,_lval) \
+     __asm__ __volatile__( \
+        "xchgl %0, %1" \
+        : /*out*/ "+r"(_lval) \
+        : /*in*/  "m"(_addr) \
+        : "memory", "cc" \
+     )
+#  define XCHG_M_R_with_redundant_LOCK(_addr,_lval) \
+     __asm__ __volatile__( \
+        "lock xchgl %0, %1" \
+        : /*out*/ "+r"(_lval) \
+        : /*in*/  "m"(_addr) \
+        : "memory", "cc" \
+     )
+#else
+#  define XCHG_M_R(_addr,_lval) \
+      do { int tmp = *(int*)(& _addr); \
+           *(int*)(& _addr) = (_lval); \
+           _lval = tmp; \
+      } while (0)
+#  define XCHG_M_R_with_redundant_LOCK(_addr,_lval) \
+      XCHG_M_R(_addr,_lval)
+#endif
+
+int x = 0;
+
+void* child_fn ( void* arg )
+{
+   int v = 12345;
+   XCHG_M_R_with_redundant_LOCK(x, v);
+   assert(v == 0 || v == 6789);
+   return NULL;
+}
+
+int main ( void )
+{
+   int v = 6789;
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   XCHG_M_R(x, v);
+   assert(v == 0 || v == 12345);
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   if (v == 0 || v == 12345)
+      printf("success\n");
+   else
+      printf("failure\n");
+
+   return v;
+}
diff --git a/helgrind/tests/tc11_XCHG.stderr.exp-glibc25-amd64 b/helgrind/tests/tc11_XCHG.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..d18786f
--- /dev/null
+++ b/helgrind/tests/tc11_XCHG.stderr.exp-glibc25-amd64
@@ -0,0 +1,3 @@
+
+
+ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc11_XCHG.stdout.exp b/helgrind/tests/tc11_XCHG.stdout.exp
new file mode 100644
index 0000000..2e9ba47
--- /dev/null
+++ b/helgrind/tests/tc11_XCHG.stdout.exp
@@ -0,0 +1 @@
+success
diff --git a/helgrind/tests/tc11_XCHG.vgtest b/helgrind/tests/tc11_XCHG.vgtest
new file mode 100644
index 0000000..342199b
--- /dev/null
+++ b/helgrind/tests/tc11_XCHG.vgtest
@@ -0,0 +1 @@
+prog: tc11_XCHG
diff --git a/helgrind/tests/tc12_rwl_trivial.c b/helgrind/tests/tc12_rwl_trivial.c
new file mode 100644
index 0000000..9dc8e84
--- /dev/null
+++ b/helgrind/tests/tc12_rwl_trivial.c
@@ -0,0 +1,34 @@
+
+/* Needed for older glibcs (2.3 and older, at least) who don't
+   otherwise "know" about pthread_rwlock_anything or about
+   PTHREAD_MUTEX_RECURSIVE (amongst things). */
+#define _GNU_SOURCE 1
+
+#include <stdio.h>
+#include <pthread.h>
+#include <assert.h>
+
+/* Do trivial stuff with a reader-writer lock. */
+
+int main ( void )
+{
+  int r;
+  pthread_rwlock_t rwl;
+
+  r = pthread_rwlock_init( &rwl, NULL );  assert(r == 0);
+
+  r = pthread_rwlock_wrlock( &rwl );      assert(r == 0);
+  r = pthread_rwlock_unlock( &rwl );      assert(r == 0);
+
+  r = pthread_rwlock_rdlock( &rwl );      assert(r == 0);
+  r = pthread_rwlock_rdlock( &rwl );      assert(r == 0);
+  r = pthread_rwlock_unlock( &rwl );      assert(r == 0);
+  r = pthread_rwlock_unlock( &rwl );      assert(r == 0);
+
+  /* this should fail - lock is unowned now */
+  r = pthread_rwlock_unlock( &rwl );      assert(r == 0);
+
+  r = pthread_rwlock_destroy( &rwl );     assert(r == 0);
+
+  return 0;
+}
diff --git a/helgrind/tests/tc12_rwl_trivial.stderr.exp-glibc25-amd64 b/helgrind/tests/tc12_rwl_trivial.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..cbc403e
--- /dev/null
+++ b/helgrind/tests/tc12_rwl_trivial.stderr.exp-glibc25-amd64
@@ -0,0 +1,11 @@
+
+Thread #1 is the program's root thread
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc12_rwl_trivial.c:29)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc12_rwl_trivial.c:18)
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc12_rwl_trivial.stdout.exp b/helgrind/tests/tc12_rwl_trivial.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc12_rwl_trivial.stdout.exp
diff --git a/helgrind/tests/tc12_rwl_trivial.vgtest b/helgrind/tests/tc12_rwl_trivial.vgtest
new file mode 100644
index 0000000..fdcd644
--- /dev/null
+++ b/helgrind/tests/tc12_rwl_trivial.vgtest
@@ -0,0 +1 @@
+prog: tc12_rwl_trivial
diff --git a/helgrind/tests/tc13_laog1.c b/helgrind/tests/tc13_laog1.c
new file mode 100644
index 0000000..e42ca98
--- /dev/null
+++ b/helgrind/tests/tc13_laog1.c
@@ -0,0 +1,33 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* The simplest possible test that triggers a lock order acquisition
+   error. */
+
+int main ( void )
+{
+   int r;
+   pthread_mutex_t mx1, mx2;
+   r = pthread_mutex_init( &mx1, NULL ); assert(r==0);
+   r = pthread_mutex_init( &mx2, NULL ); assert(r==0);
+
+   r = pthread_mutex_lock( &mx1 ); assert(r==0);
+   r = pthread_mutex_lock( &mx2 ); assert(r==0);
+
+   r = pthread_mutex_unlock( &mx1 ); assert(r==0);
+   r = pthread_mutex_unlock( &mx2 ); assert(r==0);
+
+   r = pthread_mutex_lock( &mx2 ); assert(r==0); /* error */
+   r = pthread_mutex_lock( &mx1 ); assert(r==0);
+
+   r = pthread_mutex_unlock( &mx1 ); assert(r==0);
+   r = pthread_mutex_unlock( &mx2 ); assert(r==0);
+
+   r = pthread_mutex_destroy( &mx1 );
+   r = pthread_mutex_destroy( &mx2 );
+
+   return 0;
+}
diff --git a/helgrind/tests/tc13_laog1.stderr.exp-glibc25-amd64 b/helgrind/tests/tc13_laog1.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..74aa263
--- /dev/null
+++ b/helgrind/tests/tc13_laog1.stderr.exp-glibc25-amd64
@@ -0,0 +1,14 @@
+
+Thread #1 is the program's root thread
+
+Thread #1: lock order "0x........ before 0x........" violated
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc13_laog1.c:24)
+  Required order was established by acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc13_laog1.c:17)
+  followed by a later acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc13_laog1.c:18)
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc13_laog1.stdout.exp b/helgrind/tests/tc13_laog1.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc13_laog1.stdout.exp
diff --git a/helgrind/tests/tc13_laog1.vgtest b/helgrind/tests/tc13_laog1.vgtest
new file mode 100644
index 0000000..9fa71cd
--- /dev/null
+++ b/helgrind/tests/tc13_laog1.vgtest
@@ -0,0 +1 @@
+prog: tc13_laog1
diff --git a/helgrind/tests/tc14_laog_dinphils.c b/helgrind/tests/tc14_laog_dinphils.c
new file mode 100644
index 0000000..c5af8c1
--- /dev/null
+++ b/helgrind/tests/tc14_laog_dinphils.c
@@ -0,0 +1,42 @@
+
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Naive dining philosophers with inconsistent lock acquisition
+   ordering. */
+
+static pthread_t phil[5];
+static pthread_mutex_t chop[5];
+
+void* dine ( void* arg )
+{
+   int i;
+   long left = (long)arg;
+   long right = (left + 1) % 5;
+   for (i = 0; i < 1000/*arbitrary*/; i++) {
+      pthread_mutex_lock(&chop[left]);
+      pthread_mutex_lock(&chop[right]);
+      /* eating */
+      pthread_mutex_unlock(&chop[left]);
+      pthread_mutex_unlock(&chop[right]);
+   }
+   return NULL;
+}
+
+int main ( void )
+{
+   long i;
+   for (i = 0; i < 5; i++)
+      pthread_mutex_init( &chop[i], NULL);
+
+   for (i = 0; i < 5; i++)
+      pthread_create(&phil[i], NULL, dine, (void*)i );
+
+   sleep(1);
+
+   for (i = 0; i < 5; i++)
+      pthread_join(phil[i], NULL);
+
+   return 0;
+}
diff --git a/helgrind/tests/tc14_laog_dinphils.stderr.exp-glibc25-amd64 b/helgrind/tests/tc14_laog_dinphils.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..5cedeb8
--- /dev/null
+++ b/helgrind/tests/tc14_laog_dinphils.stderr.exp-glibc25-amd64
@@ -0,0 +1,16 @@
+
+Thread #6 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc14_laog_dinphils.c:34)
+
+Thread #6: lock order "0x........ before 0x........" violated
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: dine (tc14_laog_dinphils.c:19)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+
+ERROR SUMMARY: 1000 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc14_laog_dinphils.stderr.exp-glibc25-x86 b/helgrind/tests/tc14_laog_dinphils.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..c4db6cf
--- /dev/null
+++ b/helgrind/tests/tc14_laog_dinphils.stderr.exp-glibc25-x86
@@ -0,0 +1,15 @@
+
+Thread #6 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc14_laog_dinphils.c:34)
+
+Thread #6: lock order "0x........ before 0x........" violated
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: dine (tc14_laog_dinphils.c:19)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+
+ERROR SUMMARY: 1000 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc14_laog_dinphils.stdout.exp b/helgrind/tests/tc14_laog_dinphils.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc14_laog_dinphils.stdout.exp
diff --git a/helgrind/tests/tc14_laog_dinphils.vgtest b/helgrind/tests/tc14_laog_dinphils.vgtest
new file mode 100644
index 0000000..5871b73
--- /dev/null
+++ b/helgrind/tests/tc14_laog_dinphils.vgtest
@@ -0,0 +1 @@
+prog: tc14_laog_dinphils
diff --git a/helgrind/tests/tc15_laog_lockdel.c b/helgrind/tests/tc15_laog_lockdel.c
new file mode 100644
index 0000000..ff01605
--- /dev/null
+++ b/helgrind/tests/tc15_laog_lockdel.c
@@ -0,0 +1,68 @@
+
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+/* Test that locks, having entered the lock acquisition tracking
+   machinery, are forgotten by it when the memory they reside in
+   becomes inaccessible. */
+
+int main ( void )
+{
+   int r;
+   pthread_mutex_t *mx1, *mx2;
+
+   mx1 = malloc(sizeof(pthread_mutex_t));
+   mx2 = malloc(sizeof(pthread_mutex_t));
+
+   assert(mx1);
+   assert(mx2);
+
+   r = pthread_mutex_init( mx1, NULL ); assert(r==0);
+   r = pthread_mutex_init( mx2, NULL ); assert(r==0);
+
+   /* Establish order 1 -> 2 */
+   fprintf(stderr, "Establish order 1 -> 2\n");
+   r = pthread_mutex_lock( mx1 ); assert(r==0);
+   r = pthread_mutex_lock( mx2 ); assert(r==0);
+
+   r = pthread_mutex_unlock( mx1 ); assert(r==0);
+   r = pthread_mutex_unlock( mx2 ); assert(r==0);
+
+   /* Try order 2 -> 1.  This gives an error. */
+   fprintf(stderr, "Try order 2 -> 1.  This gives an error.\n");
+   r = pthread_mutex_lock( mx2 ); assert(r==0); /* error */
+   r = pthread_mutex_lock( mx1 ); assert(r==0);
+
+   r = pthread_mutex_unlock( mx1 ); assert(r==0);
+   r = pthread_mutex_unlock( mx2 ); assert(r==0);
+
+   /* Free 2 and re-allocate it.  This gives it a new identity, 
+      so a second locking sequence 2 -> 1 should now be OK. */
+   fprintf(stderr, 
+           "Free 2 and re-allocate it.  This gives it a new identity,\n");
+   fprintf(stderr, "so a second locking sequence 2 -> 1 should now be OK.\n");
+   pthread_mutex_destroy( mx2 );
+   free(mx2);
+   mx2 = malloc(sizeof(pthread_mutex_t));
+   assert(mx2);
+   r = pthread_mutex_init( mx2, NULL ); assert(r==0);
+
+   r = pthread_mutex_lock( mx2 ); assert(r==0); /* error */
+   r = pthread_mutex_lock( mx1 ); assert(r==0);
+
+   r = pthread_mutex_unlock( mx1 ); assert(r==0);
+   r = pthread_mutex_unlock( mx2 ); assert(r==0);
+
+   /* done */
+
+   fprintf(stderr, "done\n");
+   r = pthread_mutex_destroy( mx1 );
+   r = pthread_mutex_destroy( mx2 );
+
+   free( mx1 );
+   free( mx2 );
+
+   return 0;
+}
diff --git a/helgrind/tests/tc15_laog_lockdel.stderr.exp-glibc25-amd64 b/helgrind/tests/tc15_laog_lockdel.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..4bab304
--- /dev/null
+++ b/helgrind/tests/tc15_laog_lockdel.stderr.exp-glibc25-amd64
@@ -0,0 +1,19 @@
+
+Establish order 1 -> 2
+Try order 2 -> 1.  This gives an error.
+Thread #1 is the program's root thread
+
+Thread #1: lock order "0x........ before 0x........" violated
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc15_laog_lockdel.c:36)
+  Required order was established by acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc15_laog_lockdel.c:27)
+  followed by a later acquisition of lock at 0x........
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc15_laog_lockdel.c:28)
+Free 2 and re-allocate it.  This gives it a new identity,
+so a second locking sequence 2 -> 1 should now be OK.
+done
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc15_laog_lockdel.stdout.exp b/helgrind/tests/tc15_laog_lockdel.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc15_laog_lockdel.stdout.exp
diff --git a/helgrind/tests/tc15_laog_lockdel.vgtest b/helgrind/tests/tc15_laog_lockdel.vgtest
new file mode 100644
index 0000000..bd7a2ec
--- /dev/null
+++ b/helgrind/tests/tc15_laog_lockdel.vgtest
@@ -0,0 +1 @@
+prog: tc15_laog_lockdel
diff --git a/helgrind/tests/tc16_byterace.c b/helgrind/tests/tc16_byterace.c
new file mode 100644
index 0000000..1916c37
--- /dev/null
+++ b/helgrind/tests/tc16_byterace.c
@@ -0,0 +1,42 @@
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+/* Simple demonstration of lockset tracking at byte granularity. */
+
+char bytes[10];
+
+void* child_fn ( void* arg )
+{
+   int i;
+   for (i = 0; i < 5; i++)
+      bytes[2*i + 0] ++;
+   return NULL;
+}
+
+int main ( void )
+{
+   int i;
+   pthread_t child;
+
+   if (pthread_create(&child, NULL, child_fn, NULL)) {
+      perror("pthread_create");
+      exit(1);
+   }
+
+   /* Unprotected relative to child, but harmless, since different
+      bytes accessed */
+   for (i = 0; i < 5; i++)
+      bytes[2*i + 1] ++;
+
+   /* Unprotected relative to child, but harmful; same bytes */
+   for (i = 0; i < 3; i++)
+      bytes[3*i + 1] ++;
+
+   if (pthread_join(child, NULL)) {
+      perror("pthread join");
+      exit(1);
+   }
+
+   return 0;
+}
diff --git a/helgrind/tests/tc16_byterace.stderr.exp-glibc25-amd64 b/helgrind/tests/tc16_byterace.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..e4286bc
--- /dev/null
+++ b/helgrind/tests/tc16_byterace.stderr.exp-glibc25-amd64
@@ -0,0 +1,18 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc16_byterace.c:22)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: main (tc16_byterace.c:34)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc16_byterace.stderr.exp-glibc25-x86 b/helgrind/tests/tc16_byterace.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..d7ffb0a
--- /dev/null
+++ b/helgrind/tests/tc16_byterace.stderr.exp-glibc25-x86
@@ -0,0 +1,17 @@
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc16_byterace.c:22)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: main (tc16_byterace.c:34)
+  Old state: shared-readonly by threads #1, #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc16_byterace.stdout.exp b/helgrind/tests/tc16_byterace.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc16_byterace.stdout.exp
diff --git a/helgrind/tests/tc16_byterace.vgtest b/helgrind/tests/tc16_byterace.vgtest
new file mode 100644
index 0000000..a8bf0f1
--- /dev/null
+++ b/helgrind/tests/tc16_byterace.vgtest
@@ -0,0 +1 @@
+prog: tc16_byterace
diff --git a/helgrind/tests/tc17_sembar.c b/helgrind/tests/tc17_sembar.c
new file mode 100644
index 0000000..01af962
--- /dev/null
+++ b/helgrind/tests/tc17_sembar.c
@@ -0,0 +1,212 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+/* This is really a test of semaphore handling
+   (sem_{init,destroy,post,wait}).  Using semaphores a barrier
+   function is created.  Thrcheck does understand the barrier
+   semantics implied by the barrier, as pieced together from
+   happens-before relationships obtained from the component
+   semaphores.  However, it does falsely report one race.  Ah well. */
+
+/* This code is derived from
+   gcc-4.3-20071012/libgomp/config/posix/bar.c, which is
+
+   Copyright (C) 2005 Free Software Foundation, Inc.
+   Contributed by Richard Henderson <rth@redhat.com>.
+
+   and available under version 2.1 or later of the GNU Lesser General
+   Public License.
+
+   Relative to the libgomp sources, the gomp_barrier_t type here has
+   an extra semaphore field, xxx.  This is not functionally useful,
+   but it is used to create enough extra inter-thread dependencies
+   that the barrier-like behaviour of gomp_barrier_t is evident to
+   Thrcheck.  There is no other purpose for the .xxx field. */
+
+typedef struct
+{
+  pthread_mutex_t mutex1;
+  pthread_mutex_t mutex2;
+  sem_t sem1;
+  sem_t sem2;
+  unsigned total;
+  unsigned arrived;
+  sem_t xxx;
+} gomp_barrier_t;
+
+typedef long bool;
+
+void
+gomp_barrier_init (gomp_barrier_t *bar, unsigned count)
+{
+  pthread_mutex_init (&bar->mutex1, NULL);
+  pthread_mutex_init (&bar->mutex2, NULL);
+  sem_init (&bar->sem1, 0, 0);
+  sem_init (&bar->sem2, 0, 0);
+  sem_init (&bar->xxx,  0, 0);
+  bar->total = count;
+  bar->arrived = 0;
+}
+
+void
+gomp_barrier_destroy (gomp_barrier_t *bar)
+{
+  /* Before destroying, make sure all threads have left the barrier.  */
+  pthread_mutex_lock (&bar->mutex1);
+  pthread_mutex_unlock (&bar->mutex1);
+
+  pthread_mutex_destroy (&bar->mutex1);
+  pthread_mutex_destroy (&bar->mutex2);
+  sem_destroy (&bar->sem1);
+  sem_destroy (&bar->sem2);
+  sem_destroy(&bar->xxx);
+}
+
+void
+gomp_barrier_reinit (gomp_barrier_t *bar, unsigned count)
+{
+  pthread_mutex_lock (&bar->mutex1);
+  bar->total = count;
+  pthread_mutex_unlock (&bar->mutex1);
+}
+
+void
+gomp_barrier_wait (gomp_barrier_t *bar)
+{
+  unsigned int n;
+  pthread_mutex_lock (&bar->mutex1);
+
+  ++bar->arrived;
+
+  if (bar->arrived == bar->total)
+    {
+      bar->arrived--;
+      n = bar->arrived;
+      if (n > 0) 
+        {
+          { unsigned int i;
+            for (i = 0; i < n; i++)
+              sem_wait(&bar->xxx); // acquire an obvious dependency from
+              // all other threads arriving at the barrier
+          }
+          // 1 up n times, 2 down once
+          // now let all the other threads past the barrier, giving them
+          // an obvious dependency with this thread.
+          do
+            sem_post (&bar->sem1); // 1 up
+          while (--n != 0);
+          // and wait till the last thread has left
+          sem_wait (&bar->sem2); // 2 down
+        }
+      pthread_mutex_unlock (&bar->mutex1);
+      /* «Résultats professionnels!»  First we made this thread have an
+         obvious (Thrcheck-visible) dependency on all other threads
+         calling gomp_barrier_wait.  Then, we released them all again,
+         so they all have a (visible) dependency on this thread.
+         Transitively, the result is that all threads leaving the
+         barrier have a a Thrcheck-visible dependency on all threads
+         arriving at the barrier.  As required. */
+    }
+  else
+    {
+      pthread_mutex_unlock (&bar->mutex1);
+      sem_post(&bar->xxx);
+      // first N-1 threads wind up waiting here
+      sem_wait (&bar->sem1); // 1 down 
+
+      pthread_mutex_lock (&bar->mutex2);
+      n = --bar->arrived; /* XXX see below */
+      pthread_mutex_unlock (&bar->mutex2);
+
+      if (n == 0)
+        sem_post (&bar->sem2); // 2 up
+    }
+}
+
+
+/* re XXX, thrcheck reports a race at this point.  It doesn't
+   understand that bar->arrived is protected by mutex1 whilst threads
+   are arriving at the barrier and by mutex2 whilst they are leaving,
+   but not consistently by either of them.  Oh well. */
+
+static gomp_barrier_t bar;
+
+/* What's with the volatile here?  It stops gcc compiling
+   "if (myid == 4) { unprotected = 99; }" and
+   "if (myid == 3) { unprotected = 88; }" into a conditional
+   load followed by a store.  The cmov/store sequence reads and
+   writes memory in all threads and cause Thrcheck to (correctly)
+   report a race, the underlying cause of which is that gcc is
+   generating non threadsafe code.  
+
+   (The lack of) thread safe code generation by gcc is currently a
+   hot topic.  See the following discussions:
+     http://gcc.gnu.org/ml/gcc/2007-10/msg00266.html
+     http://lkml.org/lkml/2007/10/24/673
+   and this is interesting background:
+     www.hpl.hp.com/techreports/2004/HPL-2004-209.pdf
+*/
+volatile static long unprotected = 0;
+
+void* child ( void* argV )
+{
+   long myid = (long)argV;
+   //   assert(myid >= 2 && myid <= 5);
+
+   /* First, we all wait to get to this point. */
+   gomp_barrier_wait( &bar );
+
+   /* Now, thread #4 writes to 'unprotected' and so becomes its
+      owner. */
+   if (myid == 4) {
+      unprotected = 99;
+   }
+
+   /* Now we all wait again. */
+   gomp_barrier_wait( &bar );
+
+   /* This time, thread #3 writes to 'unprotected'.  If all goes well,
+      Thrcheck sees the dependency through the barrier back to thread
+      #4 before it, and so thread #3 becomes the exclusive owner of
+      'unprotected'. */
+   if (myid == 3) {
+      unprotected = 88;
+   }
+
+   /* And just to be on the safe side ... */
+   gomp_barrier_wait( &bar );
+   return NULL;
+}
+
+
+int main (int argc, char *argv[])
+{
+   long i; int res;
+   pthread_t thr[4];
+   fprintf(stderr, "starting\n");
+
+   gomp_barrier_init( &bar, 4 );
+
+   for (i = 0; i < 4; i++) {
+      res = pthread_create( &thr[i], NULL, child, (void*)(i+2) );
+      assert(!res);
+   }
+
+   for (i = 0; i < 4; i++) {
+      res = pthread_join( thr[i], NULL );
+      assert(!res);
+   }
+
+   gomp_barrier_destroy( &bar );
+
+   /* And finally here, the root thread can get exclusive ownership
+      back from thread #4, because #4 has exited by this point and so
+      we have a dependency edge back to the write it did. */
+   fprintf(stderr, "done, result is %ld, should be 88\n", unprotected);
+
+   return 0;
+}
diff --git a/helgrind/tests/tc17_sembar.stderr.exp-glibc25-amd64 b/helgrind/tests/tc17_sembar.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..3600221
--- /dev/null
+++ b/helgrind/tests/tc17_sembar.stderr.exp-glibc25-amd64
@@ -0,0 +1,46 @@
+
+starting
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Thread #4 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Thread #5 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Possible data race during read of size 4 at 0x........
+   at 0x........: gomp_barrier_wait (tc17_sembar.c:122)
+   by 0x........: child (tc17_sembar.c:161)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-modified by threads #2, #3, #4, #5
+  New state: shared-modified by threads #2, #3, #4, #5
+  Reason:    this thread, #2, holds no consistent locks
+  Last consistently used lock for 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: gomp_barrier_init (tc17_sembar.c:46)
+   by 0x........: main (tc17_sembar.c:192)
+done, result is 88, should be 88
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc17_sembar.stderr.exp-glibc25-x86 b/helgrind/tests/tc17_sembar.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..7675dbb
--- /dev/null
+++ b/helgrind/tests/tc17_sembar.stderr.exp-glibc25-x86
@@ -0,0 +1,42 @@
+
+starting
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Thread #4 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Thread #5 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc17_sembar.c:195)
+
+Possible data race during read of size 4 at 0x........
+   at 0x........: gomp_barrier_wait (tc17_sembar.c:122)
+   by 0x........: child (tc17_sembar.c:161)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-modified by threads #2, #3, #4, #5
+  New state: shared-modified by threads #2, #3, #4, #5
+  Reason:    this thread, #2, holds no consistent locks
+  Last consistently used lock for 0x........ was first observed
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: gomp_barrier_init (tc17_sembar.c:46)
+   by 0x........: main (tc17_sembar.c:192)
+done, result is 88, should be 88
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc17_sembar.stdout.exp b/helgrind/tests/tc17_sembar.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc17_sembar.stdout.exp
diff --git a/helgrind/tests/tc17_sembar.vgtest b/helgrind/tests/tc17_sembar.vgtest
new file mode 100644
index 0000000..643ed8a
--- /dev/null
+++ b/helgrind/tests/tc17_sembar.vgtest
@@ -0,0 +1 @@
+prog: tc17_sembar
diff --git a/helgrind/tests/tc18_semabuse.c b/helgrind/tests/tc18_semabuse.c
new file mode 100644
index 0000000..6e26ce4
--- /dev/null
+++ b/helgrind/tests/tc18_semabuse.c
@@ -0,0 +1,42 @@
+
+/* Do stupid things with semaphores, and check that Thrcheck doesn't
+   fall over and does report errors appropriately.  If nothing else
+   this just checks that the relevant functions are getting
+   intercepted. */
+
+/* This is pretty lame, because making the sem_ functions fail is
+   difficult.  Not sure it's really worth having. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <string.h>
+
+int main ( void )
+{
+  int r;
+  sem_t s1;
+
+  /* Do sem_init with huge initial count */
+  r= sem_init(&s1, 0, ~0);
+
+  /* initialise properly */
+  r= sem_init(&s1, 0, 0);
+
+  /* in glibc, sem_destroy is a no-op; making it fail is
+     impossible. */
+
+  /* Do 'wait' on a bogus semaphore.  This should fail, but on glibc
+     it succeeds. */
+  memset(&s1, 0x55, sizeof(s1));
+  r= sem_wait(&s1); /* assert(r != 0); */
+
+  /* this really ought to fail, but it doesn't. */
+  r= sem_post(&s1); assert(!r);
+
+  sem_destroy(&s1);
+
+  return 0;
+}
diff --git a/helgrind/tests/tc18_semabuse.stderr.exp-glibc25-amd64 b/helgrind/tests/tc18_semabuse.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..f0519c0
--- /dev/null
+++ b/helgrind/tests/tc18_semabuse.stderr.exp-glibc25-amd64
@@ -0,0 +1,14 @@
+
+Thread #1 is the program's root thread
+
+Thread #1's call to sem_init failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: sem_init@* (hg_intercepts.c:...)
+   by 0x........: main (tc18_semabuse.c:23)
+
+Thread #1: Bug in libpthread: sem_wait succeeded on semaphore without prior sem_post
+   at 0x........: sem_wait_WRK (hg_intercepts.c:...)
+   by 0x........: sem_wait (hg_intercepts.c:...)
+   by 0x........: main (tc18_semabuse.c:34)
+
+ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc18_semabuse.stderr.exp-glibc25-x86 b/helgrind/tests/tc18_semabuse.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..82f30d4
--- /dev/null
+++ b/helgrind/tests/tc18_semabuse.stderr.exp-glibc25-x86
@@ -0,0 +1,14 @@
+
+Thread #1 is the program's root thread
+
+Thread #1's call to sem_init failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: sem_init@* (hg_intercepts.c:...)
+   by 0x........: main (tc18_semabuse.c:23)
+
+Thread #1: Bug in libpthread: sem_wait succeeded on semaphore without prior sem_post
+   at 0x........: sem_wait_WRK (hg_intercepts.c:...)
+   by 0x........: sem_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc18_semabuse.c:34)
+
+ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc18_semabuse.stdout.exp b/helgrind/tests/tc18_semabuse.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc18_semabuse.stdout.exp
diff --git a/helgrind/tests/tc18_semabuse.vgtest b/helgrind/tests/tc18_semabuse.vgtest
new file mode 100644
index 0000000..fe4d22b
--- /dev/null
+++ b/helgrind/tests/tc18_semabuse.vgtest
@@ -0,0 +1 @@
+prog: tc18_semabuse
diff --git a/helgrind/tests/tc19_shadowmem.c b/helgrind/tests/tc19_shadowmem.c
new file mode 100644
index 0000000..d652fa9
--- /dev/null
+++ b/helgrind/tests/tc19_shadowmem.c
@@ -0,0 +1,2291 @@
+
+#include <pthread.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "helgrind/helgrind.h"
+
+typedef
+   struct {
+      void* (*child)(void*);
+      char* arr;
+      int firstoff;
+      int lastoff;
+      int skipoff;
+   }
+   Info;
+
+pthread_mutex_t mx;
+
+void* child8 ( void* infoV )
+{
+   int r, i, firstoff, lastoff, skipoff;
+   char* arr;
+   Info* info = (Info*)infoV;
+   firstoff = info->firstoff;
+   lastoff  = info->lastoff;
+   skipoff  = info->skipoff;
+   arr      = info->arr;
+   assert( sizeof(char) == 1 );
+   assert( info->child == &child8 );
+   for (i = firstoff; i <= lastoff; i += 1) {
+      char* ptr = (char*)&arr[i];
+      if (i == skipoff) {
+        *ptr = 0;
+      } else {
+        r= pthread_mutex_lock( &mx ); assert(!r);
+        *ptr = 0;
+        r= pthread_mutex_unlock( &mx ); assert(!r);
+      }
+   }
+   return NULL;
+}
+
+void* child16 ( void* infoV )
+{
+   int r, i, firstoff, lastoff, skipoff;
+   char* arr;
+   Info* info = (Info*)infoV;
+   firstoff = info->firstoff;
+   lastoff  = info->lastoff;
+   skipoff  = info->skipoff;
+   arr      = info->arr;
+   assert( sizeof(short) == 2 );
+   assert( info->child == &child16 );
+   for (i = firstoff; i <= lastoff; i += 2) {
+      short* ptr = (short*)&arr[i];
+      if (i == skipoff) {
+        *ptr = 0;
+      } else {
+        r= pthread_mutex_lock( &mx ); assert(!r);
+        *ptr = 0;
+        r= pthread_mutex_unlock( &mx ); assert(!r);
+      }
+   }
+   return NULL;
+}
+
+void* child32 ( void* infoV )
+{
+   int r, i, firstoff, lastoff, skipoff;
+   char* arr;
+   Info* info = (Info*)infoV;
+   firstoff = info->firstoff;
+   lastoff  = info->lastoff;
+   skipoff  = info->skipoff;
+   arr      = info->arr;
+   assert( sizeof(int) == 4 );
+   assert( info->child == &child32 );
+   for (i = firstoff; i <= lastoff; i += 4) {
+      int* ptr = (int*)&arr[i];
+      if (i == skipoff) {
+        *ptr = 0;
+      } else {
+        r= pthread_mutex_lock( &mx ); assert(!r);
+        *ptr = 0;
+        r= pthread_mutex_unlock( &mx ); assert(!r);
+      }
+   }
+   return NULL;
+}
+
+void* child64 ( void* infoV )
+{
+   int r, i, firstoff, lastoff, skipoff;
+   char* arr;
+   Info* info = (Info*)infoV;
+   firstoff = info->firstoff;
+   lastoff  = info->lastoff;
+   skipoff  = info->skipoff;
+   arr      = info->arr;
+   assert( sizeof(double) == 8 );
+   assert( info->child == &child64 );
+   for (i = firstoff; i <= lastoff; i += 8) {
+      double* ptr = (double*)&arr[i];
+      if (i == skipoff) {
+        *ptr = 0;
+      } else {
+        r= pthread_mutex_lock( &mx ); assert(!r);
+        *ptr = 0;
+        r= pthread_mutex_unlock( &mx ); assert(!r);
+      }
+   }
+   return NULL;
+}
+
+
+void* steer ( void* infoV );
+
+#define MAXXX 100   /* re 100: should cover at least 2 cycles 
+of length 1 << N_LINE_BITS */
+/* This is all a bit subtle.  First, after every inner loop over the
+   data, we have to VALGRIND_TC_CLEAN_MEMORY it to get it back to a
+   decent starting state.  Because info.arr is 8-aligned (is asserted
+   for), the address range painter will paint at top level granularity
+   (8-byte), which means we are guaranteed to see any errors from the
+   next iteration at the maximum granularity that their alignment
+   allows.
+
+   Also, the pthread_joins cause the shadow mem cache to be flushed
+   each iteration.  Given that all trees are pulled up to 64-bit by
+   the abovementioned VALGRIND_TC_CLEAN_MEMORY, I think this
+   irrelevant.
+*/
+
+int main ( void )
+{
+  pthread_t t1, t2;
+  Info info;
+  int off;
+
+  pthread_mutex_init( &mx, NULL );
+
+  info.arr = malloc(MAXXX);
+  assert(info.arr);
+
+  /* ensure array is 8-aligned.  this is important, as per comment
+  above. */
+  assert(0 == (7 & (unsigned long)info.arr));
+
+#if 1
+  /* Test 8 bit granularity */
+
+  fprintf(stderr, "\n");
+  fprintf(stderr,
+          "===========================================================\n");
+  fprintf(stderr,
+          "=== 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ===\n");
+  fprintf(stderr,
+          "===========================================================\n");
+  fprintf(stderr, "\n");
+  for (off = 0; off < MAXXX-1; off++) {
+
+     info.firstoff = off & 0;
+     info.lastoff  = MAXXX - 1;
+     info.skipoff  = off;
+     info.child    = child8;
+
+     fprintf(stderr, "---------- char gran, %d .. %d, skip %d ----------\n",
+             info.firstoff, info.lastoff, info.skipoff );
+
+     pthread_create( &t1, NULL, steer, (void*)&info );
+     pthread_create( &t2, NULL, steer, (void*)&info );
+
+     pthread_join( t1, NULL );
+     pthread_join( t2, NULL );
+
+     VALGRIND_HG_CLEAN_MEMORY(&info.arr[0], MAXXX);
+
+  }
+#endif
+#if 1
+  /* Test 16 bit granularity */
+
+  fprintf(stderr, "\n");
+  fprintf(stderr,
+          "==========================================================\n");
+  fprintf(stderr,
+          "=== 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 ===\n");
+  fprintf(stderr,
+          "==========================================================\n");
+  fprintf(stderr, "\n");
+  for (off = 0; off < MAXXX-2; off++) {
+
+     info.firstoff = off & 1;
+     info.lastoff  = MAXXX - 2;
+     info.skipoff  = off;
+     info.child    = child16;
+
+     fprintf(stderr, "---------- short gran, %d .. %d, skip %d ----------\n",
+             info.firstoff, info.lastoff, info.skipoff );
+
+     pthread_create( &t1, NULL, steer, (void*)&info );
+     pthread_create( &t2, NULL, steer, (void*)&info );
+
+     pthread_join( t1, NULL );
+     pthread_join( t2, NULL );
+
+     VALGRIND_HG_CLEAN_MEMORY(&info.arr[0], MAXXX);
+
+  }
+#endif
+#if 1
+  /* Test 32 bit granularity */
+
+  fprintf(stderr, "\n");
+  fprintf(stderr,
+          "==========================================================\n");
+  fprintf(stderr,
+          "=== 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ===\n");
+  fprintf(stderr,
+          "==========================================================\n");
+  fprintf(stderr, "\n");
+  for (off = 0; off < MAXXX-4; off++) {
+
+     info.firstoff = off & 3;
+     info.lastoff  = MAXXX - 4;
+     info.skipoff  = off;
+     info.child    = child32;
+
+     fprintf(stderr, "---------- int gran, %d .. %d, skip %d ----------\n",
+             info.firstoff, info.lastoff, info.skipoff );
+
+     pthread_create( &t1, NULL, steer, (void*)&info );
+     pthread_create( &t2, NULL, steer, (void*)&info );
+
+     pthread_join( t1, NULL );
+     pthread_join( t2, NULL );
+
+     VALGRIND_HG_CLEAN_MEMORY(&info.arr[0], MAXXX);
+
+  }
+#endif
+#if 1
+  /* Test 64 bit granularity */
+
+  fprintf(stderr, "\n");
+  fprintf(stderr,
+          "==========================================================\n");
+  fprintf(stderr,
+          "=== 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 ===\n");
+  fprintf(stderr,
+          "==========================================================\n");
+  fprintf(stderr, "\n");
+  for (off = 0; off < MAXXX-8; off++) {
+
+     info.firstoff = off & 7;
+     info.lastoff  = MAXXX - 8;
+     info.skipoff  = off;
+     info.child    = child64;
+
+     fprintf(stderr, "---------- double gran, %d .. %d, skip %d ----------\n",
+             info.firstoff, info.lastoff, info.skipoff );
+
+     pthread_create( &t1, NULL, steer, (void*)&info );
+     pthread_create( &t2, NULL, steer, (void*)&info );
+
+     pthread_join( t1, NULL );
+     pthread_join( t2, NULL );
+
+     VALGRIND_HG_CLEAN_MEMORY(&info.arr[0], MAXXX);
+
+  }
+#endif
+  free(info.arr);
+
+  return 0;
+}
+
+void* steer ( void* infoV )
+{
+   Info* info = (Info*)infoV;
+   int   wot  = info->skipoff;
+   void*(*fn)(void*) = info->child;
+   if (wot >= 500) goto halfway;
+
+   __asm__ __volatile__("");
+   if (wot == 0) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 1) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 2) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 3) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 4) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 5) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 6) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 7) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 8) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 9) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 10) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 11) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 12) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 13) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 14) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 15) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 16) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 17) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 18) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 19) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 20) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 21) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 22) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 23) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 24) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 25) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 26) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 27) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 28) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 29) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 30) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 31) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 32) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 33) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 34) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 35) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 36) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 37) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 38) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 39) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 40) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 41) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 42) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 43) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 44) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 45) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 46) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 47) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 48) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 49) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 50) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 51) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 52) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 53) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 54) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 55) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 56) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 57) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 58) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 59) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 60) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 61) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 62) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 63) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 64) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 65) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 66) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 67) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 68) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 69) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 70) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 71) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 72) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 73) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 74) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 75) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 76) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 77) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 78) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 79) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 80) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 81) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 82) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 83) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 84) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 85) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 86) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 87) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 88) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 89) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 90) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 91) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 92) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 93) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 94) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 95) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 96) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 97) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 98) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 99) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 100) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 101) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 102) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 103) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 104) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 105) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 106) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 107) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 108) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 109) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 110) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 111) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 112) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 113) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 114) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 115) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 116) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 117) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 118) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 119) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 120) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 121) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 122) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 123) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 124) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 125) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 126) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 127) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 128) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 129) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 130) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 131) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 132) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 133) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 134) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 135) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 136) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 137) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 138) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 139) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 140) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 141) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 142) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 143) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 144) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 145) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 146) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 147) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 148) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 149) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 150) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 151) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 152) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 153) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 154) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 155) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 156) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 157) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 158) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 159) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 160) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 161) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 162) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 163) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 164) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 165) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 166) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 167) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 168) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 169) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 170) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 171) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 172) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 173) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 174) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 175) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 176) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 177) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 178) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 179) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 180) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 181) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 182) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 183) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 184) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 185) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 186) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 187) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 188) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 189) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 190) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 191) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 192) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 193) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 194) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 195) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 196) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 197) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 198) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 199) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 200) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 201) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 202) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 203) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 204) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 205) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 206) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 207) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 208) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 209) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 210) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 211) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 212) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 213) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 214) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 215) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 216) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 217) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 218) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 219) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 220) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 221) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 222) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 223) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 224) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 225) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 226) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 227) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 228) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 229) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 230) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 231) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 232) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 233) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 234) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 235) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 236) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 237) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 238) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 239) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 240) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 241) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 242) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 243) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 244) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 245) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 246) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 247) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 248) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 249) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 250) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 251) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 252) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 253) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 254) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 255) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 256) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 257) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 258) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 259) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 260) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 261) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 262) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 263) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 264) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 265) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 266) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 267) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 268) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 269) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 270) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 271) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 272) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 273) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 274) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 275) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 276) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 277) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 278) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 279) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 280) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 281) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 282) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 283) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 284) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 285) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 286) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 287) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 288) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 289) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 290) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 291) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 292) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 293) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 294) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 295) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 296) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 297) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 298) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 299) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 300) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 301) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 302) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 303) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 304) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 305) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 306) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 307) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 308) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 309) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 310) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 311) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 312) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 313) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 314) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 315) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 316) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 317) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 318) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 319) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 320) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 321) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 322) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 323) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 324) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 325) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 326) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 327) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 328) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 329) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 330) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 331) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 332) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 333) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 334) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 335) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 336) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 337) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 338) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 339) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 340) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 341) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 342) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 343) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 344) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 345) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 346) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 347) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 348) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 349) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 350) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 351) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 352) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 353) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 354) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 355) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 356) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 357) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 358) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 359) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 360) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 361) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 362) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 363) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 364) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 365) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 366) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 367) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 368) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 369) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 370) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 371) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 372) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 373) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 374) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 375) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 376) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 377) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 378) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 379) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 380) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 381) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 382) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 383) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 384) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 385) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 386) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 387) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 388) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 389) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 390) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 391) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 392) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 393) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 394) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 395) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 396) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 397) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 398) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 399) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 400) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 401) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 402) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 403) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 404) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 405) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 406) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 407) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 408) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 409) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 410) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 411) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 412) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 413) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 414) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 415) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 416) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 417) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 418) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 419) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 420) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 421) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 422) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 423) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 424) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 425) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 426) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 427) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 428) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 429) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 430) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 431) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 432) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 433) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 434) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 435) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 436) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 437) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 438) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 439) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 440) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 441) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 442) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 443) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 444) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 445) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 446) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 447) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 448) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 449) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 450) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 451) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 452) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 453) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 454) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 455) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 456) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 457) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 458) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 459) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 460) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 461) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 462) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 463) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 464) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 465) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 466) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 467) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 468) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 469) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 470) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 471) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 472) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 473) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 474) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 475) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 476) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 477) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 478) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 479) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 480) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 481) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 482) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 483) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 484) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 485) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 486) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 487) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 488) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 489) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 490) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 491) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 492) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 493) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 494) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 495) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 496) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 497) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 498) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 499) return fn(info);
+   __asm__ __volatile__("");
+  halfway:
+   if (wot == 500) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 501) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 502) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 503) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 504) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 505) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 506) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 507) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 508) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 509) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 510) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 511) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 512) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 513) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 514) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 515) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 516) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 517) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 518) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 519) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 520) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 521) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 522) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 523) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 524) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 525) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 526) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 527) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 528) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 529) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 530) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 531) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 532) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 533) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 534) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 535) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 536) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 537) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 538) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 539) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 540) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 541) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 542) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 543) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 544) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 545) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 546) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 547) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 548) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 549) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 550) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 551) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 552) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 553) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 554) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 555) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 556) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 557) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 558) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 559) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 560) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 561) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 562) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 563) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 564) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 565) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 566) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 567) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 568) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 569) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 570) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 571) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 572) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 573) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 574) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 575) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 576) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 577) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 578) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 579) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 580) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 581) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 582) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 583) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 584) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 585) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 586) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 587) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 588) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 589) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 590) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 591) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 592) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 593) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 594) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 595) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 596) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 597) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 598) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 599) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 600) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 601) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 602) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 603) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 604) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 605) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 606) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 607) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 608) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 609) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 610) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 611) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 612) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 613) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 614) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 615) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 616) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 617) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 618) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 619) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 620) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 621) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 622) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 623) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 624) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 625) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 626) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 627) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 628) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 629) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 630) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 631) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 632) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 633) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 634) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 635) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 636) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 637) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 638) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 639) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 640) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 641) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 642) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 643) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 644) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 645) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 646) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 647) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 648) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 649) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 650) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 651) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 652) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 653) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 654) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 655) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 656) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 657) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 658) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 659) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 660) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 661) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 662) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 663) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 664) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 665) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 666) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 667) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 668) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 669) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 670) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 671) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 672) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 673) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 674) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 675) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 676) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 677) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 678) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 679) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 680) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 681) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 682) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 683) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 684) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 685) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 686) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 687) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 688) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 689) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 690) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 691) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 692) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 693) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 694) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 695) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 696) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 697) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 698) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 699) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 700) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 701) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 702) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 703) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 704) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 705) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 706) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 707) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 708) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 709) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 710) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 711) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 712) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 713) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 714) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 715) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 716) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 717) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 718) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 719) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 720) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 721) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 722) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 723) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 724) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 725) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 726) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 727) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 728) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 729) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 730) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 731) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 732) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 733) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 734) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 735) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 736) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 737) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 738) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 739) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 740) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 741) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 742) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 743) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 744) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 745) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 746) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 747) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 748) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 749) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 750) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 751) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 752) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 753) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 754) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 755) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 756) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 757) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 758) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 759) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 760) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 761) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 762) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 763) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 764) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 765) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 766) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 767) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 768) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 769) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 770) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 771) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 772) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 773) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 774) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 775) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 776) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 777) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 778) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 779) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 780) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 781) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 782) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 783) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 784) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 785) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 786) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 787) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 788) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 789) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 790) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 791) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 792) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 793) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 794) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 795) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 796) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 797) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 798) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 799) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 800) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 801) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 802) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 803) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 804) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 805) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 806) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 807) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 808) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 809) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 810) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 811) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 812) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 813) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 814) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 815) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 816) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 817) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 818) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 819) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 820) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 821) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 822) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 823) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 824) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 825) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 826) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 827) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 828) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 829) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 830) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 831) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 832) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 833) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 834) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 835) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 836) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 837) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 838) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 839) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 840) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 841) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 842) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 843) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 844) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 845) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 846) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 847) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 848) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 849) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 850) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 851) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 852) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 853) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 854) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 855) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 856) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 857) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 858) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 859) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 860) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 861) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 862) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 863) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 864) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 865) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 866) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 867) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 868) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 869) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 870) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 871) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 872) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 873) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 874) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 875) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 876) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 877) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 878) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 879) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 880) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 881) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 882) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 883) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 884) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 885) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 886) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 887) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 888) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 889) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 890) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 891) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 892) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 893) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 894) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 895) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 896) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 897) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 898) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 899) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 900) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 901) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 902) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 903) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 904) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 905) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 906) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 907) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 908) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 909) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 910) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 911) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 912) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 913) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 914) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 915) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 916) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 917) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 918) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 919) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 920) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 921) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 922) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 923) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 924) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 925) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 926) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 927) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 928) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 929) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 930) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 931) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 932) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 933) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 934) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 935) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 936) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 937) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 938) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 939) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 940) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 941) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 942) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 943) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 944) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 945) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 946) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 947) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 948) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 949) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 950) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 951) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 952) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 953) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 954) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 955) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 956) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 957) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 958) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 959) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 960) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 961) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 962) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 963) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 964) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 965) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 966) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 967) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 968) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 969) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 970) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 971) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 972) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 973) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 974) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 975) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 976) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 977) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 978) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 979) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 980) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 981) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 982) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 983) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 984) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 985) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 986) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 987) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 988) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 989) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 990) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 991) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 992) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 993) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 994) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 995) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 996) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 997) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 998) return fn(info);
+   __asm__ __volatile__("");
+   if (wot == 999) return fn(info);
+   __asm__ __volatile__("");
+
+   assert(0);
+}
diff --git a/helgrind/tests/tc19_shadowmem.stderr.exp-glibc25-amd64 b/helgrind/tests/tc19_shadowmem.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..8f83732
--- /dev/null
+++ b/helgrind/tests/tc19_shadowmem.stderr.exp-glibc25-amd64
@@ -0,0 +1,15840 @@
+
+
+===========================================================
+=== 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ===
+===========================================================
+
+---------- char gran, 0 .. 99, skip 0 ----------
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #2
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no locks at all
+---------- char gran, 0 .. 99, skip 1 ----------
+
+Thread #4 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #5 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #4
+  New state: shared-modified by threads #4, #5
+  Reason:    this thread, #5, holds no locks at all
+---------- char gran, 0 .. 99, skip 2 ----------
+
+Thread #6 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #7 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #6
+  New state: shared-modified by threads #6, #7
+  Reason:    this thread, #7, holds no locks at all
+---------- char gran, 0 .. 99, skip 3 ----------
+
+Thread #8 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #9 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #8
+  New state: shared-modified by threads #8, #9
+  Reason:    this thread, #9, holds no locks at all
+---------- char gran, 0 .. 99, skip 4 ----------
+
+Thread #10 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #11 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #10
+  New state: shared-modified by threads #10, #11
+  Reason:    this thread, #11, holds no locks at all
+---------- char gran, 0 .. 99, skip 5 ----------
+
+Thread #12 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #13 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #12
+  New state: shared-modified by threads #12, #13
+  Reason:    this thread, #13, holds no locks at all
+---------- char gran, 0 .. 99, skip 6 ----------
+
+Thread #14 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #15 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #14
+  New state: shared-modified by threads #14, #15
+  Reason:    this thread, #15, holds no locks at all
+---------- char gran, 0 .. 99, skip 7 ----------
+
+Thread #16 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #17 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #16
+  New state: shared-modified by threads #16, #17
+  Reason:    this thread, #17, holds no locks at all
+---------- char gran, 0 .. 99, skip 8 ----------
+
+Thread #18 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #19 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #18
+  New state: shared-modified by threads #18, #19
+  Reason:    this thread, #19, holds no locks at all
+---------- char gran, 0 .. 99, skip 9 ----------
+
+Thread #20 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #21 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #20
+  New state: shared-modified by threads #20, #21
+  Reason:    this thread, #21, holds no locks at all
+---------- char gran, 0 .. 99, skip 10 ----------
+
+Thread #22 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #23 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #22
+  New state: shared-modified by threads #22, #23
+  Reason:    this thread, #23, holds no locks at all
+---------- char gran, 0 .. 99, skip 11 ----------
+
+Thread #24 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #25 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #24
+  New state: shared-modified by threads #24, #25
+  Reason:    this thread, #25, holds no locks at all
+---------- char gran, 0 .. 99, skip 12 ----------
+
+Thread #26 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #27 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #26
+  New state: shared-modified by threads #26, #27
+  Reason:    this thread, #27, holds no locks at all
+---------- char gran, 0 .. 99, skip 13 ----------
+
+Thread #28 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #29 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #28
+  New state: shared-modified by threads #28, #29
+  Reason:    this thread, #29, holds no locks at all
+---------- char gran, 0 .. 99, skip 14 ----------
+
+Thread #30 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #31 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #30
+  New state: shared-modified by threads #30, #31
+  Reason:    this thread, #31, holds no locks at all
+---------- char gran, 0 .. 99, skip 15 ----------
+
+Thread #32 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #33 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #32
+  New state: shared-modified by threads #32, #33
+  Reason:    this thread, #33, holds no locks at all
+---------- char gran, 0 .. 99, skip 16 ----------
+
+Thread #34 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #35 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #34
+  New state: shared-modified by threads #34, #35
+  Reason:    this thread, #35, holds no locks at all
+---------- char gran, 0 .. 99, skip 17 ----------
+
+Thread #36 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #37 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #36
+  New state: shared-modified by threads #36, #37
+  Reason:    this thread, #37, holds no locks at all
+---------- char gran, 0 .. 99, skip 18 ----------
+
+Thread #38 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #39 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #38
+  New state: shared-modified by threads #38, #39
+  Reason:    this thread, #39, holds no locks at all
+---------- char gran, 0 .. 99, skip 19 ----------
+
+Thread #40 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #41 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #40
+  New state: shared-modified by threads #40, #41
+  Reason:    this thread, #41, holds no locks at all
+---------- char gran, 0 .. 99, skip 20 ----------
+
+Thread #42 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #43 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #42
+  New state: shared-modified by threads #42, #43
+  Reason:    this thread, #43, holds no locks at all
+---------- char gran, 0 .. 99, skip 21 ----------
+
+Thread #44 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #45 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #44
+  New state: shared-modified by threads #44, #45
+  Reason:    this thread, #45, holds no locks at all
+---------- char gran, 0 .. 99, skip 22 ----------
+
+Thread #46 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #47 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #46
+  New state: shared-modified by threads #46, #47
+  Reason:    this thread, #47, holds no locks at all
+---------- char gran, 0 .. 99, skip 23 ----------
+
+Thread #48 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #49 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #48
+  New state: shared-modified by threads #48, #49
+  Reason:    this thread, #49, holds no locks at all
+---------- char gran, 0 .. 99, skip 24 ----------
+
+Thread #50 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #51 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #50
+  New state: shared-modified by threads #50, #51
+  Reason:    this thread, #51, holds no locks at all
+---------- char gran, 0 .. 99, skip 25 ----------
+
+Thread #52 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #53 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #52
+  New state: shared-modified by threads #52, #53
+  Reason:    this thread, #53, holds no locks at all
+---------- char gran, 0 .. 99, skip 26 ----------
+
+Thread #54 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #55 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #54
+  New state: shared-modified by threads #54, #55
+  Reason:    this thread, #55, holds no locks at all
+---------- char gran, 0 .. 99, skip 27 ----------
+
+Thread #56 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #57 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #56
+  New state: shared-modified by threads #56, #57
+  Reason:    this thread, #57, holds no locks at all
+---------- char gran, 0 .. 99, skip 28 ----------
+
+Thread #58 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #59 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #58
+  New state: shared-modified by threads #58, #59
+  Reason:    this thread, #59, holds no locks at all
+---------- char gran, 0 .. 99, skip 29 ----------
+
+Thread #60 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #61 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #60
+  New state: shared-modified by threads #60, #61
+  Reason:    this thread, #61, holds no locks at all
+---------- char gran, 0 .. 99, skip 30 ----------
+
+Thread #62 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #63 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #62
+  New state: shared-modified by threads #62, #63
+  Reason:    this thread, #63, holds no locks at all
+---------- char gran, 0 .. 99, skip 31 ----------
+
+Thread #64 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #65 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #64
+  New state: shared-modified by threads #64, #65
+  Reason:    this thread, #65, holds no locks at all
+---------- char gran, 0 .. 99, skip 32 ----------
+
+Thread #66 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #67 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #66
+  New state: shared-modified by threads #66, #67
+  Reason:    this thread, #67, holds no locks at all
+---------- char gran, 0 .. 99, skip 33 ----------
+
+Thread #68 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #69 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #68
+  New state: shared-modified by threads #68, #69
+  Reason:    this thread, #69, holds no locks at all
+---------- char gran, 0 .. 99, skip 34 ----------
+
+Thread #70 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #71 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #70
+  New state: shared-modified by threads #70, #71
+  Reason:    this thread, #71, holds no locks at all
+---------- char gran, 0 .. 99, skip 35 ----------
+
+Thread #72 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #73 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #72
+  New state: shared-modified by threads #72, #73
+  Reason:    this thread, #73, holds no locks at all
+---------- char gran, 0 .. 99, skip 36 ----------
+
+Thread #74 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #75 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #74
+  New state: shared-modified by threads #74, #75
+  Reason:    this thread, #75, holds no locks at all
+---------- char gran, 0 .. 99, skip 37 ----------
+
+Thread #76 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #77 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #76
+  New state: shared-modified by threads #76, #77
+  Reason:    this thread, #77, holds no locks at all
+---------- char gran, 0 .. 99, skip 38 ----------
+
+Thread #78 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #79 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #78
+  New state: shared-modified by threads #78, #79
+  Reason:    this thread, #79, holds no locks at all
+---------- char gran, 0 .. 99, skip 39 ----------
+
+Thread #80 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #81 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #80
+  New state: shared-modified by threads #80, #81
+  Reason:    this thread, #81, holds no locks at all
+---------- char gran, 0 .. 99, skip 40 ----------
+
+Thread #82 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #83 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #82
+  New state: shared-modified by threads #82, #83
+  Reason:    this thread, #83, holds no locks at all
+---------- char gran, 0 .. 99, skip 41 ----------
+
+Thread #84 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #85 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #84
+  New state: shared-modified by threads #84, #85
+  Reason:    this thread, #85, holds no locks at all
+---------- char gran, 0 .. 99, skip 42 ----------
+
+Thread #86 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #87 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #86
+  New state: shared-modified by threads #86, #87
+  Reason:    this thread, #87, holds no locks at all
+---------- char gran, 0 .. 99, skip 43 ----------
+
+Thread #88 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #89 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #88
+  New state: shared-modified by threads #88, #89
+  Reason:    this thread, #89, holds no locks at all
+---------- char gran, 0 .. 99, skip 44 ----------
+
+Thread #90 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #91 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #90
+  New state: shared-modified by threads #90, #91
+  Reason:    this thread, #91, holds no locks at all
+---------- char gran, 0 .. 99, skip 45 ----------
+
+Thread #92 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #93 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #92
+  New state: shared-modified by threads #92, #93
+  Reason:    this thread, #93, holds no locks at all
+---------- char gran, 0 .. 99, skip 46 ----------
+
+Thread #94 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #95 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #94
+  New state: shared-modified by threads #94, #95
+  Reason:    this thread, #95, holds no locks at all
+---------- char gran, 0 .. 99, skip 47 ----------
+
+Thread #96 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #97 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #96
+  New state: shared-modified by threads #96, #97
+  Reason:    this thread, #97, holds no locks at all
+---------- char gran, 0 .. 99, skip 48 ----------
+
+Thread #98 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #99 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #98
+  New state: shared-modified by threads #98, #99
+  Reason:    this thread, #99, holds no locks at all
+---------- char gran, 0 .. 99, skip 49 ----------
+
+Thread #100 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #101 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #100
+  New state: shared-modified by threads #100, #101
+  Reason:    this thread, #101, holds no locks at all
+---------- char gran, 0 .. 99, skip 50 ----------
+
+Thread #102 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #103 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #102
+  New state: shared-modified by threads #102, #103
+  Reason:    this thread, #103, holds no locks at all
+---------- char gran, 0 .. 99, skip 51 ----------
+
+Thread #104 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #105 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #104
+  New state: shared-modified by threads #104, #105
+  Reason:    this thread, #105, holds no locks at all
+---------- char gran, 0 .. 99, skip 52 ----------
+
+Thread #106 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #107 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #106
+  New state: shared-modified by threads #106, #107
+  Reason:    this thread, #107, holds no locks at all
+---------- char gran, 0 .. 99, skip 53 ----------
+
+Thread #108 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #109 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #108
+  New state: shared-modified by threads #108, #109
+  Reason:    this thread, #109, holds no locks at all
+---------- char gran, 0 .. 99, skip 54 ----------
+
+Thread #110 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #111 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #110
+  New state: shared-modified by threads #110, #111
+  Reason:    this thread, #111, holds no locks at all
+---------- char gran, 0 .. 99, skip 55 ----------
+
+Thread #112 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #113 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #112
+  New state: shared-modified by threads #112, #113
+  Reason:    this thread, #113, holds no locks at all
+---------- char gran, 0 .. 99, skip 56 ----------
+
+Thread #114 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #115 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #114
+  New state: shared-modified by threads #114, #115
+  Reason:    this thread, #115, holds no locks at all
+---------- char gran, 0 .. 99, skip 57 ----------
+
+Thread #116 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #117 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #116
+  New state: shared-modified by threads #116, #117
+  Reason:    this thread, #117, holds no locks at all
+---------- char gran, 0 .. 99, skip 58 ----------
+
+Thread #118 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #119 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #118
+  New state: shared-modified by threads #118, #119
+  Reason:    this thread, #119, holds no locks at all
+---------- char gran, 0 .. 99, skip 59 ----------
+
+Thread #120 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #121 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #120
+  New state: shared-modified by threads #120, #121
+  Reason:    this thread, #121, holds no locks at all
+---------- char gran, 0 .. 99, skip 60 ----------
+
+Thread #122 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #123 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #122
+  New state: shared-modified by threads #122, #123
+  Reason:    this thread, #123, holds no locks at all
+---------- char gran, 0 .. 99, skip 61 ----------
+
+Thread #124 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #125 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #124
+  New state: shared-modified by threads #124, #125
+  Reason:    this thread, #125, holds no locks at all
+---------- char gran, 0 .. 99, skip 62 ----------
+
+Thread #126 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #127 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #126
+  New state: shared-modified by threads #126, #127
+  Reason:    this thread, #127, holds no locks at all
+---------- char gran, 0 .. 99, skip 63 ----------
+
+Thread #128 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #129 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #128
+  New state: shared-modified by threads #128, #129
+  Reason:    this thread, #129, holds no locks at all
+---------- char gran, 0 .. 99, skip 64 ----------
+
+Thread #130 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #131 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #130
+  New state: shared-modified by threads #130, #131
+  Reason:    this thread, #131, holds no locks at all
+---------- char gran, 0 .. 99, skip 65 ----------
+
+Thread #132 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #133 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #132
+  New state: shared-modified by threads #132, #133
+  Reason:    this thread, #133, holds no locks at all
+---------- char gran, 0 .. 99, skip 66 ----------
+
+Thread #134 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #135 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #134
+  New state: shared-modified by threads #134, #135
+  Reason:    this thread, #135, holds no locks at all
+---------- char gran, 0 .. 99, skip 67 ----------
+
+Thread #136 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #137 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #136
+  New state: shared-modified by threads #136, #137
+  Reason:    this thread, #137, holds no locks at all
+---------- char gran, 0 .. 99, skip 68 ----------
+
+Thread #138 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #139 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #138
+  New state: shared-modified by threads #138, #139
+  Reason:    this thread, #139, holds no locks at all
+---------- char gran, 0 .. 99, skip 69 ----------
+
+Thread #140 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #141 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #140
+  New state: shared-modified by threads #140, #141
+  Reason:    this thread, #141, holds no locks at all
+---------- char gran, 0 .. 99, skip 70 ----------
+
+Thread #142 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #143 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #142
+  New state: shared-modified by threads #142, #143
+  Reason:    this thread, #143, holds no locks at all
+---------- char gran, 0 .. 99, skip 71 ----------
+
+Thread #144 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #145 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #144
+  New state: shared-modified by threads #144, #145
+  Reason:    this thread, #145, holds no locks at all
+---------- char gran, 0 .. 99, skip 72 ----------
+
+Thread #146 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #147 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #146
+  New state: shared-modified by threads #146, #147
+  Reason:    this thread, #147, holds no locks at all
+---------- char gran, 0 .. 99, skip 73 ----------
+
+Thread #148 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #149 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #148
+  New state: shared-modified by threads #148, #149
+  Reason:    this thread, #149, holds no locks at all
+---------- char gran, 0 .. 99, skip 74 ----------
+
+Thread #150 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #151 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #150
+  New state: shared-modified by threads #150, #151
+  Reason:    this thread, #151, holds no locks at all
+---------- char gran, 0 .. 99, skip 75 ----------
+
+Thread #152 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #153 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #152
+  New state: shared-modified by threads #152, #153
+  Reason:    this thread, #153, holds no locks at all
+---------- char gran, 0 .. 99, skip 76 ----------
+
+Thread #154 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #155 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #154
+  New state: shared-modified by threads #154, #155
+  Reason:    this thread, #155, holds no locks at all
+---------- char gran, 0 .. 99, skip 77 ----------
+
+Thread #156 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #157 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #156
+  New state: shared-modified by threads #156, #157
+  Reason:    this thread, #157, holds no locks at all
+---------- char gran, 0 .. 99, skip 78 ----------
+
+Thread #158 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #159 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #158
+  New state: shared-modified by threads #158, #159
+  Reason:    this thread, #159, holds no locks at all
+---------- char gran, 0 .. 99, skip 79 ----------
+
+Thread #160 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #161 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #160
+  New state: shared-modified by threads #160, #161
+  Reason:    this thread, #161, holds no locks at all
+---------- char gran, 0 .. 99, skip 80 ----------
+
+Thread #162 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #163 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #162
+  New state: shared-modified by threads #162, #163
+  Reason:    this thread, #163, holds no locks at all
+---------- char gran, 0 .. 99, skip 81 ----------
+
+Thread #164 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #165 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #164
+  New state: shared-modified by threads #164, #165
+  Reason:    this thread, #165, holds no locks at all
+---------- char gran, 0 .. 99, skip 82 ----------
+
+Thread #166 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #167 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #166
+  New state: shared-modified by threads #166, #167
+  Reason:    this thread, #167, holds no locks at all
+---------- char gran, 0 .. 99, skip 83 ----------
+
+Thread #168 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #169 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #168
+  New state: shared-modified by threads #168, #169
+  Reason:    this thread, #169, holds no locks at all
+---------- char gran, 0 .. 99, skip 84 ----------
+
+Thread #170 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #171 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #170
+  New state: shared-modified by threads #170, #171
+  Reason:    this thread, #171, holds no locks at all
+---------- char gran, 0 .. 99, skip 85 ----------
+
+Thread #172 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #173 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #172
+  New state: shared-modified by threads #172, #173
+  Reason:    this thread, #173, holds no locks at all
+---------- char gran, 0 .. 99, skip 86 ----------
+
+Thread #174 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #175 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #174
+  New state: shared-modified by threads #174, #175
+  Reason:    this thread, #175, holds no locks at all
+---------- char gran, 0 .. 99, skip 87 ----------
+
+Thread #176 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #177 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #176
+  New state: shared-modified by threads #176, #177
+  Reason:    this thread, #177, holds no locks at all
+---------- char gran, 0 .. 99, skip 88 ----------
+
+Thread #178 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #179 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #178
+  New state: shared-modified by threads #178, #179
+  Reason:    this thread, #179, holds no locks at all
+---------- char gran, 0 .. 99, skip 89 ----------
+
+Thread #180 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #181 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #180
+  New state: shared-modified by threads #180, #181
+  Reason:    this thread, #181, holds no locks at all
+---------- char gran, 0 .. 99, skip 90 ----------
+
+Thread #182 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #183 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #182
+  New state: shared-modified by threads #182, #183
+  Reason:    this thread, #183, holds no locks at all
+---------- char gran, 0 .. 99, skip 91 ----------
+
+Thread #184 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #185 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #184
+  New state: shared-modified by threads #184, #185
+  Reason:    this thread, #185, holds no locks at all
+---------- char gran, 0 .. 99, skip 92 ----------
+
+Thread #186 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #187 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:472)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #186
+  New state: shared-modified by threads #186, #187
+  Reason:    this thread, #187, holds no locks at all
+---------- char gran, 0 .. 99, skip 93 ----------
+
+Thread #188 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #189 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #188
+  New state: shared-modified by threads #188, #189
+  Reason:    this thread, #189, holds no locks at all
+---------- char gran, 0 .. 99, skip 94 ----------
+
+Thread #190 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #191 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #190
+  New state: shared-modified by threads #190, #191
+  Reason:    this thread, #191, holds no locks at all
+---------- char gran, 0 .. 99, skip 95 ----------
+
+Thread #192 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #193 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #192
+  New state: shared-modified by threads #192, #193
+  Reason:    this thread, #193, holds no locks at all
+---------- char gran, 0 .. 99, skip 96 ----------
+
+Thread #194 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #195 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:480)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #194
+  New state: shared-modified by threads #194, #195
+  Reason:    this thread, #195, holds no locks at all
+---------- char gran, 0 .. 99, skip 97 ----------
+
+Thread #196 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #197 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:482)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #196
+  New state: shared-modified by threads #196, #197
+  Reason:    this thread, #197, holds no locks at all
+---------- char gran, 0 .. 99, skip 98 ----------
+
+Thread #198 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #199 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:484)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #198
+  New state: shared-modified by threads #198, #199
+  Reason:    this thread, #199, holds no locks at all
+
+==========================================================
+=== 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 ===
+==========================================================
+
+---------- short gran, 0 .. 98, skip 0 ----------
+
+Thread #200 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #201 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #200
+  New state: shared-modified by threads #200, #201
+  Reason:    this thread, #201, holds no locks at all
+
+More than 100 errors detected.  Subsequent errors
+will still be recorded, but in less detail than before.
+---------- short gran, 1 .. 98, skip 1 ----------
+
+Thread #202 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #203 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #202
+  New state: shared-modified by threads #202, #203
+  Reason:    this thread, #203, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #202
+  New state: shared-modified by threads #202, #203
+  Reason:    this thread, #203, holds no locks at all
+---------- short gran, 0 .. 98, skip 2 ----------
+
+Thread #204 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #205 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #204
+  New state: shared-modified by threads #204, #205
+  Reason:    this thread, #205, holds no locks at all
+---------- short gran, 1 .. 98, skip 3 ----------
+
+Thread #206 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #207 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #206
+  New state: shared-modified by threads #206, #207
+  Reason:    this thread, #207, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #206
+  New state: shared-modified by threads #206, #207
+  Reason:    this thread, #207, holds no locks at all
+---------- short gran, 0 .. 98, skip 4 ----------
+
+Thread #208 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #209 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #208
+  New state: shared-modified by threads #208, #209
+  Reason:    this thread, #209, holds no locks at all
+---------- short gran, 1 .. 98, skip 5 ----------
+
+Thread #210 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #211 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #210
+  New state: shared-modified by threads #210, #211
+  Reason:    this thread, #211, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #210
+  New state: shared-modified by threads #210, #211
+  Reason:    this thread, #211, holds no locks at all
+---------- short gran, 0 .. 98, skip 6 ----------
+
+Thread #212 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #213 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #212
+  New state: shared-modified by threads #212, #213
+  Reason:    this thread, #213, holds no locks at all
+---------- short gran, 1 .. 98, skip 7 ----------
+
+Thread #214 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #215 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #214
+  New state: shared-modified by threads #214, #215
+  Reason:    this thread, #215, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #214
+  New state: shared-modified by threads #214, #215
+  Reason:    this thread, #215, holds no locks at all
+---------- short gran, 0 .. 98, skip 8 ----------
+
+Thread #216 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #217 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #216
+  New state: shared-modified by threads #216, #217
+  Reason:    this thread, #217, holds no locks at all
+---------- short gran, 1 .. 98, skip 9 ----------
+
+Thread #218 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #219 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #218
+  New state: shared-modified by threads #218, #219
+  Reason:    this thread, #219, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #218
+  New state: shared-modified by threads #218, #219
+  Reason:    this thread, #219, holds no locks at all
+---------- short gran, 0 .. 98, skip 10 ----------
+
+Thread #220 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #221 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #220
+  New state: shared-modified by threads #220, #221
+  Reason:    this thread, #221, holds no locks at all
+---------- short gran, 1 .. 98, skip 11 ----------
+
+Thread #222 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #223 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #222
+  New state: shared-modified by threads #222, #223
+  Reason:    this thread, #223, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #222
+  New state: shared-modified by threads #222, #223
+  Reason:    this thread, #223, holds no locks at all
+---------- short gran, 0 .. 98, skip 12 ----------
+
+Thread #224 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #225 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #224
+  New state: shared-modified by threads #224, #225
+  Reason:    this thread, #225, holds no locks at all
+---------- short gran, 1 .. 98, skip 13 ----------
+
+Thread #226 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #227 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #226
+  New state: shared-modified by threads #226, #227
+  Reason:    this thread, #227, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #226
+  New state: shared-modified by threads #226, #227
+  Reason:    this thread, #227, holds no locks at all
+---------- short gran, 0 .. 98, skip 14 ----------
+
+Thread #228 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #229 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #228
+  New state: shared-modified by threads #228, #229
+  Reason:    this thread, #229, holds no locks at all
+---------- short gran, 1 .. 98, skip 15 ----------
+
+Thread #230 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #231 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #230
+  New state: shared-modified by threads #230, #231
+  Reason:    this thread, #231, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #230
+  New state: shared-modified by threads #230, #231
+  Reason:    this thread, #231, holds no locks at all
+---------- short gran, 0 .. 98, skip 16 ----------
+
+Thread #232 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #233 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #232
+  New state: shared-modified by threads #232, #233
+  Reason:    this thread, #233, holds no locks at all
+---------- short gran, 1 .. 98, skip 17 ----------
+
+Thread #234 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #235 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #234
+  New state: shared-modified by threads #234, #235
+  Reason:    this thread, #235, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #234
+  New state: shared-modified by threads #234, #235
+  Reason:    this thread, #235, holds no locks at all
+---------- short gran, 0 .. 98, skip 18 ----------
+
+Thread #236 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #237 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #236
+  New state: shared-modified by threads #236, #237
+  Reason:    this thread, #237, holds no locks at all
+---------- short gran, 1 .. 98, skip 19 ----------
+
+Thread #238 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #239 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #238
+  New state: shared-modified by threads #238, #239
+  Reason:    this thread, #239, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #238
+  New state: shared-modified by threads #238, #239
+  Reason:    this thread, #239, holds no locks at all
+---------- short gran, 0 .. 98, skip 20 ----------
+
+Thread #240 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #241 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #240
+  New state: shared-modified by threads #240, #241
+  Reason:    this thread, #241, holds no locks at all
+---------- short gran, 1 .. 98, skip 21 ----------
+
+Thread #242 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #243 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #242
+  New state: shared-modified by threads #242, #243
+  Reason:    this thread, #243, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #242
+  New state: shared-modified by threads #242, #243
+  Reason:    this thread, #243, holds no locks at all
+---------- short gran, 0 .. 98, skip 22 ----------
+
+Thread #244 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #245 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #244
+  New state: shared-modified by threads #244, #245
+  Reason:    this thread, #245, holds no locks at all
+---------- short gran, 1 .. 98, skip 23 ----------
+
+Thread #246 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #247 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #246
+  New state: shared-modified by threads #246, #247
+  Reason:    this thread, #247, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #246
+  New state: shared-modified by threads #246, #247
+  Reason:    this thread, #247, holds no locks at all
+---------- short gran, 0 .. 98, skip 24 ----------
+
+Thread #248 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #249 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #248
+  New state: shared-modified by threads #248, #249
+  Reason:    this thread, #249, holds no locks at all
+---------- short gran, 1 .. 98, skip 25 ----------
+
+Thread #250 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #251 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #250
+  New state: shared-modified by threads #250, #251
+  Reason:    this thread, #251, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #250
+  New state: shared-modified by threads #250, #251
+  Reason:    this thread, #251, holds no locks at all
+---------- short gran, 0 .. 98, skip 26 ----------
+
+Thread #252 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #253 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #252
+  New state: shared-modified by threads #252, #253
+  Reason:    this thread, #253, holds no locks at all
+---------- short gran, 1 .. 98, skip 27 ----------
+
+Thread #254 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #255 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #254
+  New state: shared-modified by threads #254, #255
+  Reason:    this thread, #255, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #254
+  New state: shared-modified by threads #254, #255
+  Reason:    this thread, #255, holds no locks at all
+---------- short gran, 0 .. 98, skip 28 ----------
+
+Thread #256 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #257 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #256
+  New state: shared-modified by threads #256, #257
+  Reason:    this thread, #257, holds no locks at all
+---------- short gran, 1 .. 98, skip 29 ----------
+
+Thread #258 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #259 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #258
+  New state: shared-modified by threads #258, #259
+  Reason:    this thread, #259, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #258
+  New state: shared-modified by threads #258, #259
+  Reason:    this thread, #259, holds no locks at all
+---------- short gran, 0 .. 98, skip 30 ----------
+
+Thread #260 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #261 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #260
+  New state: shared-modified by threads #260, #261
+  Reason:    this thread, #261, holds no locks at all
+---------- short gran, 1 .. 98, skip 31 ----------
+
+Thread #262 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #263 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #262
+  New state: shared-modified by threads #262, #263
+  Reason:    this thread, #263, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #262
+  New state: shared-modified by threads #262, #263
+  Reason:    this thread, #263, holds no locks at all
+---------- short gran, 0 .. 98, skip 32 ----------
+
+Thread #264 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #265 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #264
+  New state: shared-modified by threads #264, #265
+  Reason:    this thread, #265, holds no locks at all
+---------- short gran, 1 .. 98, skip 33 ----------
+
+Thread #266 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #267 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #266
+  New state: shared-modified by threads #266, #267
+  Reason:    this thread, #267, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #266
+  New state: shared-modified by threads #266, #267
+  Reason:    this thread, #267, holds no locks at all
+---------- short gran, 0 .. 98, skip 34 ----------
+
+Thread #268 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #269 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #268
+  New state: shared-modified by threads #268, #269
+  Reason:    this thread, #269, holds no locks at all
+---------- short gran, 1 .. 98, skip 35 ----------
+
+Thread #270 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #271 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #270
+  New state: shared-modified by threads #270, #271
+  Reason:    this thread, #271, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #270
+  New state: shared-modified by threads #270, #271
+  Reason:    this thread, #271, holds no locks at all
+---------- short gran, 0 .. 98, skip 36 ----------
+
+Thread #272 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #273 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #272
+  New state: shared-modified by threads #272, #273
+  Reason:    this thread, #273, holds no locks at all
+---------- short gran, 1 .. 98, skip 37 ----------
+
+Thread #274 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #275 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #274
+  New state: shared-modified by threads #274, #275
+  Reason:    this thread, #275, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #274
+  New state: shared-modified by threads #274, #275
+  Reason:    this thread, #275, holds no locks at all
+---------- short gran, 0 .. 98, skip 38 ----------
+
+Thread #276 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #277 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #276
+  New state: shared-modified by threads #276, #277
+  Reason:    this thread, #277, holds no locks at all
+---------- short gran, 1 .. 98, skip 39 ----------
+
+Thread #278 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #279 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #278
+  New state: shared-modified by threads #278, #279
+  Reason:    this thread, #279, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #278
+  New state: shared-modified by threads #278, #279
+  Reason:    this thread, #279, holds no locks at all
+---------- short gran, 0 .. 98, skip 40 ----------
+
+Thread #280 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #281 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #280
+  New state: shared-modified by threads #280, #281
+  Reason:    this thread, #281, holds no locks at all
+---------- short gran, 1 .. 98, skip 41 ----------
+
+Thread #282 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #283 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #282
+  New state: shared-modified by threads #282, #283
+  Reason:    this thread, #283, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #282
+  New state: shared-modified by threads #282, #283
+  Reason:    this thread, #283, holds no locks at all
+---------- short gran, 0 .. 98, skip 42 ----------
+
+Thread #284 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #285 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #284
+  New state: shared-modified by threads #284, #285
+  Reason:    this thread, #285, holds no locks at all
+---------- short gran, 1 .. 98, skip 43 ----------
+
+Thread #286 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #287 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #286
+  New state: shared-modified by threads #286, #287
+  Reason:    this thread, #287, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #286
+  New state: shared-modified by threads #286, #287
+  Reason:    this thread, #287, holds no locks at all
+---------- short gran, 0 .. 98, skip 44 ----------
+
+Thread #288 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #289 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #288
+  New state: shared-modified by threads #288, #289
+  Reason:    this thread, #289, holds no locks at all
+---------- short gran, 1 .. 98, skip 45 ----------
+
+Thread #290 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #291 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #290
+  New state: shared-modified by threads #290, #291
+  Reason:    this thread, #291, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #290
+  New state: shared-modified by threads #290, #291
+  Reason:    this thread, #291, holds no locks at all
+---------- short gran, 0 .. 98, skip 46 ----------
+
+Thread #292 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #293 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #292
+  New state: shared-modified by threads #292, #293
+  Reason:    this thread, #293, holds no locks at all
+---------- short gran, 1 .. 98, skip 47 ----------
+
+Thread #294 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #295 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #294
+  New state: shared-modified by threads #294, #295
+  Reason:    this thread, #295, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #294
+  New state: shared-modified by threads #294, #295
+  Reason:    this thread, #295, holds no locks at all
+---------- short gran, 0 .. 98, skip 48 ----------
+
+Thread #296 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #297 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #296
+  New state: shared-modified by threads #296, #297
+  Reason:    this thread, #297, holds no locks at all
+---------- short gran, 1 .. 98, skip 49 ----------
+
+Thread #298 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #299 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #298
+  New state: shared-modified by threads #298, #299
+  Reason:    this thread, #299, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #298
+  New state: shared-modified by threads #298, #299
+  Reason:    this thread, #299, holds no locks at all
+---------- short gran, 0 .. 98, skip 50 ----------
+
+Thread #300 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #301 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #300
+  New state: shared-modified by threads #300, #301
+  Reason:    this thread, #301, holds no locks at all
+---------- short gran, 1 .. 98, skip 51 ----------
+
+Thread #302 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #303 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #302
+  New state: shared-modified by threads #302, #303
+  Reason:    this thread, #303, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #302
+  New state: shared-modified by threads #302, #303
+  Reason:    this thread, #303, holds no locks at all
+---------- short gran, 0 .. 98, skip 52 ----------
+
+Thread #304 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #305 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #304
+  New state: shared-modified by threads #304, #305
+  Reason:    this thread, #305, holds no locks at all
+---------- short gran, 1 .. 98, skip 53 ----------
+
+Thread #306 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #307 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #306
+  New state: shared-modified by threads #306, #307
+  Reason:    this thread, #307, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #306
+  New state: shared-modified by threads #306, #307
+  Reason:    this thread, #307, holds no locks at all
+---------- short gran, 0 .. 98, skip 54 ----------
+
+Thread #308 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #309 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #308
+  New state: shared-modified by threads #308, #309
+  Reason:    this thread, #309, holds no locks at all
+---------- short gran, 1 .. 98, skip 55 ----------
+
+Thread #310 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #311 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #310
+  New state: shared-modified by threads #310, #311
+  Reason:    this thread, #311, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #310
+  New state: shared-modified by threads #310, #311
+  Reason:    this thread, #311, holds no locks at all
+---------- short gran, 0 .. 98, skip 56 ----------
+
+Thread #312 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #313 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #312
+  New state: shared-modified by threads #312, #313
+  Reason:    this thread, #313, holds no locks at all
+---------- short gran, 1 .. 98, skip 57 ----------
+
+Thread #314 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #315 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #314
+  New state: shared-modified by threads #314, #315
+  Reason:    this thread, #315, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #314
+  New state: shared-modified by threads #314, #315
+  Reason:    this thread, #315, holds no locks at all
+---------- short gran, 0 .. 98, skip 58 ----------
+
+Thread #316 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #317 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #316
+  New state: shared-modified by threads #316, #317
+  Reason:    this thread, #317, holds no locks at all
+---------- short gran, 1 .. 98, skip 59 ----------
+
+Thread #318 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #319 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #318
+  New state: shared-modified by threads #318, #319
+  Reason:    this thread, #319, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #318
+  New state: shared-modified by threads #318, #319
+  Reason:    this thread, #319, holds no locks at all
+---------- short gran, 0 .. 98, skip 60 ----------
+
+Thread #320 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #321 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #320
+  New state: shared-modified by threads #320, #321
+  Reason:    this thread, #321, holds no locks at all
+---------- short gran, 1 .. 98, skip 61 ----------
+
+Thread #322 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #323 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #322
+  New state: shared-modified by threads #322, #323
+  Reason:    this thread, #323, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #322
+  New state: shared-modified by threads #322, #323
+  Reason:    this thread, #323, holds no locks at all
+---------- short gran, 0 .. 98, skip 62 ----------
+
+Thread #324 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #325 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #324
+  New state: shared-modified by threads #324, #325
+  Reason:    this thread, #325, holds no locks at all
+---------- short gran, 1 .. 98, skip 63 ----------
+
+Thread #326 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #327 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #326
+  New state: shared-modified by threads #326, #327
+  Reason:    this thread, #327, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #326
+  New state: shared-modified by threads #326, #327
+  Reason:    this thread, #327, holds no locks at all
+---------- short gran, 0 .. 98, skip 64 ----------
+
+Thread #328 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #329 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #328
+  New state: shared-modified by threads #328, #329
+  Reason:    this thread, #329, holds no locks at all
+---------- short gran, 1 .. 98, skip 65 ----------
+
+Thread #330 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #331 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #330
+  New state: shared-modified by threads #330, #331
+  Reason:    this thread, #331, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #330
+  New state: shared-modified by threads #330, #331
+  Reason:    this thread, #331, holds no locks at all
+---------- short gran, 0 .. 98, skip 66 ----------
+
+Thread #332 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #333 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #332
+  New state: shared-modified by threads #332, #333
+  Reason:    this thread, #333, holds no locks at all
+---------- short gran, 1 .. 98, skip 67 ----------
+
+Thread #334 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #335 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #334
+  New state: shared-modified by threads #334, #335
+  Reason:    this thread, #335, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #334
+  New state: shared-modified by threads #334, #335
+  Reason:    this thread, #335, holds no locks at all
+---------- short gran, 0 .. 98, skip 68 ----------
+
+Thread #336 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #337 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #336
+  New state: shared-modified by threads #336, #337
+  Reason:    this thread, #337, holds no locks at all
+---------- short gran, 1 .. 98, skip 69 ----------
+
+Thread #338 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #339 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #338
+  New state: shared-modified by threads #338, #339
+  Reason:    this thread, #339, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #338
+  New state: shared-modified by threads #338, #339
+  Reason:    this thread, #339, holds no locks at all
+---------- short gran, 0 .. 98, skip 70 ----------
+
+Thread #340 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #341 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #340
+  New state: shared-modified by threads #340, #341
+  Reason:    this thread, #341, holds no locks at all
+---------- short gran, 1 .. 98, skip 71 ----------
+
+Thread #342 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #343 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #342
+  New state: shared-modified by threads #342, #343
+  Reason:    this thread, #343, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #342
+  New state: shared-modified by threads #342, #343
+  Reason:    this thread, #343, holds no locks at all
+---------- short gran, 0 .. 98, skip 72 ----------
+
+Thread #344 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #345 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #344
+  New state: shared-modified by threads #344, #345
+  Reason:    this thread, #345, holds no locks at all
+---------- short gran, 1 .. 98, skip 73 ----------
+
+Thread #346 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #347 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #346
+  New state: shared-modified by threads #346, #347
+  Reason:    this thread, #347, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #346
+  New state: shared-modified by threads #346, #347
+  Reason:    this thread, #347, holds no locks at all
+---------- short gran, 0 .. 98, skip 74 ----------
+
+Thread #348 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #349 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #348
+  New state: shared-modified by threads #348, #349
+  Reason:    this thread, #349, holds no locks at all
+---------- short gran, 1 .. 98, skip 75 ----------
+
+Thread #350 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #351 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #350
+  New state: shared-modified by threads #350, #351
+  Reason:    this thread, #351, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #350
+  New state: shared-modified by threads #350, #351
+  Reason:    this thread, #351, holds no locks at all
+---------- short gran, 0 .. 98, skip 76 ----------
+
+Thread #352 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #353 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #352
+  New state: shared-modified by threads #352, #353
+  Reason:    this thread, #353, holds no locks at all
+---------- short gran, 1 .. 98, skip 77 ----------
+
+Thread #354 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #355 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #354
+  New state: shared-modified by threads #354, #355
+  Reason:    this thread, #355, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #354
+  New state: shared-modified by threads #354, #355
+  Reason:    this thread, #355, holds no locks at all
+---------- short gran, 0 .. 98, skip 78 ----------
+
+Thread #356 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #357 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #356
+  New state: shared-modified by threads #356, #357
+  Reason:    this thread, #357, holds no locks at all
+---------- short gran, 1 .. 98, skip 79 ----------
+
+Thread #358 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #359 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #358
+  New state: shared-modified by threads #358, #359
+  Reason:    this thread, #359, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #358
+  New state: shared-modified by threads #358, #359
+  Reason:    this thread, #359, holds no locks at all
+---------- short gran, 0 .. 98, skip 80 ----------
+
+Thread #360 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #361 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #360
+  New state: shared-modified by threads #360, #361
+  Reason:    this thread, #361, holds no locks at all
+---------- short gran, 1 .. 98, skip 81 ----------
+
+Thread #362 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #363 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #362
+  New state: shared-modified by threads #362, #363
+  Reason:    this thread, #363, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #362
+  New state: shared-modified by threads #362, #363
+  Reason:    this thread, #363, holds no locks at all
+---------- short gran, 0 .. 98, skip 82 ----------
+
+Thread #364 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #365 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #364
+  New state: shared-modified by threads #364, #365
+  Reason:    this thread, #365, holds no locks at all
+---------- short gran, 1 .. 98, skip 83 ----------
+
+Thread #366 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #367 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #366
+  New state: shared-modified by threads #366, #367
+  Reason:    this thread, #367, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #366
+  New state: shared-modified by threads #366, #367
+  Reason:    this thread, #367, holds no locks at all
+---------- short gran, 0 .. 98, skip 84 ----------
+
+Thread #368 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #369 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #368
+  New state: shared-modified by threads #368, #369
+  Reason:    this thread, #369, holds no locks at all
+---------- short gran, 1 .. 98, skip 85 ----------
+
+Thread #370 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #371 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #370
+  New state: shared-modified by threads #370, #371
+  Reason:    this thread, #371, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #370
+  New state: shared-modified by threads #370, #371
+  Reason:    this thread, #371, holds no locks at all
+---------- short gran, 0 .. 98, skip 86 ----------
+
+Thread #372 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #373 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #372
+  New state: shared-modified by threads #372, #373
+  Reason:    this thread, #373, holds no locks at all
+---------- short gran, 1 .. 98, skip 87 ----------
+
+Thread #374 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #375 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #374
+  New state: shared-modified by threads #374, #375
+  Reason:    this thread, #375, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #374
+  New state: shared-modified by threads #374, #375
+  Reason:    this thread, #375, holds no locks at all
+---------- short gran, 0 .. 98, skip 88 ----------
+
+Thread #376 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #377 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #376
+  New state: shared-modified by threads #376, #377
+  Reason:    this thread, #377, holds no locks at all
+---------- short gran, 1 .. 98, skip 89 ----------
+
+Thread #378 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #379 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #378
+  New state: shared-modified by threads #378, #379
+  Reason:    this thread, #379, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #378
+  New state: shared-modified by threads #378, #379
+  Reason:    this thread, #379, holds no locks at all
+---------- short gran, 0 .. 98, skip 90 ----------
+
+Thread #380 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #381 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #380
+  New state: shared-modified by threads #380, #381
+  Reason:    this thread, #381, holds no locks at all
+---------- short gran, 1 .. 98, skip 91 ----------
+
+Thread #382 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #383 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #382
+  New state: shared-modified by threads #382, #383
+  Reason:    this thread, #383, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #382
+  New state: shared-modified by threads #382, #383
+  Reason:    this thread, #383, holds no locks at all
+---------- short gran, 0 .. 98, skip 92 ----------
+
+Thread #384 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #385 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:472)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #384
+  New state: shared-modified by threads #384, #385
+  Reason:    this thread, #385, holds no locks at all
+---------- short gran, 1 .. 98, skip 93 ----------
+
+Thread #386 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #387 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #386
+  New state: shared-modified by threads #386, #387
+  Reason:    this thread, #387, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #386
+  New state: shared-modified by threads #386, #387
+  Reason:    this thread, #387, holds no locks at all
+---------- short gran, 0 .. 98, skip 94 ----------
+
+Thread #388 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #389 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #388
+  New state: shared-modified by threads #388, #389
+  Reason:    this thread, #389, holds no locks at all
+---------- short gran, 1 .. 98, skip 95 ----------
+
+Thread #390 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #391 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #390
+  New state: shared-modified by threads #390, #391
+  Reason:    this thread, #391, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #390
+  New state: shared-modified by threads #390, #391
+  Reason:    this thread, #391, holds no locks at all
+---------- short gran, 0 .. 98, skip 96 ----------
+
+Thread #392 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #393 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:480)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #392
+  New state: shared-modified by threads #392, #393
+  Reason:    this thread, #393, holds no locks at all
+---------- short gran, 1 .. 98, skip 97 ----------
+
+Thread #394 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #395 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:482)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #394
+  New state: shared-modified by threads #394, #395
+  Reason:    this thread, #395, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:482)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #394
+  New state: shared-modified by threads #394, #395
+  Reason:    this thread, #395, holds no locks at all
+
+==========================================================
+=== 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ===
+==========================================================
+
+---------- int gran, 0 .. 96, skip 0 ----------
+
+Thread #396 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #397 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #396
+  New state: shared-modified by threads #396, #397
+  Reason:    this thread, #397, holds no locks at all
+---------- int gran, 1 .. 96, skip 1 ----------
+
+Thread #398 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #399 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+---------- int gran, 2 .. 96, skip 2 ----------
+
+Thread #400 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #401 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #400
+  New state: shared-modified by threads #400, #401
+  Reason:    this thread, #401, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #400
+  New state: shared-modified by threads #400, #401
+  Reason:    this thread, #401, holds no locks at all
+---------- int gran, 3 .. 96, skip 3 ----------
+
+Thread #402 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #403 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+---------- int gran, 0 .. 96, skip 4 ----------
+
+Thread #404 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #405 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #404
+  New state: shared-modified by threads #404, #405
+  Reason:    this thread, #405, holds no locks at all
+---------- int gran, 1 .. 96, skip 5 ----------
+
+Thread #406 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #407 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+---------- int gran, 2 .. 96, skip 6 ----------
+
+Thread #408 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #409 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #408
+  New state: shared-modified by threads #408, #409
+  Reason:    this thread, #409, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #408
+  New state: shared-modified by threads #408, #409
+  Reason:    this thread, #409, holds no locks at all
+---------- int gran, 3 .. 96, skip 7 ----------
+
+Thread #410 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #411 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+---------- int gran, 0 .. 96, skip 8 ----------
+
+Thread #412 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #413 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #412
+  New state: shared-modified by threads #412, #413
+  Reason:    this thread, #413, holds no locks at all
+---------- int gran, 1 .. 96, skip 9 ----------
+
+Thread #414 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #415 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+---------- int gran, 2 .. 96, skip 10 ----------
+
+Thread #416 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #417 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #416
+  New state: shared-modified by threads #416, #417
+  Reason:    this thread, #417, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #416
+  New state: shared-modified by threads #416, #417
+  Reason:    this thread, #417, holds no locks at all
+---------- int gran, 3 .. 96, skip 11 ----------
+
+Thread #418 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #419 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+---------- int gran, 0 .. 96, skip 12 ----------
+
+Thread #420 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #421 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #420
+  New state: shared-modified by threads #420, #421
+  Reason:    this thread, #421, holds no locks at all
+---------- int gran, 1 .. 96, skip 13 ----------
+
+Thread #422 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #423 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+---------- int gran, 2 .. 96, skip 14 ----------
+
+Thread #424 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #425 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #424
+  New state: shared-modified by threads #424, #425
+  Reason:    this thread, #425, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #424
+  New state: shared-modified by threads #424, #425
+  Reason:    this thread, #425, holds no locks at all
+---------- int gran, 3 .. 96, skip 15 ----------
+
+Thread #426 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #427 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+---------- int gran, 0 .. 96, skip 16 ----------
+
+Thread #428 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #429 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #428
+  New state: shared-modified by threads #428, #429
+  Reason:    this thread, #429, holds no locks at all
+---------- int gran, 1 .. 96, skip 17 ----------
+
+Thread #430 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #431 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+---------- int gran, 2 .. 96, skip 18 ----------
+
+Thread #432 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #433 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #432
+  New state: shared-modified by threads #432, #433
+  Reason:    this thread, #433, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #432
+  New state: shared-modified by threads #432, #433
+  Reason:    this thread, #433, holds no locks at all
+---------- int gran, 3 .. 96, skip 19 ----------
+
+Thread #434 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #435 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+---------- int gran, 0 .. 96, skip 20 ----------
+
+Thread #436 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #437 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #436
+  New state: shared-modified by threads #436, #437
+  Reason:    this thread, #437, holds no locks at all
+---------- int gran, 1 .. 96, skip 21 ----------
+
+Thread #438 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #439 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+---------- int gran, 2 .. 96, skip 22 ----------
+
+Thread #440 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #441 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #440
+  New state: shared-modified by threads #440, #441
+  Reason:    this thread, #441, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #440
+  New state: shared-modified by threads #440, #441
+  Reason:    this thread, #441, holds no locks at all
+---------- int gran, 3 .. 96, skip 23 ----------
+
+Thread #442 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #443 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+---------- int gran, 0 .. 96, skip 24 ----------
+
+Thread #444 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #445 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #444
+  New state: shared-modified by threads #444, #445
+  Reason:    this thread, #445, holds no locks at all
+---------- int gran, 1 .. 96, skip 25 ----------
+
+Thread #446 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #447 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+---------- int gran, 2 .. 96, skip 26 ----------
+
+Thread #448 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #449 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #448
+  New state: shared-modified by threads #448, #449
+  Reason:    this thread, #449, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #448
+  New state: shared-modified by threads #448, #449
+  Reason:    this thread, #449, holds no locks at all
+---------- int gran, 3 .. 96, skip 27 ----------
+
+Thread #450 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #451 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+---------- int gran, 0 .. 96, skip 28 ----------
+
+Thread #452 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #453 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #452
+  New state: shared-modified by threads #452, #453
+  Reason:    this thread, #453, holds no locks at all
+---------- int gran, 1 .. 96, skip 29 ----------
+
+Thread #454 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #455 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+---------- int gran, 2 .. 96, skip 30 ----------
+
+Thread #456 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #457 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #456
+  New state: shared-modified by threads #456, #457
+  Reason:    this thread, #457, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #456
+  New state: shared-modified by threads #456, #457
+  Reason:    this thread, #457, holds no locks at all
+---------- int gran, 3 .. 96, skip 31 ----------
+
+Thread #458 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #459 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+---------- int gran, 0 .. 96, skip 32 ----------
+
+Thread #460 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #461 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #460
+  New state: shared-modified by threads #460, #461
+  Reason:    this thread, #461, holds no locks at all
+---------- int gran, 1 .. 96, skip 33 ----------
+
+Thread #462 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #463 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+---------- int gran, 2 .. 96, skip 34 ----------
+
+Thread #464 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #465 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #464
+  New state: shared-modified by threads #464, #465
+  Reason:    this thread, #465, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #464
+  New state: shared-modified by threads #464, #465
+  Reason:    this thread, #465, holds no locks at all
+---------- int gran, 3 .. 96, skip 35 ----------
+
+Thread #466 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #467 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+---------- int gran, 0 .. 96, skip 36 ----------
+
+Thread #468 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #469 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #468
+  New state: shared-modified by threads #468, #469
+  Reason:    this thread, #469, holds no locks at all
+---------- int gran, 1 .. 96, skip 37 ----------
+
+Thread #470 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #471 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+---------- int gran, 2 .. 96, skip 38 ----------
+
+Thread #472 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #473 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #472
+  New state: shared-modified by threads #472, #473
+  Reason:    this thread, #473, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #472
+  New state: shared-modified by threads #472, #473
+  Reason:    this thread, #473, holds no locks at all
+---------- int gran, 3 .. 96, skip 39 ----------
+
+Thread #474 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #475 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+---------- int gran, 0 .. 96, skip 40 ----------
+
+Thread #476 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #477 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #476
+  New state: shared-modified by threads #476, #477
+  Reason:    this thread, #477, holds no locks at all
+---------- int gran, 1 .. 96, skip 41 ----------
+
+Thread #478 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #479 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+---------- int gran, 2 .. 96, skip 42 ----------
+
+Thread #480 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #481 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #480
+  New state: shared-modified by threads #480, #481
+  Reason:    this thread, #481, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #480
+  New state: shared-modified by threads #480, #481
+  Reason:    this thread, #481, holds no locks at all
+---------- int gran, 3 .. 96, skip 43 ----------
+
+Thread #482 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #483 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+---------- int gran, 0 .. 96, skip 44 ----------
+
+Thread #484 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #485 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #484
+  New state: shared-modified by threads #484, #485
+  Reason:    this thread, #485, holds no locks at all
+---------- int gran, 1 .. 96, skip 45 ----------
+
+Thread #486 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #487 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+---------- int gran, 2 .. 96, skip 46 ----------
+
+Thread #488 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #489 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #488
+  New state: shared-modified by threads #488, #489
+  Reason:    this thread, #489, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #488
+  New state: shared-modified by threads #488, #489
+  Reason:    this thread, #489, holds no locks at all
+---------- int gran, 3 .. 96, skip 47 ----------
+
+Thread #490 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #491 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+---------- int gran, 0 .. 96, skip 48 ----------
+
+Thread #492 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #493 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #492
+  New state: shared-modified by threads #492, #493
+  Reason:    this thread, #493, holds no locks at all
+---------- int gran, 1 .. 96, skip 49 ----------
+
+Thread #494 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #495 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+---------- int gran, 2 .. 96, skip 50 ----------
+
+Thread #496 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #497 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #496
+  New state: shared-modified by threads #496, #497
+  Reason:    this thread, #497, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #496
+  New state: shared-modified by threads #496, #497
+  Reason:    this thread, #497, holds no locks at all
+---------- int gran, 3 .. 96, skip 51 ----------
+
+Thread #498 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #499 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+---------- int gran, 0 .. 96, skip 52 ----------
+
+Thread #500 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #501 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #500
+  New state: shared-modified by threads #500, #501
+  Reason:    this thread, #501, holds no locks at all
+---------- int gran, 1 .. 96, skip 53 ----------
+
+Thread #502 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #503 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+---------- int gran, 2 .. 96, skip 54 ----------
+
+Thread #504 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #505 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #504
+  New state: shared-modified by threads #504, #505
+  Reason:    this thread, #505, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #504
+  New state: shared-modified by threads #504, #505
+  Reason:    this thread, #505, holds no locks at all
+---------- int gran, 3 .. 96, skip 55 ----------
+
+Thread #506 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #507 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+---------- int gran, 0 .. 96, skip 56 ----------
+
+Thread #508 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #509 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #508
+  New state: shared-modified by threads #508, #509
+  Reason:    this thread, #509, holds no locks at all
+---------- int gran, 1 .. 96, skip 57 ----------
+
+Thread #510 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #511 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+---------- int gran, 2 .. 96, skip 58 ----------
+
+Thread #512 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #513 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #512
+  New state: shared-modified by threads #512, #513
+  Reason:    this thread, #513, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #512
+  New state: shared-modified by threads #512, #513
+  Reason:    this thread, #513, holds no locks at all
+---------- int gran, 3 .. 96, skip 59 ----------
+
+Thread #514 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #515 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+---------- int gran, 0 .. 96, skip 60 ----------
+
+Thread #516 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #517 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #516
+  New state: shared-modified by threads #516, #517
+  Reason:    this thread, #517, holds no locks at all
+---------- int gran, 1 .. 96, skip 61 ----------
+
+Thread #518 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #519 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+---------- int gran, 2 .. 96, skip 62 ----------
+
+Thread #520 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #521 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #520
+  New state: shared-modified by threads #520, #521
+  Reason:    this thread, #521, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #520
+  New state: shared-modified by threads #520, #521
+  Reason:    this thread, #521, holds no locks at all
+---------- int gran, 3 .. 96, skip 63 ----------
+
+Thread #522 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #523 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+---------- int gran, 0 .. 96, skip 64 ----------
+
+Thread #524 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #525 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #524
+  New state: shared-modified by threads #524, #525
+  Reason:    this thread, #525, holds no locks at all
+---------- int gran, 1 .. 96, skip 65 ----------
+
+Thread #526 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #527 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+---------- int gran, 2 .. 96, skip 66 ----------
+
+Thread #528 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #529 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #528
+  New state: shared-modified by threads #528, #529
+  Reason:    this thread, #529, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #528
+  New state: shared-modified by threads #528, #529
+  Reason:    this thread, #529, holds no locks at all
+---------- int gran, 3 .. 96, skip 67 ----------
+
+Thread #530 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #531 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+---------- int gran, 0 .. 96, skip 68 ----------
+
+Thread #532 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #533 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #532
+  New state: shared-modified by threads #532, #533
+  Reason:    this thread, #533, holds no locks at all
+---------- int gran, 1 .. 96, skip 69 ----------
+
+Thread #534 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #535 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+---------- int gran, 2 .. 96, skip 70 ----------
+
+Thread #536 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #537 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #536
+  New state: shared-modified by threads #536, #537
+  Reason:    this thread, #537, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #536
+  New state: shared-modified by threads #536, #537
+  Reason:    this thread, #537, holds no locks at all
+---------- int gran, 3 .. 96, skip 71 ----------
+
+Thread #538 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #539 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+---------- int gran, 0 .. 96, skip 72 ----------
+
+Thread #540 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #541 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #540
+  New state: shared-modified by threads #540, #541
+  Reason:    this thread, #541, holds no locks at all
+---------- int gran, 1 .. 96, skip 73 ----------
+
+Thread #542 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #543 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+---------- int gran, 2 .. 96, skip 74 ----------
+
+Thread #544 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #545 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #544
+  New state: shared-modified by threads #544, #545
+  Reason:    this thread, #545, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #544
+  New state: shared-modified by threads #544, #545
+  Reason:    this thread, #545, holds no locks at all
+---------- int gran, 3 .. 96, skip 75 ----------
+
+Thread #546 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #547 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+---------- int gran, 0 .. 96, skip 76 ----------
+
+Thread #548 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #549 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #548
+  New state: shared-modified by threads #548, #549
+  Reason:    this thread, #549, holds no locks at all
+---------- int gran, 1 .. 96, skip 77 ----------
+
+Thread #550 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #551 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+---------- int gran, 2 .. 96, skip 78 ----------
+
+Thread #552 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #553 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #552
+  New state: shared-modified by threads #552, #553
+  Reason:    this thread, #553, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #552
+  New state: shared-modified by threads #552, #553
+  Reason:    this thread, #553, holds no locks at all
+---------- int gran, 3 .. 96, skip 79 ----------
+
+Thread #554 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #555 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+---------- int gran, 0 .. 96, skip 80 ----------
+
+Thread #556 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #557 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #556
+  New state: shared-modified by threads #556, #557
+  Reason:    this thread, #557, holds no locks at all
+---------- int gran, 1 .. 96, skip 81 ----------
+
+Thread #558 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #559 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+---------- int gran, 2 .. 96, skip 82 ----------
+
+Thread #560 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #561 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #560
+  New state: shared-modified by threads #560, #561
+  Reason:    this thread, #561, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #560
+  New state: shared-modified by threads #560, #561
+  Reason:    this thread, #561, holds no locks at all
+---------- int gran, 3 .. 96, skip 83 ----------
+
+Thread #562 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #563 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+---------- int gran, 0 .. 96, skip 84 ----------
+
+Thread #564 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #565 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #564
+  New state: shared-modified by threads #564, #565
+  Reason:    this thread, #565, holds no locks at all
+---------- int gran, 1 .. 96, skip 85 ----------
+
+Thread #566 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #567 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+---------- int gran, 2 .. 96, skip 86 ----------
+
+Thread #568 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #569 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #568
+  New state: shared-modified by threads #568, #569
+  Reason:    this thread, #569, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #568
+  New state: shared-modified by threads #568, #569
+  Reason:    this thread, #569, holds no locks at all
+---------- int gran, 3 .. 96, skip 87 ----------
+
+Thread #570 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #571 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+---------- int gran, 0 .. 96, skip 88 ----------
+
+Thread #572 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #573 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #572
+  New state: shared-modified by threads #572, #573
+  Reason:    this thread, #573, holds no locks at all
+---------- int gran, 1 .. 96, skip 89 ----------
+
+Thread #574 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #575 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+---------- int gran, 2 .. 96, skip 90 ----------
+
+Thread #576 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #577 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #576
+  New state: shared-modified by threads #576, #577
+  Reason:    this thread, #577, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #576
+  New state: shared-modified by threads #576, #577
+  Reason:    this thread, #577, holds no locks at all
+---------- int gran, 3 .. 96, skip 91 ----------
+
+Thread #578 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #579 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+---------- int gran, 0 .. 96, skip 92 ----------
+
+Thread #580 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #581 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:472)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #580
+  New state: shared-modified by threads #580, #581
+  Reason:    this thread, #581, holds no locks at all
+---------- int gran, 1 .. 96, skip 93 ----------
+
+Thread #582 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #583 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+---------- int gran, 2 .. 96, skip 94 ----------
+
+Thread #584 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #585 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #584
+  New state: shared-modified by threads #584, #585
+  Reason:    this thread, #585, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #584
+  New state: shared-modified by threads #584, #585
+  Reason:    this thread, #585, holds no locks at all
+---------- int gran, 3 .. 96, skip 95 ----------
+
+Thread #586 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #587 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+==========================================================
+=== 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 ===
+==========================================================
+
+---------- double gran, 0 .. 92, skip 0 ----------
+
+Thread #588 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #589 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #588
+  New state: shared-modified by threads #588, #589
+  Reason:    this thread, #589, holds no locks at all
+---------- double gran, 1 .. 92, skip 1 ----------
+
+Thread #590 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #591 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+---------- double gran, 2 .. 92, skip 2 ----------
+
+Thread #592 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #593 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+---------- double gran, 3 .. 92, skip 3 ----------
+
+Thread #594 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #595 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+---------- double gran, 4 .. 92, skip 4 ----------
+
+Thread #596 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #597 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #596
+  New state: shared-modified by threads #596, #597
+  Reason:    this thread, #597, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #596
+  New state: shared-modified by threads #596, #597
+  Reason:    this thread, #597, holds no locks at all
+---------- double gran, 5 .. 92, skip 5 ----------
+
+Thread #598 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #599 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+---------- double gran, 6 .. 92, skip 6 ----------
+
+Thread #600 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #601 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+---------- double gran, 7 .. 92, skip 7 ----------
+
+Thread #602 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #603 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+---------- double gran, 0 .. 92, skip 8 ----------
+
+Thread #604 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #605 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #604
+  New state: shared-modified by threads #604, #605
+  Reason:    this thread, #605, holds no locks at all
+---------- double gran, 1 .. 92, skip 9 ----------
+
+Thread #606 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #607 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+---------- double gran, 2 .. 92, skip 10 ----------
+
+Thread #608 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #609 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+---------- double gran, 3 .. 92, skip 11 ----------
+
+Thread #610 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #611 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+---------- double gran, 4 .. 92, skip 12 ----------
+
+Thread #612 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #613 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #612
+  New state: shared-modified by threads #612, #613
+  Reason:    this thread, #613, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #612
+  New state: shared-modified by threads #612, #613
+  Reason:    this thread, #613, holds no locks at all
+---------- double gran, 5 .. 92, skip 13 ----------
+
+Thread #614 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #615 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+---------- double gran, 6 .. 92, skip 14 ----------
+
+Thread #616 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #617 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+---------- double gran, 7 .. 92, skip 15 ----------
+
+Thread #618 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #619 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+---------- double gran, 0 .. 92, skip 16 ----------
+
+Thread #620 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #621 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #620
+  New state: shared-modified by threads #620, #621
+  Reason:    this thread, #621, holds no locks at all
+---------- double gran, 1 .. 92, skip 17 ----------
+
+Thread #622 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #623 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+---------- double gran, 2 .. 92, skip 18 ----------
+
+Thread #624 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #625 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+---------- double gran, 3 .. 92, skip 19 ----------
+
+Thread #626 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #627 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+---------- double gran, 4 .. 92, skip 20 ----------
+
+Thread #628 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #629 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #628
+  New state: shared-modified by threads #628, #629
+  Reason:    this thread, #629, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #628
+  New state: shared-modified by threads #628, #629
+  Reason:    this thread, #629, holds no locks at all
+---------- double gran, 5 .. 92, skip 21 ----------
+
+Thread #630 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #631 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+---------- double gran, 6 .. 92, skip 22 ----------
+
+Thread #632 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #633 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+---------- double gran, 7 .. 92, skip 23 ----------
+
+Thread #634 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #635 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+---------- double gran, 0 .. 92, skip 24 ----------
+
+Thread #636 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #637 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #636
+  New state: shared-modified by threads #636, #637
+  Reason:    this thread, #637, holds no locks at all
+---------- double gran, 1 .. 92, skip 25 ----------
+
+Thread #638 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #639 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+---------- double gran, 2 .. 92, skip 26 ----------
+
+Thread #640 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #641 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+---------- double gran, 3 .. 92, skip 27 ----------
+
+Thread #642 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #643 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+---------- double gran, 4 .. 92, skip 28 ----------
+
+Thread #644 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #645 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #644
+  New state: shared-modified by threads #644, #645
+  Reason:    this thread, #645, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #644
+  New state: shared-modified by threads #644, #645
+  Reason:    this thread, #645, holds no locks at all
+---------- double gran, 5 .. 92, skip 29 ----------
+
+Thread #646 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #647 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+---------- double gran, 6 .. 92, skip 30 ----------
+
+Thread #648 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #649 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+---------- double gran, 7 .. 92, skip 31 ----------
+
+Thread #650 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #651 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+---------- double gran, 0 .. 92, skip 32 ----------
+
+Thread #652 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #653 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #652
+  New state: shared-modified by threads #652, #653
+  Reason:    this thread, #653, holds no locks at all
+---------- double gran, 1 .. 92, skip 33 ----------
+
+Thread #654 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #655 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+---------- double gran, 2 .. 92, skip 34 ----------
+
+Thread #656 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #657 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+---------- double gran, 3 .. 92, skip 35 ----------
+
+Thread #658 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #659 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+---------- double gran, 4 .. 92, skip 36 ----------
+
+Thread #660 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #661 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #660
+  New state: shared-modified by threads #660, #661
+  Reason:    this thread, #661, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #660
+  New state: shared-modified by threads #660, #661
+  Reason:    this thread, #661, holds no locks at all
+---------- double gran, 5 .. 92, skip 37 ----------
+
+Thread #662 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #663 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+---------- double gran, 6 .. 92, skip 38 ----------
+
+Thread #664 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #665 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+---------- double gran, 7 .. 92, skip 39 ----------
+
+Thread #666 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #667 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+---------- double gran, 0 .. 92, skip 40 ----------
+
+Thread #668 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #669 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #668
+  New state: shared-modified by threads #668, #669
+  Reason:    this thread, #669, holds no locks at all
+---------- double gran, 1 .. 92, skip 41 ----------
+
+Thread #670 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #671 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+---------- double gran, 2 .. 92, skip 42 ----------
+
+Thread #672 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #673 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+---------- double gran, 3 .. 92, skip 43 ----------
+
+Thread #674 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #675 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+---------- double gran, 4 .. 92, skip 44 ----------
+
+Thread #676 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #677 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #676
+  New state: shared-modified by threads #676, #677
+  Reason:    this thread, #677, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #676
+  New state: shared-modified by threads #676, #677
+  Reason:    this thread, #677, holds no locks at all
+---------- double gran, 5 .. 92, skip 45 ----------
+
+Thread #678 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #679 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+---------- double gran, 6 .. 92, skip 46 ----------
+
+Thread #680 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #681 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+---------- double gran, 7 .. 92, skip 47 ----------
+
+Thread #682 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #683 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+---------- double gran, 0 .. 92, skip 48 ----------
+
+Thread #684 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #685 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #684
+  New state: shared-modified by threads #684, #685
+  Reason:    this thread, #685, holds no locks at all
+---------- double gran, 1 .. 92, skip 49 ----------
+
+Thread #686 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #687 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+---------- double gran, 2 .. 92, skip 50 ----------
+
+Thread #688 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #689 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+---------- double gran, 3 .. 92, skip 51 ----------
+
+Thread #690 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #691 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+---------- double gran, 4 .. 92, skip 52 ----------
+
+Thread #692 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #693 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #692
+  New state: shared-modified by threads #692, #693
+  Reason:    this thread, #693, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #692
+  New state: shared-modified by threads #692, #693
+  Reason:    this thread, #693, holds no locks at all
+---------- double gran, 5 .. 92, skip 53 ----------
+
+Thread #694 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #695 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+---------- double gran, 6 .. 92, skip 54 ----------
+
+Thread #696 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #697 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+---------- double gran, 7 .. 92, skip 55 ----------
+
+Thread #698 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #699 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+---------- double gran, 0 .. 92, skip 56 ----------
+
+Thread #700 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #701 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #700
+  New state: shared-modified by threads #700, #701
+  Reason:    this thread, #701, holds no locks at all
+---------- double gran, 1 .. 92, skip 57 ----------
+
+Thread #702 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #703 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+---------- double gran, 2 .. 92, skip 58 ----------
+
+Thread #704 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #705 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+---------- double gran, 3 .. 92, skip 59 ----------
+
+Thread #706 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #707 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+---------- double gran, 4 .. 92, skip 60 ----------
+
+Thread #708 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #709 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #708
+  New state: shared-modified by threads #708, #709
+  Reason:    this thread, #709, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #708
+  New state: shared-modified by threads #708, #709
+  Reason:    this thread, #709, holds no locks at all
+---------- double gran, 5 .. 92, skip 61 ----------
+
+Thread #710 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #711 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+---------- double gran, 6 .. 92, skip 62 ----------
+
+Thread #712 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #713 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+---------- double gran, 7 .. 92, skip 63 ----------
+
+Thread #714 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #715 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+---------- double gran, 0 .. 92, skip 64 ----------
+
+Thread #716 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #717 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #716
+  New state: shared-modified by threads #716, #717
+  Reason:    this thread, #717, holds no locks at all
+---------- double gran, 1 .. 92, skip 65 ----------
+
+Thread #718 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #719 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+---------- double gran, 2 .. 92, skip 66 ----------
+
+Thread #720 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #721 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+---------- double gran, 3 .. 92, skip 67 ----------
+
+Thread #722 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #723 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+---------- double gran, 4 .. 92, skip 68 ----------
+
+Thread #724 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #725 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #724
+  New state: shared-modified by threads #724, #725
+  Reason:    this thread, #725, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #724
+  New state: shared-modified by threads #724, #725
+  Reason:    this thread, #725, holds no locks at all
+---------- double gran, 5 .. 92, skip 69 ----------
+
+Thread #726 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #727 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+---------- double gran, 6 .. 92, skip 70 ----------
+
+Thread #728 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #729 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+---------- double gran, 7 .. 92, skip 71 ----------
+
+Thread #730 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #731 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+---------- double gran, 0 .. 92, skip 72 ----------
+
+Thread #732 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #733 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #732
+  New state: shared-modified by threads #732, #733
+  Reason:    this thread, #733, holds no locks at all
+---------- double gran, 1 .. 92, skip 73 ----------
+
+Thread #734 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #735 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+---------- double gran, 2 .. 92, skip 74 ----------
+
+Thread #736 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #737 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+---------- double gran, 3 .. 92, skip 75 ----------
+
+Thread #738 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #739 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+---------- double gran, 4 .. 92, skip 76 ----------
+
+Thread #740 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #741 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #740
+  New state: shared-modified by threads #740, #741
+  Reason:    this thread, #741, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #740
+  New state: shared-modified by threads #740, #741
+  Reason:    this thread, #741, holds no locks at all
+---------- double gran, 5 .. 92, skip 77 ----------
+
+Thread #742 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #743 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+---------- double gran, 6 .. 92, skip 78 ----------
+
+Thread #744 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #745 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+---------- double gran, 7 .. 92, skip 79 ----------
+
+Thread #746 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #747 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+---------- double gran, 0 .. 92, skip 80 ----------
+
+Thread #748 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #749 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #748
+  New state: shared-modified by threads #748, #749
+  Reason:    this thread, #749, holds no locks at all
+---------- double gran, 1 .. 92, skip 81 ----------
+
+Thread #750 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #751 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+---------- double gran, 2 .. 92, skip 82 ----------
+
+Thread #752 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #753 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+---------- double gran, 3 .. 92, skip 83 ----------
+
+Thread #754 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #755 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+---------- double gran, 4 .. 92, skip 84 ----------
+
+Thread #756 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #757 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #756
+  New state: shared-modified by threads #756, #757
+  Reason:    this thread, #757, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #756
+  New state: shared-modified by threads #756, #757
+  Reason:    this thread, #757, holds no locks at all
+---------- double gran, 5 .. 92, skip 85 ----------
+
+Thread #758 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #759 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+---------- double gran, 6 .. 92, skip 86 ----------
+
+Thread #760 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #761 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+---------- double gran, 7 .. 92, skip 87 ----------
+
+Thread #762 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #763 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+---------- double gran, 0 .. 92, skip 88 ----------
+
+Thread #764 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #765 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #764
+  New state: shared-modified by threads #764, #765
+  Reason:    this thread, #765, holds no locks at all
+---------- double gran, 1 .. 92, skip 89 ----------
+
+Thread #766 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #767 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+---------- double gran, 2 .. 92, skip 90 ----------
+
+Thread #768 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #769 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+---------- double gran, 3 .. 92, skip 91 ----------
+
+Thread #770 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #771 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+ERROR SUMMARY: 1004 errors from 1004 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc19_shadowmem.stderr.exp-glibc25-x86 b/helgrind/tests/tc19_shadowmem.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..efa6730
--- /dev/null
+++ b/helgrind/tests/tc19_shadowmem.stderr.exp-glibc25-x86
@@ -0,0 +1,15070 @@
+
+
+===========================================================
+=== 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ===
+===========================================================
+
+---------- char gran, 0 .. 99, skip 0 ----------
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #2
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no locks at all
+---------- char gran, 0 .. 99, skip 1 ----------
+
+Thread #4 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #5 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #4
+  New state: shared-modified by threads #4, #5
+  Reason:    this thread, #5, holds no locks at all
+---------- char gran, 0 .. 99, skip 2 ----------
+
+Thread #6 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #7 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #6
+  New state: shared-modified by threads #6, #7
+  Reason:    this thread, #7, holds no locks at all
+---------- char gran, 0 .. 99, skip 3 ----------
+
+Thread #8 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #9 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #8
+  New state: shared-modified by threads #8, #9
+  Reason:    this thread, #9, holds no locks at all
+---------- char gran, 0 .. 99, skip 4 ----------
+
+Thread #10 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #11 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #10
+  New state: shared-modified by threads #10, #11
+  Reason:    this thread, #11, holds no locks at all
+---------- char gran, 0 .. 99, skip 5 ----------
+
+Thread #12 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #13 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #12
+  New state: shared-modified by threads #12, #13
+  Reason:    this thread, #13, holds no locks at all
+---------- char gran, 0 .. 99, skip 6 ----------
+
+Thread #14 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #15 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #14
+  New state: shared-modified by threads #14, #15
+  Reason:    this thread, #15, holds no locks at all
+---------- char gran, 0 .. 99, skip 7 ----------
+
+Thread #16 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #17 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #16
+  New state: shared-modified by threads #16, #17
+  Reason:    this thread, #17, holds no locks at all
+---------- char gran, 0 .. 99, skip 8 ----------
+
+Thread #18 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #19 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #18
+  New state: shared-modified by threads #18, #19
+  Reason:    this thread, #19, holds no locks at all
+---------- char gran, 0 .. 99, skip 9 ----------
+
+Thread #20 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #21 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #20
+  New state: shared-modified by threads #20, #21
+  Reason:    this thread, #21, holds no locks at all
+---------- char gran, 0 .. 99, skip 10 ----------
+
+Thread #22 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #23 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #22
+  New state: shared-modified by threads #22, #23
+  Reason:    this thread, #23, holds no locks at all
+---------- char gran, 0 .. 99, skip 11 ----------
+
+Thread #24 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #25 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #24
+  New state: shared-modified by threads #24, #25
+  Reason:    this thread, #25, holds no locks at all
+---------- char gran, 0 .. 99, skip 12 ----------
+
+Thread #26 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #27 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #26
+  New state: shared-modified by threads #26, #27
+  Reason:    this thread, #27, holds no locks at all
+---------- char gran, 0 .. 99, skip 13 ----------
+
+Thread #28 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #29 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #28
+  New state: shared-modified by threads #28, #29
+  Reason:    this thread, #29, holds no locks at all
+---------- char gran, 0 .. 99, skip 14 ----------
+
+Thread #30 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #31 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #30
+  New state: shared-modified by threads #30, #31
+  Reason:    this thread, #31, holds no locks at all
+---------- char gran, 0 .. 99, skip 15 ----------
+
+Thread #32 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #33 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #32
+  New state: shared-modified by threads #32, #33
+  Reason:    this thread, #33, holds no locks at all
+---------- char gran, 0 .. 99, skip 16 ----------
+
+Thread #34 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #35 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #34
+  New state: shared-modified by threads #34, #35
+  Reason:    this thread, #35, holds no locks at all
+---------- char gran, 0 .. 99, skip 17 ----------
+
+Thread #36 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #37 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #36
+  New state: shared-modified by threads #36, #37
+  Reason:    this thread, #37, holds no locks at all
+---------- char gran, 0 .. 99, skip 18 ----------
+
+Thread #38 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #39 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #38
+  New state: shared-modified by threads #38, #39
+  Reason:    this thread, #39, holds no locks at all
+---------- char gran, 0 .. 99, skip 19 ----------
+
+Thread #40 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #41 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #40
+  New state: shared-modified by threads #40, #41
+  Reason:    this thread, #41, holds no locks at all
+---------- char gran, 0 .. 99, skip 20 ----------
+
+Thread #42 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #43 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #42
+  New state: shared-modified by threads #42, #43
+  Reason:    this thread, #43, holds no locks at all
+---------- char gran, 0 .. 99, skip 21 ----------
+
+Thread #44 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #45 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #44
+  New state: shared-modified by threads #44, #45
+  Reason:    this thread, #45, holds no locks at all
+---------- char gran, 0 .. 99, skip 22 ----------
+
+Thread #46 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #47 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #46
+  New state: shared-modified by threads #46, #47
+  Reason:    this thread, #47, holds no locks at all
+---------- char gran, 0 .. 99, skip 23 ----------
+
+Thread #48 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #49 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #48
+  New state: shared-modified by threads #48, #49
+  Reason:    this thread, #49, holds no locks at all
+---------- char gran, 0 .. 99, skip 24 ----------
+
+Thread #50 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #51 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #50
+  New state: shared-modified by threads #50, #51
+  Reason:    this thread, #51, holds no locks at all
+---------- char gran, 0 .. 99, skip 25 ----------
+
+Thread #52 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #53 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #52
+  New state: shared-modified by threads #52, #53
+  Reason:    this thread, #53, holds no locks at all
+---------- char gran, 0 .. 99, skip 26 ----------
+
+Thread #54 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #55 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #54
+  New state: shared-modified by threads #54, #55
+  Reason:    this thread, #55, holds no locks at all
+---------- char gran, 0 .. 99, skip 27 ----------
+
+Thread #56 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #57 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #56
+  New state: shared-modified by threads #56, #57
+  Reason:    this thread, #57, holds no locks at all
+---------- char gran, 0 .. 99, skip 28 ----------
+
+Thread #58 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #59 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #58
+  New state: shared-modified by threads #58, #59
+  Reason:    this thread, #59, holds no locks at all
+---------- char gran, 0 .. 99, skip 29 ----------
+
+Thread #60 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #61 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #60
+  New state: shared-modified by threads #60, #61
+  Reason:    this thread, #61, holds no locks at all
+---------- char gran, 0 .. 99, skip 30 ----------
+
+Thread #62 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #63 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #62
+  New state: shared-modified by threads #62, #63
+  Reason:    this thread, #63, holds no locks at all
+---------- char gran, 0 .. 99, skip 31 ----------
+
+Thread #64 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #65 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #64
+  New state: shared-modified by threads #64, #65
+  Reason:    this thread, #65, holds no locks at all
+---------- char gran, 0 .. 99, skip 32 ----------
+
+Thread #66 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #67 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #66
+  New state: shared-modified by threads #66, #67
+  Reason:    this thread, #67, holds no locks at all
+---------- char gran, 0 .. 99, skip 33 ----------
+
+Thread #68 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #69 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #68
+  New state: shared-modified by threads #68, #69
+  Reason:    this thread, #69, holds no locks at all
+---------- char gran, 0 .. 99, skip 34 ----------
+
+Thread #70 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #71 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #70
+  New state: shared-modified by threads #70, #71
+  Reason:    this thread, #71, holds no locks at all
+---------- char gran, 0 .. 99, skip 35 ----------
+
+Thread #72 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #73 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #72
+  New state: shared-modified by threads #72, #73
+  Reason:    this thread, #73, holds no locks at all
+---------- char gran, 0 .. 99, skip 36 ----------
+
+Thread #74 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #75 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #74
+  New state: shared-modified by threads #74, #75
+  Reason:    this thread, #75, holds no locks at all
+---------- char gran, 0 .. 99, skip 37 ----------
+
+Thread #76 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #77 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #76
+  New state: shared-modified by threads #76, #77
+  Reason:    this thread, #77, holds no locks at all
+---------- char gran, 0 .. 99, skip 38 ----------
+
+Thread #78 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #79 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #78
+  New state: shared-modified by threads #78, #79
+  Reason:    this thread, #79, holds no locks at all
+---------- char gran, 0 .. 99, skip 39 ----------
+
+Thread #80 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #81 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #80
+  New state: shared-modified by threads #80, #81
+  Reason:    this thread, #81, holds no locks at all
+---------- char gran, 0 .. 99, skip 40 ----------
+
+Thread #82 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #83 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #82
+  New state: shared-modified by threads #82, #83
+  Reason:    this thread, #83, holds no locks at all
+---------- char gran, 0 .. 99, skip 41 ----------
+
+Thread #84 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #85 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #84
+  New state: shared-modified by threads #84, #85
+  Reason:    this thread, #85, holds no locks at all
+---------- char gran, 0 .. 99, skip 42 ----------
+
+Thread #86 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #87 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #86
+  New state: shared-modified by threads #86, #87
+  Reason:    this thread, #87, holds no locks at all
+---------- char gran, 0 .. 99, skip 43 ----------
+
+Thread #88 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #89 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #88
+  New state: shared-modified by threads #88, #89
+  Reason:    this thread, #89, holds no locks at all
+---------- char gran, 0 .. 99, skip 44 ----------
+
+Thread #90 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #91 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #90
+  New state: shared-modified by threads #90, #91
+  Reason:    this thread, #91, holds no locks at all
+---------- char gran, 0 .. 99, skip 45 ----------
+
+Thread #92 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #93 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #92
+  New state: shared-modified by threads #92, #93
+  Reason:    this thread, #93, holds no locks at all
+---------- char gran, 0 .. 99, skip 46 ----------
+
+Thread #94 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #95 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #94
+  New state: shared-modified by threads #94, #95
+  Reason:    this thread, #95, holds no locks at all
+---------- char gran, 0 .. 99, skip 47 ----------
+
+Thread #96 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #97 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #96
+  New state: shared-modified by threads #96, #97
+  Reason:    this thread, #97, holds no locks at all
+---------- char gran, 0 .. 99, skip 48 ----------
+
+Thread #98 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #99 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #98
+  New state: shared-modified by threads #98, #99
+  Reason:    this thread, #99, holds no locks at all
+---------- char gran, 0 .. 99, skip 49 ----------
+
+Thread #100 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #101 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #100
+  New state: shared-modified by threads #100, #101
+  Reason:    this thread, #101, holds no locks at all
+---------- char gran, 0 .. 99, skip 50 ----------
+
+Thread #102 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #103 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #102
+  New state: shared-modified by threads #102, #103
+  Reason:    this thread, #103, holds no locks at all
+---------- char gran, 0 .. 99, skip 51 ----------
+
+Thread #104 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #105 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #104
+  New state: shared-modified by threads #104, #105
+  Reason:    this thread, #105, holds no locks at all
+---------- char gran, 0 .. 99, skip 52 ----------
+
+Thread #106 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #107 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #106
+  New state: shared-modified by threads #106, #107
+  Reason:    this thread, #107, holds no locks at all
+---------- char gran, 0 .. 99, skip 53 ----------
+
+Thread #108 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #109 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #108
+  New state: shared-modified by threads #108, #109
+  Reason:    this thread, #109, holds no locks at all
+---------- char gran, 0 .. 99, skip 54 ----------
+
+Thread #110 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #111 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #110
+  New state: shared-modified by threads #110, #111
+  Reason:    this thread, #111, holds no locks at all
+---------- char gran, 0 .. 99, skip 55 ----------
+
+Thread #112 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #113 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #112
+  New state: shared-modified by threads #112, #113
+  Reason:    this thread, #113, holds no locks at all
+---------- char gran, 0 .. 99, skip 56 ----------
+
+Thread #114 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #115 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #114
+  New state: shared-modified by threads #114, #115
+  Reason:    this thread, #115, holds no locks at all
+---------- char gran, 0 .. 99, skip 57 ----------
+
+Thread #116 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #117 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #116
+  New state: shared-modified by threads #116, #117
+  Reason:    this thread, #117, holds no locks at all
+---------- char gran, 0 .. 99, skip 58 ----------
+
+Thread #118 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #119 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #118
+  New state: shared-modified by threads #118, #119
+  Reason:    this thread, #119, holds no locks at all
+---------- char gran, 0 .. 99, skip 59 ----------
+
+Thread #120 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #121 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #120
+  New state: shared-modified by threads #120, #121
+  Reason:    this thread, #121, holds no locks at all
+---------- char gran, 0 .. 99, skip 60 ----------
+
+Thread #122 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #123 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #122
+  New state: shared-modified by threads #122, #123
+  Reason:    this thread, #123, holds no locks at all
+---------- char gran, 0 .. 99, skip 61 ----------
+
+Thread #124 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #125 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #124
+  New state: shared-modified by threads #124, #125
+  Reason:    this thread, #125, holds no locks at all
+---------- char gran, 0 .. 99, skip 62 ----------
+
+Thread #126 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #127 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #126
+  New state: shared-modified by threads #126, #127
+  Reason:    this thread, #127, holds no locks at all
+---------- char gran, 0 .. 99, skip 63 ----------
+
+Thread #128 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #129 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #128
+  New state: shared-modified by threads #128, #129
+  Reason:    this thread, #129, holds no locks at all
+---------- char gran, 0 .. 99, skip 64 ----------
+
+Thread #130 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #131 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #130
+  New state: shared-modified by threads #130, #131
+  Reason:    this thread, #131, holds no locks at all
+---------- char gran, 0 .. 99, skip 65 ----------
+
+Thread #132 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #133 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #132
+  New state: shared-modified by threads #132, #133
+  Reason:    this thread, #133, holds no locks at all
+---------- char gran, 0 .. 99, skip 66 ----------
+
+Thread #134 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #135 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #134
+  New state: shared-modified by threads #134, #135
+  Reason:    this thread, #135, holds no locks at all
+---------- char gran, 0 .. 99, skip 67 ----------
+
+Thread #136 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #137 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #136
+  New state: shared-modified by threads #136, #137
+  Reason:    this thread, #137, holds no locks at all
+---------- char gran, 0 .. 99, skip 68 ----------
+
+Thread #138 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #139 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #138
+  New state: shared-modified by threads #138, #139
+  Reason:    this thread, #139, holds no locks at all
+---------- char gran, 0 .. 99, skip 69 ----------
+
+Thread #140 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #141 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #140
+  New state: shared-modified by threads #140, #141
+  Reason:    this thread, #141, holds no locks at all
+---------- char gran, 0 .. 99, skip 70 ----------
+
+Thread #142 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #143 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #142
+  New state: shared-modified by threads #142, #143
+  Reason:    this thread, #143, holds no locks at all
+---------- char gran, 0 .. 99, skip 71 ----------
+
+Thread #144 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #145 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #144
+  New state: shared-modified by threads #144, #145
+  Reason:    this thread, #145, holds no locks at all
+---------- char gran, 0 .. 99, skip 72 ----------
+
+Thread #146 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #147 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #146
+  New state: shared-modified by threads #146, #147
+  Reason:    this thread, #147, holds no locks at all
+---------- char gran, 0 .. 99, skip 73 ----------
+
+Thread #148 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #149 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #148
+  New state: shared-modified by threads #148, #149
+  Reason:    this thread, #149, holds no locks at all
+---------- char gran, 0 .. 99, skip 74 ----------
+
+Thread #150 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #151 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #150
+  New state: shared-modified by threads #150, #151
+  Reason:    this thread, #151, holds no locks at all
+---------- char gran, 0 .. 99, skip 75 ----------
+
+Thread #152 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #153 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #152
+  New state: shared-modified by threads #152, #153
+  Reason:    this thread, #153, holds no locks at all
+---------- char gran, 0 .. 99, skip 76 ----------
+
+Thread #154 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #155 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #154
+  New state: shared-modified by threads #154, #155
+  Reason:    this thread, #155, holds no locks at all
+---------- char gran, 0 .. 99, skip 77 ----------
+
+Thread #156 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #157 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #156
+  New state: shared-modified by threads #156, #157
+  Reason:    this thread, #157, holds no locks at all
+---------- char gran, 0 .. 99, skip 78 ----------
+
+Thread #158 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #159 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #158
+  New state: shared-modified by threads #158, #159
+  Reason:    this thread, #159, holds no locks at all
+---------- char gran, 0 .. 99, skip 79 ----------
+
+Thread #160 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #161 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #160
+  New state: shared-modified by threads #160, #161
+  Reason:    this thread, #161, holds no locks at all
+---------- char gran, 0 .. 99, skip 80 ----------
+
+Thread #162 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #163 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #162
+  New state: shared-modified by threads #162, #163
+  Reason:    this thread, #163, holds no locks at all
+---------- char gran, 0 .. 99, skip 81 ----------
+
+Thread #164 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #165 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #164
+  New state: shared-modified by threads #164, #165
+  Reason:    this thread, #165, holds no locks at all
+---------- char gran, 0 .. 99, skip 82 ----------
+
+Thread #166 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #167 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #166
+  New state: shared-modified by threads #166, #167
+  Reason:    this thread, #167, holds no locks at all
+---------- char gran, 0 .. 99, skip 83 ----------
+
+Thread #168 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #169 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #168
+  New state: shared-modified by threads #168, #169
+  Reason:    this thread, #169, holds no locks at all
+---------- char gran, 0 .. 99, skip 84 ----------
+
+Thread #170 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #171 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #170
+  New state: shared-modified by threads #170, #171
+  Reason:    this thread, #171, holds no locks at all
+---------- char gran, 0 .. 99, skip 85 ----------
+
+Thread #172 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #173 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #172
+  New state: shared-modified by threads #172, #173
+  Reason:    this thread, #173, holds no locks at all
+---------- char gran, 0 .. 99, skip 86 ----------
+
+Thread #174 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #175 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #174
+  New state: shared-modified by threads #174, #175
+  Reason:    this thread, #175, holds no locks at all
+---------- char gran, 0 .. 99, skip 87 ----------
+
+Thread #176 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #177 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #176
+  New state: shared-modified by threads #176, #177
+  Reason:    this thread, #177, holds no locks at all
+---------- char gran, 0 .. 99, skip 88 ----------
+
+Thread #178 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #179 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #178
+  New state: shared-modified by threads #178, #179
+  Reason:    this thread, #179, holds no locks at all
+---------- char gran, 0 .. 99, skip 89 ----------
+
+Thread #180 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #181 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #180
+  New state: shared-modified by threads #180, #181
+  Reason:    this thread, #181, holds no locks at all
+---------- char gran, 0 .. 99, skip 90 ----------
+
+Thread #182 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #183 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #182
+  New state: shared-modified by threads #182, #183
+  Reason:    this thread, #183, holds no locks at all
+---------- char gran, 0 .. 99, skip 91 ----------
+
+Thread #184 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #185 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #184
+  New state: shared-modified by threads #184, #185
+  Reason:    this thread, #185, holds no locks at all
+---------- char gran, 0 .. 99, skip 92 ----------
+
+Thread #186 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #187 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:472)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #186
+  New state: shared-modified by threads #186, #187
+  Reason:    this thread, #187, holds no locks at all
+---------- char gran, 0 .. 99, skip 93 ----------
+
+Thread #188 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #189 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #188
+  New state: shared-modified by threads #188, #189
+  Reason:    this thread, #189, holds no locks at all
+---------- char gran, 0 .. 99, skip 94 ----------
+
+Thread #190 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #191 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #190
+  New state: shared-modified by threads #190, #191
+  Reason:    this thread, #191, holds no locks at all
+---------- char gran, 0 .. 99, skip 95 ----------
+
+Thread #192 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #193 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #192
+  New state: shared-modified by threads #192, #193
+  Reason:    this thread, #193, holds no locks at all
+---------- char gran, 0 .. 99, skip 96 ----------
+
+Thread #194 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #195 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:480)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #194
+  New state: shared-modified by threads #194, #195
+  Reason:    this thread, #195, holds no locks at all
+---------- char gran, 0 .. 99, skip 97 ----------
+
+Thread #196 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #197 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:482)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #196
+  New state: shared-modified by threads #196, #197
+  Reason:    this thread, #197, holds no locks at all
+---------- char gran, 0 .. 99, skip 98 ----------
+
+Thread #198 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:172)
+
+Thread #199 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:173)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child8 (tc19_shadowmem.c:35)
+   by 0x........: steer (tc19_shadowmem.c:484)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #198
+  New state: shared-modified by threads #198, #199
+  Reason:    this thread, #199, holds no locks at all
+
+==========================================================
+=== 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 ===
+==========================================================
+
+---------- short gran, 0 .. 98, skip 0 ----------
+
+Thread #200 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #201 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #200
+  New state: shared-modified by threads #200, #201
+  Reason:    this thread, #201, holds no locks at all
+
+More than 100 errors detected.  Subsequent errors
+will still be recorded, but in less detail than before.
+---------- short gran, 1 .. 98, skip 1 ----------
+
+Thread #202 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #203 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #202
+  New state: shared-modified by threads #202, #203
+  Reason:    this thread, #203, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #202
+  New state: shared-modified by threads #202, #203
+  Reason:    this thread, #203, holds no locks at all
+---------- short gran, 0 .. 98, skip 2 ----------
+
+Thread #204 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #205 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #204
+  New state: shared-modified by threads #204, #205
+  Reason:    this thread, #205, holds no locks at all
+---------- short gran, 1 .. 98, skip 3 ----------
+
+Thread #206 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #207 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #206
+  New state: shared-modified by threads #206, #207
+  Reason:    this thread, #207, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #206
+  New state: shared-modified by threads #206, #207
+  Reason:    this thread, #207, holds no locks at all
+---------- short gran, 0 .. 98, skip 4 ----------
+
+Thread #208 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #209 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #208
+  New state: shared-modified by threads #208, #209
+  Reason:    this thread, #209, holds no locks at all
+---------- short gran, 1 .. 98, skip 5 ----------
+
+Thread #210 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #211 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #210
+  New state: shared-modified by threads #210, #211
+  Reason:    this thread, #211, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #210
+  New state: shared-modified by threads #210, #211
+  Reason:    this thread, #211, holds no locks at all
+---------- short gran, 0 .. 98, skip 6 ----------
+
+Thread #212 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #213 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #212
+  New state: shared-modified by threads #212, #213
+  Reason:    this thread, #213, holds no locks at all
+---------- short gran, 1 .. 98, skip 7 ----------
+
+Thread #214 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #215 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #214
+  New state: shared-modified by threads #214, #215
+  Reason:    this thread, #215, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #214
+  New state: shared-modified by threads #214, #215
+  Reason:    this thread, #215, holds no locks at all
+---------- short gran, 0 .. 98, skip 8 ----------
+
+Thread #216 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #217 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #216
+  New state: shared-modified by threads #216, #217
+  Reason:    this thread, #217, holds no locks at all
+---------- short gran, 1 .. 98, skip 9 ----------
+
+Thread #218 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #219 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #218
+  New state: shared-modified by threads #218, #219
+  Reason:    this thread, #219, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #218
+  New state: shared-modified by threads #218, #219
+  Reason:    this thread, #219, holds no locks at all
+---------- short gran, 0 .. 98, skip 10 ----------
+
+Thread #220 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #221 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #220
+  New state: shared-modified by threads #220, #221
+  Reason:    this thread, #221, holds no locks at all
+---------- short gran, 1 .. 98, skip 11 ----------
+
+Thread #222 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #223 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #222
+  New state: shared-modified by threads #222, #223
+  Reason:    this thread, #223, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #222
+  New state: shared-modified by threads #222, #223
+  Reason:    this thread, #223, holds no locks at all
+---------- short gran, 0 .. 98, skip 12 ----------
+
+Thread #224 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #225 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #224
+  New state: shared-modified by threads #224, #225
+  Reason:    this thread, #225, holds no locks at all
+---------- short gran, 1 .. 98, skip 13 ----------
+
+Thread #226 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #227 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #226
+  New state: shared-modified by threads #226, #227
+  Reason:    this thread, #227, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #226
+  New state: shared-modified by threads #226, #227
+  Reason:    this thread, #227, holds no locks at all
+---------- short gran, 0 .. 98, skip 14 ----------
+
+Thread #228 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #229 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #228
+  New state: shared-modified by threads #228, #229
+  Reason:    this thread, #229, holds no locks at all
+---------- short gran, 1 .. 98, skip 15 ----------
+
+Thread #230 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #231 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #230
+  New state: shared-modified by threads #230, #231
+  Reason:    this thread, #231, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #230
+  New state: shared-modified by threads #230, #231
+  Reason:    this thread, #231, holds no locks at all
+---------- short gran, 0 .. 98, skip 16 ----------
+
+Thread #232 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #233 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #232
+  New state: shared-modified by threads #232, #233
+  Reason:    this thread, #233, holds no locks at all
+---------- short gran, 1 .. 98, skip 17 ----------
+
+Thread #234 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #235 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #234
+  New state: shared-modified by threads #234, #235
+  Reason:    this thread, #235, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #234
+  New state: shared-modified by threads #234, #235
+  Reason:    this thread, #235, holds no locks at all
+---------- short gran, 0 .. 98, skip 18 ----------
+
+Thread #236 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #237 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #236
+  New state: shared-modified by threads #236, #237
+  Reason:    this thread, #237, holds no locks at all
+---------- short gran, 1 .. 98, skip 19 ----------
+
+Thread #238 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #239 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #238
+  New state: shared-modified by threads #238, #239
+  Reason:    this thread, #239, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #238
+  New state: shared-modified by threads #238, #239
+  Reason:    this thread, #239, holds no locks at all
+---------- short gran, 0 .. 98, skip 20 ----------
+
+Thread #240 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #241 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #240
+  New state: shared-modified by threads #240, #241
+  Reason:    this thread, #241, holds no locks at all
+---------- short gran, 1 .. 98, skip 21 ----------
+
+Thread #242 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #243 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #242
+  New state: shared-modified by threads #242, #243
+  Reason:    this thread, #243, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #242
+  New state: shared-modified by threads #242, #243
+  Reason:    this thread, #243, holds no locks at all
+---------- short gran, 0 .. 98, skip 22 ----------
+
+Thread #244 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #245 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #244
+  New state: shared-modified by threads #244, #245
+  Reason:    this thread, #245, holds no locks at all
+---------- short gran, 1 .. 98, skip 23 ----------
+
+Thread #246 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #247 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #246
+  New state: shared-modified by threads #246, #247
+  Reason:    this thread, #247, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #246
+  New state: shared-modified by threads #246, #247
+  Reason:    this thread, #247, holds no locks at all
+---------- short gran, 0 .. 98, skip 24 ----------
+
+Thread #248 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #249 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #248
+  New state: shared-modified by threads #248, #249
+  Reason:    this thread, #249, holds no locks at all
+---------- short gran, 1 .. 98, skip 25 ----------
+
+Thread #250 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #251 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #250
+  New state: shared-modified by threads #250, #251
+  Reason:    this thread, #251, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #250
+  New state: shared-modified by threads #250, #251
+  Reason:    this thread, #251, holds no locks at all
+---------- short gran, 0 .. 98, skip 26 ----------
+
+Thread #252 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #253 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #252
+  New state: shared-modified by threads #252, #253
+  Reason:    this thread, #253, holds no locks at all
+---------- short gran, 1 .. 98, skip 27 ----------
+
+Thread #254 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #255 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #254
+  New state: shared-modified by threads #254, #255
+  Reason:    this thread, #255, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #254
+  New state: shared-modified by threads #254, #255
+  Reason:    this thread, #255, holds no locks at all
+---------- short gran, 0 .. 98, skip 28 ----------
+
+Thread #256 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #257 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #256
+  New state: shared-modified by threads #256, #257
+  Reason:    this thread, #257, holds no locks at all
+---------- short gran, 1 .. 98, skip 29 ----------
+
+Thread #258 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #259 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #258
+  New state: shared-modified by threads #258, #259
+  Reason:    this thread, #259, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #258
+  New state: shared-modified by threads #258, #259
+  Reason:    this thread, #259, holds no locks at all
+---------- short gran, 0 .. 98, skip 30 ----------
+
+Thread #260 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #261 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #260
+  New state: shared-modified by threads #260, #261
+  Reason:    this thread, #261, holds no locks at all
+---------- short gran, 1 .. 98, skip 31 ----------
+
+Thread #262 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #263 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #262
+  New state: shared-modified by threads #262, #263
+  Reason:    this thread, #263, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #262
+  New state: shared-modified by threads #262, #263
+  Reason:    this thread, #263, holds no locks at all
+---------- short gran, 0 .. 98, skip 32 ----------
+
+Thread #264 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #265 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #264
+  New state: shared-modified by threads #264, #265
+  Reason:    this thread, #265, holds no locks at all
+---------- short gran, 1 .. 98, skip 33 ----------
+
+Thread #266 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #267 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #266
+  New state: shared-modified by threads #266, #267
+  Reason:    this thread, #267, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #266
+  New state: shared-modified by threads #266, #267
+  Reason:    this thread, #267, holds no locks at all
+---------- short gran, 0 .. 98, skip 34 ----------
+
+Thread #268 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #269 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #268
+  New state: shared-modified by threads #268, #269
+  Reason:    this thread, #269, holds no locks at all
+---------- short gran, 1 .. 98, skip 35 ----------
+
+Thread #270 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #271 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #270
+  New state: shared-modified by threads #270, #271
+  Reason:    this thread, #271, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #270
+  New state: shared-modified by threads #270, #271
+  Reason:    this thread, #271, holds no locks at all
+---------- short gran, 0 .. 98, skip 36 ----------
+
+Thread #272 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #273 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #272
+  New state: shared-modified by threads #272, #273
+  Reason:    this thread, #273, holds no locks at all
+---------- short gran, 1 .. 98, skip 37 ----------
+
+Thread #274 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #275 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #274
+  New state: shared-modified by threads #274, #275
+  Reason:    this thread, #275, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #274
+  New state: shared-modified by threads #274, #275
+  Reason:    this thread, #275, holds no locks at all
+---------- short gran, 0 .. 98, skip 38 ----------
+
+Thread #276 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #277 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #276
+  New state: shared-modified by threads #276, #277
+  Reason:    this thread, #277, holds no locks at all
+---------- short gran, 1 .. 98, skip 39 ----------
+
+Thread #278 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #279 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #278
+  New state: shared-modified by threads #278, #279
+  Reason:    this thread, #279, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #278
+  New state: shared-modified by threads #278, #279
+  Reason:    this thread, #279, holds no locks at all
+---------- short gran, 0 .. 98, skip 40 ----------
+
+Thread #280 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #281 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #280
+  New state: shared-modified by threads #280, #281
+  Reason:    this thread, #281, holds no locks at all
+---------- short gran, 1 .. 98, skip 41 ----------
+
+Thread #282 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #283 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #282
+  New state: shared-modified by threads #282, #283
+  Reason:    this thread, #283, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #282
+  New state: shared-modified by threads #282, #283
+  Reason:    this thread, #283, holds no locks at all
+---------- short gran, 0 .. 98, skip 42 ----------
+
+Thread #284 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #285 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #284
+  New state: shared-modified by threads #284, #285
+  Reason:    this thread, #285, holds no locks at all
+---------- short gran, 1 .. 98, skip 43 ----------
+
+Thread #286 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #287 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #286
+  New state: shared-modified by threads #286, #287
+  Reason:    this thread, #287, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #286
+  New state: shared-modified by threads #286, #287
+  Reason:    this thread, #287, holds no locks at all
+---------- short gran, 0 .. 98, skip 44 ----------
+
+Thread #288 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #289 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #288
+  New state: shared-modified by threads #288, #289
+  Reason:    this thread, #289, holds no locks at all
+---------- short gran, 1 .. 98, skip 45 ----------
+
+Thread #290 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #291 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #290
+  New state: shared-modified by threads #290, #291
+  Reason:    this thread, #291, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #290
+  New state: shared-modified by threads #290, #291
+  Reason:    this thread, #291, holds no locks at all
+---------- short gran, 0 .. 98, skip 46 ----------
+
+Thread #292 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #293 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #292
+  New state: shared-modified by threads #292, #293
+  Reason:    this thread, #293, holds no locks at all
+---------- short gran, 1 .. 98, skip 47 ----------
+
+Thread #294 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #295 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #294
+  New state: shared-modified by threads #294, #295
+  Reason:    this thread, #295, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #294
+  New state: shared-modified by threads #294, #295
+  Reason:    this thread, #295, holds no locks at all
+---------- short gran, 0 .. 98, skip 48 ----------
+
+Thread #296 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #297 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #296
+  New state: shared-modified by threads #296, #297
+  Reason:    this thread, #297, holds no locks at all
+---------- short gran, 1 .. 98, skip 49 ----------
+
+Thread #298 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #299 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #298
+  New state: shared-modified by threads #298, #299
+  Reason:    this thread, #299, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #298
+  New state: shared-modified by threads #298, #299
+  Reason:    this thread, #299, holds no locks at all
+---------- short gran, 0 .. 98, skip 50 ----------
+
+Thread #300 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #301 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #300
+  New state: shared-modified by threads #300, #301
+  Reason:    this thread, #301, holds no locks at all
+---------- short gran, 1 .. 98, skip 51 ----------
+
+Thread #302 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #303 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #302
+  New state: shared-modified by threads #302, #303
+  Reason:    this thread, #303, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #302
+  New state: shared-modified by threads #302, #303
+  Reason:    this thread, #303, holds no locks at all
+---------- short gran, 0 .. 98, skip 52 ----------
+
+Thread #304 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #305 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #304
+  New state: shared-modified by threads #304, #305
+  Reason:    this thread, #305, holds no locks at all
+---------- short gran, 1 .. 98, skip 53 ----------
+
+Thread #306 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #307 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #306
+  New state: shared-modified by threads #306, #307
+  Reason:    this thread, #307, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #306
+  New state: shared-modified by threads #306, #307
+  Reason:    this thread, #307, holds no locks at all
+---------- short gran, 0 .. 98, skip 54 ----------
+
+Thread #308 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #309 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #308
+  New state: shared-modified by threads #308, #309
+  Reason:    this thread, #309, holds no locks at all
+---------- short gran, 1 .. 98, skip 55 ----------
+
+Thread #310 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #311 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #310
+  New state: shared-modified by threads #310, #311
+  Reason:    this thread, #311, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #310
+  New state: shared-modified by threads #310, #311
+  Reason:    this thread, #311, holds no locks at all
+---------- short gran, 0 .. 98, skip 56 ----------
+
+Thread #312 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #313 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #312
+  New state: shared-modified by threads #312, #313
+  Reason:    this thread, #313, holds no locks at all
+---------- short gran, 1 .. 98, skip 57 ----------
+
+Thread #314 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #315 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #314
+  New state: shared-modified by threads #314, #315
+  Reason:    this thread, #315, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #314
+  New state: shared-modified by threads #314, #315
+  Reason:    this thread, #315, holds no locks at all
+---------- short gran, 0 .. 98, skip 58 ----------
+
+Thread #316 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #317 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #316
+  New state: shared-modified by threads #316, #317
+  Reason:    this thread, #317, holds no locks at all
+---------- short gran, 1 .. 98, skip 59 ----------
+
+Thread #318 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #319 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #318
+  New state: shared-modified by threads #318, #319
+  Reason:    this thread, #319, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #318
+  New state: shared-modified by threads #318, #319
+  Reason:    this thread, #319, holds no locks at all
+---------- short gran, 0 .. 98, skip 60 ----------
+
+Thread #320 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #321 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #320
+  New state: shared-modified by threads #320, #321
+  Reason:    this thread, #321, holds no locks at all
+---------- short gran, 1 .. 98, skip 61 ----------
+
+Thread #322 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #323 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #322
+  New state: shared-modified by threads #322, #323
+  Reason:    this thread, #323, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #322
+  New state: shared-modified by threads #322, #323
+  Reason:    this thread, #323, holds no locks at all
+---------- short gran, 0 .. 98, skip 62 ----------
+
+Thread #324 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #325 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #324
+  New state: shared-modified by threads #324, #325
+  Reason:    this thread, #325, holds no locks at all
+---------- short gran, 1 .. 98, skip 63 ----------
+
+Thread #326 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #327 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #326
+  New state: shared-modified by threads #326, #327
+  Reason:    this thread, #327, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #326
+  New state: shared-modified by threads #326, #327
+  Reason:    this thread, #327, holds no locks at all
+---------- short gran, 0 .. 98, skip 64 ----------
+
+Thread #328 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #329 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #328
+  New state: shared-modified by threads #328, #329
+  Reason:    this thread, #329, holds no locks at all
+---------- short gran, 1 .. 98, skip 65 ----------
+
+Thread #330 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #331 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #330
+  New state: shared-modified by threads #330, #331
+  Reason:    this thread, #331, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #330
+  New state: shared-modified by threads #330, #331
+  Reason:    this thread, #331, holds no locks at all
+---------- short gran, 0 .. 98, skip 66 ----------
+
+Thread #332 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #333 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #332
+  New state: shared-modified by threads #332, #333
+  Reason:    this thread, #333, holds no locks at all
+---------- short gran, 1 .. 98, skip 67 ----------
+
+Thread #334 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #335 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #334
+  New state: shared-modified by threads #334, #335
+  Reason:    this thread, #335, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #334
+  New state: shared-modified by threads #334, #335
+  Reason:    this thread, #335, holds no locks at all
+---------- short gran, 0 .. 98, skip 68 ----------
+
+Thread #336 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #337 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #336
+  New state: shared-modified by threads #336, #337
+  Reason:    this thread, #337, holds no locks at all
+---------- short gran, 1 .. 98, skip 69 ----------
+
+Thread #338 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #339 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #338
+  New state: shared-modified by threads #338, #339
+  Reason:    this thread, #339, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #338
+  New state: shared-modified by threads #338, #339
+  Reason:    this thread, #339, holds no locks at all
+---------- short gran, 0 .. 98, skip 70 ----------
+
+Thread #340 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #341 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #340
+  New state: shared-modified by threads #340, #341
+  Reason:    this thread, #341, holds no locks at all
+---------- short gran, 1 .. 98, skip 71 ----------
+
+Thread #342 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #343 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #342
+  New state: shared-modified by threads #342, #343
+  Reason:    this thread, #343, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #342
+  New state: shared-modified by threads #342, #343
+  Reason:    this thread, #343, holds no locks at all
+---------- short gran, 0 .. 98, skip 72 ----------
+
+Thread #344 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #345 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #344
+  New state: shared-modified by threads #344, #345
+  Reason:    this thread, #345, holds no locks at all
+---------- short gran, 1 .. 98, skip 73 ----------
+
+Thread #346 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #347 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #346
+  New state: shared-modified by threads #346, #347
+  Reason:    this thread, #347, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #346
+  New state: shared-modified by threads #346, #347
+  Reason:    this thread, #347, holds no locks at all
+---------- short gran, 0 .. 98, skip 74 ----------
+
+Thread #348 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #349 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #348
+  New state: shared-modified by threads #348, #349
+  Reason:    this thread, #349, holds no locks at all
+---------- short gran, 1 .. 98, skip 75 ----------
+
+Thread #350 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #351 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #350
+  New state: shared-modified by threads #350, #351
+  Reason:    this thread, #351, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #350
+  New state: shared-modified by threads #350, #351
+  Reason:    this thread, #351, holds no locks at all
+---------- short gran, 0 .. 98, skip 76 ----------
+
+Thread #352 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #353 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #352
+  New state: shared-modified by threads #352, #353
+  Reason:    this thread, #353, holds no locks at all
+---------- short gran, 1 .. 98, skip 77 ----------
+
+Thread #354 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #355 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #354
+  New state: shared-modified by threads #354, #355
+  Reason:    this thread, #355, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #354
+  New state: shared-modified by threads #354, #355
+  Reason:    this thread, #355, holds no locks at all
+---------- short gran, 0 .. 98, skip 78 ----------
+
+Thread #356 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #357 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #356
+  New state: shared-modified by threads #356, #357
+  Reason:    this thread, #357, holds no locks at all
+---------- short gran, 1 .. 98, skip 79 ----------
+
+Thread #358 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #359 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #358
+  New state: shared-modified by threads #358, #359
+  Reason:    this thread, #359, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #358
+  New state: shared-modified by threads #358, #359
+  Reason:    this thread, #359, holds no locks at all
+---------- short gran, 0 .. 98, skip 80 ----------
+
+Thread #360 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #361 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #360
+  New state: shared-modified by threads #360, #361
+  Reason:    this thread, #361, holds no locks at all
+---------- short gran, 1 .. 98, skip 81 ----------
+
+Thread #362 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #363 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #362
+  New state: shared-modified by threads #362, #363
+  Reason:    this thread, #363, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #362
+  New state: shared-modified by threads #362, #363
+  Reason:    this thread, #363, holds no locks at all
+---------- short gran, 0 .. 98, skip 82 ----------
+
+Thread #364 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #365 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #364
+  New state: shared-modified by threads #364, #365
+  Reason:    this thread, #365, holds no locks at all
+---------- short gran, 1 .. 98, skip 83 ----------
+
+Thread #366 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #367 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #366
+  New state: shared-modified by threads #366, #367
+  Reason:    this thread, #367, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #366
+  New state: shared-modified by threads #366, #367
+  Reason:    this thread, #367, holds no locks at all
+---------- short gran, 0 .. 98, skip 84 ----------
+
+Thread #368 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #369 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #368
+  New state: shared-modified by threads #368, #369
+  Reason:    this thread, #369, holds no locks at all
+---------- short gran, 1 .. 98, skip 85 ----------
+
+Thread #370 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #371 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #370
+  New state: shared-modified by threads #370, #371
+  Reason:    this thread, #371, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #370
+  New state: shared-modified by threads #370, #371
+  Reason:    this thread, #371, holds no locks at all
+---------- short gran, 0 .. 98, skip 86 ----------
+
+Thread #372 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #373 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #372
+  New state: shared-modified by threads #372, #373
+  Reason:    this thread, #373, holds no locks at all
+---------- short gran, 1 .. 98, skip 87 ----------
+
+Thread #374 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #375 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #374
+  New state: shared-modified by threads #374, #375
+  Reason:    this thread, #375, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #374
+  New state: shared-modified by threads #374, #375
+  Reason:    this thread, #375, holds no locks at all
+---------- short gran, 0 .. 98, skip 88 ----------
+
+Thread #376 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #377 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #376
+  New state: shared-modified by threads #376, #377
+  Reason:    this thread, #377, holds no locks at all
+---------- short gran, 1 .. 98, skip 89 ----------
+
+Thread #378 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #379 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #378
+  New state: shared-modified by threads #378, #379
+  Reason:    this thread, #379, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #378
+  New state: shared-modified by threads #378, #379
+  Reason:    this thread, #379, holds no locks at all
+---------- short gran, 0 .. 98, skip 90 ----------
+
+Thread #380 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #381 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #380
+  New state: shared-modified by threads #380, #381
+  Reason:    this thread, #381, holds no locks at all
+---------- short gran, 1 .. 98, skip 91 ----------
+
+Thread #382 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #383 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #382
+  New state: shared-modified by threads #382, #383
+  Reason:    this thread, #383, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #382
+  New state: shared-modified by threads #382, #383
+  Reason:    this thread, #383, holds no locks at all
+---------- short gran, 0 .. 98, skip 92 ----------
+
+Thread #384 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #385 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:472)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #384
+  New state: shared-modified by threads #384, #385
+  Reason:    this thread, #385, holds no locks at all
+---------- short gran, 1 .. 98, skip 93 ----------
+
+Thread #386 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #387 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #386
+  New state: shared-modified by threads #386, #387
+  Reason:    this thread, #387, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #386
+  New state: shared-modified by threads #386, #387
+  Reason:    this thread, #387, holds no locks at all
+---------- short gran, 0 .. 98, skip 94 ----------
+
+Thread #388 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #389 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #388
+  New state: shared-modified by threads #388, #389
+  Reason:    this thread, #389, holds no locks at all
+---------- short gran, 1 .. 98, skip 95 ----------
+
+Thread #390 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #391 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #390
+  New state: shared-modified by threads #390, #391
+  Reason:    this thread, #391, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #390
+  New state: shared-modified by threads #390, #391
+  Reason:    this thread, #391, holds no locks at all
+---------- short gran, 0 .. 98, skip 96 ----------
+
+Thread #392 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #393 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:480)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #392
+  New state: shared-modified by threads #392, #393
+  Reason:    this thread, #393, holds no locks at all
+---------- short gran, 1 .. 98, skip 97 ----------
+
+Thread #394 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:203)
+
+Thread #395 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:204)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:482)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #394
+  New state: shared-modified by threads #394, #395
+  Reason:    this thread, #395, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child16 (tc19_shadowmem.c:59)
+   by 0x........: steer (tc19_shadowmem.c:482)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #394
+  New state: shared-modified by threads #394, #395
+  Reason:    this thread, #395, holds no locks at all
+
+==========================================================
+=== 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 ===
+==========================================================
+
+---------- int gran, 0 .. 96, skip 0 ----------
+
+Thread #396 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #397 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #396
+  New state: shared-modified by threads #396, #397
+  Reason:    this thread, #397, holds no locks at all
+---------- int gran, 1 .. 96, skip 1 ----------
+
+Thread #398 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #399 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #398
+  New state: shared-modified by threads #398, #399
+  Reason:    this thread, #399, holds no locks at all
+---------- int gran, 2 .. 96, skip 2 ----------
+
+Thread #400 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #401 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #400
+  New state: shared-modified by threads #400, #401
+  Reason:    this thread, #401, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #400
+  New state: shared-modified by threads #400, #401
+  Reason:    this thread, #401, holds no locks at all
+---------- int gran, 3 .. 96, skip 3 ----------
+
+Thread #402 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #403 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #402
+  New state: shared-modified by threads #402, #403
+  Reason:    this thread, #403, holds no locks at all
+---------- int gran, 0 .. 96, skip 4 ----------
+
+Thread #404 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #405 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #404
+  New state: shared-modified by threads #404, #405
+  Reason:    this thread, #405, holds no locks at all
+---------- int gran, 1 .. 96, skip 5 ----------
+
+Thread #406 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #407 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #406
+  New state: shared-modified by threads #406, #407
+  Reason:    this thread, #407, holds no locks at all
+---------- int gran, 2 .. 96, skip 6 ----------
+
+Thread #408 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #409 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #408
+  New state: shared-modified by threads #408, #409
+  Reason:    this thread, #409, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #408
+  New state: shared-modified by threads #408, #409
+  Reason:    this thread, #409, holds no locks at all
+---------- int gran, 3 .. 96, skip 7 ----------
+
+Thread #410 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #411 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #410
+  New state: shared-modified by threads #410, #411
+  Reason:    this thread, #411, holds no locks at all
+---------- int gran, 0 .. 96, skip 8 ----------
+
+Thread #412 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #413 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #412
+  New state: shared-modified by threads #412, #413
+  Reason:    this thread, #413, holds no locks at all
+---------- int gran, 1 .. 96, skip 9 ----------
+
+Thread #414 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #415 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #414
+  New state: shared-modified by threads #414, #415
+  Reason:    this thread, #415, holds no locks at all
+---------- int gran, 2 .. 96, skip 10 ----------
+
+Thread #416 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #417 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #416
+  New state: shared-modified by threads #416, #417
+  Reason:    this thread, #417, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #416
+  New state: shared-modified by threads #416, #417
+  Reason:    this thread, #417, holds no locks at all
+---------- int gran, 3 .. 96, skip 11 ----------
+
+Thread #418 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #419 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #418
+  New state: shared-modified by threads #418, #419
+  Reason:    this thread, #419, holds no locks at all
+---------- int gran, 0 .. 96, skip 12 ----------
+
+Thread #420 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #421 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #420
+  New state: shared-modified by threads #420, #421
+  Reason:    this thread, #421, holds no locks at all
+---------- int gran, 1 .. 96, skip 13 ----------
+
+Thread #422 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #423 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #422
+  New state: shared-modified by threads #422, #423
+  Reason:    this thread, #423, holds no locks at all
+---------- int gran, 2 .. 96, skip 14 ----------
+
+Thread #424 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #425 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #424
+  New state: shared-modified by threads #424, #425
+  Reason:    this thread, #425, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #424
+  New state: shared-modified by threads #424, #425
+  Reason:    this thread, #425, holds no locks at all
+---------- int gran, 3 .. 96, skip 15 ----------
+
+Thread #426 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #427 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #426
+  New state: shared-modified by threads #426, #427
+  Reason:    this thread, #427, holds no locks at all
+---------- int gran, 0 .. 96, skip 16 ----------
+
+Thread #428 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #429 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #428
+  New state: shared-modified by threads #428, #429
+  Reason:    this thread, #429, holds no locks at all
+---------- int gran, 1 .. 96, skip 17 ----------
+
+Thread #430 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #431 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #430
+  New state: shared-modified by threads #430, #431
+  Reason:    this thread, #431, holds no locks at all
+---------- int gran, 2 .. 96, skip 18 ----------
+
+Thread #432 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #433 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #432
+  New state: shared-modified by threads #432, #433
+  Reason:    this thread, #433, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #432
+  New state: shared-modified by threads #432, #433
+  Reason:    this thread, #433, holds no locks at all
+---------- int gran, 3 .. 96, skip 19 ----------
+
+Thread #434 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #435 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #434
+  New state: shared-modified by threads #434, #435
+  Reason:    this thread, #435, holds no locks at all
+---------- int gran, 0 .. 96, skip 20 ----------
+
+Thread #436 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #437 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #436
+  New state: shared-modified by threads #436, #437
+  Reason:    this thread, #437, holds no locks at all
+---------- int gran, 1 .. 96, skip 21 ----------
+
+Thread #438 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #439 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #438
+  New state: shared-modified by threads #438, #439
+  Reason:    this thread, #439, holds no locks at all
+---------- int gran, 2 .. 96, skip 22 ----------
+
+Thread #440 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #441 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #440
+  New state: shared-modified by threads #440, #441
+  Reason:    this thread, #441, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #440
+  New state: shared-modified by threads #440, #441
+  Reason:    this thread, #441, holds no locks at all
+---------- int gran, 3 .. 96, skip 23 ----------
+
+Thread #442 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #443 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #442
+  New state: shared-modified by threads #442, #443
+  Reason:    this thread, #443, holds no locks at all
+---------- int gran, 0 .. 96, skip 24 ----------
+
+Thread #444 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #445 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #444
+  New state: shared-modified by threads #444, #445
+  Reason:    this thread, #445, holds no locks at all
+---------- int gran, 1 .. 96, skip 25 ----------
+
+Thread #446 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #447 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #446
+  New state: shared-modified by threads #446, #447
+  Reason:    this thread, #447, holds no locks at all
+---------- int gran, 2 .. 96, skip 26 ----------
+
+Thread #448 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #449 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #448
+  New state: shared-modified by threads #448, #449
+  Reason:    this thread, #449, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #448
+  New state: shared-modified by threads #448, #449
+  Reason:    this thread, #449, holds no locks at all
+---------- int gran, 3 .. 96, skip 27 ----------
+
+Thread #450 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #451 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #450
+  New state: shared-modified by threads #450, #451
+  Reason:    this thread, #451, holds no locks at all
+---------- int gran, 0 .. 96, skip 28 ----------
+
+Thread #452 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #453 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #452
+  New state: shared-modified by threads #452, #453
+  Reason:    this thread, #453, holds no locks at all
+---------- int gran, 1 .. 96, skip 29 ----------
+
+Thread #454 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #455 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #454
+  New state: shared-modified by threads #454, #455
+  Reason:    this thread, #455, holds no locks at all
+---------- int gran, 2 .. 96, skip 30 ----------
+
+Thread #456 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #457 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #456
+  New state: shared-modified by threads #456, #457
+  Reason:    this thread, #457, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #456
+  New state: shared-modified by threads #456, #457
+  Reason:    this thread, #457, holds no locks at all
+---------- int gran, 3 .. 96, skip 31 ----------
+
+Thread #458 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #459 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #458
+  New state: shared-modified by threads #458, #459
+  Reason:    this thread, #459, holds no locks at all
+---------- int gran, 0 .. 96, skip 32 ----------
+
+Thread #460 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #461 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #460
+  New state: shared-modified by threads #460, #461
+  Reason:    this thread, #461, holds no locks at all
+---------- int gran, 1 .. 96, skip 33 ----------
+
+Thread #462 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #463 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #462
+  New state: shared-modified by threads #462, #463
+  Reason:    this thread, #463, holds no locks at all
+---------- int gran, 2 .. 96, skip 34 ----------
+
+Thread #464 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #465 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #464
+  New state: shared-modified by threads #464, #465
+  Reason:    this thread, #465, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #464
+  New state: shared-modified by threads #464, #465
+  Reason:    this thread, #465, holds no locks at all
+---------- int gran, 3 .. 96, skip 35 ----------
+
+Thread #466 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #467 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #466
+  New state: shared-modified by threads #466, #467
+  Reason:    this thread, #467, holds no locks at all
+---------- int gran, 0 .. 96, skip 36 ----------
+
+Thread #468 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #469 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #468
+  New state: shared-modified by threads #468, #469
+  Reason:    this thread, #469, holds no locks at all
+---------- int gran, 1 .. 96, skip 37 ----------
+
+Thread #470 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #471 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #470
+  New state: shared-modified by threads #470, #471
+  Reason:    this thread, #471, holds no locks at all
+---------- int gran, 2 .. 96, skip 38 ----------
+
+Thread #472 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #473 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #472
+  New state: shared-modified by threads #472, #473
+  Reason:    this thread, #473, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #472
+  New state: shared-modified by threads #472, #473
+  Reason:    this thread, #473, holds no locks at all
+---------- int gran, 3 .. 96, skip 39 ----------
+
+Thread #474 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #475 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #474
+  New state: shared-modified by threads #474, #475
+  Reason:    this thread, #475, holds no locks at all
+---------- int gran, 0 .. 96, skip 40 ----------
+
+Thread #476 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #477 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #476
+  New state: shared-modified by threads #476, #477
+  Reason:    this thread, #477, holds no locks at all
+---------- int gran, 1 .. 96, skip 41 ----------
+
+Thread #478 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #479 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #478
+  New state: shared-modified by threads #478, #479
+  Reason:    this thread, #479, holds no locks at all
+---------- int gran, 2 .. 96, skip 42 ----------
+
+Thread #480 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #481 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #480
+  New state: shared-modified by threads #480, #481
+  Reason:    this thread, #481, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #480
+  New state: shared-modified by threads #480, #481
+  Reason:    this thread, #481, holds no locks at all
+---------- int gran, 3 .. 96, skip 43 ----------
+
+Thread #482 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #483 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #482
+  New state: shared-modified by threads #482, #483
+  Reason:    this thread, #483, holds no locks at all
+---------- int gran, 0 .. 96, skip 44 ----------
+
+Thread #484 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #485 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #484
+  New state: shared-modified by threads #484, #485
+  Reason:    this thread, #485, holds no locks at all
+---------- int gran, 1 .. 96, skip 45 ----------
+
+Thread #486 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #487 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #486
+  New state: shared-modified by threads #486, #487
+  Reason:    this thread, #487, holds no locks at all
+---------- int gran, 2 .. 96, skip 46 ----------
+
+Thread #488 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #489 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #488
+  New state: shared-modified by threads #488, #489
+  Reason:    this thread, #489, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #488
+  New state: shared-modified by threads #488, #489
+  Reason:    this thread, #489, holds no locks at all
+---------- int gran, 3 .. 96, skip 47 ----------
+
+Thread #490 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #491 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #490
+  New state: shared-modified by threads #490, #491
+  Reason:    this thread, #491, holds no locks at all
+---------- int gran, 0 .. 96, skip 48 ----------
+
+Thread #492 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #493 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #492
+  New state: shared-modified by threads #492, #493
+  Reason:    this thread, #493, holds no locks at all
+---------- int gran, 1 .. 96, skip 49 ----------
+
+Thread #494 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #495 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #494
+  New state: shared-modified by threads #494, #495
+  Reason:    this thread, #495, holds no locks at all
+---------- int gran, 2 .. 96, skip 50 ----------
+
+Thread #496 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #497 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #496
+  New state: shared-modified by threads #496, #497
+  Reason:    this thread, #497, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #496
+  New state: shared-modified by threads #496, #497
+  Reason:    this thread, #497, holds no locks at all
+---------- int gran, 3 .. 96, skip 51 ----------
+
+Thread #498 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #499 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #498
+  New state: shared-modified by threads #498, #499
+  Reason:    this thread, #499, holds no locks at all
+---------- int gran, 0 .. 96, skip 52 ----------
+
+Thread #500 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #501 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #500
+  New state: shared-modified by threads #500, #501
+  Reason:    this thread, #501, holds no locks at all
+---------- int gran, 1 .. 96, skip 53 ----------
+
+Thread #502 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #503 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #502
+  New state: shared-modified by threads #502, #503
+  Reason:    this thread, #503, holds no locks at all
+---------- int gran, 2 .. 96, skip 54 ----------
+
+Thread #504 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #505 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #504
+  New state: shared-modified by threads #504, #505
+  Reason:    this thread, #505, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #504
+  New state: shared-modified by threads #504, #505
+  Reason:    this thread, #505, holds no locks at all
+---------- int gran, 3 .. 96, skip 55 ----------
+
+Thread #506 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #507 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #506
+  New state: shared-modified by threads #506, #507
+  Reason:    this thread, #507, holds no locks at all
+---------- int gran, 0 .. 96, skip 56 ----------
+
+Thread #508 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #509 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #508
+  New state: shared-modified by threads #508, #509
+  Reason:    this thread, #509, holds no locks at all
+---------- int gran, 1 .. 96, skip 57 ----------
+
+Thread #510 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #511 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #510
+  New state: shared-modified by threads #510, #511
+  Reason:    this thread, #511, holds no locks at all
+---------- int gran, 2 .. 96, skip 58 ----------
+
+Thread #512 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #513 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #512
+  New state: shared-modified by threads #512, #513
+  Reason:    this thread, #513, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #512
+  New state: shared-modified by threads #512, #513
+  Reason:    this thread, #513, holds no locks at all
+---------- int gran, 3 .. 96, skip 59 ----------
+
+Thread #514 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #515 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #514
+  New state: shared-modified by threads #514, #515
+  Reason:    this thread, #515, holds no locks at all
+---------- int gran, 0 .. 96, skip 60 ----------
+
+Thread #516 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #517 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #516
+  New state: shared-modified by threads #516, #517
+  Reason:    this thread, #517, holds no locks at all
+---------- int gran, 1 .. 96, skip 61 ----------
+
+Thread #518 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #519 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #518
+  New state: shared-modified by threads #518, #519
+  Reason:    this thread, #519, holds no locks at all
+---------- int gran, 2 .. 96, skip 62 ----------
+
+Thread #520 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #521 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #520
+  New state: shared-modified by threads #520, #521
+  Reason:    this thread, #521, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #520
+  New state: shared-modified by threads #520, #521
+  Reason:    this thread, #521, holds no locks at all
+---------- int gran, 3 .. 96, skip 63 ----------
+
+Thread #522 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #523 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #522
+  New state: shared-modified by threads #522, #523
+  Reason:    this thread, #523, holds no locks at all
+---------- int gran, 0 .. 96, skip 64 ----------
+
+Thread #524 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #525 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #524
+  New state: shared-modified by threads #524, #525
+  Reason:    this thread, #525, holds no locks at all
+---------- int gran, 1 .. 96, skip 65 ----------
+
+Thread #526 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #527 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #526
+  New state: shared-modified by threads #526, #527
+  Reason:    this thread, #527, holds no locks at all
+---------- int gran, 2 .. 96, skip 66 ----------
+
+Thread #528 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #529 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #528
+  New state: shared-modified by threads #528, #529
+  Reason:    this thread, #529, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #528
+  New state: shared-modified by threads #528, #529
+  Reason:    this thread, #529, holds no locks at all
+---------- int gran, 3 .. 96, skip 67 ----------
+
+Thread #530 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #531 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #530
+  New state: shared-modified by threads #530, #531
+  Reason:    this thread, #531, holds no locks at all
+---------- int gran, 0 .. 96, skip 68 ----------
+
+Thread #532 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #533 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #532
+  New state: shared-modified by threads #532, #533
+  Reason:    this thread, #533, holds no locks at all
+---------- int gran, 1 .. 96, skip 69 ----------
+
+Thread #534 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #535 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #534
+  New state: shared-modified by threads #534, #535
+  Reason:    this thread, #535, holds no locks at all
+---------- int gran, 2 .. 96, skip 70 ----------
+
+Thread #536 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #537 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #536
+  New state: shared-modified by threads #536, #537
+  Reason:    this thread, #537, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #536
+  New state: shared-modified by threads #536, #537
+  Reason:    this thread, #537, holds no locks at all
+---------- int gran, 3 .. 96, skip 71 ----------
+
+Thread #538 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #539 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #538
+  New state: shared-modified by threads #538, #539
+  Reason:    this thread, #539, holds no locks at all
+---------- int gran, 0 .. 96, skip 72 ----------
+
+Thread #540 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #541 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #540
+  New state: shared-modified by threads #540, #541
+  Reason:    this thread, #541, holds no locks at all
+---------- int gran, 1 .. 96, skip 73 ----------
+
+Thread #542 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #543 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #542
+  New state: shared-modified by threads #542, #543
+  Reason:    this thread, #543, holds no locks at all
+---------- int gran, 2 .. 96, skip 74 ----------
+
+Thread #544 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #545 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #544
+  New state: shared-modified by threads #544, #545
+  Reason:    this thread, #545, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #544
+  New state: shared-modified by threads #544, #545
+  Reason:    this thread, #545, holds no locks at all
+---------- int gran, 3 .. 96, skip 75 ----------
+
+Thread #546 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #547 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #546
+  New state: shared-modified by threads #546, #547
+  Reason:    this thread, #547, holds no locks at all
+---------- int gran, 0 .. 96, skip 76 ----------
+
+Thread #548 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #549 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #548
+  New state: shared-modified by threads #548, #549
+  Reason:    this thread, #549, holds no locks at all
+---------- int gran, 1 .. 96, skip 77 ----------
+
+Thread #550 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #551 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #550
+  New state: shared-modified by threads #550, #551
+  Reason:    this thread, #551, holds no locks at all
+---------- int gran, 2 .. 96, skip 78 ----------
+
+Thread #552 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #553 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #552
+  New state: shared-modified by threads #552, #553
+  Reason:    this thread, #553, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #552
+  New state: shared-modified by threads #552, #553
+  Reason:    this thread, #553, holds no locks at all
+---------- int gran, 3 .. 96, skip 79 ----------
+
+Thread #554 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #555 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #554
+  New state: shared-modified by threads #554, #555
+  Reason:    this thread, #555, holds no locks at all
+---------- int gran, 0 .. 96, skip 80 ----------
+
+Thread #556 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #557 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #556
+  New state: shared-modified by threads #556, #557
+  Reason:    this thread, #557, holds no locks at all
+---------- int gran, 1 .. 96, skip 81 ----------
+
+Thread #558 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #559 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #558
+  New state: shared-modified by threads #558, #559
+  Reason:    this thread, #559, holds no locks at all
+---------- int gran, 2 .. 96, skip 82 ----------
+
+Thread #560 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #561 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #560
+  New state: shared-modified by threads #560, #561
+  Reason:    this thread, #561, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #560
+  New state: shared-modified by threads #560, #561
+  Reason:    this thread, #561, holds no locks at all
+---------- int gran, 3 .. 96, skip 83 ----------
+
+Thread #562 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #563 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #562
+  New state: shared-modified by threads #562, #563
+  Reason:    this thread, #563, holds no locks at all
+---------- int gran, 0 .. 96, skip 84 ----------
+
+Thread #564 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #565 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #564
+  New state: shared-modified by threads #564, #565
+  Reason:    this thread, #565, holds no locks at all
+---------- int gran, 1 .. 96, skip 85 ----------
+
+Thread #566 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #567 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #566
+  New state: shared-modified by threads #566, #567
+  Reason:    this thread, #567, holds no locks at all
+---------- int gran, 2 .. 96, skip 86 ----------
+
+Thread #568 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #569 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #568
+  New state: shared-modified by threads #568, #569
+  Reason:    this thread, #569, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #568
+  New state: shared-modified by threads #568, #569
+  Reason:    this thread, #569, holds no locks at all
+---------- int gran, 3 .. 96, skip 87 ----------
+
+Thread #570 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #571 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #570
+  New state: shared-modified by threads #570, #571
+  Reason:    this thread, #571, holds no locks at all
+---------- int gran, 0 .. 96, skip 88 ----------
+
+Thread #572 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #573 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #572
+  New state: shared-modified by threads #572, #573
+  Reason:    this thread, #573, holds no locks at all
+---------- int gran, 1 .. 96, skip 89 ----------
+
+Thread #574 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #575 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #574
+  New state: shared-modified by threads #574, #575
+  Reason:    this thread, #575, holds no locks at all
+---------- int gran, 2 .. 96, skip 90 ----------
+
+Thread #576 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #577 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #576
+  New state: shared-modified by threads #576, #577
+  Reason:    this thread, #577, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #576
+  New state: shared-modified by threads #576, #577
+  Reason:    this thread, #577, holds no locks at all
+---------- int gran, 3 .. 96, skip 91 ----------
+
+Thread #578 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #579 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #578
+  New state: shared-modified by threads #578, #579
+  Reason:    this thread, #579, holds no locks at all
+---------- int gran, 0 .. 96, skip 92 ----------
+
+Thread #580 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #581 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:472)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #580
+  New state: shared-modified by threads #580, #581
+  Reason:    this thread, #581, holds no locks at all
+---------- int gran, 1 .. 96, skip 93 ----------
+
+Thread #582 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #583 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:474)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #582
+  New state: shared-modified by threads #582, #583
+  Reason:    this thread, #583, holds no locks at all
+---------- int gran, 2 .. 96, skip 94 ----------
+
+Thread #584 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #585 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #584
+  New state: shared-modified by threads #584, #585
+  Reason:    this thread, #585, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:476)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #584
+  New state: shared-modified by threads #584, #585
+  Reason:    this thread, #585, holds no locks at all
+---------- int gran, 3 .. 96, skip 95 ----------
+
+Thread #586 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:234)
+
+Thread #587 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:235)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child32 (tc19_shadowmem.c:83)
+   by 0x........: steer (tc19_shadowmem.c:478)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #586
+  New state: shared-modified by threads #586, #587
+  Reason:    this thread, #587, holds no locks at all
+
+==========================================================
+=== 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 ===
+==========================================================
+
+---------- double gran, 0 .. 92, skip 0 ----------
+
+Thread #588 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #589 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:288)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #588
+  New state: shared-modified by threads #588, #589
+  Reason:    this thread, #589, holds no locks at all
+---------- double gran, 1 .. 92, skip 1 ----------
+
+Thread #590 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #591 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:290)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #590
+  New state: shared-modified by threads #590, #591
+  Reason:    this thread, #591, holds no locks at all
+---------- double gran, 2 .. 92, skip 2 ----------
+
+Thread #592 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #593 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:292)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #592
+  New state: shared-modified by threads #592, #593
+  Reason:    this thread, #593, holds no locks at all
+---------- double gran, 3 .. 92, skip 3 ----------
+
+Thread #594 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #595 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:294)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #594
+  New state: shared-modified by threads #594, #595
+  Reason:    this thread, #595, holds no locks at all
+---------- double gran, 4 .. 92, skip 4 ----------
+
+Thread #596 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #597 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #596
+  New state: shared-modified by threads #596, #597
+  Reason:    this thread, #597, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:296)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #596
+  New state: shared-modified by threads #596, #597
+  Reason:    this thread, #597, holds no locks at all
+---------- double gran, 5 .. 92, skip 5 ----------
+
+Thread #598 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #599 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:298)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #598
+  New state: shared-modified by threads #598, #599
+  Reason:    this thread, #599, holds no locks at all
+---------- double gran, 6 .. 92, skip 6 ----------
+
+Thread #600 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #601 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:300)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #600
+  New state: shared-modified by threads #600, #601
+  Reason:    this thread, #601, holds no locks at all
+---------- double gran, 7 .. 92, skip 7 ----------
+
+Thread #602 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #603 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:302)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #602
+  New state: shared-modified by threads #602, #603
+  Reason:    this thread, #603, holds no locks at all
+---------- double gran, 0 .. 92, skip 8 ----------
+
+Thread #604 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #605 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:304)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #604
+  New state: shared-modified by threads #604, #605
+  Reason:    this thread, #605, holds no locks at all
+---------- double gran, 1 .. 92, skip 9 ----------
+
+Thread #606 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #607 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:306)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #606
+  New state: shared-modified by threads #606, #607
+  Reason:    this thread, #607, holds no locks at all
+---------- double gran, 2 .. 92, skip 10 ----------
+
+Thread #608 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #609 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:308)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #608
+  New state: shared-modified by threads #608, #609
+  Reason:    this thread, #609, holds no locks at all
+---------- double gran, 3 .. 92, skip 11 ----------
+
+Thread #610 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #611 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:310)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #610
+  New state: shared-modified by threads #610, #611
+  Reason:    this thread, #611, holds no locks at all
+---------- double gran, 4 .. 92, skip 12 ----------
+
+Thread #612 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #613 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #612
+  New state: shared-modified by threads #612, #613
+  Reason:    this thread, #613, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:312)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #612
+  New state: shared-modified by threads #612, #613
+  Reason:    this thread, #613, holds no locks at all
+---------- double gran, 5 .. 92, skip 13 ----------
+
+Thread #614 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #615 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:314)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #614
+  New state: shared-modified by threads #614, #615
+  Reason:    this thread, #615, holds no locks at all
+---------- double gran, 6 .. 92, skip 14 ----------
+
+Thread #616 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #617 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:316)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #616
+  New state: shared-modified by threads #616, #617
+  Reason:    this thread, #617, holds no locks at all
+---------- double gran, 7 .. 92, skip 15 ----------
+
+Thread #618 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #619 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:318)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #618
+  New state: shared-modified by threads #618, #619
+  Reason:    this thread, #619, holds no locks at all
+---------- double gran, 0 .. 92, skip 16 ----------
+
+Thread #620 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #621 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:320)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #620
+  New state: shared-modified by threads #620, #621
+  Reason:    this thread, #621, holds no locks at all
+---------- double gran, 1 .. 92, skip 17 ----------
+
+Thread #622 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #623 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:322)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #622
+  New state: shared-modified by threads #622, #623
+  Reason:    this thread, #623, holds no locks at all
+---------- double gran, 2 .. 92, skip 18 ----------
+
+Thread #624 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #625 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:324)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #624
+  New state: shared-modified by threads #624, #625
+  Reason:    this thread, #625, holds no locks at all
+---------- double gran, 3 .. 92, skip 19 ----------
+
+Thread #626 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #627 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:326)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #626
+  New state: shared-modified by threads #626, #627
+  Reason:    this thread, #627, holds no locks at all
+---------- double gran, 4 .. 92, skip 20 ----------
+
+Thread #628 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #629 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #628
+  New state: shared-modified by threads #628, #629
+  Reason:    this thread, #629, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:328)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #628
+  New state: shared-modified by threads #628, #629
+  Reason:    this thread, #629, holds no locks at all
+---------- double gran, 5 .. 92, skip 21 ----------
+
+Thread #630 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #631 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:330)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #630
+  New state: shared-modified by threads #630, #631
+  Reason:    this thread, #631, holds no locks at all
+---------- double gran, 6 .. 92, skip 22 ----------
+
+Thread #632 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #633 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:332)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #632
+  New state: shared-modified by threads #632, #633
+  Reason:    this thread, #633, holds no locks at all
+---------- double gran, 7 .. 92, skip 23 ----------
+
+Thread #634 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #635 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:334)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #634
+  New state: shared-modified by threads #634, #635
+  Reason:    this thread, #635, holds no locks at all
+---------- double gran, 0 .. 92, skip 24 ----------
+
+Thread #636 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #637 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:336)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #636
+  New state: shared-modified by threads #636, #637
+  Reason:    this thread, #637, holds no locks at all
+---------- double gran, 1 .. 92, skip 25 ----------
+
+Thread #638 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #639 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:338)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #638
+  New state: shared-modified by threads #638, #639
+  Reason:    this thread, #639, holds no locks at all
+---------- double gran, 2 .. 92, skip 26 ----------
+
+Thread #640 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #641 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:340)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #640
+  New state: shared-modified by threads #640, #641
+  Reason:    this thread, #641, holds no locks at all
+---------- double gran, 3 .. 92, skip 27 ----------
+
+Thread #642 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #643 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:342)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #642
+  New state: shared-modified by threads #642, #643
+  Reason:    this thread, #643, holds no locks at all
+---------- double gran, 4 .. 92, skip 28 ----------
+
+Thread #644 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #645 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #644
+  New state: shared-modified by threads #644, #645
+  Reason:    this thread, #645, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:344)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #644
+  New state: shared-modified by threads #644, #645
+  Reason:    this thread, #645, holds no locks at all
+---------- double gran, 5 .. 92, skip 29 ----------
+
+Thread #646 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #647 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:346)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #646
+  New state: shared-modified by threads #646, #647
+  Reason:    this thread, #647, holds no locks at all
+---------- double gran, 6 .. 92, skip 30 ----------
+
+Thread #648 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #649 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:348)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #648
+  New state: shared-modified by threads #648, #649
+  Reason:    this thread, #649, holds no locks at all
+---------- double gran, 7 .. 92, skip 31 ----------
+
+Thread #650 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #651 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:350)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #650
+  New state: shared-modified by threads #650, #651
+  Reason:    this thread, #651, holds no locks at all
+---------- double gran, 0 .. 92, skip 32 ----------
+
+Thread #652 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #653 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:352)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #652
+  New state: shared-modified by threads #652, #653
+  Reason:    this thread, #653, holds no locks at all
+---------- double gran, 1 .. 92, skip 33 ----------
+
+Thread #654 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #655 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:354)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #654
+  New state: shared-modified by threads #654, #655
+  Reason:    this thread, #655, holds no locks at all
+---------- double gran, 2 .. 92, skip 34 ----------
+
+Thread #656 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #657 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:356)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #656
+  New state: shared-modified by threads #656, #657
+  Reason:    this thread, #657, holds no locks at all
+---------- double gran, 3 .. 92, skip 35 ----------
+
+Thread #658 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #659 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:358)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #658
+  New state: shared-modified by threads #658, #659
+  Reason:    this thread, #659, holds no locks at all
+---------- double gran, 4 .. 92, skip 36 ----------
+
+Thread #660 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #661 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #660
+  New state: shared-modified by threads #660, #661
+  Reason:    this thread, #661, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:360)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #660
+  New state: shared-modified by threads #660, #661
+  Reason:    this thread, #661, holds no locks at all
+---------- double gran, 5 .. 92, skip 37 ----------
+
+Thread #662 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #663 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:362)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #662
+  New state: shared-modified by threads #662, #663
+  Reason:    this thread, #663, holds no locks at all
+---------- double gran, 6 .. 92, skip 38 ----------
+
+Thread #664 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #665 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:364)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #664
+  New state: shared-modified by threads #664, #665
+  Reason:    this thread, #665, holds no locks at all
+---------- double gran, 7 .. 92, skip 39 ----------
+
+Thread #666 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #667 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:366)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #666
+  New state: shared-modified by threads #666, #667
+  Reason:    this thread, #667, holds no locks at all
+---------- double gran, 0 .. 92, skip 40 ----------
+
+Thread #668 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #669 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:368)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #668
+  New state: shared-modified by threads #668, #669
+  Reason:    this thread, #669, holds no locks at all
+---------- double gran, 1 .. 92, skip 41 ----------
+
+Thread #670 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #671 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:370)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #670
+  New state: shared-modified by threads #670, #671
+  Reason:    this thread, #671, holds no locks at all
+---------- double gran, 2 .. 92, skip 42 ----------
+
+Thread #672 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #673 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:372)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #672
+  New state: shared-modified by threads #672, #673
+  Reason:    this thread, #673, holds no locks at all
+---------- double gran, 3 .. 92, skip 43 ----------
+
+Thread #674 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #675 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:374)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #674
+  New state: shared-modified by threads #674, #675
+  Reason:    this thread, #675, holds no locks at all
+---------- double gran, 4 .. 92, skip 44 ----------
+
+Thread #676 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #677 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #676
+  New state: shared-modified by threads #676, #677
+  Reason:    this thread, #677, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:376)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #676
+  New state: shared-modified by threads #676, #677
+  Reason:    this thread, #677, holds no locks at all
+---------- double gran, 5 .. 92, skip 45 ----------
+
+Thread #678 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #679 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:378)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #678
+  New state: shared-modified by threads #678, #679
+  Reason:    this thread, #679, holds no locks at all
+---------- double gran, 6 .. 92, skip 46 ----------
+
+Thread #680 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #681 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:380)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #680
+  New state: shared-modified by threads #680, #681
+  Reason:    this thread, #681, holds no locks at all
+---------- double gran, 7 .. 92, skip 47 ----------
+
+Thread #682 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #683 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:382)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #682
+  New state: shared-modified by threads #682, #683
+  Reason:    this thread, #683, holds no locks at all
+---------- double gran, 0 .. 92, skip 48 ----------
+
+Thread #684 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #685 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:384)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #684
+  New state: shared-modified by threads #684, #685
+  Reason:    this thread, #685, holds no locks at all
+---------- double gran, 1 .. 92, skip 49 ----------
+
+Thread #686 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #687 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:386)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #686
+  New state: shared-modified by threads #686, #687
+  Reason:    this thread, #687, holds no locks at all
+---------- double gran, 2 .. 92, skip 50 ----------
+
+Thread #688 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #689 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:388)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #688
+  New state: shared-modified by threads #688, #689
+  Reason:    this thread, #689, holds no locks at all
+---------- double gran, 3 .. 92, skip 51 ----------
+
+Thread #690 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #691 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:390)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #690
+  New state: shared-modified by threads #690, #691
+  Reason:    this thread, #691, holds no locks at all
+---------- double gran, 4 .. 92, skip 52 ----------
+
+Thread #692 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #693 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #692
+  New state: shared-modified by threads #692, #693
+  Reason:    this thread, #693, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:392)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #692
+  New state: shared-modified by threads #692, #693
+  Reason:    this thread, #693, holds no locks at all
+---------- double gran, 5 .. 92, skip 53 ----------
+
+Thread #694 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #695 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:394)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #694
+  New state: shared-modified by threads #694, #695
+  Reason:    this thread, #695, holds no locks at all
+---------- double gran, 6 .. 92, skip 54 ----------
+
+Thread #696 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #697 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:396)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #696
+  New state: shared-modified by threads #696, #697
+  Reason:    this thread, #697, holds no locks at all
+---------- double gran, 7 .. 92, skip 55 ----------
+
+Thread #698 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #699 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:398)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #698
+  New state: shared-modified by threads #698, #699
+  Reason:    this thread, #699, holds no locks at all
+---------- double gran, 0 .. 92, skip 56 ----------
+
+Thread #700 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #701 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:400)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #700
+  New state: shared-modified by threads #700, #701
+  Reason:    this thread, #701, holds no locks at all
+---------- double gran, 1 .. 92, skip 57 ----------
+
+Thread #702 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #703 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:402)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #702
+  New state: shared-modified by threads #702, #703
+  Reason:    this thread, #703, holds no locks at all
+---------- double gran, 2 .. 92, skip 58 ----------
+
+Thread #704 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #705 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:404)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #704
+  New state: shared-modified by threads #704, #705
+  Reason:    this thread, #705, holds no locks at all
+---------- double gran, 3 .. 92, skip 59 ----------
+
+Thread #706 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #707 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:406)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #706
+  New state: shared-modified by threads #706, #707
+  Reason:    this thread, #707, holds no locks at all
+---------- double gran, 4 .. 92, skip 60 ----------
+
+Thread #708 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #709 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #708
+  New state: shared-modified by threads #708, #709
+  Reason:    this thread, #709, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:408)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #708
+  New state: shared-modified by threads #708, #709
+  Reason:    this thread, #709, holds no locks at all
+---------- double gran, 5 .. 92, skip 61 ----------
+
+Thread #710 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #711 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:410)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #710
+  New state: shared-modified by threads #710, #711
+  Reason:    this thread, #711, holds no locks at all
+---------- double gran, 6 .. 92, skip 62 ----------
+
+Thread #712 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #713 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:412)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #712
+  New state: shared-modified by threads #712, #713
+  Reason:    this thread, #713, holds no locks at all
+---------- double gran, 7 .. 92, skip 63 ----------
+
+Thread #714 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #715 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:414)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #714
+  New state: shared-modified by threads #714, #715
+  Reason:    this thread, #715, holds no locks at all
+---------- double gran, 0 .. 92, skip 64 ----------
+
+Thread #716 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #717 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:416)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #716
+  New state: shared-modified by threads #716, #717
+  Reason:    this thread, #717, holds no locks at all
+---------- double gran, 1 .. 92, skip 65 ----------
+
+Thread #718 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #719 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:418)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #718
+  New state: shared-modified by threads #718, #719
+  Reason:    this thread, #719, holds no locks at all
+---------- double gran, 2 .. 92, skip 66 ----------
+
+Thread #720 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #721 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:420)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #720
+  New state: shared-modified by threads #720, #721
+  Reason:    this thread, #721, holds no locks at all
+---------- double gran, 3 .. 92, skip 67 ----------
+
+Thread #722 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #723 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:422)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #722
+  New state: shared-modified by threads #722, #723
+  Reason:    this thread, #723, holds no locks at all
+---------- double gran, 4 .. 92, skip 68 ----------
+
+Thread #724 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #725 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #724
+  New state: shared-modified by threads #724, #725
+  Reason:    this thread, #725, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:424)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #724
+  New state: shared-modified by threads #724, #725
+  Reason:    this thread, #725, holds no locks at all
+---------- double gran, 5 .. 92, skip 69 ----------
+
+Thread #726 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #727 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:426)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #726
+  New state: shared-modified by threads #726, #727
+  Reason:    this thread, #727, holds no locks at all
+---------- double gran, 6 .. 92, skip 70 ----------
+
+Thread #728 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #729 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:428)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #728
+  New state: shared-modified by threads #728, #729
+  Reason:    this thread, #729, holds no locks at all
+---------- double gran, 7 .. 92, skip 71 ----------
+
+Thread #730 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #731 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:430)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #730
+  New state: shared-modified by threads #730, #731
+  Reason:    this thread, #731, holds no locks at all
+---------- double gran, 0 .. 92, skip 72 ----------
+
+Thread #732 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #733 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:432)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #732
+  New state: shared-modified by threads #732, #733
+  Reason:    this thread, #733, holds no locks at all
+---------- double gran, 1 .. 92, skip 73 ----------
+
+Thread #734 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #735 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:434)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #734
+  New state: shared-modified by threads #734, #735
+  Reason:    this thread, #735, holds no locks at all
+---------- double gran, 2 .. 92, skip 74 ----------
+
+Thread #736 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #737 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:436)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #736
+  New state: shared-modified by threads #736, #737
+  Reason:    this thread, #737, holds no locks at all
+---------- double gran, 3 .. 92, skip 75 ----------
+
+Thread #738 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #739 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:438)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #738
+  New state: shared-modified by threads #738, #739
+  Reason:    this thread, #739, holds no locks at all
+---------- double gran, 4 .. 92, skip 76 ----------
+
+Thread #740 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #741 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #740
+  New state: shared-modified by threads #740, #741
+  Reason:    this thread, #741, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:440)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #740
+  New state: shared-modified by threads #740, #741
+  Reason:    this thread, #741, holds no locks at all
+---------- double gran, 5 .. 92, skip 77 ----------
+
+Thread #742 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #743 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:442)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #742
+  New state: shared-modified by threads #742, #743
+  Reason:    this thread, #743, holds no locks at all
+---------- double gran, 6 .. 92, skip 78 ----------
+
+Thread #744 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #745 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:444)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #744
+  New state: shared-modified by threads #744, #745
+  Reason:    this thread, #745, holds no locks at all
+---------- double gran, 7 .. 92, skip 79 ----------
+
+Thread #746 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #747 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:446)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #746
+  New state: shared-modified by threads #746, #747
+  Reason:    this thread, #747, holds no locks at all
+---------- double gran, 0 .. 92, skip 80 ----------
+
+Thread #748 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #749 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:448)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #748
+  New state: shared-modified by threads #748, #749
+  Reason:    this thread, #749, holds no locks at all
+---------- double gran, 1 .. 92, skip 81 ----------
+
+Thread #750 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #751 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:450)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #750
+  New state: shared-modified by threads #750, #751
+  Reason:    this thread, #751, holds no locks at all
+---------- double gran, 2 .. 92, skip 82 ----------
+
+Thread #752 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #753 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:452)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #752
+  New state: shared-modified by threads #752, #753
+  Reason:    this thread, #753, holds no locks at all
+---------- double gran, 3 .. 92, skip 83 ----------
+
+Thread #754 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #755 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:454)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #754
+  New state: shared-modified by threads #754, #755
+  Reason:    this thread, #755, holds no locks at all
+---------- double gran, 4 .. 92, skip 84 ----------
+
+Thread #756 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #757 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #756
+  New state: shared-modified by threads #756, #757
+  Reason:    this thread, #757, holds no locks at all
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:456)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #756
+  New state: shared-modified by threads #756, #757
+  Reason:    this thread, #757, holds no locks at all
+---------- double gran, 5 .. 92, skip 85 ----------
+
+Thread #758 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #759 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:458)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #758
+  New state: shared-modified by threads #758, #759
+  Reason:    this thread, #759, holds no locks at all
+---------- double gran, 6 .. 92, skip 86 ----------
+
+Thread #760 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #761 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:460)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #760
+  New state: shared-modified by threads #760, #761
+  Reason:    this thread, #761, holds no locks at all
+---------- double gran, 7 .. 92, skip 87 ----------
+
+Thread #762 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #763 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:462)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #762
+  New state: shared-modified by threads #762, #763
+  Reason:    this thread, #763, holds no locks at all
+---------- double gran, 0 .. 92, skip 88 ----------
+
+Thread #764 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #765 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 8 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:464)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #764
+  New state: shared-modified by threads #764, #765
+  Reason:    this thread, #765, holds no locks at all
+---------- double gran, 1 .. 92, skip 89 ----------
+
+Thread #766 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #767 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:466)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #766
+  New state: shared-modified by threads #766, #767
+  Reason:    this thread, #767, holds no locks at all
+---------- double gran, 2 .. 92, skip 90 ----------
+
+Thread #768 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #769 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:468)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #768
+  New state: shared-modified by threads #768, #769
+  Reason:    this thread, #769, holds no locks at all
+---------- double gran, 3 .. 92, skip 91 ----------
+
+Thread #770 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:265)
+
+Thread #771 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc19_shadowmem.c:266)
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+Possible data race during write of size 1 at 0x........
+   at 0x........: child64 (tc19_shadowmem.c:107)
+   by 0x........: steer (tc19_shadowmem.c:470)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: owned exclusively by thread #770
+  New state: shared-modified by threads #770, #771
+  Reason:    this thread, #771, holds no locks at all
+
+ERROR SUMMARY: 1004 errors from 1004 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc19_shadowmem.stdout.exp b/helgrind/tests/tc19_shadowmem.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc19_shadowmem.stdout.exp
diff --git a/helgrind/tests/tc19_shadowmem.vgtest b/helgrind/tests/tc19_shadowmem.vgtest
new file mode 100644
index 0000000..233e8e4
--- /dev/null
+++ b/helgrind/tests/tc19_shadowmem.vgtest
@@ -0,0 +1,2 @@
+prog: tc19_shadowmem
+vgopts: --cmp-race-err-addrs=yes --error-limit=no
diff --git a/helgrind/tests/tc20_verifywrap.c b/helgrind/tests/tc20_verifywrap.c
new file mode 100644
index 0000000..81ea512
--- /dev/null
+++ b/helgrind/tests/tc20_verifywrap.c
@@ -0,0 +1,262 @@
+
+/* This program attempts to verify that all functions that are
+   supposed to be wrapped by tc_intercepts.c really are wrapped.  The
+   main way it does this is to cause failures in those functions, so
+   as to obtain various error messages which imply that the wrapper
+   really did engage.
+
+   Any regressions shown up by this program are potentially serious
+   and should be investigated carefully. */
+
+/* Needed for older glibcs (2.3 and older, at least) who don't
+   otherwise "know" about some more exotic pthread stuff, in this case
+   PTHREAD_MUTEX_ERRORCHECK. */
+#define _GNU_SOURCE 1
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <semaphore.h>
+
+#if !defined(__GLIBC_PREREQ)
+# error "This program needs __GLIBC_PREREQ (in /usr/include/features.h)"
+#endif
+
+short unprotected = 0;
+
+void* lazy_child ( void* v ) {
+   assert(0); /* does not run */
+}
+
+void* racy_child ( void* v ) {
+   unprotected = 1234;
+   return NULL;
+}
+
+int main ( void )
+{
+   int r;
+   /* pthread_t thr; */
+   /* pthread_attr_t thra; */
+   pthread_mutexattr_t mxa, mxa2;
+   pthread_mutex_t mx, mx2, mx3, mx4;
+   pthread_cond_t cv;
+   struct timespec abstime;
+   pthread_rwlock_t rwl;
+   pthread_rwlock_t rwl2;
+   pthread_rwlock_t rwl3;
+   sem_t s1;
+
+#  if __GLIBC_PREREQ(2,4)
+   fprintf(stderr, 
+           "\n\n------ This is output for >= glibc 2.4 ------\n");
+#  else
+   fprintf(stderr,
+           "\n\n------ This is output for < glibc 2.4 ------\n");
+#  endif
+
+   /* --------- pthread_create/join --------- */
+
+   fprintf(stderr,
+   "\n---------------- pthread_create/join ----------------\n\n");
+
+   /* make pthread_create fail */
+   /* It's amazingly difficult to make pthread_create fail
+      without first soaking up all the machine's resources.
+      Instead, in order to demonstrate that it's really wrapped,
+      create a child thread, generate a race error, and join with it
+      again. */
+   /* This just segfaults:
+      memset( &thra, 0xFF, sizeof(thra) );
+      r= pthread_create( &thr, NULL, lazy_child, NULL ); assert(r);
+   */
+   { pthread_t child;
+     r= pthread_create( &child, NULL, racy_child, NULL ); assert(!r);
+     sleep(1); /* just to ensure parent thread reports race, not child */
+     unprotected = 5678;
+     r= pthread_join( child, NULL ); assert(!r);
+   }
+
+   /* make pthread_join fail */
+   r= pthread_join( pthread_self(), NULL ); assert(r);
+
+   /* --------- pthread_mutex_lock et al --------- */
+
+   fprintf(stderr,
+   "\n---------------- pthread_mutex_lock et al ----------------\n\n");
+
+   /* make pthread_mutex_init fail */
+   memset( &mxa, 0xFF, sizeof(mxa) );
+   r= pthread_mutex_init( &mx, &mxa );
+#  if __GLIBC_PREREQ(2,4)
+   assert(r); /* glibc >= 2.4: the call should fail */
+#  else
+   assert(!r); /* glibc < 2.4: oh well, glibc didn't bounce this */
+#  endif
+
+   /* make pthread_mutex_destroy fail */
+   r= pthread_mutex_init( &mx2, NULL ); assert(!r);
+   r= pthread_mutex_lock( &mx2 ); assert(!r);
+   r= pthread_mutex_destroy( &mx2 ); assert(r);
+
+   /* make pthread_mutex_lock fail (skipped on < glibc 2.4 because it
+      doesn't fail, hence hangs the test) */
+#  if __GLIBC_PREREQ(2,4)
+   memset( &mx3, 0xFF, sizeof(mx3) );
+   r= pthread_mutex_lock( &mx3 ); assert(r);
+#  else
+   fprintf(stderr, "\nmake pthread_mutex_lock fail: "
+                   "skipped on glibc < 2.4\n\n");
+#  endif
+
+   /* make pthread_mutex_trylock fail */
+   memset( &mx3, 0xFF, sizeof(mx3) );
+   r= pthread_mutex_trylock( &mx3 ); assert(r);
+
+   /* make pthread_mutex_timedlock fail */
+   memset( &abstime, 0, sizeof(abstime) );
+   memset( &mx3, 0xFF, sizeof(mx3) );
+   r= pthread_mutex_timedlock( &mx3, &abstime ); assert(r);
+
+   /* make pthread_mutex_unlock fail */
+   memset( &mx3, 0xFF, sizeof(mx3) );
+   r= pthread_mutex_unlock( &mx3 );
+#  if __GLIBC_PREREQ(2,4)
+   assert(r);
+#  else
+   assert(!r);
+#  endif
+
+   /* --------- pthread_cond_wait et al --------- */
+
+   fprintf(stderr,
+   "\n---------------- pthread_cond_wait et al ----------------\n\n");
+
+   /* make pthread_cond_wait fail.  This is difficult.  Our cunning
+      plan (tm) is to show up at pthread_cond_wait bearing a
+      not-locked mutex of the ERRORCHECK flavour and hope (as is
+      indeed the case with glibc-2.5) that pthread_cond_wait notices
+      it is not locked, and bounces our request. */
+   r= pthread_mutexattr_init( &mxa2 ); assert(!r);
+   r= pthread_mutexattr_settype( &mxa2, PTHREAD_MUTEX_ERRORCHECK );
+      assert(!r);
+   r= pthread_mutex_init( &mx4, &mxa2 ); assert(!r);
+   r= pthread_cond_init( &cv, NULL ); assert(!r);
+   r= pthread_cond_wait( &cv, &mx4 ); assert(r);
+   r= pthread_mutexattr_destroy( &mxa2 ); assert(!r);
+
+   /* make pthread_cond_signal fail.  FIXME: can't figure out how
+      to */
+   r= pthread_cond_signal( &cv ); assert(!r);
+   fprintf(stderr, "\nFIXME: can't figure out how to "
+                   "verify wrap of pthread_cond_signal\n\n");
+
+   /* make pthread_cond_broadcast fail.  FIXME: can't figure out how
+      to */
+   r= pthread_cond_broadcast( &cv ); assert(!r);
+   fprintf(stderr, "\nFIXME: can't figure out how to "
+                   "verify wrap of pthread_broadcast_signal\n\n");
+
+   /* make pthread_cond_timedwait fail. */
+   memset( &abstime, 0, sizeof(abstime) );
+   abstime.tv_nsec = 1000000000 + 1;
+   r= pthread_cond_timedwait( &cv, &mx4, &abstime ); assert(r);
+
+   /* --------- pthread_rwlock_* --------- */
+
+   fprintf(stderr,
+   "\n---------------- pthread_rwlock_* ----------------\n\n");
+
+   /* pthread_rwlock_init, pthread_rwlock_unlock */
+   /* pthread_rwlock_init: can't make glibc's implementation fail.
+      However, can demonstrate interceptedness by initialising but not
+      locking a lock and then unlocking it.  Then the unlock call
+      should say "first seen at .. the init call."  So this tests
+      wrappedness of both calls. */
+   r= pthread_rwlock_init( &rwl, NULL ); assert(!r);
+   r= pthread_rwlock_unlock( &rwl ); 
+   /* assert(r); *//* glibc doesn't complain.  It really ought to. Oh well. */
+
+   /* We can infer the presence of wrapping for pthread_rwlock_rdlock,
+      pthread_rwlock_wrlock and pthread_rwlock_unlock by making
+      Thrcheck count the lockedness state, and warning when we unlock
+      a not-locked lock.  Thusly: */
+   r= pthread_rwlock_init( &rwl2, NULL ); assert(!r);
+
+   /* w-lock it */
+   fprintf(stderr, "(1) no error on next line\n");
+   r= pthread_rwlock_wrlock( &rwl2 ); assert(!r);
+   /* unlock it */
+   fprintf(stderr, "(2) no error on next line\n");
+   r= pthread_rwlock_unlock( &rwl2 ); assert(!r);
+   /* unlock it again, get an error */
+   fprintf(stderr, "(3)    ERROR on next line\n");
+   r= pthread_rwlock_unlock( &rwl2 ); assert(!r);
+
+   /* same game with r-locks */
+   r= pthread_rwlock_init( &rwl2, NULL ); assert(!r);
+   /* r-lock it twice */
+   fprintf(stderr, "(4) no error on next line\n");
+   r= pthread_rwlock_rdlock( &rwl2 ); assert(!r);
+   fprintf(stderr, "(5) no error on next line\n");
+   r= pthread_rwlock_rdlock( &rwl2 ); assert(!r);
+   /* unlock it twice */
+   fprintf(stderr, "(6) no error on next line\n");
+   r= pthread_rwlock_unlock( &rwl2 ); assert(!r);
+   fprintf(stderr, "(7) no error on next line\n");
+   r= pthread_rwlock_unlock( &rwl2 ); assert(!r);
+   /* unlock it again, get an error */
+   fprintf(stderr, "(8)    ERROR on next line\n");
+   r= pthread_rwlock_unlock( &rwl2 ); assert(!r);
+
+   /* Lock rwl3 so the locked-lock-at-dealloc check can complain about
+      it. */
+   r= pthread_rwlock_init( &rwl3, NULL ); assert(!r);
+   r= pthread_rwlock_rdlock( &rwl3 ); assert(!r);
+
+   /* ------------- sem_* ------------- */
+
+   /* This is pretty lame, and duplicates tc18_semabuse.c. */
+
+   fprintf(stderr,
+   "\n---------------- sem_* ----------------\n\n");
+
+   /* verifies wrap of sem_init */
+   /* Do sem_init with huge initial count - fails */
+   r= sem_init(&s1, 0, ~0); assert(r);
+
+   /* initialise properly */
+   r= sem_init(&s1, 0, 0);
+
+   /* in glibc, sem_destroy is a no-op; making it fail is
+      impossible. */
+   fprintf(stderr, "\nFIXME: can't figure out how to verify wrap of "
+                   "sem_destroy\n\n");
+
+   /* verifies wrap of sem_wait */
+   /* Do 'wait' on a bogus semaphore.  This should fail, but on glibc
+      it succeeds. */
+   memset(&s1, 0x55, sizeof(s1));
+   r= sem_wait(&s1); /* assert(r != 0); */
+
+   /* this really ought to fail, but it doesn't. */
+   r= sem_post(&s1); assert(!r);
+   fprintf(stderr, "\nFIXME: can't figure out how to verify wrap of "
+                   "sem_post\n\n");
+
+   sem_destroy(&s1);
+
+   /* ------------- dealloc of mem holding locks ------------- */
+
+   fprintf(stderr,
+   "\n------------ dealloc of mem holding locks ------------\n\n");
+
+   /* At this point it should complain about deallocation
+      of memory containing locked locks:
+         rwl3
+   */
+
+   return 0;
+}
diff --git a/helgrind/tests/tc20_verifywrap.stderr.exp-glibc23-amd64 b/helgrind/tests/tc20_verifywrap.stderr.exp-glibc23-amd64
new file mode 100644
index 0000000..df85c25
--- /dev/null
+++ b/helgrind/tests/tc20_verifywrap.stderr.exp-glibc23-amd64
@@ -0,0 +1,134 @@
+
+
+
+------ This is output for < glibc 2.4 ------
+
+---------------- pthread_create/join ----------------
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:76)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: main (tc20_verifywrap.c:78)
+  Old state: owned exclusively by thread #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no locks at all
+
+Thread #1's call to pthread_join failed
+   with error code 35 (EDEADLK: Resource deadlock would occur)
+   at 0x........: pthread_join (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:83)
+
+---------------- pthread_mutex_lock et al ----------------
+
+
+Thread #1: pthread_mutex_destroy of a locked mutex
+   at 0x........: pthread_mutex_destroy (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:102)
+
+Thread #1's call to pthread_mutex_destroy failed
+   with error code 16 (EBUSY: Device or resource busy)
+   at 0x........: pthread_mutex_destroy (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:102)
+
+make pthread_mutex_lock fail: skipped on glibc < 2.4
+
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:125)
+
+---------------- pthread_cond_wait et al ----------------
+
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:147)
+
+Thread #1's call to pthread_cond_wait failed
+   with error code 1 (EPERM: Operation not permitted)
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:147)
+
+FIXME: can't figure out how to verify wrap of pthread_cond_signal
+
+
+FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_timedwait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:165)
+
+Thread #1's call to pthread_cond_timedwait failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_cond_timedwait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:165)
+
+---------------- pthread_rwlock_* ----------------
+
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:179)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:178)
+(1) no error on next line
+(2) no error on next line
+(3)    ERROR on next line
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:196)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:186)
+(4) no error on next line
+(5) no error on next line
+(6) no error on next line
+(7) no error on next line
+(8)    ERROR on next line
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:212)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:186)
+
+---------------- sem_* ----------------
+
+
+Thread #1's call to sem_init failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: sem_init@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:228)
+
+FIXME: can't figure out how to verify wrap of sem_destroy
+
+
+Thread #1: Bug in libpthread: sem_wait succeeded on semaphore without prior sem_post
+   at 0x........: sem_wait_WRK (hg_intercepts.c:...)
+   by 0x........: sem_wait (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:242)
+
+FIXME: can't figure out how to verify wrap of sem_post
+
+
+------------ dealloc of mem holding locks ------------
+
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: main (tc20_verifywrap.c:262)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:216)
+
+ERROR SUMMARY: 15 errors from 15 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc20_verifywrap.stderr.exp-glibc25-amd64 b/helgrind/tests/tc20_verifywrap.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..0b399de
--- /dev/null
+++ b/helgrind/tests/tc20_verifywrap.stderr.exp-glibc25-amd64
@@ -0,0 +1,156 @@
+
+
+
+------ This is output for >= glibc 2.4 ------
+
+---------------- pthread_create/join ----------------
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:76)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: main (tc20_verifywrap.c:78)
+  Old state: owned exclusively by thread #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no locks at all
+
+Thread #1's call to pthread_join failed
+   with error code 35 (EDEADLK: Resource deadlock would occur)
+   at 0x........: pthread_join (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:83)
+
+---------------- pthread_mutex_lock et al ----------------
+
+
+Thread #1's call to pthread_mutex_init failed
+   with error code 95 (EOPNOTSUPP: Operation not supported on transport endpoint)
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:92)
+
+Thread #1: pthread_mutex_destroy of a locked mutex
+   at 0x........: pthread_mutex_destroy (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:102)
+
+Thread #1's call to pthread_mutex_destroy failed
+   with error code 16 (EBUSY: Device or resource busy)
+   at 0x........: pthread_mutex_destroy (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:102)
+
+Thread #1's call to pthread_mutex_lock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:108)
+
+Thread #1's call to pthread_mutex_trylock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_trylock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:116)
+
+Thread #1's call to pthread_mutex_timedlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_timedlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:121)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:125)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:125)
+
+---------------- pthread_cond_wait et al ----------------
+
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:147)
+
+Thread #1's call to pthread_cond_wait failed
+   with error code 1 (EPERM: Operation not permitted)
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:147)
+
+FIXME: can't figure out how to verify wrap of pthread_cond_signal
+
+
+FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_timedwait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:165)
+
+Thread #1's call to pthread_cond_timedwait failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_cond_timedwait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:165)
+
+---------------- pthread_rwlock_* ----------------
+
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:179)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:178)
+(1) no error on next line
+(2) no error on next line
+(3)    ERROR on next line
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:196)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:186)
+(4) no error on next line
+(5) no error on next line
+(6) no error on next line
+(7) no error on next line
+(8)    ERROR on next line
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:212)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:186)
+
+---------------- sem_* ----------------
+
+
+Thread #1's call to sem_init failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: sem_init@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:228)
+
+FIXME: can't figure out how to verify wrap of sem_destroy
+
+
+Thread #1: Bug in libpthread: sem_wait succeeded on semaphore without prior sem_post
+   at 0x........: sem_wait_WRK (hg_intercepts.c:...)
+   by 0x........: sem_wait (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:242)
+
+FIXME: can't figure out how to verify wrap of sem_post
+
+
+------------ dealloc of mem holding locks ------------
+
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: main (tc20_verifywrap.c:262)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:216)
+
+ERROR SUMMARY: 20 errors from 20 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc20_verifywrap.stderr.exp-glibc25-x86 b/helgrind/tests/tc20_verifywrap.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..c44e998
--- /dev/null
+++ b/helgrind/tests/tc20_verifywrap.stderr.exp-glibc25-x86
@@ -0,0 +1,155 @@
+
+
+
+------ This is output for >= glibc 2.4 ------
+
+---------------- pthread_create/join ----------------
+
+Thread #1 is the program's root thread
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:76)
+
+Possible data race during write of size 2 at 0x........
+   at 0x........: main (tc20_verifywrap.c:78)
+  Old state: owned exclusively by thread #2
+  New state: shared-modified by threads #1, #2
+  Reason:    this thread, #1, holds no locks at all
+
+Thread #1's call to pthread_join failed
+   with error code 35 (EDEADLK: Resource deadlock would occur)
+   at 0x........: pthread_join (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:83)
+
+---------------- pthread_mutex_lock et al ----------------
+
+
+Thread #1's call to pthread_mutex_init failed
+   with error code 95 (EOPNOTSUPP: Operation not supported on transport endpoint)
+   at 0x........: pthread_mutex_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:92)
+
+Thread #1: pthread_mutex_destroy of a locked mutex
+   at 0x........: pthread_mutex_destroy (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:102)
+
+Thread #1's call to pthread_mutex_destroy failed
+   with error code 16 (EBUSY: Device or resource busy)
+   at 0x........: pthread_mutex_destroy (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:102)
+
+Thread #1's call to pthread_mutex_lock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_lock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:108)
+
+Thread #1's call to pthread_mutex_trylock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_trylock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:116)
+
+Thread #1's call to pthread_mutex_timedlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_timedlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:121)
+
+Thread #1 unlocked an invalid lock at 0x........ 
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:125)
+
+Thread #1's call to pthread_mutex_unlock failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_mutex_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:125)
+
+---------------- pthread_cond_wait et al ----------------
+
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:147)
+
+Thread #1's call to pthread_cond_wait failed
+   with error code 1 (EPERM: Operation not permitted)
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:147)
+
+FIXME: can't figure out how to verify wrap of pthread_cond_signal
+
+
+FIXME: can't figure out how to verify wrap of pthread_broadcast_signal
+
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_timedwait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:165)
+
+Thread #1's call to pthread_cond_timedwait failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: pthread_cond_timedwait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:165)
+
+---------------- pthread_rwlock_* ----------------
+
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:179)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:178)
+(1) no error on next line
+(2) no error on next line
+(3)    ERROR on next line
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:196)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:186)
+(4) no error on next line
+(5) no error on next line
+(6) no error on next line
+(7) no error on next line
+(8)    ERROR on next line
+
+Thread #1 unlocked a not-locked lock at 0x........ 
+   at 0x........: pthread_rwlock_unlock (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:212)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:186)
+
+---------------- sem_* ----------------
+
+
+Thread #1's call to sem_init failed
+   with error code 22 (EINVAL: Invalid argument)
+   at 0x........: sem_init@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:228)
+
+FIXME: can't figure out how to verify wrap of sem_destroy
+
+
+Thread #1: Bug in libpthread: sem_wait succeeded on semaphore without prior sem_post
+   at 0x........: sem_wait_WRK (hg_intercepts.c:...)
+   by 0x........: sem_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:242)
+
+FIXME: can't figure out how to verify wrap of sem_post
+
+
+------------ dealloc of mem holding locks ------------
+
+
+Thread #1 deallocated location 0x........ containing a locked lock
+   at 0x........: main (tc20_verifywrap.c:261)
+  Lock at 0x........ was first observed
+   at 0x........: pthread_rwlock_init (hg_intercepts.c:...)
+   by 0x........: main (tc20_verifywrap.c:216)
+
+ERROR SUMMARY: 20 errors from 20 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc20_verifywrap.stdout.exp b/helgrind/tests/tc20_verifywrap.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc20_verifywrap.stdout.exp
diff --git a/helgrind/tests/tc20_verifywrap.vgtest b/helgrind/tests/tc20_verifywrap.vgtest
new file mode 100644
index 0000000..bc61bd6
--- /dev/null
+++ b/helgrind/tests/tc20_verifywrap.vgtest
@@ -0,0 +1 @@
+prog: tc20_verifywrap
diff --git a/helgrind/tests/tc21_pthonce.c b/helgrind/tests/tc21_pthonce.c
new file mode 100644
index 0000000..69fac76
--- /dev/null
+++ b/helgrind/tests/tc21_pthonce.c
@@ -0,0 +1,96 @@
+
+/* This really exists to check that Thrcheck behaves plausibly
+   with pthread_once calls.  Which it appears to.
+
+   The original source of this program is as shown below, although it
+   has been modified somewhat.  See
+   http://www.oreilly.com/pub/a/oreilly/ask_tim/2001/codepolicy.html
+   for OReilly's policy on using bits of their code examples.
+*/
+
+
+/********************************************************
+ * An example source module to accompany...
+ *
+ * "Using POSIX Threads: Programming with Pthreads"
+ *     by Brad Nichols, Dick Buttlar, Jackie Farrell
+ *     O'Reilly & Associates, Inc.
+ *
+ ********************************************************
+ * once_exam.c
+ *
+ * An example of using the pthreads_once() call to execute an
+ * initialization procedure.
+ *
+ * A program spawns multiple threads and each one tries to
+ * execute the routine welcome() using the once call. Only
+ * the first thread into the once routine will actually
+ * execute welcome().
+ *
+ * The program's main thread synchronizes its exit with the
+ * exit of the threads using the pthread_join() operation.
+ *
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <assert.h>
+
+#include <pthread.h>
+
+/* With more than 2 threads, the precise error reports vary between
+   platforms, in terms of the number of races detected.  Make life
+   simple and just have 2 threads and so just 1 race. */
+#define  NUM_THREADS 2
+
+static pthread_once_t welcome_once_block = PTHREAD_ONCE_INIT;
+
+static int unprotected1 = 0;
+static int unprotected2 = 0;
+
+/* This is a hack: delay threads except the first enough so as to
+   ensure threads[0] gets to the pthread_once call first.  This is so
+   as to ensure that this test produces results which aren't
+   scheduling sensitive.  (sigh) */
+void maybe_stall ( int myid )
+{
+   assert(myid >= 0 && myid < NUM_THREADS);
+   if (myid > 0)
+      sleep(1);
+}
+
+void welcome(void) {
+   printf("welcome: Welcome\n");
+   unprotected1++; /* this is harmless */
+}
+
+void* child ( void* argV ) { 
+   int r; 
+   maybe_stall( *(int*)argV );
+   r= pthread_once(&welcome_once_block, welcome); assert(!r);
+   printf("child: Hi, I'm thread %d\n", *(int*)argV);
+   unprotected2++; /* whereas this is a race */
+   return NULL;
+}
+
+int main ( void ) {
+   int       *id_arg, i, r;
+   pthread_t threads[NUM_THREADS];
+
+   id_arg = (int *)malloc(NUM_THREADS*sizeof(int));
+
+   for (i = 0; i < NUM_THREADS; i++) {
+      id_arg[i] = i;
+      r= pthread_create(&threads[i], NULL, child, &id_arg[i]);
+      assert(!r);
+   }
+
+   for (i = 0; i < NUM_THREADS; i++) {
+      pthread_join(threads[i], NULL);
+      /* printf("main: joined to thread %d\n", i); */
+   }
+   printf("main: Goodbye\n");
+   return 0;
+}
diff --git a/helgrind/tests/tc21_pthonce.stderr.exp-glibc25-amd64 b/helgrind/tests/tc21_pthonce.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..4d0fd44
--- /dev/null
+++ b/helgrind/tests/tc21_pthonce.stderr.exp-glibc25-amd64
@@ -0,0 +1,26 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc21_pthonce.c:86)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc21_pthonce.c:86)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child (tc21_pthonce.c:74)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #2, #3
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc21_pthonce.stderr.exp-glibc25-x86 b/helgrind/tests/tc21_pthonce.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..f0b58a3
--- /dev/null
+++ b/helgrind/tests/tc21_pthonce.stderr.exp-glibc25-x86
@@ -0,0 +1,24 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc21_pthonce.c:86)
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc21_pthonce.c:86)
+
+Possible data race during write of size 4 at 0x........
+   at 0x........: child (tc21_pthonce.c:74)
+   by 0x........: mythread_wrapper (hg_intercepts.c:...)
+   by 0x........: ...
+   by 0x........: ...
+  Old state: shared-readonly by threads #2, #3
+  New state: shared-modified by threads #2, #3
+  Reason:    this thread, #3, holds no consistent locks
+  Location 0x........ has never been protected by any lock
+
+ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc21_pthonce.stdout.exp b/helgrind/tests/tc21_pthonce.stdout.exp
new file mode 100644
index 0000000..e6c2dc2
--- /dev/null
+++ b/helgrind/tests/tc21_pthonce.stdout.exp
@@ -0,0 +1,4 @@
+welcome: Welcome
+child: Hi, I'm thread 0
+child: Hi, I'm thread 1
+main: Goodbye
diff --git a/helgrind/tests/tc21_pthonce.vgtest b/helgrind/tests/tc21_pthonce.vgtest
new file mode 100644
index 0000000..d9b9a81
--- /dev/null
+++ b/helgrind/tests/tc21_pthonce.vgtest
@@ -0,0 +1 @@
+prog: tc21_pthonce
diff --git a/helgrind/tests/tc22_exit_w_lock.c b/helgrind/tests/tc22_exit_w_lock.c
new file mode 100644
index 0000000..d40600e
--- /dev/null
+++ b/helgrind/tests/tc22_exit_w_lock.c
@@ -0,0 +1,50 @@
+
+#include <pthread.h>
+#include <unistd.h>
+#include <assert.h>
+#include <signal.h>
+
+/* Should see 3 threads exiting in different ways, all holding one (or
+   two) locks. */
+
+pthread_mutex_t mxC1  = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t mxC2  = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t mxC2b = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t mxP   = PTHREAD_MUTEX_INITIALIZER;
+
+/* This one exits in the normal way, by joining back */
+void* child_fn1 ( void* arg )
+{
+  int r= pthread_mutex_lock( &mxC1 ); assert(!r);
+  return NULL;
+}
+
+/* This one detaches, does its own thing. */
+void* child_fn2 ( void* arg )
+{
+  int r;
+  r= pthread_mutex_lock( &mxC2 ); assert(!r);
+  r= pthread_mutex_lock( &mxC2b ); assert(!r);
+  r= pthread_detach( pthread_self() ); assert(!r);
+  return NULL;
+}
+
+/* Parent creates 2 children, takes a lock, waits, segfaults.  Use
+   sleeps to enforce exit ordering, for repeatable regtesting. */
+int main ( void )
+{
+   int r;
+   pthread_t child1, child2;
+
+   r= pthread_create(&child2, NULL, child_fn2, NULL); assert(!r);
+   sleep(1);
+
+   r= pthread_create(&child1, NULL, child_fn1, NULL); assert(!r);
+   r= pthread_join(child1, NULL); assert(!r);
+   sleep(1);
+
+   r= pthread_mutex_lock( &mxP );
+ 
+   kill( getpid(), SIGABRT );
+   return 0;
+}
diff --git a/helgrind/tests/tc22_exit_w_lock.stderr.exp-glibc25-amd64 b/helgrind/tests/tc22_exit_w_lock.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..f0eb6b6
--- /dev/null
+++ b/helgrind/tests/tc22_exit_w_lock.stderr.exp-glibc25-amd64
@@ -0,0 +1,30 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc22_exit_w_lock.c:39)
+
+Thread #2: Exiting thread still holds 2 locks
+   at 0x........: start_thread (in /lib/libpthread...)
+   by 0x........: ...
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: ...
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc22_exit_w_lock.c:42)
+
+Thread #3: Exiting thread still holds 1 lock
+   at 0x........: start_thread (in /lib/libpthread...)
+   by 0x........: ...
+
+Thread #1 is the program's root thread
+
+Thread #1: Exiting thread still holds 1 lock
+   at 0x........: kill (in /...libc...)
+   by 0x........: main (tc22_exit_w_lock.c:48)
+
+ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc22_exit_w_lock.stderr.exp-glibc25-x86 b/helgrind/tests/tc22_exit_w_lock.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..bc07725
--- /dev/null
+++ b/helgrind/tests/tc22_exit_w_lock.stderr.exp-glibc25-x86
@@ -0,0 +1,28 @@
+
+Thread #2 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc22_exit_w_lock.c:39)
+
+Thread #2: Exiting thread still holds 2 locks
+   at 0x........: start_thread (in /lib/libpthread...)
+   by 0x........: ...
+
+Thread #3 was created
+   at 0x........: clone (in /...libc...)
+   by 0x........: pthread_create@GLIBC_ (in /lib/libpthread...)
+   by 0x........: pthread_create@* (hg_intercepts.c:...)
+   by 0x........: main (tc22_exit_w_lock.c:42)
+
+Thread #3: Exiting thread still holds 1 lock
+   at 0x........: start_thread (in /lib/libpthread...)
+   by 0x........: ...
+
+Thread #1 is the program's root thread
+
+Thread #1: Exiting thread still holds 1 lock
+   at 0x........: kill (in /...libc...)
+   by 0x........: (below main) (in /...libc...)
+
+ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc22_exit_w_lock.stdout.exp b/helgrind/tests/tc22_exit_w_lock.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc22_exit_w_lock.stdout.exp
diff --git a/helgrind/tests/tc22_exit_w_lock.vgtest b/helgrind/tests/tc22_exit_w_lock.vgtest
new file mode 100644
index 0000000..4f85dd5
--- /dev/null
+++ b/helgrind/tests/tc22_exit_w_lock.vgtest
@@ -0,0 +1 @@
+prog: tc22_exit_w_lock
diff --git a/helgrind/tests/tc23_bogus_condwait.c b/helgrind/tests/tc23_bogus_condwait.c
new file mode 100644
index 0000000..a0fad5d
--- /dev/null
+++ b/helgrind/tests/tc23_bogus_condwait.c
@@ -0,0 +1,86 @@
+
+/* Expect 5 errors total (4 re cvs, 1 re exiting w/lock.).
+   Tests passing bogus mutexes to pthread_cond_wait. */
+#define _GNU_SOURCE 1 /* needed by glibc <= 2.3 for pthread_rwlock_* */
+#include <pthread.h>
+#include <assert.h>
+#include <unistd.h>
+#include <semaphore.h>
+
+pthread_mutex_t mx[4];
+pthread_cond_t cv;
+pthread_rwlock_t rwl;
+
+sem_t quit_now;
+
+void* rescue_me ( void* uu )
+{
+  /* wait for, and unblock, the first wait */
+  sleep(1);
+  pthread_cond_signal( &cv );
+
+  /* wait for, and unblock, the second wait */
+  sleep(1);
+  pthread_cond_signal( &cv );
+
+  /* wait for, and unblock, the third wait */
+  sleep(1);
+  pthread_cond_signal( &cv );
+
+  /* wait for, and unblock, the fourth wait */
+  sleep(1);
+  pthread_cond_signal( &cv );
+
+  sem_wait( &quit_now );
+  return NULL;
+}
+
+void* grab_the_lock ( void* uu )
+{
+   int r= pthread_mutex_lock( &mx[2] ); assert(!r);
+   sem_wait( &quit_now );
+   r= pthread_mutex_unlock( &mx[2] ); assert(!r);
+   return NULL;
+}
+
+int main ( void )
+{
+  int r;
+  pthread_t my_rescuer, grabber;
+
+  r= pthread_mutex_init(&mx[0], NULL); assert(!r);
+  r= pthread_mutex_init(&mx[1], NULL); assert(!r);
+  r= pthread_mutex_init(&mx[2], NULL); assert(!r);
+  r= pthread_mutex_init(&mx[3], NULL); assert(!r);
+
+  r= pthread_cond_init(&cv, NULL); assert(!r);
+  r= pthread_rwlock_init(&rwl, NULL); assert(!r);
+
+  r= sem_init( &quit_now, 0,0 ); assert(!r);
+
+  r= pthread_create( &grabber, NULL, grab_the_lock, NULL ); assert(!r);
+  sleep(1); /* let the grabber get there first */
+
+  r= pthread_create( &my_rescuer, NULL, rescue_me, NULL );  assert(!r);
+  /* Do stupid things and hope that rescue_me gets us out of
+     trouble */
+
+  /* mx is bogus */
+  r= pthread_cond_wait(&cv, (pthread_mutex_t*)(1 + (char*)&mx[0]) );
+
+  /* mx is not locked */
+  r= pthread_cond_wait(&cv, &mx[0]);
+
+  /* wrong flavour of lock */
+  r= pthread_cond_wait(&cv, (pthread_mutex_t*)&rwl );
+
+  /* mx is held by someone else. */
+  r= pthread_cond_wait(&cv, &mx[2] );
+
+  r= sem_post( &quit_now ); assert(!r);
+  r= sem_post( &quit_now ); assert(!r);
+
+  r= pthread_join( my_rescuer, NULL ); assert(!r);
+  r= pthread_join( grabber, NULL ); assert(!r);
+  return 0;
+}
diff --git a/helgrind/tests/tc23_bogus_condwait.stderr.exp-glibc25-amd64 b/helgrind/tests/tc23_bogus_condwait.stderr.exp-glibc25-amd64
new file mode 100644
index 0000000..2bb66de
--- /dev/null
+++ b/helgrind/tests/tc23_bogus_condwait.stderr.exp-glibc25-amd64
@@ -0,0 +1,20 @@
+
+Thread #1 is the program's root thread
+
+Thread #1: pthread_cond_{timed}wait called with invalid mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:69)
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:72)
+
+Thread #1: pthread_cond_{timed}wait called with mutex of type pthread_rwlock_t*
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:75)
+
+Thread #1: pthread_cond_{timed}wait called with mutex held by a different thread
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:78)
+
+ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc23_bogus_condwait.stderr.exp-glibc25-x86 b/helgrind/tests/tc23_bogus_condwait.stderr.exp-glibc25-x86
new file mode 100644
index 0000000..2bb66de
--- /dev/null
+++ b/helgrind/tests/tc23_bogus_condwait.stderr.exp-glibc25-x86
@@ -0,0 +1,20 @@
+
+Thread #1 is the program's root thread
+
+Thread #1: pthread_cond_{timed}wait called with invalid mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:69)
+
+Thread #1: pthread_cond_{timed}wait called with un-held mutex
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:72)
+
+Thread #1: pthread_cond_{timed}wait called with mutex of type pthread_rwlock_t*
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:75)
+
+Thread #1: pthread_cond_{timed}wait called with mutex held by a different thread
+   at 0x........: pthread_cond_wait@* (hg_intercepts.c:...)
+   by 0x........: main (tc23_bogus_condwait.c:78)
+
+ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
diff --git a/helgrind/tests/tc23_bogus_condwait.stdout.exp b/helgrind/tests/tc23_bogus_condwait.stdout.exp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/helgrind/tests/tc23_bogus_condwait.stdout.exp
diff --git a/helgrind/tests/tc23_bogus_condwait.vgtest b/helgrind/tests/tc23_bogus_condwait.vgtest
new file mode 100644
index 0000000..31c3ed8
--- /dev/null
+++ b/helgrind/tests/tc23_bogus_condwait.vgtest
@@ -0,0 +1 @@
+prog: tc23_bogus_condwait