From 8badf641ce592ed10c0a807dc61e618db0375d82 Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Thu, 26 Nov 2020 17:41:08 -0500 Subject: [PATCH] testsuite: Add test for dynamic linking of cmm-sources objects Essentially just copying the existing CmmSources test but building with `--enable-executable-dynamic` --- .../PackageTests/CmmSourcesDyn/cabal.out | 13 +++++++ .../PackageTests/CmmSourcesDyn/cabal.project | 2 + .../PackageTests/CmmSourcesDyn/cabal.test.hs | 7 ++++ .../CmmSourcesDyn/cbits/HeapPrim.cmm | 6 +++ .../CmmSourcesDyn/cmmexperiment.cabal | 27 ++++++++++++++ .../PackageTests/CmmSourcesDyn/demo/Main.hs | 2 + .../PackageTests/CmmSourcesDyn/setup.out | 7 ++++ .../PackageTests/CmmSourcesDyn/setup.test.hs | 7 ++++ .../PackageTests/CmmSourcesDyn/src/Demo.hs | 37 +++++++++++++++++++ 9 files changed, 108 insertions(+) create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.out create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.project create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.test.hs create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/cbits/HeapPrim.cmm create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/cmmexperiment.cabal create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/demo/Main.hs create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/setup.out create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/setup.test.hs create mode 100644 cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.out b/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.out new file mode 100644 index 00000000000..939ed0ad85a --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.out @@ -0,0 +1,13 @@ +# cabal v2-run +Resolving dependencies... +Build profile: -w ghc- -O1 +In order, the following will be built: + - cmmexperiment-0 (lib) (first run) + - cmmexperiment-0 (exe:demo) (first run) +Configuring library for cmmexperiment-0.. +Preprocessing library for cmmexperiment-0.. +Building library for cmmexperiment-0.. +Configuring executable 'demo' for cmmexperiment-0.. +Warning: The package has an extraneous version range for a dependency on an internal library: cmmexperiment >=0 && ==0. This version range includes the current package but isn't needed as the current package's library will always be used. +Preprocessing executable 'demo' for cmmexperiment-0.. +Building executable 'demo' for cmmexperiment-0.. diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.project b/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.project new file mode 100644 index 00000000000..cd67a3fd3d2 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.project @@ -0,0 +1,2 @@ +packages: . +executable-dynamic: True diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.test.hs b/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.test.hs new file mode 100644 index 00000000000..ee8aa155ac2 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/cabal.test.hs @@ -0,0 +1,7 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + skipIfWindows + res <- cabal' "v2-run" ["demo"] + assertOutputContains "= Post common block elimination =" res + assertOutputContains "In Box we have 0x" res diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cbits/HeapPrim.cmm b/cabal-testsuite/PackageTests/CmmSourcesDyn/cbits/HeapPrim.cmm new file mode 100644 index 00000000000..d4319291052 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/cbits/HeapPrim.cmm @@ -0,0 +1,6 @@ +#include "Cmm.h" + +aToMyWordzh (P_ clos) +{ + return (clos); +} diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/cmmexperiment.cabal b/cabal-testsuite/PackageTests/CmmSourcesDyn/cmmexperiment.cabal new file mode 100644 index 00000000000..e63f206e6ff --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/cmmexperiment.cabal @@ -0,0 +1,27 @@ +cabal-version: 3.0 +name: cmmexperiment +version: 0 +build-type: Simple + +-- This code is extracted form ghc-heap +-- Copyright (c) 2012-2013, Joachim Breitner +-- (and probably -2020 GHC Team) +-- Under BSD-3-Clause + +library + default-language: Haskell2010 + hs-source-dirs: src + build-depends: base + exposed-modules: Demo + + cmm-sources: cbits/HeapPrim.cmm + if impl(ghc >=8.2) + cmm-options: -ddump-cmm-verbose + else + cmm-options: -ddump-cmm + +executable demo + default-language: Haskell2010 + main-is: Main.hs + hs-source-dirs: demo + build-depends: base, cmmexperiment diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/demo/Main.hs b/cabal-testsuite/PackageTests/CmmSourcesDyn/demo/Main.hs new file mode 100644 index 00000000000..5ffdc4dad1f --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/demo/Main.hs @@ -0,0 +1,2 @@ +module Main (main) where +import Demo (main) diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.out b/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.out new file mode 100644 index 00000000000..3e73fcec3d9 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.out @@ -0,0 +1,7 @@ +# Setup configure +Configuring cmmexperiment-0... +# Setup build +Preprocessing library for cmmexperiment-0.. +Building library for cmmexperiment-0.. +Preprocessing executable 'demo' for cmmexperiment-0.. +Building executable 'demo' for cmmexperiment-0.. diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.test.hs b/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.test.hs new file mode 100644 index 00000000000..072977fdee3 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/setup.test.hs @@ -0,0 +1,7 @@ +import Test.Cabal.Prelude + +main = setupTest $ do + skipIf "ghc < 7.8" =<< ghcVersionIs (< mkVersion [7,8]) + setup "configure" [] + res <- setup' "build" [] + assertOutputContains "= Post common block elimination =" res diff --git a/cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs b/cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs new file mode 100644 index 00000000000..ad44a3b650e --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSourcesDyn/src/Demo.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE ForeignFunctionInterface #-} +{-# LANGUAGE GHCForeignImportPrim #-} +{-# LANGUAGE MagicHash #-} +{-# LANGUAGE UnliftedFFITypes #-} +module Demo (main) where + +#include "MachDeps.h" + +import Data.Bits +import GHC.Exts +import Numeric (showHex) + +foreign import prim "aToMyWordzh" aToWord# :: Any -> Word# + +tAG_MASK :: Int +tAG_MASK = (1 `shift` TAG_BITS) - 1 + +data Box = Box Any + +instance Show Box where + showsPrec _ (Box a) rs = + -- unsafePerformIO (print "↓" >> pClosure a) `seq` + pad_out (showHex addr "") ++ (if tag>0 then "/" ++ show tag else "") ++ rs + where + ptr = W# (aToWord# a) + tag = ptr .&. fromIntegral tAG_MASK -- ((1 `shiftL` TAG_BITS) -1) + addr = ptr - tag + pad_out ls = '0':'x':ls + +asBox :: a -> Box +asBox x = Box (unsafeCoerce# x) + +main :: IO () +main = do + let box = asBox "foobar" + putStrLn $ "In Box we have " ++ show box