| /* |
| |
| 2006-05-21: vex r1619 finally causes the x86->IR front end to state |
| exactly the %eflags dataflow surrounding 'cmpb $0, ... ; js ..' |
| and so memcheck no longer gives a false positive on this test. |
| |
| ----------- |
| |
| (original comments) |
| Assembly derived from the following program compiled with -O2. |
| This fools Valgrind, causing it to give a false error. |
| |
| #include <stdio.h> |
| |
| struct Foo |
| { |
| int a1 : 1; |
| int a2 : 1; |
| int a3 : 1; |
| int a4 : 1; |
| int a5 : 1; |
| int a6 : 1; |
| int a7 : 1; |
| int bleh : 1; |
| }; |
| |
| struct Foo* foo; |
| |
| void set() |
| { |
| foo->bleh = 1; |
| } |
| |
| void get() |
| { |
| if ( foo->bleh == 0 ) |
| printf( "blieb\n" ); |
| } |
| |
| int main() |
| { |
| foo = malloc(sizeof(struct Foo)); |
| set(); |
| |
| get(); |
| |
| return 0; |
| } |
| |
| */ |
| |
| #include "tests/asm.h" |
| |
| .file "tronical.c" |
| .version "01.01" |
| gcc2_compiled.: |
| .text |
| .align 4 |
| .globl set |
| set: |
| pushl %ebp |
| movl foo, %eax |
| orb $128, (%eax) |
| movl %esp, %ebp |
| popl %ebp |
| ret |
| .Lfe1: |
| .LC0: |
| .ascii "blieb\n" |
| .text |
| .align 4 |
| .globl get |
| get: |
| pushl %ebp |
| movl %esp, %ebp |
| subl $8, %esp |
| movl foo, %eax |
| cmpb $0, (%eax) |
| js .L4 |
| subl $12, %esp |
| pushl $.LC0 |
| call VG_SYM_ASM(printf) |
| addl $16, %esp |
| .L4: |
| leave |
| ret |
| .Lfe2: |
| .align 4 |
| .globl VG_SYM_ASM(main) |
| VG_SYM_ASM(main): |
| pushl %ebp |
| movl %esp, %ebp |
| subl $20, %esp |
| pushl $4 |
| call VG_SYM_ASM(malloc) |
| movl %eax, foo |
| call set |
| call get |
| xorl %eax, %eax |
| leave |
| ret |
| .Lfe3: |
| .comm foo,4,4 |
| .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)" |