http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47602

Paulo César Pereira de Andrade <pcpa at mandriva dot com.br> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |pcpa at mandriva dot com.br

--- Comment #14 from Paulo César Pereira de Andrade <pcpa at mandriva dot 
com.br> 2011-11-25 19:22:09 UTC ---
  In a first try on updating to valgrind 3.7.0 I run into this:

make[3]: Entering directory `/home/pcpa/rpm/BUILD/valgrind-3.7.0/coregrind'
x86_64-mandriva-linux-gnu-gcc -DHAVE_CONFIG_H -I. -I..  -I.. -I../include
-I../VEX/pub -DVGA_x86=1 -DVGO_linux=1 -DVGP_x86_linux=1
-DVGPV_x86_linux_vanilla=1 -I../coregrind -DVG_LIBDIR="\"/usr/lib64/valgrind"\"
-DVG_PLATFORM="\"x86-linux\""  -m32 -O2 -g -Wall -Wmissing-prototypes -Wshadow
-Wpointer-arith -Wstrict-prototypes -Wmissing-declarations
-Wno-format-zero-length -fno-strict-aliasing -fno-builtin -Wno-long-long -O2 -g
-frecord-gcc-switches -Wstrict-aliasing=2 -pipe -Wformat
-Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
--param=ssp-buffer-size=4 -fPIC -Wno-pointer-sign -fno-stack-protector -MT
libcoregrind_x86_linux_a-syswrap-linux.o -MD -MP -MF
.deps/libcoregrind_x86_linux_a-syswrap-linux.Tpo -c -o
libcoregrind_x86_linux_a-syswrap-linux.o `test -f 'm_syswrap/syswrap-linux.c'
|| echo './'`m_syswrap/syswrap-linux.c
m_syswrap/syswrap-linux.c: In function 'run_a_thread_NORETURN':
m_syswrap/syswrap-linux.c:202:7: error: PIC register clobbered by 'ebx' in
'asm'
make[3]: *** [libcoregrind_x86_linux_a-syswrap-linux.o] Error 1

The code is like this:

static void run_a_thread_NORETURN ( Word tidW )
[...]
      /* We have to use this sequence to terminate the thread to
         prevent a subtle race.  If VG_(exit_thread)() had left the
         ThreadState as Empty, then it could have been reallocated,
         reusing the stack while we're doing these last cleanups.
         Instead, VG_(exit_thread) leaves it as Zombie to prevent
         reallocation.  We need to make sure we don't touch the stack
         between marking it Empty and exiting.  Hence the
         assembler. */
#if defined(VGP_x86_linux)
      asm volatile (
         "movl    %1, %0\n"    /* set tst->status = VgTs_Empty */
         "movl    %2, %%eax\n"    /* set %eax = __NR_exit */
         "movl    %3, %%ebx\n"    /* set %ebx = tst->os_state.exitcode */
         "int    $0x80\n"    /* exit(tst->os_state.exitcode) */
         : "=m" (tst->status)
         : "n" (VgTs_Empty), "n" (__NR_exit), "m" (tst->os_state.exitcode)
         : "eax", "ebx"
      );
#elif defined(VGP_amd64_linux)

In valgrind 3.6.1 it works because it does not tell about the clobbered
registers.

Reply via email to