https://bugs.kde.org/show_bug.cgi?id=432801

--- Comment #8 from Eyal <eyals...@gmail.com> ---
Even vgdb isn't helping me.  Here's the code that I'm using:

#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
  struct sigaction act;
  if (sigaction(SIGTERM, 0, &act) == 1) {
    return 12;
  }
  if (sigaction(SIGTERM, 0, &act) == 1) {
    return 12;
  }

  char pattern[] = "0123456789";
    pattern[8] = 0;
    const unsigned long plen = strlen(pattern);
    size_t hp=0;
    for (size_t i = 0; i < plen; ++i)
        hp += pattern[i];
    volatile int j = 0;
    if (hp==j) {
      j++;
    }
    return 1;
}

If I switch the pattern[8] with pattern[9] then the output is nearly identical
but it fails a memcheck test in valgrind.

I used vgdb to step through the code and I'm seeing strange behavior.  In the
code, there are two instances of movq to an xmm register:

   0x00000000004011ff <+191>:   je     0x4012c8 <main+392>
   0x0000000000401205 <+197>:   mov    %rbx,%rdi
   0x0000000000401208 <+200>:   sub    %rsi,%rdi
   0x000000000040120b <+203>:   movq   %r8,%xmm0

and

   0x00000000004012c8 <+392>:   movq   %r8,%xmm0


Identical instructions.  Depending on the pattern[] line above, either the jump
is taken or not.  In either case, eventually there is a movq from register r8
into xmm0.

In the working case, I see that $r8 is successfully copied into $xmm0 and the
vbits are all cleared to 0, as it expected.  But in the broken case, the value
is not copied and the vbits are wrong, too!  It might just be wrong when
looking at the result in vgdb because the output is right in the end.

If someone can help me debug this, I'm willing to put in some time.

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to