testsuite: Add test for #16514
authorBen Gamari <ben@smart-cactus.org>
Tue, 2 Apr 2019 15:59:06 +0000 (11:59 -0400)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sun, 9 Jun 2019 22:41:38 +0000 (18:41 -0400)
testsuite/tests/rts/T16514.hs [new file with mode: 0644]
testsuite/tests/rts/T16514.stdout [new file with mode: 0644]
testsuite/tests/rts/T16514_c.cpp [new file with mode: 0644]
testsuite/tests/rts/all.T

diff --git a/testsuite/tests/rts/T16514.hs b/testsuite/tests/rts/T16514.hs
new file mode 100644 (file)
index 0000000..12e0d36
--- /dev/null
@@ -0,0 +1,18 @@
+-- ensure that the XMM register values are properly preserved across STG
+-- exit/entry. Note that this is very sensitive to code generation.
+
+module Main where
+
+import Control.Monad (when)
+import System.Exit (exitWith, ExitCode(..))
+
+foreign export ccall fn_hs :: IO ()
+
+fn_hs :: IO ()
+fn_hs = return ()
+
+foreign import ccall test  :: IO Int
+
+main :: IO ()
+main = do res <- test
+          when (res /= 0) (exitWith $ ExitFailure res)
diff --git a/testsuite/tests/rts/T16514.stdout b/testsuite/tests/rts/T16514.stdout
new file mode 100644 (file)
index 0000000..6b58280
--- /dev/null
@@ -0,0 +1,4 @@
+1.414210 1.732050 2.236070 2.828430 3.605550 4.582580
+1.414210 1.732050 2.236070 2.828430 3.605550 4.582580
+1.414210 1.732050 2.236070 2.828430 3.605550 4.582580
+
diff --git a/testsuite/tests/rts/T16514_c.cpp b/testsuite/tests/rts/T16514_c.cpp
new file mode 100644 (file)
index 0000000..1474741
--- /dev/null
@@ -0,0 +1,45 @@
+#include <iostream>
+#include <stdexcept>
+
+extern "C" {
+
+void fn_hs();
+void fn() {
+    fn_hs();
+}
+
+void check(double sqrt2, double sqrt3,  double sqrt5,
+           double sqrt8, double sqrt13, double sqrt21) {
+    std::cout << std::fixed << sqrt2 << " " << sqrt3 << " " << sqrt5 << " "
+              << sqrt8 << " " << sqrt13 << " " << sqrt21 << std::endl;
+    if (sqrt2 != 1.41421 || sqrt3  != 1.73205 || sqrt5  != 2.23607 ||
+        sqrt8 != 2.82843 || sqrt13 != 3.60555 || sqrt21 != 4.58258) {
+        throw std::runtime_error("xmm registers have been scratched");
+    }
+}
+
+int test() {
+    try {
+        double sqrt2  = 1.41421;
+        double sqrt3  = 1.73205;
+        double sqrt5  = 2.23607;
+        double sqrt8  = 2.82843;
+        double sqrt13 = 3.60555;
+        double sqrt21 = 4.58258;
+        check(sqrt2, sqrt3, sqrt5, sqrt8, sqrt13, sqrt21);
+        fn();
+        check(sqrt2, sqrt3, sqrt5, sqrt8, sqrt13, sqrt21);
+        try {
+            fn();
+        } catch (const std::exception &) {
+        }
+        check(sqrt2, sqrt3, sqrt5, sqrt8, sqrt13, sqrt21);
+    } catch (const std::exception &e) {
+        std::cerr << e.what() << std::endl;
+        return 1;
+    }
+    return 0;
+}
+
+} // extern "C"
+
index 86f79c2..bf0b48a 100644 (file)
@@ -390,3 +390,4 @@ test('keep-cafs',
   ],
   makefile_test, ['KeepCafs'])
 
+test('T16514', unless(opsys('mingw32'), skip), compile_and_run, ['T16514_c.cpp -lstdc++'])