]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Replace strlen on amd64-linux with a simple version that doesn't
authorTom Hughes <tom@compton.nu>
Thu, 2 Jul 2009 13:02:12 +0000 (13:02 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 2 Jul 2009 13:02:12 +0000 (13:02 +0000)
generate false positives.

Patch from Jakub Jelinek <jakub@redhat.com>. Fixes #190429.

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

coregrind/m_redir.c
coregrind/m_trampoline.S
coregrind/pub_core_trampoline.h

index d824a79a4258ec6a558df0770364ebbbc330c5f8..570d996ce500ca08e314bb43e16d4f440854b739 100644 (file)
@@ -879,6 +879,20 @@ void VG_(redir_initialise) ( void )
       (Addr)&VG_(amd64_linux_REDIR_FOR_vtime) 
    );
 
+   /* If we're using memcheck, use these intercepts right from
+      the start, otherwise ld.so makes a lot of noise. */
+   if (0==VG_(strcmp)("Memcheck", VG_(details).name)) {
+
+      static const HChar croakage[]
+        = "Possible fix: install glibc's debuginfo package on this machine.";
+
+      /* this is mandatory - can't sanely continue without it */
+      add_hardwired_spec(
+         "ld-linux-x86-64.so.2", "strlen",
+         (Addr)&VG_(amd64_linux_REDIR_FOR_strlen),
+         croakage
+      );   
+   }
 #  elif defined(VGP_ppc32_linux)
    {
    static const HChar croakage[]
index 8b3487ef9fcdc37bdcf72a25194342c8a072c4ed..256666bdf40ea4d6891c785aeefed455ad5dc7bc 100644 (file)
@@ -168,7 +168,29 @@ VG_(amd64_linux_REDIR_FOR_vtime):
 .LfnE3:
 .size VG_(amd64_linux_REDIR_FOR_vtime), .-.LfnB3
 
-/* A CIE for the above two functions, followed by their FDEs */
+/* There's no particular reason that this needs to be handwritten
+   assembly, but since that's what this file contains, here's a
+   simple strlen implementation (written in C and compiled by gcc.)
+*/
+.global VG_(amd64_linux_REDIR_FOR_strlen)
+.type   VG_(amd64_linux_REDIR_FOR_strlen), @function
+VG_(amd64_linux_REDIR_FOR_strlen):
+.LfnB4:
+       xorl    %eax, %eax
+       cmpb    $0, (%rdi)
+       movq    %rdi, %rdx
+       je      .L41
+.L40:  addq    $1, %rdx
+       cmpb    $0, (%rdx)
+       jne     .L40
+       movq    %rdx, %rax
+       subq    %rdi, %rax
+.L41:  ret
+.LfnE4:
+.size VG_(amd64_linux_REDIR_FOR_strlen), .-VG_(amd64_linux_REDIR_FOR_strlen)
+
+
+/* A CIE for the above three functions, followed by their FDEs */
        .section .eh_frame,"a",@progbits
 .Lframe1:
         .long   .LEcie1-.LScie1
@@ -206,6 +228,15 @@ VG_(amd64_linux_REDIR_FOR_vtime):
         .uleb128 0x0
         .align 8
 .LEfde3:
+.LSfde4:
+        .long   .LEfde4-.LASfde4
+.LASfde4:
+        .long   .LASfde4-.Lframe1
+        .long   .LfnB4
+        .long   .LfnE4-.LfnB4
+        .uleb128 0x0
+        .align 8
+.LEfde4:
        .previous
 
 .global VG_(trampoline_stuff_end)
index c8c652074448e4877b5546a261da8d56d2825ef4..31c591cb94913d212c4e6b52c12eeb5128a67fdb 100644 (file)
@@ -66,6 +66,7 @@ extern Char* VG_(x86_linux_REDIR_FOR_index) ( const Char*, Int );
 extern void VG_(amd64_linux_SUBST_FOR_rt_sigreturn);
 extern void VG_(amd64_linux_REDIR_FOR_vgettimeofday);
 extern void VG_(amd64_linux_REDIR_FOR_vtime);
+extern UInt VG_(amd64_linux_REDIR_FOR_strlen)( void* );
 #endif
 
 #if defined(VGP_ppc32_linux)