-- from: crucible-c/src/Report.hs {-# Language LambdaCase #-} {-# Language OverloadedStrings #-} module Crux.Report where import Data.Void (Void) import System.FilePath import System.Directory (createDirectoryIfMissing, canonicalizePath) import System.IO import qualified Data.Foldable as Fold import Data.Functor.Const import Data.List (partition) import Data.Maybe (fromMaybe) import qualified Data.Sequence as Seq import Data.Sequence (Seq) import qualified Data.Set as Set import qualified Data.Text as Text import Control.Exception (catch, SomeException(..)) import Control.Monad (forM_) import Prettyprinter (Doc) import qualified Data.Text.IO as T import Lang.Crucible.Simulator.SimError import Lang.Crucible.Backend import What4.ProgramLoc import What4.Expr (GroundValueWrapper) import Crux.Types import Crux.Config.Common import Crux.Loops import Crux.Model ( modelJS ) -- Note these should be data files. However, cabal-new build doesn't make it easy for the installation -- to find data files, so they are embedded as Text constants instead. import Crux.UI.JS import Crux.UI.Jquery (jquery) -- ui/jquery.min.js import Crux.UI.IndexHtml (indexHtml) -- ui/index.html generateReport :: CruxOptions -> CruxSimulationResult -> IO () generateReport opts res | outDir opts == "" || skipReport opts = return () | otherwise = do let xs = cruxSimResultGoals res goals = map snd $ Fold.toList xs referencedFiles = Set.toList (Set.fromList (inputFiles opts) <> foldMap provedGoalFiles goals) createDirectoryIfMissing True (outDir opts) maybeGenerateSource opts referencedFiles scs <- renderSideConds opts goals let contents = renderJS (jsList scs) -- Due to CORS restrictions, the only current way of statically loading local data -- is by including a