1e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/* 2e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 342a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj2006-05-21: vex r1619 finally causes the x86->IR front end to state 442a32a22874037bb1e4e468a2b71ab6d72722d4bsewardjexactly the %eflags dataflow surrounding 'cmpb $0, ... ; js ..' 542a32a22874037bb1e4e468a2b71ab6d72722d4bsewardjand so memcheck no longer gives a false positive on this test. 642a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj 742a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj----------- 842a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj 942a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj(original comments) 10e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnAssembly derived from the following program compiled with -O2. 11e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnThis fools Valgrind, causing it to give a false error. 12e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 13e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#include <stdio.h> 14e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 15e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnstruct Foo 16e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 17e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a1 : 1; 18e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a2 : 1; 19e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a3 : 1; 20e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a4 : 1; 21e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a5 : 1; 22e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a6 : 1; 23e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int a7 : 1; 24e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn int bleh : 1; 25e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn}; 26e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 27e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnstruct Foo* foo; 28e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 29e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnvoid set() 30e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 31e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn foo->bleh = 1; 32e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 33e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 34e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnvoid get() 35e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 36e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn if ( foo->bleh == 0 ) 37e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn printf( "blieb\n" ); 38e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 39e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 40e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnint main() 41e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{ 42e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn foo = malloc(sizeof(struct Foo)); 43e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn set(); 44e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 45e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn get(); 46e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 47e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn return 0; 48e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn} 49e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 50e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn*/ 51e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn 52b9acfbed9322db02f0a5d6171326390c730a6bd8njn#include "tests/asm.h" 53b9acfbed9322db02f0a5d6171326390c730a6bd8njn 54e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .file "tronical.c" 55c4fe430c41766b18dae84cea8bc8f9b8b01e378csewardj#if defined(VGO_linux) 56e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .version "01.01" 57c4fe430c41766b18dae84cea8bc8f9b8b01e378csewardj#endif 58e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjngcc2_compiled.: 59e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.text 60e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .align 4 61e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.globl set 62e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnset: 63e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn pushl %ebp 64e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn movl foo, %eax 65e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn orb $128, (%eax) 66e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn movl %esp, %ebp 67e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn popl %ebp 68e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn ret 69e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.Lfe1: 70e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.LC0: 71b9acfbed9322db02f0a5d6171326390c730a6bd8njn .ascii "blieb\n" 72e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.text 73e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .align 4 74e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.globl get 75e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnget: 76e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn pushl %ebp 77e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn movl %esp, %ebp 78e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn subl $8, %esp 79e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn movl foo, %eax 80e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn cmpb $0, (%eax) 81e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn js .L4 82e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn subl $12, %esp 83e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn pushl $.LC0 84b9acfbed9322db02f0a5d6171326390c730a6bd8njn call VG_SYM_ASM(printf) 85e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn addl $16, %esp 86e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.L4: 87e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn leave 88e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn ret 89e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.Lfe2: 90e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .align 4 91b9acfbed9322db02f0a5d6171326390c730a6bd8njn.globl VG_SYM_ASM(main) 92b9acfbed9322db02f0a5d6171326390c730a6bd8njnVG_SYM_ASM(main): 93e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn pushl %ebp 94e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn movl %esp, %ebp 95e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn subl $20, %esp 96e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn pushl $4 97b9acfbed9322db02f0a5d6171326390c730a6bd8njn call VG_SYM_ASM(malloc) 98e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn movl %eax, foo 99e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn call set 100e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn call get 101e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn xorl %eax, %eax 102e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn leave 103e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn ret 104e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.Lfe3: 105e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .comm foo,4,4 106e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)" 107