From: Paul Floyd Date: Thu, 19 May 2022 20:40:03 +0000 (+0200) Subject: Clobber ecx for clang x86 leak tests X-Git-Tag: VALGRIND_3_20_0~72 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98774bffd21bdeb0e4f2903b8df9083fd93c243d;p=thirdparty%2Fvalgrind.git Clobber ecx for clang x86 leak tests The assembler for leak-cases.c on x86 with clang for f() ends with 40198b: c7 04 24 00 00 00 00 movl $0x0,(%esp) 401992: e8 c9 fe ff ff call 401860 401997: 89 04 24 mov %eax,(%esp) 40199a: e8 c1 fe ff ff call 401860 40199f: a3 74 40 40 00 mov %eax,0x404074 4019a4: a1 74 40 40 00 mov 0x404074,%eax 4019a9: 8b 08 mov (%eax),%ecx 4019ab: 83 c1 08 add $0x8,%ecx 4019ae: 89 08 mov %ecx,(%eax) 4019b0: c7 05 74 40 40 00 00 movl $0x0,0x404074 4019b7: 00 00 00 4019ba: 83 c4 04 add $0x4,%esp 4019bd: 5d pop %ebp 4019be: c3 ret If I've read that correctly, at the enc ECX contains the pointer to allocated memory returned by mk() plus 8. main() doesn't clobber ECX either, so this shows up in the leak checks. Clobbering ECX fixes the following testcases on FreeBSD 13.1 x86 with clang 13 < gdbserver_tests/mcblocklistsearch (stderrB) < memcheck/tests/leak-cases-full (stderr) < memcheck/tests/leak-cases-summary (stderr) < memcheck/tests/leak-cycle (stderr) < memcheck/tests/leak-tree (stderr) < memcheck/tests/lks (stderr) --- diff --git a/memcheck/tests/leak.h b/memcheck/tests/leak.h index 9056cf0971..79e3cd6ac7 100644 --- a/memcheck/tests/leak.h +++ b/memcheck/tests/leak.h @@ -143,6 +143,11 @@ "$8", "$9", "$10", "$11", "$12", "$13", \ "$14", "$15", "$24", "$25", "$31"); \ } while (0) +#elif defined (__clang__) && defined(VGA_x86) +#define CLEAR_CALLER_SAVED_REGS \ + do { \ + __asm__ __volatile__ ("movl $0, %ecx\n\t"); \ + } while (0) #else #define CLEAR_CALLER_SAVED_REGS /*nothing*/ #endif