]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
x86 regtest: fix clobber lists in generated asm statements
authorGra??vydas Ignotas <notasas@gmail.com>
Fri, 9 Feb 2024 17:02:23 +0000 (19:02 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Fri, 9 Feb 2024 20:56:33 +0000 (21:56 +0100)
Must add result registers also, or else code like this is generated:

      asm(
         "fsave %3\n"
         "movl %2, %%eax\n"
         "cdq\n"
         "movl %%edx, %0\n"
         "movl %%eax, %1\n"
         "frstor %3\n"
         "cld\n"
         : "=m" (result0), "=m" (result1)
         : "m" (preset0), "m" (state[0])
         : "eax"
      );

This crashes on my machine because gcc places some pointer in %%edx.

none/tests/amd64/gen_insn_test.pl
none/tests/x86/gen_insn_test.pl

index a144ec4ea8ca9975effae37040dcc55efa19eaa4..aa3910462d121024b547dd07164dae6b81d2842d 100644 (file)
@@ -893,16 +893,20 @@ while (<>)
     print qq|$prefix\"m\" \(state[0]\)\n|;
 
     $prefix = "         : ";
+    my %clobber_added;
 
-    foreach my $arg (@presets, @args)
+    foreach my $arg (@presets, @results, @args)
     {
         if ($arg->{register} && $arg->{type} ne "st")
         {
             my $register = $arg->{register};
 
             $register =~ s/^(r[0-9]+)[bwd]$/$1/;
-            print qq|$prefix\"$register\"|;
-            $prefix = ", ";
+            if (!$clobber_added{$register}++)
+            {
+                print qq|$prefix\"$register\"|;
+                $prefix = ", ";
+            }
         }
     }
 
index c676ddc7318c11650de5bf1d7c5349b914434805..4e732797df71a8cbd5cd6b840964d56d63f47168 100644 (file)
@@ -859,12 +859,15 @@ while (<>)
     print qq|$prefix\"m\" \(state[0]\)\n|;
 
     $prefix = "         : ";
+    my %clobber_added;
 
-    foreach my $arg (@presets, @args)
+    foreach my $arg (@presets, @results, @args)
     {
-        if ($arg->{register} && $arg->{type} ne "st")
+        my $register = $arg->{register};
+
+        if ($register && $arg->{type} ne "st" && !$clobber_added{$register}++)
         {
-            print qq|$prefix\"$arg->{register}\"|;
+            print qq|$prefix\"$register\"|;
             $prefix = ", ";
         }
     }