From 65a27683fabadc2d1a9ab1b0dbbdb4857d3a3640 Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Wed, 1 Feb 2017 14:48:53 +0100 Subject: Actually run the LLVM verifier; fix all problems --- main.hs | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'main.hs') diff --git a/main.hs b/main.hs index ad9627b..ca953a8 100644 --- a/main.hs +++ b/main.hs @@ -7,7 +7,9 @@ import System.Environment import System.Exit import qualified Data.ByteString as BS import qualified LLVM.General as General +import qualified LLVM.General.Analysis as General import qualified LLVM.General.Context as General +import qualified LLVM.General.PassManager as General import qualified LLVM.General.Target as General import Check @@ -58,14 +60,31 @@ main = do General.withContext $ \context -> do putStrLn "Calling withModuleFromAST:" assert $ General.withModuleFromAST context llvmMod $ \genmod -> do - putStrLn "Calling moduleLLVMAssembly:" - llvmasm <- General.moduleLLVMAssembly genmod - putStr llvmasm - putStrLn "" - assert $ General.withHostTargetMachine $ \machine -> do - General.getTargetMachineTriple machine >>= putStrLn + putStrLn "Calling withPassManager:" + General.withPassManager (General.defaultCuratedPassSetSpec {General.optLevel = Just 1}) $ \pm -> do + putStrLn "Calling moduleLLVMAssembly:" + llvmasm1 <- General.moduleLLVMAssembly genmod + putStr llvmasm1 putStrLn "" - assert (General.moduleTargetAssembly machine genmod) - >>= putStr - bs <- assert $ General.moduleObject machine genmod - BS.writeFile "output_gen.o" bs + + putStrLn "Calling verify:" + res <- runExceptT (General.verify genmod) + either die return res + + putStrLn "Calling runPassManager:" + modified <- General.runPassManager pm genmod + if modified + then putStrLn "Pass manager modified the module" + else putStrLn "Pass manager had no effect on the module" + + putStrLn "Calling moduleLLVMAssembly:" + llvmasm <- General.moduleLLVMAssembly genmod + putStr llvmasm + putStrLn "" + assert $ General.withHostTargetMachine $ \machine -> do + General.getTargetMachineTriple machine >>= putStrLn + putStrLn "" + assert (General.moduleTargetAssembly machine genmod) + >>= putStr + bs <- assert $ General.moduleObject machine genmod + BS.writeFile "output_gen.o" bs -- cgit v1.2.3-70-g09d2