diff --git a/cabal-testsuite/PackageTests/CmmSources/cabal.out b/cabal-testsuite/PackageTests/CmmSources/cabal.out new file mode 100644 index 00000000000..939ed0ad85a --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/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/CmmSources/cabal.project b/cabal-testsuite/PackageTests/CmmSources/cabal.project new file mode 100644 index 00000000000..e6fdbadb439 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/cabal.project @@ -0,0 +1 @@ +packages: . diff --git a/cabal-testsuite/PackageTests/CmmSources/cabal.test.hs b/cabal-testsuite/PackageTests/CmmSources/cabal.test.hs new file mode 100644 index 00000000000..0fa879eaedb --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/cabal.test.hs @@ -0,0 +1,6 @@ +import Test.Cabal.Prelude + +main = cabalTest $ do + res <- cabal' "v2-run" ["demo"] + assertOutputContains "= Post common block elimination =" res + assertOutputContains "In Box we have 0x" res diff --git a/cabal-testsuite/PackageTests/CmmSources/cbits/HeapPrim.cmm b/cabal-testsuite/PackageTests/CmmSources/cbits/HeapPrim.cmm new file mode 100644 index 00000000000..d4319291052 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/cbits/HeapPrim.cmm @@ -0,0 +1,6 @@ +#include "Cmm.h" + +aToMyWordzh (P_ clos) +{ + return (clos); +} diff --git a/cabal-testsuite/PackageTests/CmmSources/cmmexperiment.cabal b/cabal-testsuite/PackageTests/CmmSources/cmmexperiment.cabal new file mode 100644 index 00000000000..e63f206e6ff --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/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/CmmSources/demo/Main.hs b/cabal-testsuite/PackageTests/CmmSources/demo/Main.hs new file mode 100644 index 00000000000..5ffdc4dad1f --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/demo/Main.hs @@ -0,0 +1,2 @@ +module Main (main) where +import Demo (main) diff --git a/cabal-testsuite/PackageTests/CmmSources/setup.out b/cabal-testsuite/PackageTests/CmmSources/setup.out new file mode 100644 index 00000000000..3e73fcec3d9 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/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/CmmSources/setup.test.hs b/cabal-testsuite/PackageTests/CmmSources/setup.test.hs new file mode 100644 index 00000000000..d4e10bdcd28 --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/setup.test.hs @@ -0,0 +1,7 @@ +import Test.Cabal.Prelude + +main = setupTest $ do + skipIf =<< ghcVersionIs (< mkVersion [7,8]) + setup "configure" [] + res <- setup' "build" [] + assertOutputContains "= Post common block elimination =" res diff --git a/cabal-testsuite/PackageTests/CmmSources/src/Demo.hs b/cabal-testsuite/PackageTests/CmmSources/src/Demo.hs new file mode 100644 index 00000000000..ad44a3b650e --- /dev/null +++ b/cabal-testsuite/PackageTests/CmmSources/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