mirror of
https://github.com/anoma/juvix.git
synced 2024-12-15 10:03:22 +03:00
f2298bd674
An implementation of the translation from JuvixCore to JuvixAsm. After merging this PR, the only remaining step to complete the basic compilation pipeline (#1556) is the compilation of complex pattern matching (#1531). * Fixes several bugs in lambda-lifting. * Fixes several bugs in the RemoveTypeArgs transformation. * Fixes several bugs in the TopEtaExpand transformation. * Adds the ConvertBuiltinTypes transformation which converts the builtin bool inductive type to Core primitive bool. * Adds the `juvix dev core strip` command. * Adds the `juvix dev core asm` command. * Adds the `juvix dev core compile` command. * Adds two groups of tests: - JuvixCore to JuvixAsm translation: translate JuvixCore tests to JuvixAsm and run the results with the JuvixAsm interpreter, - JuvixCore compilation: compile JuvixCore tests to native code and WASM and execute the results. * Closes #1520 * Closes #1549
36 lines
1.4 KiB
Haskell
36 lines
1.4 KiB
Haskell
module Asm.Compile.Base where
|
|
|
|
import Base
|
|
import Data.Text.IO qualified as TIO
|
|
import Juvix.Compiler.Asm.Data.InfoTable
|
|
import Juvix.Compiler.Asm.Options
|
|
import Juvix.Compiler.Asm.Translation.FromSource
|
|
import Juvix.Compiler.Backend qualified as Backend
|
|
import Juvix.Compiler.Backend.C qualified as C
|
|
import Juvix.Compiler.Pipeline qualified as Pipeline
|
|
import Runtime.Base qualified as Runtime
|
|
|
|
asmCompileAssertion' :: InfoTable -> Path Abs File -> Path Abs File -> (String -> IO ()) -> Assertion
|
|
asmCompileAssertion' tab mainFile expectedFile step = do
|
|
step "Generate C code"
|
|
case run $ runError @JuvixError $ Pipeline.asmToMiniC asmOpts tab of
|
|
Left {} -> assertFailure "code generation failed"
|
|
Right C.MiniCResult {..} ->
|
|
withTempDir'
|
|
( \dirPath -> do
|
|
let cFile = dirPath <//> replaceExtension' ".c" (filename mainFile)
|
|
TIO.writeFile (toFilePath cFile) _resultCCode
|
|
Runtime.clangAssertion cFile expectedFile "" step
|
|
)
|
|
where
|
|
asmOpts :: Options
|
|
asmOpts = makeOptions Backend.TargetCNative64 True
|
|
|
|
asmCompileAssertion :: Path Abs File -> Path Abs File -> (String -> IO ()) -> Assertion
|
|
asmCompileAssertion mainFile expectedFile step = do
|
|
step "Parse"
|
|
s <- readFile (toFilePath mainFile)
|
|
case runParser (toFilePath mainFile) s of
|
|
Left err -> assertFailure (show err)
|
|
Right tab -> asmCompileAssertion' tab mainFile expectedFile step
|