Replace strlen on amd64-linux with a simple version that doesn't

generate false positives.

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


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10402
This commit is contained in:
Tom Hughes 2009-07-02 13:02:12 +00:00
parent 6a98bb7307
commit 3ddeb03e5b
3 changed files with 47 additions and 1 deletions

View 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[]

View 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)

View 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)