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