Package: valgrind
Version: 1:3.5.0-3
Severity: normal


Running valgrind (memcheck) on my program compiled with g++-4.5, it
dies on an unrecognized instruction:

   $ valgrind ./m4test
   ==18514== Memcheck, a memory error detector
   ==18514== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
   ==18514== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for 
copyright info
   ==18514== Command: ./m4test
   ==18514== 
   vex amd64->IR: unhandled instruction bytes: 0x66 0xF 0x3A 0x21 0x42 0x1C
   ==18514== valgrind: Unrecognised instruction at address 0x4005b7.
   ==18514== Your program just tried to execute an instruction that Valgrind
   ==18514== did not recognise.  There are two possible reasons for this.
   ==18514== 1. Your program has a bug and erroneously jumped to a non-code
   ==18514==    location.  If you are running Memcheck and you just saw a
   ==18514==    warning about a bad jump, it's probably your program's fault.
   ==18514== 2. The instruction is legitimate but Valgrind doesn't handle it,
   ==18514==    i.e. it's Valgrind's fault.  If you think this is the case or
   ==18514==    you are not sure, please let us know and we'll try to fix it.
   ==18514== Either way, Valgrind will now raise a SIGILL signal which will
   ==18514== probably kill your program.
   ==18514== 
   ==18514== Process terminating with default action of signal 4 (SIGILL)
   ==18514==  Illegal opcode at address 0x4005B7
   ==18514==    at 0x4005B7: Matrix4::operator*(Matrix4 const&) const (in 
/tmp/m4test)
   ==18514==    by 0x40050B: main (in /tmp/m4test)
   ==18514== 
   ==18514== HEAP SUMMARY:
   ==18514==     in use at exit: 0 bytes in 0 blocks
   ==18514==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
   ==18514== 
   ==18514== All heap blocks were freed -- no leaks are possible
   ==18514== 
   ==18514== For counts of detected and suppressed errors, rerun with: -v
   ==18514== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
   Illegal instruction


However the instruction in question seems to be a valid SSE4.1
instruction, "insertps".  The program runs fine without valgrind.

[Note that I didn't actually enable the use of SSE4.1 explicitly -- I
just compiled with "-march=native", and that automatically did so.]

The processor is an Intel "core2 duo".  *** So to try the following test
you might need to be on a similar machine ***

The following is a small test program that causes g++-4.5 (version
"Debian 4.5-20100103-1") to generate the instruction.  To repeat:

  (0) Make sure you're on a machine that supports SSE4.1 instructions
  (1) Make sure g++-4.5 (from experimental) is installed
  (2) Compile the program with "make m4test"
  (3) Run valgrind on it: "valgrind m4test"
  (4) It should give the error output shown above

[Sorry I don't know if I can attach a tar file to a bug report, so I've
just put the files inline, with "===== FILENAME =====" before each file]


===== Makefile =====
CXX = g++-4.5
CXXFLAGS = -march=core2 -msse4.1 -O3 -ffast-math -fverbose-asm

m4test: m4test.o m4.o
        $(CXX) -o $@ $(CXXFLAGS) $^

===== m4test.cc =====
#include "m4.h"

int main ()
{
  Matrix4 x, y;
  x = x * y;
  return 0;
}

===== m4.h =====
class Matrix4
{
public:

  Matrix4 ();

  float &operator() (unsigned i, unsigned j) { return els[i][j]; }
  const float &operator() (unsigned i, unsigned j) const { return els[i][j]; }

  Matrix4 operator* (const Matrix4 &xform) const;

private:

  float els[4][4];
};

===== m4.cc =====
#include "m4.h"

Matrix4::Matrix4 ()
{
  els[0][0] = 1; els[0][1] = 0; els[0][2] = 0; els[0][3] = 0;
  els[1][0] = 0; els[1][1] = 1; els[1][2] = 0; els[1][3] = 0;
  els[2][0] = 0; els[2][1] = 0; els[2][2] = 1; els[2][3] = 0;
  els[3][0] = 0; els[3][1] = 0; els[3][2] = 0; els[3][3] = 1;
}

Matrix4
Matrix4::operator* (const Matrix4 &xform) const
{
  Matrix4 result;
  for (unsigned i = 0; i < 4; i++)
    for (unsigned j = 0; j < 4; j++)
      result(i, j)
        = (*this) (i, 0) * xform (0, j)
        + (*this) (i, 1) * xform (1, j)
        + (*this) (i, 2) * xform (2, j)
        + (*this) (i, 3) * xform (3, j);
  return result;
}

===== END =====


Thanks,

-Miles


-- System Information:
Debian Release: squeeze/sid
  APT prefers oldstable
  APT policy: (500, 'oldstable'), (500, 'unstable'), (500, 'testing'), (500, 
'stable'), (50, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.33-2-amd64 (SMP w/2 CPU cores)
Locale: LANG=ja_JP.UTF-8, LC_CTYPE=ja_JP.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages valgrind depends on:
ii  libc6                         2.10.2-6   Embedded GNU C Library: Shared lib
ii  libc6-dbg                     2.10.2-6   Embedded GNU C Library: detached d

Versions of packages valgrind recommends:
ii  gdb                           7.1-1      The GNU Debugger

Versions of packages valgrind suggests:
pn  alleyoop                      <none>     (no description available)
pn  kcachegrind                   <none>     (no description available)
pn  valkyrie                      <none>     (no description available)

-- debconf-show failed



-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to