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