From: Tom H. <th...@cy...> - 2004-03-28 11:26:34
|
CVS commit by thughes: For FPU/MMX/SSE instructions which don't reference any memory, make memcheck look at whether the eflags are read or written and generate UCode to validate and/or mark as valid the eflags when necessary. CCMAIL: 785...@bu... A tests/fpeflags.c 1.1 [no copyright] A tests/fpeflags.stderr.exp 1.1 A tests/fpeflags.vgtest 1.1 M +18 -4 mc_translate.c 1.38 M +1 -0 tests/.cvsignore 1.11 M +5 -1 tests/Makefile.am 1.35 --- valgrind/memcheck/mc_translate.c #1.37:1.38 @@ -1179,9 +1179,23 @@ static UCodeBlock* memcheck_instrument ( } - /* For FPU, MMX and SSE insns not referencing memory, just - copy thru. */ + /* For MMX and SSE insns not referencing memory, just + make sure the eflags are defined if the instruction + read them, and make them defined it it writes them. */ case SSE5: case SSE4: case SSE3: case MMX1: case MMX2: case MMX3: case FPU: + if (u_in->flags_r != FlagsEmpty) { + qt = create_GETVF(cb, 0); + uInstr1(cb, TESTV, 0, TempReg, qt); + /* qt should never be referred to again. Nevertheless + ... */ + uInstr1(cb, SETV, 0, TempReg, qt); + } + if (u_in->flags_w != FlagsEmpty) { + qd = newTemp(cb); + uInstr2(cb, MOV, 4, Literal, 0, TempReg, qd); + uLiteral(cb, qd); + create_PUTVF(cb, 0, qd); + } VG_(copy_UInstr)(cb, u_in); break; --- valgrind/memcheck/tests/.cvsignore #1.10:1.11 @@ -17,4 +17,5 @@ filter_leak_check_size filter_stderr +fpeflags fprw fwrite --- valgrind/memcheck/tests/Makefile.am #1.34:1.35 @@ -28,4 +28,5 @@ exitprog.stderr.exp exitprog.vgtest \ execve.stderr.exp execve.vgtest \ + fpeflags.stderr.exp fpeflags.vgtest \ fprw.stderr.exp fprw.vgtest \ fwrite.stderr.exp fwrite.stdout.exp fwrite.vgtest \ @@ -76,5 +77,5 @@ clientperm custom_alloc \ doublefree error_counts errs1 exitprog execve \ - fprw fwrite inits inline \ + fpeflags fprw fwrite inits inline \ malloc1 malloc2 malloc3 manuel1 manuel2 manuel3 \ memalign_test memcmptest mmaptest nanoleak new_nothrow null_socket \ @@ -103,4 +104,5 @@ execve_SOURCES = execve.c exitprog_SOURCES = exitprog.c +fpeflags_SOURCES = fpeflags.c fprw_SOURCES = fprw.c fwrite_SOURCES = fwrite.c @@ -142,2 +144,4 @@ new_override_SOURCES = new_override.cpp +# must be built with these flags -- bug only occurred with them +fpeflags.o: CFLAGS += -march=i686 |