From 98774bffd21bdeb0e4f2903b8df9083fd93c243d Mon Sep 17 00:00:00 2001 From: Paul Floyd Date: Thu, 19 May 2022 22:40:03 +0200 Subject: [PATCH] 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) --- memcheck/tests/leak.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/memcheck/tests/leak.h b/memcheck/tests/leak.h index 9056cf097..79e3cd6ac 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