From 1e6822913b7e4b636a504445d4587b4d6a7a6cd3 Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Mon, 26 Jun 2023 17:10:40 -0400 Subject: [PATCH] Prototype mir_verify command This implements just enough scaffolding to support the basics of a `mir_verify` command and related scaffolding, which is one of the main goals of #1859. When I say "basic", I really do mean that: there are quite a few things that do not work currently. These include: * `mir_alloc`/`mir_points_to` do not work yet. * Overrides (unsafe or otherwise) do not work yet. * There is no way to declare variables with `struct` or `enum` types. * Likely other things. These limitations notwithstanding, it is now possible to write MIR specifications for very simple functions such as the ones in the `test_mir_verify_basic` integration test. I will be adding additional capabilities in subsequent patches. Most of the code in this patch is not terribly exciting, as lots of it is cargo-culted from the LLVM and JVM backends. Ideally, we would find a way to deduplicate a lot more of this code, but this will not be straightforward without substantial refactoring in SAW. See #379. In addition to the code itself, I have also expanded the SAW manual to mention the variety of new MIR-related commands added in this patch. Of particular interest is that `mir_verify` allows you to specify function identifiers in multiple ways, which is provided as a convenience to SAW users. See the manual for more details. Checks off several boxes in #1859. --- CHANGES.md | 6 +- crucible-mir-comp/crucible-mir-comp.cabal | 1 - .../src/Mir/Compositional/Builder.hs | 5 +- .../src/Mir/Compositional/Clobber.hs | 4 +- .../src/Mir/Compositional/Convert.hs | 197 +-- .../src/Mir/Compositional/MethodSpec.hs | 79 -- .../src/Mir/Compositional/Override.hs | 26 +- crux-mir-comp/crux-mir-comp.cabal | 1 + crux-mir-comp/src/Mir/Cryptol.hs | 2 + doc/manual/manual.md | 170 ++- doc/manual/manual.pdf | Bin 554079 -> 513753 bytes intTests/test_mir_load_module/Makefile | 3 +- intTests/test_mir_verify_basic/Makefile | 9 + .../test.linked-mir.json | 1 + intTests/test_mir_verify_basic/test.rs | 51 + intTests/test_mir_verify_basic/test.saw | 87 ++ intTests/test_mir_verify_basic/test.sh | 3 + intTests/test_mir_verify_conds/Makefile | 9 + .../test.linked-mir.json | 1 + intTests/test_mir_verify_conds/test.rs | 3 + intTests/test_mir_verify_conds/test.saw | 56 + intTests/test_mir_verify_conds/test.sh | 3 + intTests/test_mir_verify_pop_count/Makefile | 9 + .../test.linked-mir.json | 1 + intTests/test_mir_verify_pop_count/test.rs | 9 + intTests/test_mir_verify_pop_count/test.saw | 19 + intTests/test_mir_verify_pop_count/test.sh | 3 + saw-remote-api/docs/SAW.rst | 89 +- saw-remote-api/python/saw_client/__init__.py | 132 +- saw-remote-api/python/saw_client/commands.py | 57 + .../python/saw_client/connection.py | 39 + saw-remote-api/python/saw_client/crucible.py | 17 +- saw-remote-api/python/saw_client/mir.py | 42 + saw-remote-api/python/saw_client/mir_type.py | 100 ++ .../python/tests/saw/test-files/Makefile | 11 +- .../saw/test-files/basic_mir.linked-mir.json | 1 + .../python/tests/saw/test-files/basic_mir.rs | 3 + .../python/tests/saw/test_basic_mir.py | 32 + saw-remote-api/saw-remote-api.cabal | 2 + saw-remote-api/saw-remote-api/Main.hs | 11 + saw-remote-api/src/SAWServer.hs | 17 +- saw-remote-api/src/SAWServer/Data/MIRType.hs | 89 ++ saw-remote-api/src/SAWServer/Exceptions.hs | 12 + .../src/SAWServer/MIRCrucibleSetup.hs | 152 ++- saw-remote-api/src/SAWServer/MIRVerify.hs | 80 ++ saw-script.cabal | 5 + src/SAWScript/AST.hs | 9 +- src/SAWScript/Crucible/Common/MethodSpec.hs | 4 + src/SAWScript/Crucible/Common/Override.hs | 25 +- .../Crucible/Common/ResolveSetupValue.hs | 32 + src/SAWScript/Crucible/JVM/Override.hs | 30 +- .../Crucible/JVM/ResolveSetupValue.hs | 16 +- src/SAWScript/Crucible/LLVM/Override.hs | 39 +- src/SAWScript/Crucible/MIR/Builtins.hs | 1143 ++++++++++++++++- src/SAWScript/Crucible/MIR/MethodSpecIR.hs | 162 +++ src/SAWScript/Crucible/MIR/Override.hs | 503 ++++++++ .../Crucible/MIR/ResolveSetupValue.hs | 397 ++++++ src/SAWScript/Crucible/MIR/TypeShape.hs | 274 ++++ src/SAWScript/Interpreter.hs | 202 +++ src/SAWScript/Lexer.x | 4 +- src/SAWScript/Parser.y | 4 + src/SAWScript/Value.hs | 53 + 62 files changed, 4121 insertions(+), 425 deletions(-) delete mode 100644 crucible-mir-comp/src/Mir/Compositional/MethodSpec.hs create mode 100644 intTests/test_mir_verify_basic/Makefile create mode 100644 intTests/test_mir_verify_basic/test.linked-mir.json create mode 100644 intTests/test_mir_verify_basic/test.rs create mode 100644 intTests/test_mir_verify_basic/test.saw create mode 100755 intTests/test_mir_verify_basic/test.sh create mode 100644 intTests/test_mir_verify_conds/Makefile create mode 100644 intTests/test_mir_verify_conds/test.linked-mir.json create mode 100644 intTests/test_mir_verify_conds/test.rs create mode 100644 intTests/test_mir_verify_conds/test.saw create mode 100755 intTests/test_mir_verify_conds/test.sh create mode 100644 intTests/test_mir_verify_pop_count/Makefile create mode 100644 intTests/test_mir_verify_pop_count/test.linked-mir.json create mode 100644 intTests/test_mir_verify_pop_count/test.rs create mode 100644 intTests/test_mir_verify_pop_count/test.saw create mode 100755 intTests/test_mir_verify_pop_count/test.sh create mode 100644 saw-remote-api/python/saw_client/mir.py create mode 100644 saw-remote-api/python/saw_client/mir_type.py create mode 100644 saw-remote-api/python/tests/saw/test-files/basic_mir.linked-mir.json create mode 100644 saw-remote-api/python/tests/saw/test-files/basic_mir.rs create mode 100644 saw-remote-api/python/tests/saw/test_basic_mir.py create mode 100644 saw-remote-api/src/SAWServer/Data/MIRType.hs create mode 100644 saw-remote-api/src/SAWServer/MIRVerify.hs create mode 100644 src/SAWScript/Crucible/Common/ResolveSetupValue.hs create mode 100644 src/SAWScript/Crucible/MIR/MethodSpecIR.hs create mode 100644 src/SAWScript/Crucible/MIR/Override.hs create mode 100644 src/SAWScript/Crucible/MIR/ResolveSetupValue.hs create mode 100644 src/SAWScript/Crucible/MIR/TypeShape.hs diff --git a/CHANGES.md b/CHANGES.md index c31d0bebd2..2fe5edfaf6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,11 @@ -# Nightly +# Nightly -- ????-??-?? ## New Features * SAW now supports loading and reasoning about Cryptol declarations that make use of numeric constraint guards. For more information on numeric constraint guards, see the [relavent section of the Cryptol reference manual](https://galoisinc.github.io/cryptol/master/BasicSyntax.html#numeric-constraint-guards). +* Add an experimental `mir_verify` command, along with related utilities for + constructing specifications for MIR/Rust programs. For more information, see + the `mir_*` commands documented in the [SAW + manual](https://github.com/GaloisInc/saw-script/blob/master/doc/manual/manual.md). # Version 1.0 -- 2023-06-26 diff --git a/crucible-mir-comp/crucible-mir-comp.cabal b/crucible-mir-comp/crucible-mir-comp.cabal index 6e4220cce1..5883a68623 100644 --- a/crucible-mir-comp/crucible-mir-comp.cabal +++ b/crucible-mir-comp/crucible-mir-comp.cabal @@ -41,7 +41,6 @@ library exposed-modules: Mir.Compositional.Builder Mir.Compositional.Clobber Mir.Compositional.Convert - Mir.Compositional.MethodSpec Mir.Compositional.Override ghc-options: -Wall -Wno-name-shadowing diff --git a/crucible-mir-comp/src/Mir/Compositional/Builder.hs b/crucible-mir-comp/src/Mir/Compositional/Builder.hs index cd3ab2ec70..8c13af7bed 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Builder.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Builder.hs @@ -52,6 +52,8 @@ import qualified Verifier.SAW.Simulator.What4.ReturnTrip as SAW import qualified Verifier.SAW.TypedTerm as SAW import qualified SAWScript.Crucible.Common.MethodSpec as MS +import SAWScript.Crucible.MIR.MethodSpecIR +import SAWScript.Crucible.MIR.TypeShape import Mir.DefId import Mir.Generator (CollectionState, collection) @@ -61,7 +63,6 @@ import qualified Mir.Mir as M import Mir.Compositional.Clobber import Mir.Compositional.Convert -import Mir.Compositional.MethodSpec import Mir.Compositional.Override (MethodSpec(..)) @@ -686,7 +687,7 @@ regToSetup bak p eval shp rv = go shp rv ", but got Any wrapping " ++ show tpr where shpTpr = StructRepr $ fmapFC fieldShapeType flds go (TransparentShape _ shp) rv = go shp rv - go (RefShape refTy ty' tpr) ref = do + go (RefShape refTy ty' _ tpr) ref = do partIdxLen <- lift $ mirRef_indexAndLenSim ref optIdxLen <- liftIO $ readPartExprMaybe sym partIdxLen let (optIdx, optLen) = diff --git a/crucible-mir-comp/src/Mir/Compositional/Clobber.hs b/crucible-mir-comp/src/Mir/Compositional/Clobber.hs index 458d09daac..151d025b98 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Clobber.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Clobber.hs @@ -24,6 +24,8 @@ import Lang.Crucible.Backend import Lang.Crucible.Simulator import Lang.Crucible.Types +import SAWScript.Crucible.MIR.TypeShape + import Mir.Generator (CollectionState, collection, staticMap, StaticVar(..)) import Mir.Intrinsics hiding (MethodSpec, MethodSpecBuilder) import qualified Mir.Mir as M @@ -106,7 +108,7 @@ clobberImmutSymbolic sym loc nameStr shp rv = go shp rv go (TransparentShape _ shp) rv = go shp rv -- Since this ref is in immutable memory, whatever behavior we're -- approximating with this clobber can't possibly modify it. - go (RefShape _ _ _tpr) rv = return rv + go (RefShape _ _ _ _tpr) rv = return rv go (FnPtrShape _ _ _) _rv = error "Function pointers not currently supported in overrides" diff --git a/crucible-mir-comp/src/Mir/Compositional/Convert.hs b/crucible-mir-comp/src/Mir/Compositional/Convert.hs index 157639bf39..bb503e1e74 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Convert.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Convert.hs @@ -13,7 +13,6 @@ module Mir.Compositional.Convert where -import Control.Lens ((^.), (^..), each) import Control.Monad import Control.Monad.IO.Class import Data.Foldable @@ -47,177 +46,10 @@ import Verifier.SAW.Simulator.What4 (SValue) import qualified Verifier.SAW.Simulator.What4 as SAW import qualified Verifier.SAW.Simulator.What4.ReturnTrip as SAW (baseSCType) +import SAWScript.Crucible.MIR.TypeShape + import Mir.Intrinsics import qualified Mir.Mir as M -import Mir.TransTy ( tyListToCtx, tyToRepr, tyToReprCont, canInitialize - , isUnsized, reprTransparentFieldTy ) - - --- | TypeShape is used to classify MIR `Ty`s and their corresponding --- CrucibleTypes into a few common cases. We don't use `Ty` directly because --- there are some `Ty`s that have identical structure (such as TyRef vs. --- TyRawPtr) or similar enough structure that we'd rather write only one case --- (such as `u8` vs `i8` vs `i32`, all primitives/BaseTypes). And we don't use --- TypeRepr directly because it's lacking information in some cases (notably --- `TyAdt`, which is always AnyRepr, concealing the actual field types of the --- struct). --- --- In each constructor, the first `M.Ty` is the overall MIR type (e.g., for --- ArrayShape, this is the TyArray type). The overall `TypeRepr tp` isn't --- stored directly, but can be computed with `shapeType`. -data TypeShape (tp :: CrucibleType) where - UnitShape :: M.Ty -> TypeShape UnitType - PrimShape :: M.Ty -> BaseTypeRepr btp -> TypeShape (BaseToType btp) - TupleShape :: M.Ty -> [M.Ty] -> Assignment FieldShape ctx -> TypeShape (StructType ctx) - ArrayShape :: M.Ty -> M.Ty -> TypeShape tp -> TypeShape (MirVectorType tp) - StructShape :: M.Ty -> [M.Ty] -> Assignment FieldShape ctx -> TypeShape AnyType - TransparentShape :: M.Ty -> TypeShape tp -> TypeShape tp - -- | Note that RefShape contains only a TypeRepr for the pointee type, not - -- a TypeShape. None of our operations need to recurse inside pointers, - -- and also this saves us from some infinite recursion. - RefShape :: M.Ty -> M.Ty -> TypeRepr tp -> TypeShape (MirReferenceType tp) - -- | Note that 'FnPtrShape' contains only 'TypeRepr's for the argument and - -- result types, not 'TypeShape's, as none of our operations need to recurse - -- inside them. - FnPtrShape :: M.Ty -> CtxRepr args -> TypeRepr ret - -> TypeShape (FunctionHandleType args ret) - --- | The TypeShape of a struct field, which might have a MaybeType wrapper to --- allow for partial initialization. -data FieldShape (tp :: CrucibleType) where - OptField :: TypeShape tp -> FieldShape (MaybeType tp) - ReqField :: TypeShape tp -> FieldShape tp - --- | Return the `TypeShape` of `ty`. --- --- It is guaranteed that the `tp :: CrucibleType` index of the resulting --- `TypeShape` matches that returned by `tyToRepr`. -tyToShape :: M.Collection -> M.Ty -> Some TypeShape -tyToShape col ty = go ty - where - go :: M.Ty -> Some TypeShape - go ty = case ty of - M.TyBool -> goPrim ty - M.TyChar -> goPrim ty - M.TyInt _ -> goPrim ty - M.TyUint _ -> goPrim ty - M.TyTuple [] -> goUnit ty - M.TyTuple tys -> goTuple ty tys - M.TyClosure tys -> goTuple ty tys - M.TyFnDef _ -> goUnit ty - M.TyArray ty' _ | Some shp <- go ty' -> Some $ ArrayShape ty ty' shp - M.TyAdt nm _ _ -> case Map.lookup nm (col ^. M.adts) of - Just adt | Just ty' <- reprTransparentFieldTy col adt -> - mapSome (TransparentShape ty) $ go ty' - Just (M.Adt _ M.Struct [v] _ _ _ _) -> goStruct ty (v ^.. M.vfields . each . M.fty) - Just (M.Adt _ ak _ _ _ _ _) -> error $ "tyToShape: AdtKind " ++ show ak ++ " NYI" - Nothing -> error $ "tyToShape: bad adt: " ++ show ty - M.TyRef ty' mutbl -> goRef ty ty' mutbl - M.TyRawPtr ty' mutbl -> goRef ty ty' mutbl - M.TyFnPtr sig -> goFnPtr ty sig - _ -> error $ "tyToShape: " ++ show ty ++ " NYI" - - goPrim :: M.Ty -> Some TypeShape - goPrim ty | Some tpr <- tyToRepr col ty, AsBaseType btpr <- asBaseType tpr = - Some $ PrimShape ty btpr - goPrim ty | Some tpr <- tyToRepr col ty = - error $ "tyToShape: type " ++ show ty ++ " produced non-primitive type " ++ show tpr - - goUnit :: M.Ty -> Some TypeShape - goUnit ty = Some $ UnitShape ty - - goTuple :: M.Ty -> [M.Ty] -> Some TypeShape - goTuple ty tys | Some flds <- loop tys Empty = Some $ TupleShape ty tys flds - where - loop :: forall ctx. [M.Ty] -> Assignment FieldShape ctx -> Some (Assignment FieldShape) - loop [] flds = Some flds - loop (ty:tys) flds | Some fld <- go ty = loop tys (flds :> OptField fld) - - goStruct :: M.Ty -> [M.Ty] -> Some TypeShape - goStruct ty tys | Some flds <- loop tys Empty = Some $ StructShape ty tys flds - where - loop :: forall ctx. [M.Ty] -> Assignment FieldShape ctx -> Some (Assignment FieldShape) - loop [] flds = Some flds - loop (ty:tys) flds | Some fld <- goField ty = loop tys (flds :> fld) - - goField :: M.Ty -> Some FieldShape - goField ty | Some shp <- go ty = case canInitialize col ty of - True -> Some $ ReqField shp - False -> Some $ OptField shp - - goRef :: M.Ty -> M.Ty -> M.Mutability -> Some TypeShape - goRef ty ty' mutbl - | M.TySlice slicedTy <- ty' - , Some tpr <- tyToRepr col slicedTy - = Some $ - TupleShape ty [refTy, usizeTy] - (Empty - :> ReqField (RefShape refTy slicedTy tpr) - :> ReqField (PrimShape usizeTy BaseUsizeRepr)) - | M.TyStr <- ty' - = Some $ - TupleShape ty [refTy, usizeTy] - (Empty - :> ReqField (RefShape refTy (M.TyUint M.B8) (BVRepr (knownNat @8))) - :> ReqField (PrimShape usizeTy BaseUsizeRepr)) - where - -- We use a ref (of the same mutability as `ty`) when possible, to - -- avoid unnecessary clobbering. - refTy = case ty of - M.TyRef _ _ -> M.TyRef ty' mutbl - _ -> M.TyRef ty' mutbl - usizeTy = M.TyUint M.USize - goRef ty ty' _ | isUnsized ty' = error $ - "tyToShape: fat pointer " ++ show ty ++ " NYI" - goRef ty ty' _ | Some tpr <- tyToRepr col ty' = Some $ RefShape ty ty' tpr - - goFnPtr :: M.Ty -> M.FnSig -> Some TypeShape - goFnPtr ty (M.FnSig args ret _abi _spread) = - tyListToCtx col args $ \argsr -> - tyToReprCont col ret $ \retr -> - Some (FnPtrShape ty argsr retr) - --- | Given a `Ty` and the result of `tyToRepr ty`, produce a `TypeShape` with --- the same index `tp`. Raises an `error` if the `TypeRepr` doesn't match --- `tyToRepr ty`. -tyToShapeEq :: HasCallStack => M.Collection -> M.Ty -> TypeRepr tp -> TypeShape tp -tyToShapeEq col ty tpr | Some shp <- tyToShape col ty = - case testEquality (shapeType shp) tpr of - Just Refl -> shp - Nothing -> error $ "tyToShapeEq: type " ++ show ty ++ - " does not have representation " ++ show tpr ++ - " (got " ++ show (shapeType shp) ++ " instead)" - -shapeType :: TypeShape tp -> TypeRepr tp -shapeType shp = go shp - where - go :: forall tp. TypeShape tp -> TypeRepr tp - go (UnitShape _) = UnitRepr - go (PrimShape _ btpr) = baseToType btpr - go (TupleShape _ _ flds) = StructRepr $ fmapFC fieldShapeType flds - go (ArrayShape _ _ shp) = MirVectorRepr $ shapeType shp - go (StructShape _ _ _flds) = AnyRepr - go (TransparentShape _ shp) = go shp - go (RefShape _ _ tpr) = MirReferenceRepr tpr - go (FnPtrShape _ args ret) = FunctionHandleRepr args ret - -fieldShapeType :: FieldShape tp -> TypeRepr tp -fieldShapeType (ReqField shp) = shapeType shp -fieldShapeType (OptField shp) = MaybeRepr $ shapeType shp - -shapeMirTy :: TypeShape tp -> M.Ty -shapeMirTy (UnitShape ty) = ty -shapeMirTy (PrimShape ty _) = ty -shapeMirTy (TupleShape ty _ _) = ty -shapeMirTy (ArrayShape ty _ _) = ty -shapeMirTy (StructShape ty _ _) = ty -shapeMirTy (TransparentShape ty _) = ty -shapeMirTy (RefShape ty _ _) = ty -shapeMirTy (FnPtrShape ty _ _) = ty - -fieldShapeMirTy :: FieldShape tp -> M.Ty -fieldShapeMirTy (ReqField shp) = shapeMirTy shp -fieldShapeMirTy (OptField shp) = shapeMirTy shp -- | Run `f` on each `SymExpr` in `v`. @@ -549,28 +381,3 @@ regToTerm sym sc name w4VarMapRef shp rv = go shp rv go shp rv' goVector _shp (MirVector_Array _) = fail $ "regToTerm: MirVector_Array not supported" - -shapeToTerm :: forall tp m. - (MonadIO m, MonadFail m) => - SAW.SharedContext -> - TypeShape tp -> - m SAW.Term -shapeToTerm sc shp = go shp - where - go :: forall tp. TypeShape tp -> m SAW.Term - go (UnitShape _) = liftIO $ SAW.scUnitType sc - go (PrimShape _ BaseBoolRepr) = liftIO $ SAW.scBoolType sc - go (PrimShape _ (BaseBVRepr w)) = liftIO $ SAW.scBitvector sc (natValue w) - go (TupleShape _ _ flds) = do - tys <- toListFC getConst <$> traverseFC (\x -> Const <$> goField x) flds - liftIO $ SAW.scTupleType sc tys - go (ArrayShape (M.TyArray _ n) _ shp) = do - ty <- go shp - n <- liftIO $ SAW.scNat sc (fromIntegral n) - liftIO $ SAW.scVecType sc n ty - go shp = fail $ "shapeToTerm: unsupported type " ++ show (shapeType shp) - - goField :: forall tp. FieldShape tp -> m SAW.Term - goField (OptField shp) = go shp - goField (ReqField shp) = go shp - diff --git a/crucible-mir-comp/src/Mir/Compositional/MethodSpec.hs b/crucible-mir-comp/src/Mir/Compositional/MethodSpec.hs deleted file mode 100644 index 9c5c2c275a..0000000000 --- a/crucible-mir-comp/src/Mir/Compositional/MethodSpec.hs +++ /dev/null @@ -1,79 +0,0 @@ -{-# Language DataKinds #-} -{-# Language TypeFamilies #-} -{-# Language OverloadedStrings #-} -{-# Language TemplateHaskell #-} - -module Mir.Compositional.MethodSpec -where - -import Control.Lens (makeLenses) -import Data.Parameterized.Classes -import Data.Parameterized.Some -import Data.Text (Text) -import qualified Prettyprinter as PP - -import Lang.Crucible.Types - -import qualified SAWScript.Crucible.Common.MethodSpec as MS -import qualified SAWScript.Crucible.Common.Override as MS - -import Mir.DefId -import Mir.Generator -import Mir.Intrinsics -import qualified Mir.Mir as M - - -type instance MS.HasSetupNull MIR = 'False -type instance MS.HasSetupGlobal MIR = 'False -type instance MS.HasSetupStruct MIR = 'True -type instance MS.HasSetupArray MIR = 'True -type instance MS.HasSetupElem MIR = 'True -type instance MS.HasSetupField MIR = 'True -type instance MS.HasSetupCast MIR = 'False -type instance MS.HasSetupUnion MIR = 'False -type instance MS.HasSetupGlobalInitializer MIR = 'False - -type instance MS.HasGhostState MIR = 'False - -type instance MS.TypeName MIR = Text -type instance MS.ExtType MIR = M.Ty - -type instance MS.MethodId MIR = DefId -type instance MS.AllocSpec MIR = Some MirAllocSpec -type instance MS.PointsTo MIR = MirPointsTo -type instance MS.ResolvedState MIR = () -type instance MS.CastType MIR = () - -type instance MS.Codebase MIR = CollectionState - -type instance MS.CrucibleContext MIR = () - -type instance MS.Pointer' MIR sym = Some (MirPointer sym) - - -data MirPointsTo = MirPointsTo MS.AllocIndex [MS.SetupValue MIR] - deriving (Show) - -instance PP.Pretty MirPointsTo where - pretty (MirPointsTo alloc sv) = PP.parens $ - PP.pretty (show alloc) PP.<+> "->" PP.<+> PP.list (map MS.ppSetupValue sv) - -data MirAllocSpec tp = MirAllocSpec - { _maType :: TypeRepr tp - , _maMutbl :: M.Mutability - , _maMirType :: M.Ty - , _maLen :: Int - } - deriving (Show) - -instance ShowF MirAllocSpec where - -data MirPointer sym tp = MirPointer - { _mpType :: TypeRepr tp - , _mpRef :: MirReferenceMux sym tp - } - -type MIRMethodSpec = MS.CrucibleMethodSpecIR MIR - -makeLenses ''MirAllocSpec -makeLenses ''MirPointer diff --git a/crucible-mir-comp/src/Mir/Compositional/Override.hs b/crucible-mir-comp/src/Mir/Compositional/Override.hs index 0553c28baf..5658d87b9e 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Override.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Override.hs @@ -53,6 +53,8 @@ import qualified Verifier.SAW.TypedTerm as SAW import qualified SAWScript.Crucible.Common.MethodSpec as MS import qualified SAWScript.Crucible.Common.Override as MS +import SAWScript.Crucible.MIR.MethodSpecIR +import SAWScript.Crucible.MIR.TypeShape import Mir.Generator import Mir.Intrinsics hiding (MethodSpec) @@ -60,7 +62,6 @@ import qualified Mir.Mir as M import Mir.Compositional.Clobber import Mir.Compositional.Convert -import Mir.Compositional.MethodSpec type MirOverrideMatcher sym a = forall p rorw rtp args ret. @@ -288,7 +289,12 @@ runSpec cs mh ms = ovrWithBackend $ \bak -> Map.toList $ ms ^. MS.csPostState . MS.csAllocs postAllocMap <- liftM Map.fromList $ forM postAllocDefs $ \(alloc, Some allocSpec) -> do ref <- newMirRefSim (allocSpec ^. maType) - return (alloc, Some $ MirPointer (allocSpec ^. maType) ref) + return ( alloc + , Some $ MirPointer (allocSpec ^. maType) + (allocSpec ^. maMutbl) + (allocSpec ^. maMirType) + ref + ) let allocMap = preAllocMap <> postAllocMap -- Handle return value and post-state PointsTos @@ -403,10 +409,10 @@ matchArg sym sc eval allocSpecs md shp rv sv = go shp rv sv ", but got Any wrapping " ++ show tpr where shpTpr = StructRepr $ fmapFC fieldShapeType flds go (TransparentShape _ shp) rv sv = go shp rv sv - go (RefShape refTy _ tpr) ref (MS.SetupVar alloc) = - goRef refTy tpr ref alloc 0 - go (RefShape refTy _ tpr) ref (MS.SetupElem () (MS.SetupVar alloc) idx) = - goRef refTy tpr ref alloc idx + go (RefShape refTy pointeeTy mutbl tpr) ref (MS.SetupVar alloc) = + goRef refTy pointeeTy mutbl tpr ref alloc 0 + go (RefShape refTy pointeeTy mutbl tpr) ref (MS.SetupElem () (MS.SetupVar alloc) idx) = + goRef refTy pointeeTy mutbl tpr ref alloc idx go (FnPtrShape _ _ _) _ _ = error "Function pointers not currently supported in overrides" go shp _ sv = error $ "matchArg: type error: bad SetupValue " ++ @@ -432,13 +438,15 @@ matchArg sym sc eval allocSpecs md shp rv sv = go shp rv sv goRef :: forall tp'. M.Ty -> + M.Ty -> + M.Mutability -> TypeRepr tp' -> MirReferenceMux sym tp' -> MS.AllocIndex -> -- | The expected offset of `ref` past the start of the allocation. Int -> MirOverrideMatcher sym () - goRef refTy tpr ref alloc refOffset = do + goRef refTy pointeeTy mutbl tpr ref alloc refOffset = do partIdxLen <- lift $ mirRef_indexAndLenSim ref optIdxLen <- liftIO $ readPartExprMaybe sym partIdxLen let (optIdx, optLen) = @@ -486,7 +494,7 @@ matchArg sym sc eval allocSpecs md shp rv sv = go shp rv sv SimError loc (AssertFailureSimError ("mismatch on " ++ show alloc) "") | otherwise -> error $ "mismatched types for " ++ show alloc ++ ": " ++ show tpr ++ " does not match " ++ show (ptr ^. mpType) - MS.setupValueSub %= Map.insert alloc (Some $ MirPointer tpr ref') + MS.setupValueSub %= Map.insert alloc (Some $ MirPointer tpr mutbl pointeeTy ref') -- | Convert a SetupValue to a RegValue. This is used for MethodSpec outputs, @@ -524,7 +532,7 @@ setupToReg sym sc termSub regMap allocMap shp sv = go shp sv go (StructShape _ _ flds) (MS.SetupStruct _ False svs) = AnyValue (StructRepr $ fmapFC fieldShapeType flds) <$> goFields flds svs go (TransparentShape _ shp) sv = go shp sv - go (RefShape _ _ tpr) (MS.SetupVar alloc) = case Map.lookup alloc allocMap of + go (RefShape _ _ _ tpr) (MS.SetupVar alloc) = case Map.lookup alloc allocMap of Just (Some ptr) -> case testEquality tpr (ptr ^. mpType) of Just Refl -> return $ ptr ^. mpRef Nothing -> error $ "setupToReg: type error: bad reference type for " ++ show alloc ++ diff --git a/crux-mir-comp/crux-mir-comp.cabal b/crux-mir-comp/crux-mir-comp.cabal index 199b7c991d..e51d5feaad 100644 --- a/crux-mir-comp/crux-mir-comp.cabal +++ b/crux-mir-comp/crux-mir-comp.cabal @@ -34,6 +34,7 @@ library crux-mir, saw-core, saw-core-what4, + saw-script, cryptol, cryptol-saw-core diff --git a/crux-mir-comp/src/Mir/Cryptol.hs b/crux-mir-comp/src/Mir/Cryptol.hs index 17bc207a59..ccc45ba518 100644 --- a/crux-mir-comp/src/Mir/Cryptol.hs +++ b/crux-mir-comp/src/Mir/Cryptol.hs @@ -61,6 +61,8 @@ import qualified Verifier.SAW.Simulator.What4.ReturnTrip as SAW import qualified Verifier.SAW.Recognizer as SAW (asExtCns) import qualified Verifier.SAW.TypedTerm as SAW +import SAWScript.Crucible.MIR.TypeShape + import Mir.Compositional.Convert import Mir.Compositional.DefId (hasInstPrefix) diff --git a/doc/manual/manual.md b/doc/manual/manual.md index 586d06e7c8..743683f817 100644 --- a/doc/manual/manual.md +++ b/doc/manual/manual.md @@ -1737,9 +1737,9 @@ file to the `mir_load_module` function: * `mir_load_module : String -> TopLevel MIRModule` -SAW currently supports Rust code that can be built with a [March 22, 2020 Rust -nightly](https://static.rust-lang.org/dist/2020-03-22/). If you encounter a -Rust feature that SAW does not support, please report it [on +SAW currently supports Rust code that can be built with a [January 23, 2023 +Rust nightly](https://static.rust-lang.org/dist/2023-01-23/). If you encounter +a Rust feature that SAW does not support, please report it [on GitHub](https://github.com/GaloisInc/saw-script/issues). ## Notes on Compiling Code for SAW @@ -1913,7 +1913,7 @@ allocated during execution is allowed). The direct extraction process just discussed automatically introduces symbolic variables and then abstracts over them, yielding a SAWScript -`Term` that reflects the semantics of the original Java or LLVM code. +`Term` that reflects the semantics of the original Java, LLVM, or MIR code. For simple functions, this is often the most convenient interface. For more complex code, however, it can be necessary (or more natural) to specifically introduce fresh variables and indicate what portions of the @@ -2040,7 +2040,7 @@ The built-in functions described so far work by extracting models of code that can then be used for a variety of purposes, including proofs about the properties of the code. -When the goal is to prove equivalence between some LLVM or Java code and +When the goal is to prove equivalence between some LLVM, Java, or MIR code and a specification, however, a more declarative approach is sometimes convenient. The following sections describe an approach that combines model extraction and verification with respect to a specification. A @@ -2072,8 +2072,7 @@ gives the proof script to use for verification. The result is a proved specification that can be used to simplify verification of functions that call this one. -A similar command for JVM programs is available if `enable_experimental` -has been run. +Similar commands are available for JVM programs: ~~~~ jvm_verify : @@ -2086,8 +2085,71 @@ jvm_verify : TopLevel JVMMethodSpec ~~~~ -Now we describe how to construct a value of type `LLVMSetup ()` (or -`JVMSetup ()`). +And for MIR programs: + +~~~~ +mir_verify : + MIRModule -> + String -> + [MIRSpec] -> + Bool -> + MIRSetup () -> + ProofScript () -> + TopLevel MIRSpec +~~~~ + +### Running a MIR-based verification + +`mir_verify` requires `enable_experimental` in order to be used. Moreover, +some parts of `mir_verify` are not currently implemented, so it is possible +that using `mir_verify` on some programs will fail. + +The `String` supplied as an argument to `mir_verify` is expected to be a +function _identifier_. An identifier is expected adhere to one of the following +conventions: + +* `/::` +* `::` + +Where: + +* `` is the name of the crate in which the function is defined. (If + you produced your MIR JSON file by compiling a single `.rs` file with + `saw-rustc`, then the crate name is the same as the name of the file, but + without the `.rs` file extension.) +* `` is a hash of the crate and its dependencies. In extreme + cases, it is possible for two different crates to have identical crate names, + in which case the disambiguator must be used to distinguish between the two + crates. In the common case, however, most crate names will correspond to + exactly one disambiguator, and you are allowed to leave out the + `/` part of the `String` in this case. +* `` is the path to the function within the crate. Sometimes, + this is as simple as the function name itself. In other cases, a function + path may involve multiple _segments_, depending on the module hierarchy for + the program being verified. For instance, a `read` function located in + `core/src/ptr/mod.rs` will have the identifier: + + ``` + core::ptr::read + ``` + + Where `core` is the crate name and `ptr::read` is the function path, which + has two segments `ptr` and `read`. There are also some special forms of + segments that appear for functions defined in certain language constructs. + For instance, if a function is defined in an `impl` block, then it will have + `{impl}` as one of its segments, e.g., + + ``` + core::ptr::const_ptr::{impl}::offset + ``` + + If you are in doubt about what the full identifier for a given fuction is, + consult the MIR JSON file for your program. + +----- + +Now we describe how to construct a value of type `LLVMSetup ()`, `JVMSetup ()`, +or `MIRSetup ()`. ## Structure of a Specification @@ -2099,32 +2161,32 @@ A specifications for Crucible consists of three logical components: * A specification of the expected final value of the program state. -These three portions of the specification are written in sequence within -a `do` block of `LLVMSetup` (or `JVMSetup`) type. The command -`llvm_execute_func` (or `jvm_execute_func`) separates the -specification of the initial state from the specification of the final -state, and specifies the arguments to the function in terms of the -initial state. Most of the commands available for state description will -work either before or after `llvm_execute_func`, though with -slightly different meaning, as described below. +These three portions of the specification are written in sequence within a `do` +block of type `{LLVM,JVM,MIR}Setup`. The command `{llvm,jvm,mir}_execute_func` +separates the specification of the initial state from the specification of the +final state, and specifies the arguments to the function in terms of the +initial state. Most of the commands available for state description will work +either before or after `{llvm,jvm,mir}_execute_func`, though with slightly +different meaning, as described below. ## Creating Fresh Variables -In any case where you want to prove a property of a function for an -entire class of inputs (perhaps all inputs) rather than concrete values, -the initial values of at least some elements of the program state must -contain fresh variables. These are created in a specification with the -`llvm_fresh_var` and `jvm_fresh_var` commands rather than -`fresh_symbolic`. +In any case where you want to prove a property of a function for an entire +class of inputs (perhaps all inputs) rather than concrete values, the initial +values of at least some elements of the program state must contain fresh +variables. These are created in a specification with the +`{llvm,jvm,mir}_fresh_var` commands rather than `fresh_symbolic`. * `llvm_fresh_var : String -> LLVMType -> LLVMSetup Term` * `jvm_fresh_var : String -> JavaType -> JVMSetup Term` +* `mir_fresh_var : String -> MIRType -> MIRSetup Term` + The first parameter to both functions is a name, used only for presentation. It's possible (though not recommended) to create multiple variables with the same name, but SAW will distinguish between them -internally. The second parameter is the LLVM (or Java) type of the +internally. The second parameter is the LLVM, Java, or MIR type of the variable. The resulting `Term` can be used in various subsequent commands. @@ -2151,6 +2213,31 @@ Java types are built up using the following functions: * `java_class : String -> JavaType` * `java_array : Int -> JavaType -> JavaType` +MIR types are built up using the following functions: + +* `mir_array : Int -> MIRType -> MIRType` +* `mir_bool : MIRType` +* `mir_char : MIRType` +* `mir_i8 : MIRType` +* `mir_i6 : MIRType` +* `mir_i32 : MIRType` +* `mir_i64 : MIRType` +* `mir_i128 : MIRType` +* `mir_isize : MIRType` +* `mir_f32 : MIRType` +* `mir_f64 : MIRType` +* `mir_ref : MIRType -> MIRType` +* `mir_ref_mut : MIRType -> MIRType` +* `mir_slice : MIRType -> MIRType` +* `mir_str : MIRType` +* `mir_tuple : [MIRType] -> MIRType` +* `mir_u8 : MIRType` +* `mir_u6 : MIRType` +* `mir_u32 : MIRType` +* `mir_u64 : MIRType` +* `mir_u128 : MIRType` +* `mir_usize : MIRType` + Most of these types are straightforward mappings to the standard LLVM and Java types. The one key difference is that arrays must have a fixed, concrete size. Therefore, all analysis results are valid only under the @@ -2189,27 +2276,31 @@ values that can occur during symbolic execution, which includes both `Term` values, pointers, and composite types consisting of either of these (both structures and arrays). -The `llvm_term` and `jvm_term` functions create a `SetupValue` or -`JVMValue` from a `Term`: +The `llvm_term`, `jvm_term`, and `mir_term` functions create a `SetupValue`, +`JVMValue`, or `MIRValue`, respectively, from a `Term`: * `llvm_term : Term -> SetupValue` * `jvm_term : Term -> JVMValue` +* `mir_term : Term -> MIRValue` ## Executing -Once the initial state has been configured, the `llvm_execute_func` +Once the initial state has been configured, the `{llvm,jvm,mir}_execute_func` command specifies the parameters of the function being analyzed in terms of the state elements already configured. * `llvm_execute_func : [SetupValue] -> LLVMSetup ()` +* `jvm_execute_func : [JVMValue] -> JVMSetup ()` +* `mir_execute_func : [MIRValue] -> MIRSetup ()` ## Return Values To specify the value that should be returned by the function being -verified use the `llvm_return` or `jvm_return` command. +verified use the `{llvm,jvm,mir}_return` command. * `llvm_return : SetupValue -> LLVMSetup ()` * `jvm_return : JVMValue -> JVMSetup ()` +* `mir_return : MIRValue -> MIRSetup ()` ## A First Simple Example @@ -2252,11 +2343,11 @@ of properties we have already proved about its callees rather than analyzing them anew. This enables us to reason about much larger and more complex systems than otherwise possible. -The `llvm_verify` and `jvm_verify` functions return values of -type `CrucibleMethodSpec` and `JVMMethodSpec`, respectively. These -values are opaque objects that internally contain both the information -provided in the associated `JVMSetup` or `LLVMSetup` blocks and -the results of the verification process. +The `llvm_verify`, `jvm_verify`, and `mir_verify` functions return values of +type `CrucibleMethodSpec`, `JVMMethodSpec`, and `MIRMethodSpec`, respectively. +These values are opaque objects that internally contain both the information +provided in the associated `LLVMSetup`, `JVMSetup`, or `MIRSetup` blocks, +respectively, and the results of the verification process. Any of these `MethodSpec` objects can be passed in via the third argument of the `..._verify` functions. For any function or method @@ -2326,6 +2417,14 @@ array of the given concrete size, with elements of the given type. * `jvm_alloc_object : String -> JVMSetup JVMValue` specifies an object of the given class name. +The experimental MIR implementation also has a `mir_alloc` function, which +behaves similarly to `llvm_alloc`. `mir_alloc` creates an immutable reference, +but there is also a `mir_alloc_mut` function for creating a mutable reference: + +* `mir_alloc : MIRType -> MIRSetup SetupValue` + +* `mir_alloc_mut : MIRType -> MIRSetup SetupValue` + In LLVM, it's also possible to construct fresh pointers that do not point to allocated memory (which can be useful for functions that manipulate pointers but not the values they point to): @@ -2650,6 +2749,9 @@ values in scope at the time. * `jvm_precond : Term -> JVMSetup ()` * `jvm_postcond : Term -> JVMSetup ()` * `jvm_assert : Term -> JVMSetup ()` +* `mir_precond : Term -> MIRSetup ()` +* `mir_postcond : Term -> MIRSetup ()` +* `mir_assert : Term -> MIRSetup ()` These commands take `Term` arguments, and therefore cannot describe the values of pointers. The "assert" variants will work in either pre- @@ -3512,7 +3614,7 @@ N.B: The following commands must first be enabled using `enable_experimental`. s : out std_logic ); end half; - + entity full is port ( a : in std_logic; diff --git a/doc/manual/manual.pdf b/doc/manual/manual.pdf index 1d5bba2dc37232247e451df073caf53064660c98..76c8901099df5a9bae055c03a8d63412781e0ad8 100644 GIT binary patch delta 242065 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%0Dwn( z$agyp`{sQrWz2RrkE#^-bzYSmfcJYtl2pk3_HRsATRG!AWF4soz7|f+bPMCarv@Sb z-;oheMR7ke3WO$_KecdJ#?CO)qu+V6z@VlTtY#|Bw|BaJME>&i5!y3QVS}Q=OUnX3 z{@Hw`Af(Ln+h@d9{nIa4Lj*d>v1dc^+czz3o-I|FY16To*2H8khBuYIyaTSMy2F#Q zq}`}F^`*aqLd4J*joPa*$o3Y0b%+arZJ`i|tYIT+Utv}@Q68FX4pAf(n39=eVwi-9|2$JoicCo%bqOm6UIe(&f7;MpSYBEa zy25Tm(=rI9RxnA)5!02^OubHHeC)UBAX!T01qpaR#=B~J$2)!V-Cb|(!9CCPfoA~h z>d91}A+G+ld(T!z0t~Nj3 zws3#j!DG6(JRC+fEl4ug^Ha`QRFl%(8>0@z#T;cX^i4uZmKkwvn+T_Ay1OysA0~lE zo|E9=SfM&kl-O|}O<0;n=hO&-#7Q1l=c_}yEVfS)u;X+8R$7yLkAf2l6IC09dsgYm!OYkoY2{U)QS9s| z;PjnSE&|?$Q|dW^e*PyA-2(|w#H1*z04W5H*XgB=FlCnz-&>fpA}dVCi-Sq}QaFfV zYxU+OAJUSLenH`~wTn7^iw6%Jw!}3yK&d*R?6A>D=L|aG1r{9A4jzaf7 zEDGj43pehqA+h{AWPF~v&Ny}Cza>4?%($b(GTXkLS21O3+GrW(1Yu_{Ty=+f2};z1Wj}B z?1kS<6Jq%Rf(FXoMqmvf_ws_`FkGnBa%{r<0a~9_Y~-hxv~%y1|9Ko}C1`_m?nJaT zvKBHO?2^v}QO_vq$AWz?-|1(fj%@BSo{#zvh}`EuOBW1ehb6~7x@tJMW$CCaz|!$3 zi>zq1+3K)_{mh@`d%}BkH=u%G1xdO!w`%IaoRmlX{WuZa;xsc8~0-L^S z?W&M;yYVSUX#V72!uy9%Q2T{KBBYSFy3e|gpLdPD*CQsjFz8P8TduXY(81mE0G-oj zULq2L8atbEgb@PHiJzy{sFyJw{eXtW-a)f>Rm}Uq_7~`{OD-M`6;7m3V4{DNQroH) zoes^bZxP1fndyQ6&Fd26KRm$dukAlCSiNkUeWaj9p+jvi&bJCH5X(xNZZ(iMF#UtA zrVen4ND-Fr%VwHDsbSGSvYi1NHN`aZoR0#I#&W$;#3j{ZyYspr?HcF0PKj07L7o-PSLwp?JnivD@D2Gj?-F-2 zZ_a?%l)HP8)3K4G6XeN6At$C~r7E@+!)hmd#e%Z{YE#1IQ_$+vqk$s5AlA4-vB!FY zuCY9W`}o^A%d^nzRpVyH#jUPzRu97H5$d%6!`3+kXA*YpI<{@wwrx&q+s-6;W81cq zi8-;YiEZ0XcK+`>_-ohRebCi?($xp6>UnzgwXXZv-WHY{>tT!5YL~O*Vi*1xPJfD( zARwmA>)XtJs9p!aGDt97V~Y_2p%j0ji^pH@wPS}0Rf!=wyyqVC&$}LUxx4lZ)8R!h zI8+6$*X3zOUN$IDh^W&Cnr3-_{$B(Q2rGFcQBjp^@19I5MLtv>fsMRf4U|jY0_PR;{nk${&oV!+ntW~(IRW8`X z49cJ@(f(7(e-P0O)l-I>0)K(#B_rW89eR12l?B9H8FZBeO>#J;t6MFskq9K+ zGsc4e4|?!wo>{;3T*yVCu?;=8kcfc&EMypchdXLaVW`m)W}R&<^6<&GaEL+1@#Ktz zT#lHuKY`9v``oADgb(9`SuOWJ*zk~^7%VCUcKKZa=EMj(3J@)q89E%bBVt(7Kdav3 z$lndczYk3}oOinU0$Uqq+G?U~A037D>A!ANldHRy_Fw|_$9V<(+`YlWT!`3Qe;E3dMF z+a}X_jU~glLN)XT9>W6*{0%HMm*bWdcz#0n$wRIa|7-RyUwqZJwX>EXJ`m(E8`B6x z1=#$jfTVn2>;sa}xOwPXWX7Drg{vX0?$f38*SPRGv7pZ^RWW&+qL5gH)to>n4X4`x zBG_1r{ql49_8DrsOIM8iE&iP<_4@3=q^28AL|kERTG5Y_5)?-iu7o%EM>!0!l4tvp z$!=xut)t5UWJ$q_yB$Y+bGrz6-IRfS-z)RIuWnJ?=T zpRNxSH^V?kWrsRP8BWHOAnccfaFlMPqUcc*nTORbsjT*lW7yDP*ea7jW!2b#_K4<@ z^TCvUWpcP2cEq@7SUcxXmni$?K-G}1l}@Uc!F@nX3#bI5Jx@4Z#QmU0PBA2b<-9Zj zMZ${^4{glA@bn)k889MS4Gz2$9G7GyTCk=dUK_I=V(5V85Tt9ff#?lQ=g40w_FMJy z_aPe~JLiV24i<%ir2AKMv*v|>R&Jh19)$s_-2J`7O&lidfv{hLrUgsJPuq9!bX*$a zc*U-W>5wX0XqryWVln}M@pa++7#E*2A<}tf@ORf@i+(cROe9uV;=T7t-2i2+^mN;? zn0qYAs=~YMdI=aa3BxBy$E(_ue-z0Kuan?wcpJvvY~=n|9iI=Y74a*8gI-a3uaM`y zE*Luml0~QVa8>WHqf+xm;G8sLiYJ)+21# zzx8em#sK^t?Ox^bZ5v+q>akigfJ@`-NrN?-uXRT6B~NDSK*3#rcJ9 z+SxCbybe{aw{juftNh((nvCKpEkgx``> zgmpNsT)JFG2u5pw(Pzi@!6={1d+e5_#gEX{c3)>41a0IUb~weW5MLr#o81$fXZ9J} z4kkmf0X+~1N#3yA>?{o}sKW6ZGJ}@KrLOnLiZ2v?Q`Ds`)K`Qw8FNc5K zsf?x0McWbhm{O6A-j#w5__tn6TC)$O%%nJQK3rQ;NY!W?aRqq5j8V45X3F@$iWd+R z6hWG{Inf6|>q)Y9$<<5P4c2AWfA%+T|dIna(oNzitgvUD-rp-VBye>_k zdsD_7Ezt)iWYB*+(Wkx8q94hCDcqcGrv*IE41tx{^LEfJR$rLN78N?UXJz3smNl{G zSgMK)ra7Z0oVJFj-}fLYQ?p&4T`$gHfzab|w%1R7sIj|h(nV;Z!o+ztx5!fvyx9C< zPbUI^#VFpp9zh;My}a+=BKt6@(f`XGIx#&kn~v*5?}8;jX^(ZUJ3F}FZv*qbtz{Eq z;N58z-RY5_xJkcwXkXO(P_|}XBRNh{%)jd!xfr_WSE8*mD@k4`mym!htjDSYm9p0` z`AYatieU)yR{8|;+Cov#hqJmrY;d8+Ij$yvJPU|;re&n?lKSuSf`fu7Q1_mqO2NXD z_+hA5UU;TuY{?7;5I{YwC-?WZv#NEB@tgDSyZhR?N|1*6FrBj|y;ZPJ`3~>jcl*+4 zrOYh-J=ZVqS7iET`FauJmxZI8leP?b7S>^d@@J2M``I(wNLEXD{=VDjcH2tRKs%en z=QVI?Z=Ifxj z&c^m1#Ymd}Aut#~M-p!HoYs8R{%G2f3lT)ZpYM!JC<>w;(+Zvu@3=+kTqb}H^lJM# zK2mi(fwl!IGiInD?&T=HNRBiFjU@)J?Tiw<-UYh74&`NDJOU>?dLD#*|3Rt2NrGyT z3x(^J1l5#@R+2~qjTEgCIvK^9QO42Ii%MD4X4tBLa{mD^TjeBiVvGkJG(nP<-0v@d z#4V*viz;_D+((^IpHIcU-&c_>Rsm5-QNlw-1zu9P>ZyZSKy+Szl9zp3hAU3o*uIuh zNy9BFbPh8Xzsyb|zKKmiw9i#}MubOB9S4M=jt@pnGE5tw!i*P$Gb~!%82T4UBuAdb zO-vBi!G8@PgQ0W;Iay-tmkc-lL4_7Rg(w!$hKs;MgN?{z&6-=P8l(#2+Ehu9Qb5f? z;OeSQFsMp6K7jm~P!LpL;<_&!7QdS>D#ro?qorcEA(Syy&2BQcQ?O{l2W&Pc#cDToIDgQSy-ot`7pPgz9M4%+G^dc;e!)wXw8WI-Vq_?OfDX=VK>x0K z3?x3h_#f#(PBpEthS&|%zu_ZGI+j>R^wu2|_i#{DO7M;)B+oJhwdG|)eSOB>7z#=S z;P9US9ytfUH|}UWaCbI_1jCQJv%Njn+mkuLAlXQMOiHe}^sYeF82GMZ5DjW(;tqiu zsro&En*g1-z`gqbn;3BVBT&|%fYh4+Wb-aY-<=H;#`nEyatd~5w;e7?i%zVeq)1k~ zHb)Xfi#05L>D$bJvpIFgfG8r=13BDGZ18KqB-j-iT4&>)li=`?9eFe|T0QG@x}$RE zWk3}7-PV(k+73ZPdIADbO!>fcnLce7Pm-|q>Da1haOUX6q^<;7C6~9QWA$c6*qrgy zG}}X9T!$9a{QTmOweQ33g%1K@&+VCQW5)7?(E7f|a@MhAR^t?212e|_u5~*!B%~35 zXQ4i!_2Lxiux8%vw@?w&T_gX_-t229|4E_b>3+ef#{op>Ty%%%Pm+lD{r>v)(fyy& zG{6ZOLEhK1br+9dCg(2LkpM5;{H;$HbRLM~$8ng}=Zl+uZ_lB*zCDAR2K=%E zwDv5Hz^?&0c{u=lK+yi)q%r89G`|pu6@4b>ERH1OOwmpPm6IcFzMzd^kysBPlDKex zFB+~G)a_DnQ#7G$JISS(=9!nK9mwFv&owcn#9}S=tWu%0yVi$9h9@Zt;<3t_7woiW zvh6YytKo1DtS>6Qh{hwHe9M0fkS-*%NIIcfmdrwo4k?YgU_9hw8h&oc1>xnE0TJ3= z$z;|3Hz%o3eTDoiF`1VA>>&a086I4acNyvJX~gvDIyE@FKQ(yo$@-e#KXeASqFit7 zS~F4nO@4LCd0@=**Sn+s{`oqshq08h>aoMiPW#{KgRwU^KmVA!(!kD@w7lnR;dwo@ zjj~~TBQ8emSGok~MSaKtmE4TRNR|Hq;C?S{(Hhk5r>$%4(;bfg%TW?wM3ENwB$gP? zeHQ0Bs%(1p8_uc~zW%Lxpq*|L;z}>o-Jfs^;2uDzYxQ$lQ*k#U)a7&crf+u_y`kC0gx8}P_cVNOLnMO(v3d{CvQEAL zF2pCF|8{8=@X0zO;A0q`g3qjHmENm$YJb8{v$_8Mv|8+H74OMP3%&F?z6SB|Z_TA@ z-bj4I^Z|4HFHM8R%FX=$wuV{RSdxSXsR21SHgW45ckf>?0A6fOT9U`BU4)fV`Gh?L zDMp16yoi_wQsk88vgmm344o_3`u)sn1qiY>gF5m;ZaqJ9GU}JiQ9R#^0VuNG zKPjS%2`$?BAG+5*jy@|hzv?zaj85c7aBvfz-B%n!IPJ{N`0dS(&|e&?trqnRnlKls zwBHcQAo#y;jXHuHHq#`vUj@R0T0L}#gP#%BjNjisXE=dbcZX=PdD|{caV!tqjgBOp zL`J*t*hU4RwydhlpyU2tD45Kf0BkBH`}gaubhOprALvi!iP2pmqOj>DT=u#Oo{c>7 zA>#i809W*%S9zN*iDk0)t4?ecOhsuJH6ZuT>}!%Jg6zmZ$VEh8J4h76?OfkpkOef(i2kO)1E3N$IC%G7 zG=;GDR{Sm8{oF`XWqpW@)pXK(3D6B@jtI#s**)qGn%5@90VCh#7) zwz2!93SUBuPcB^a=FeFJy;K;ASVIxUm?B6Mkxc>`eR9QsV7l4>Un-Nv`??+)>@|E1 zY4Kx*qHW*3p&Bzrs9oJ2vO^LY`J#7xX4kyt!{|s0Q7WpnCt`Gu8bEvpnT6QJlL%E% zUd1@D@{zxfBE$38E*k^}e!T0A7X+qLWNxGSsIbI*U}6fpbtNQ9jlFg;lG@}TYe^XE z?T(vm5CT}c`g%c_hdu!)VQN&UQCy83YLUpDM&iH-(wWQpQ#b}1?>#4cG>wGhUxeD6 zv1HYoFOr0>i38Ey6JUQ<*(RNG@z>)b1_kUjw@lY^R|dz^)42V{KTGJFV+1F%*>~D< z+RB1$L?^rC5u3kY&x8{=E6{NHQ zuBFI7G6wX+7EgT) zxiLLn{IFL?Q$4PROrGT8TsN*Yx|nLxq{{U!<(gEtTEbHCp=xiOeFs|+7`PLK`(Ig? zgK4Hi3jWNBY<$mjisr-35e4cfsY(e9oESj{DTc7G!%cX=J&Q~V+EXlK&muu&;4Ch3 zpx%rj&&utrK>&$G8U+{%S0NK8iU5fhN(wzsvmnj1C4{~kKP;;Z*+6EF<>UF1SR9!t zOG|U#p-IrWf;N(FyO~YE43H(jE4IMn6)UVCQ@S%0lFbJj^uQ~f7l1OJBPG;DN}39m$BpwjWFy~yd^JG& zl1XI!4cq@}8{i$-b3O=q%|DJZIz%Fc%MIJa1Fz&X<8+5YDwV@eqo#pZy`7}e+XCE@?l>5c zH^BB_mYDvM@u_z?>@0f{g`B{$i%*PJE6R`=D=+gmZ~dvk@=&uWJ~H*bJbMEetmp*M z#feA~2{#Qifn+4pyXni-mH=nkb|hn95D+W8u+J6k@zBIAc3j8~M#2S-Hr8;#J27pI7 zygAzG=9uikC|P(#BzUDdGck**PD6p8-r~kry5jG2U!kLPlMze<9J~qL!r;92l3`_j zT;_0rU{ji&V6@&G$2Vzzx919*90V>dG>N#?-X^o@0J|@dx%|GH0?6GFC2(2Z{F*aU z=uOUVRDdL%))F9Nr_z@M5YYQ11mMoswq}d{@OO|C`XXsa_%<4<9K%wfh5+ilDuXv- zSWZ;9=P;0rh680!I1WYfR*mPA-pcFZ>sEKp-!tBa0U8gk7)qC68fEsFoAmdb~9=~8#`tNZog2dpslM2{Lpymy6< z-3X)i`1_<3C^;!Ff2N6<%~u(PptBOv^rfmnBCO6jt!c2d|LbHgDty%6(j2HqFmOhN zttKWed{Pg-GaDv{2q%FsirVI#b9- zTI}G(3x%WD?r>E3005@@SzoWO>sU=*Sao;$7y_2AP&a)(8V>Jrl1kXOipDW?#H&+O z=jX)4TpI(l83F0cFIGV$; z{XX)yhO_;|@dR)qgL@me&3-W~sx9e(A@_EeOo5B3Vl!3Q?F#IVuCzfEa{b5fJpkwCh0#hL)-&{rFO6=Gv}ph6$9)rDOCMWQW-3EkU>0!3eCbS zYEKYU{JD)aJAV%gSc}p#r>T@bIeYw3b9qCyy?kOduqG+tt=dH~a+oTWm9eewCX5<~NuTZj-K{#!TJXJBdkqDW{ zRV6(2EdaFeFQpda%`H)@GM?E{2C0|Cg|p1(S#4>Z(~*T!OK2pI?)O@ivB5Sq_zw&; zmJ*K(af+_gHo;g#T#rUs<6bw~$*fp>w#d}o_50Zw>zq(|fr27ph@_>fr`Z0Hy;jP}MbjZyBq4B;00X|&6x@p2k2%zuL z%829OOCf`2~!uB$Lir*R%TQf55s zILQC2wv z%Y7^>#K-w#k?^4Ze28=VIF}_=O4OOU>M%?11W)}?_#v$idif2B0200QAA4F_sS7v) z_7A7?|M@~=WoG*iyz>Xg%3*`!sRJ_1s~Z$Wg78R zx5S*l=3d(4w=Ha49I?-}(%*|4NkX{os}!rwS!Mb7CI=L)Zk#fvhG9_7$0fm-VKy60akQz`g+`cc7}UL#O* z4vo6(FU5uPzjTd=>j~Pw)-%)FW7#b?ESSs2WzD<~*k6>oXcNHcnMkZ-wfaD21J4UL zGs4e2{0{4MLWO9%4s-01-lJ>V$n3*Y4n$H{F2Db<1jt%NTB}Vu&*^9r9QV0xv-7bK zx;N8bjw+fdFBgmBN8>9NfX90_`Y`BwghnSSQCNE+A-B(7C=bArPgSHi;hD4O7_U9H z)EAkh@R1E*s! zP+7m1jW|tbZFhta(n-Al+Y_6cYO}W5&GlX>0&v5_e?hTE@hi5(t+tb37?CI-Kn9d3 z6X+62ayzbQlpYgHgZjl0Y_3L@*+#kS&n>Umxlm$jD+i{m7_oIGTfFX07wUGjI9<>F zZ2h9s$XMW2!)v}<(THF|D|nD8&m*V_Us^c_R@R+O7nPV6Siy&px$MR}q*btHJv!cc z0RuIUq~HHq*7wF6{_L_f_^l)W!Ap|jcb3}_K2A2#9h>d^W*8Pm0(pg3EqB%T!66|= z+j0w`5VMYqFYFoNFji=u@APes&U*`5$aQe21F-?r)v*7H9UcwrigcsOc1yl2E2jE60WTC2z zgft~)qv?S7Nd(Bl5ZI4wcjU#ec9D9^@(p@$p>c-IV&~pHSz16N#qL?>bmxR1+rFRg zDpA3ZfVdn}WB7;56EoSDXGs86MWZkyqF|p7PzS*T zg|q%jRb1T%!Up~rehr&8S4nm%_fgN);#;!T-6*k5(*sO2Dk&B&Qh42%cOm!vb9PCq zG|cHb+V=8FV}OsORrqRm+stz&FM_d`i)v;~i-4hv;84B@7&-5E2F&ME=%~~v?>hCx zMjl?1va3{9$m)deMlGW2@I#|w%h&JI<`=+F?}2~CK=G2DKQ75CJq0d z=@IH=6kJ@|FD-69E1_hh&a~EKyEi=id0g!6uN<4#OkAq&b^~&4y zq=(?qI8nIugwn?YJtpNqQ!YRP5It?tF1Tj5HM&6`e9b}n!+aLtSB6yNa}2|-8P!(6 zZ5;f`s{dY{2$!moP%S$FCbq0n*HIp2qG4Ya!n_>ligEX zqMr`@pm-5-0e9*bwO(6^q2^Dtz4pni1{q<7LAE`DDoIoI8yTi&Zji&Tv70A9!{2i9 zP6*cX3Qo23vcOh~DwW%br$AV{Il`ZsAvDPdYT1nSvAtfNt)Ktk0y!z$1^UFtMT+XL zSfIyT4|skzeBoTx>r%Qwj2?~z`w=J9j}G8zM}QMV17cu)8x91gM6HRa=yB^ zvK`hE5+ODClo$Cl11lS)$xHe)Z<+oG(BU$jn6%3`XmLazCUz`95f_9^sW%yS9zps7 zh$f*%0kgzkP>!4OrO2>CSI2!0!Eopj1^{ggBP`%zA?IAw+>I%?nzi@}%_~^wlCVyy z@y5f#JZRNprm1@SJ1WG&M~KSo_76tVg3nQm%Iyo0fH2#E6Ah>YfzX`{v zQf_ZY5jo-);svl*JGq-kLl95LMXHJ^QQSjW`S^;1>IPTWDO3w#g&cG99i!5!hwGqD zpdiu*W;ao*zpEA!9rPB8*hZkE6k3-Q0Bz!)y7g&{nJx-1(Rj~!U}$vtfPqphN)eAq zu=(P}-sTJ+gXKLlPts$=-ggMZ>3C_I&WNm>Cdw+%Mk)qewcpJD9gYc(@;G`VHQc6u zW^+L#(;u%WO>Wb+>P;3r2?}1qD-g=&k0eh%mNoH-KZZ_SE_;t4`y4&hEHj!mfbxyH zqZF7X)bVdYghggB0=A8h_A5+n78j>A)j^cG#yuw1Y>+C;qtN9-sr7Ucb1QIs)!%)5 zRKAuR9XIVafC43oD~K+A`MdS#A(<7t@*;KI07cvAj*<|N zulj3lt#pcsE(89Ao7dMDe#)6WauP)@q@Ei9iFF1U^5F3opVCY8MaO$y*6A{Cp18?0F@tp7f#Ms zPG9b8iO}GM6N?MXJIeuInzKt!m1R*2UaUu-TWYN}&mB6n<@slyl8cUk-Ce75Wi_XP z2xxbfn8(hmva#p}L2b_XAL~~;MlRFOi2Pfs_-*yS1C~+H{px@3)C7!M!8cPC@Oj9+ z<)X67if*smFLQq=321*20aD2NXx9;odc+Ua);wimeuZe_*qTDdubFSUo%;X z$w%9p@>nVz_ro%oPk6-m-0E)2BLL3N)Op5AsH6~ze6vZ!uZiwT014T|}vPbkn zNTT)|Pz=RyJObJKVt3$$W$Uv4AhV{U$YEK%#7hPI5PAH1;ByANfERy*;{uto#cevi zm&3!0Z~Z#bUq}+@UltRLJ>pd`rLXGjdYkiw<|#;(-j7cgWsOvmXe9l4%O5>VM8-^w zXdpP*a8PD&8N(Hy8e@xm>AyL2N<=Ft?@Y;VpQs{&mc=)<{&L8fI?kn1rY!7P{^eId zJ*@wb^3diCWfrb_fKgfi+4_cj+1xDs&!__k+s{n+889j+Gds(F6-Sp^Kj9}FNPf?? zvqf-Xx?7U#Xi{_b@qB3T4dMie`SG>Q$bWL)EE56SyGn`FQTo>jV0{#thVHiTVT5BD z4iaor46K>__)PI^CK04Y!Ls+rUN}4L3|Gx5})=Uwap;=o5Yh@cO+5_vJty z;s@8QQGKiJ2^pjcE`S`pNfu&m<)!8%eYu9^*X^vKJ7-NO;=4vi`Hj2lQOBU# z4*jd`X2>mpw35-IFh&u-cnpKE@u$+LTB$G-zQ*2z$k#?=&;Wxt@TfbUy+-8u&kZ8n zuqHgJuo7)(Q&{PJvp)Nm4I(au?c*>IxMgBYo^i42RLfMY&_p}Q*6Uo4yvTekvUDDL zaX_RX&F8Ik-A2uFMl{4|7Xl;4^gv=z}E z^W`W^(bnTZ=WF=J(U?-tgI3_hdW5<8$K)iBNdY&C%BEUTw#Er&^bOTRi`qXobWzw4 z&UmYJQr5};c+GZr>r4D)an`3wDpRE~l;6h_O6~Gg6yUswMAjDe0h{6L~C06MdHXAQ2a!dv#<>! zKx7A7IJNfc6V9Mgr-w3kZMSETr$fJ)1Twi9KcyyDuWkKf(OP=1V`*s<2dYVU!1iYTF7sdCZK-A+p#+j1ky5&Z_3g4XQ+c8! z-c3Xl=gm_-ggn0xML16QE$Dm6-Bl_xmb3Ke-xNxh$MnUes5!)Zkvwp_(HsaIKb@IJ zu5$7wK=pDNZqi=ej;F?8g`W@BhM(<-a9+W*!eH3z^#1hg$>~d#Q6-9?@lnHsXG$p}JC0l=kk$T;!l}(OxeaV+uaF z$CAtIr{XtQd<0wJ0$3>%k`bQ(sR7KWJ@wohWMM`-g-pG)^6_a@m{iY3J9pno3hURn zg2bMNU5-j_T1>hBQ0fC13Fy=5accf4*8@B-EY%yC*wEy=TC$m*$*=eb&it59_7T&4 z_2y+o*+(1vc zAMl7+Gt&j<8#>(mdbk(a&OkKz2ZHofi^lu1B?qsKhv}}g4i-N!3fJT3H5LG#n@uxq ze&=*2?b-738x)^}(*q{0&;=X?l$DF?za~}=uK#7%*#FZ)`@c-Am!K}@wlhO&!Gk4M z3EJq$G;?V(Z=eR+$LS7(A!R;H2&X=4$4leU~?!EwPU zpdhVaE*~1FPcX$+1OWzQ;U>PEKA%`>M-<-Rpcn$ALKo$i=QvL{YMlkklJz^$JhnUO zYAQ!)-2jIxb{_R<;7)Ayl)gDkaz5p{7Y*o8e4TV4I+v&%d3{2N$7xnTeKY%c#R2eV2TZ^4N1VdCU(ZK9TU>Z2`L*0ZWkQBt*hD!(uxu@0Dmt^ zjJcE?(lo#~Af702pB_@o@g#m2TNfHx-7GX2ErT#bvMo0Ql*t$iz!g3bK@TycjnUm5V}8Fb?(Bl<*uu#BcKy1%wme_2 zT|(Tcx@LMB0pt048y*69kc)++0bdGVXbYj3tUmDWIAEENx;dO-2h<`(^Ubct$h%2E z$KWD|kboZ4LBPwKYi1%!Eq`kN+2M%r>1e~ftS~4%`TM}fcw}KC1WDy zbPx1{=Vw9E!nW)Cw&KWbch$2{?*j*yV)k@?n0Pg5eT>;8Lp(oU=jvC-J*B#=Kn{#_ z7d;aH=)!K{xq#5+z`HhW5kOrV#uB$7%~E-UJAK(mh(FR z>xXqSiBD}pQyjR`D=@LtS=W0px|Hq5qxZ?pzp{#rQ3@$}f9lPCDc>XT+ZeE&J$e6n=rQl=!;`1m z6)kzbJbyb@)p&ai*jj%)T%Y)TY@snyR^=f4aNeduKS!Y{M;}B>Q4nr|y^*wdljefo zr0^A4b=a9uhI>HgWVhwYzPv63##97sxs5<4Z9?P5tJEYR*MLCOTrQ2@t7}3LW>te` zhw{aD^Y_sy#d1Fu@uNb(ixSJ|xKe>h4G&}ydK%^O-vMYD055AEdx70NI#s~2s($a^ zKIp(yg{PIKlf%@ohvAj-&?)yue4!pz>ygs%ZN(lH6r3pYasz%jhsB#_VOhypw8)52 zT8?lpcPZh*kf2xWCeL31{&C~I2HBHu$MW5)kGX>3hsC05y>*|>CyE)f`H^K(4Y;OoNw>zhYKu;bYQrG-$} zPA&0a`mv552RrR@`9=$UEXYCQ$K}z#?u^_WSiG?3N%-5N?Y^I{j_p&b!?OTVv5g=s z<^z5OTBS8d<;p`GkM*3ro>_Axs!*J3?Ewk@O8EASV{$%r zmKHF6l%e$Wc(LR4HEPCKu-%ze&L3|havzVu`oG@nU6duUG40->j*zZNh*(TguLQcv zS&0tzC348BuPA)Dt|Ua6Lr($Prhy1!r^86g3^!WT29VPzUQAk`)56vk?^`y;P#s=S}(HX)g#OCpyp6I_dwOA7bW z*6`VYbn-^hvH!i?f!edbDUCYzH9d*44x{6cQXTyq_zr3}^Uc5-w8BJVB+_{HB~5zDpg#CeN0_%Y3DJLo|Qm!U*P@J(Au5(SR2?*3jzg zpI~uZGGpQ1_jB)ne_V6zVH?;kKeDw;5(;gxZTU7< z6#L))!h`Mny8`MhL!c8aui>`1iFUs+SC@MJ*hc*xZFxaynCc0(jS5S!yTvxs`66ET zNU`%mTun6)X&E|BvLgupYc1`PE^na&jL!FIDxKOYduI>WVEjDl;NvQMASM!j2`&W5 zR-}q(8cMfQmN>DDNjA$^!>CGLl#`K?O?BEFB~$$V+82Zx*FXjN;(w4-+Fpn|!Jm)< z@7wo5_jf+**xqZkmd`1GGD|eju6Ap$7%t!}BT;S7k@|EIYi1ar@|K&h&S>?-g_2bv z@v0Y{^6>)5mshb{)_`F9alo%&l-CE9+n05AuSIJrD|nn)>=QrtgN;%YShk3^$cqT3 z%oS7S4I>ApRs4!7|l{(qM)jks@)EM?$r0=l@35>soR`wlVnJUmt=-PqlbVPRZ?|IwAtH`4QD})C|hfDAWy&qlbS>C zmYD#AXIg)8={{a+3jHiISGKPvh2RbF{os}oA}mI9^87Z%$A4kg>aa1BN;!Ol`t`>D zxk~mLEFYd>v9M8vDNSvtXA4JyqR}ioG*I0`Clv75ye2F%*m~K*#r!wW&ps9?~+G4%4j`!&3w#?D@lqL4p&$bfe-he{3|dQ9ZVT@s_ZJ zLCj;rnaQ0L?9_;`=aBl~ziVHE=G;^tP>U-{#R9y<x3 zfeC%u*j^)DZ=uw{Q3Ipd_wOLaY2wke1*BPN1bJ&Rs#(jAWK-L8AMdE&))O(EhPLKaRy`@vD#L%#~j zSmGnE-NX>?t;cR9WX+J~$_t{-Ts3{8U8BWnldRGE@H)U`BbedsAVL979t{9rC`cP& z&;naNnd?Ex{UJ;^rbu^|uo=-t7zfBErm6*#MIz4ZY#AO&BYM@BYM zs%@chs2s%Htcj?q&Ode}s)utthEC4Wg0#mmgGfv!C*ymhX?TKb<$&#^BL?ZYRXYKy zmGES=mwX+$qNfL;xbO|~_4Bz7`&-VRgzeej@(@6`=dub+ zGNnJ!aLm=-Ejb5y_}{4&R8H99#U}9UK!o{Hx|beTOpESrTB{6Gl}rX4hhfCp>UL9w z_N(OcN*^6OHD{%G{P)vM*i)tCewbXDT(}&$59K$$?iY3gea6W7FwQe4zpIm4#w|(? z3TCWe-c@%d@@)X|v>oh3=Yh)Hfh1UlmbRt0Pk795Sq2FDV>wm5al)HL zg4T`1nvF@C{8xj(;Pmmj9r$^vYh9j%cYiz6ubVW_Z9<)nsIaizcbhkB=45-UK$b0S6;B|S?b25O8Ie%L<6 zYY8<{Ynsph0i!@%zw=N>`O@d@fE_mx1>>laQojQwbhmBw_ z0U}MF!Hd8EOJEQtFbESEgy9AOp7?N6A7@A0){a;a{#vnnb$8M0jsA8P{VN;t3#pj_ zFFIbHoL{7a33UI2Yu9IH@D2wp2g>-Ab1`^+^7Bc`toDff<0<`98{E48%dS!0A7R1* z-Yxi|mxBI0{rCx_sM}E)6IpwWEm8plOE|x$`J$ZT#hVhzv(=b&H_%ynpoC>cwblNA z`fN78DhQJnhxYzI9|B03m!We76c;i%ATS_rVrmLJJPI#NWo~D5Xdp8)HNfW2ZxM@;flgZeg8y-cS*ixcGQg^v}^545J00qi- zvMzCF(vD_UAP6iL!0xlyCB*D{CT3rrNuXjTXGYCTV&YuLS-C#@=`5DYN`4s>>6P!| zDxQ9|mb1^>v+v;NU(JEtJmB})#edn;7e>$WIL}lzyI9T=t>V4(GO6T=Wj2*J`-*c{QuJzDh*_mu@ISG9~oy_&aym@wN7UjYkv^;f@PG^ za@RCi5>ZoMbwzi_)gU>H0u#3(Q^!!INo`6y;Et zJ&VK3Bya^ybaS3&QBgO=RpTa6Z}@*$`G$Qp46q^b`CMxieYNEGo2rBjsrnx0X_M#) zS8uzPmb`V%cxY(pMsMnW;eWW*ktNZ&jb&=4Q|RmUwyBqQr>w_ZtBg3zC1_WguvV4D zhIPQ{1V8NhYT;C^W%cQ*+pZqm>+7~?`boEC>$UEuUDe%|<=WDW{VQ^ifj#XbTmGK+O)r`_(_{;t2g zsk#%bD3Cx}6>F1E`K<~v3>A610_0G6G*sQPD4mI*HPmZ>mw#@wv4^ErxrqgWYdA{N z+^m0{&`F9&m`>R}gH=vNbd6h;N7W{%fMd zp`nlchE?H4S$~uBbl%C?x?@)K4i9BixX}ye(s166Q|tZRuphbtpZ zY`y6|RxvXbn@qzSf^~9BI(mUVsC8;q{ak>zsN5!%fQTR&tYOC$?og2cfHn;s6mCZt z-$RB2^Luon_r2Y4?WUSv@fHRuv21spuLcEK!0`REdw-T?4z_P?2F}XHY2uDR<@r2U zQAhNS=#uCTC^%6n12rZ^m6l1CM(^NXq_|xsp<0uw=r#O_ND_Su4YWWQU=wg$$-#N%lxs?&9RYPs>{Dp2}M) zS5!u>!bX20HJ+oYPJ-IhvDyGj<*gs2-WjA&DGR`|M2!B+ zfYXm$nN*lq%Vf&RAp@-pYecZC5Y%c72qawA;{nh}6!^9gq)wIWaiF2We`@0}<6}TZ zL2$4jI9O0w|1Ke;paB;F)xQxk_J96Z1&56ZWYFmXwLytk$SFK5X*qTQ$}-|!Qn{z{ zmdX{COFWv;u@fif!3S8X(~t(DSgEE^lUUT`Nxl;dsbJGOaKIwMbYHt`7A{V0`j*@8 z5db@vWs51jenm)tnS)i=?ygrZJoba^ddKx>OqnPUFi}%M0UvIv%WYS0hJVM-JFzxa zHlOli)8!n;nuX$IApp=5H^tq+FDUMV3ZFz><09=!T&302>_KSs&za&u)?wF(09MePGFj^qM#mBObYOv zc}MI&dHVlNOIVRkV_-xzmz_MCfR|R%2e-)}r=nIUtP*LQW+R@q;G&q<2x{S$vq z-%fxo0$LI6h+;gT6OISWDJcZYIBt=>rJaJjQs zrw7s1htoFXS$|HAoWw!oBy$bOkWZ2{3X?RuW*9#@`3TDAJC0#A@J&QE~ z)J8ZLousiAcFG8C(BEiL&c`H&F(}PVd0h#hnH-~a@P9sreBrf`@&3n%)kWjKMH1RW z4S(gQ6#!QO)6MB~6$Nn$aN4Gn<;K5>KYPaG zUHBVQOS*~D(AVMp_f2J-Fy!{R;+exsx~=rmP1@Y(yE zI|t46dP_HM@D%Wj|6UCpEgP2SpYZ=hyM0;RRE>K&@#;#D6I40KDZ$btoEYrE-GIf8 zzxgY7q2Qrphc>YRZJF@+6|y9NB{t2ce8PBMd4FpLfwsl4;u2}RVvUEtuV4M`8!n;# zG`@K-rN!ZmmK@?@0j4e#pH6UGXL)l_As!S9Kc2&x1o!9Y4LUeC<@uBwUE#X?XWwof zyFbDJzUnDAXEb=Q!(I2%1t?BZQ&tE|h%fkG;Gdy90$yIkR02MCbak%n7EjQ?5_fc^ z9)DHg(;)bS3tC|w4Ij$3g8?}U(V_+WMa`zGYGGc+C7T(Xu)Rx$^Gzox1nFO{03&7A z-QZL6S0n!0{Z8N_fcO7m6!bV-hFa^q1H>V_ZsR{x05Iak3>To>H)_Fu{_2){>e{t` zeQ>|dErBsHY?OyEnv!*ZBoI^&grWv zK6-xbZeWHwpD=`1BSV}i=B(gI7v!vj%UR)94Z3iah50F+`+#LFymR~dt(YyKnsg=4X1CO6J;VE9V%E%FoqcyEVv`~x{QHt`>1OE++(=87 zX-+H66vAxo@s%&mf*&(Mt2|cunCw#ShFlVTSu|};7pCy`=%$?F`E+QA(hN9|)N}b3 zzt6Xg}zM& zVpe>K(h3aNt6hg;SkY|7&=!RvQ?XXrawR!I5OlwNcRW&&95+du048}n9`AieCDBEc zM9)t+{3a2PjEIahEKhh;ZcaX(FfKAqo0F;A3P(KP$%_q-erZo$!GG9V0=eac-cM&I zPo5bSPzI!t_Xinb?t^`UIGBMP18F5y>ue} z`?p_S5?^+U{0{X{+y48-QYjPv2Y;9A6-eD2;2@D}qOdNSigrnQ5$`}^6Sv(!OB9$8 z3IcfQ^_G_Xu=>!n7j^j**E&8w!~z9H{6Gy^%CcOL8s-FKT+-kO=(ybvv_3@ZA3z(; z#h;Q@?RI}fFckSIvBeUu4_HexmZXwcyQ46X$JM@RXyz0K`#a|%q%Z(`g*g{<0Ax|- zq%c^{1cCKAAwPgs(#FGhq=|5C7LV&g%>E7Hv@VxTnPc4O@qeYE{uO6?`Zz6=q4a>Bg zk-4g!34xb2WPv=sL@Qfje+X<22)riST2zu2E~04nhOk5QkXZoZrkE|?^7p3%IHv;+ zE)o8j0Lvdd!7>~?7B7(Ga&3tFK+}hSq7YCcO&OmOymD%8W=O=}7&f=G&c6UBznks& zTZn&i37q@jn{x61ho1@V^f^zUSvs-fk_%=elmVWxOyrc@-wB=^9GW{2okV7ri$4~nLSqL~O^EimaSt|?A&LcDR$n+d!DV2MK-U(|mj z|CXQyL80<%3!EmqpWD6R08WwjXKPw_vfg>qFdb{n0tjJu(GjLg`m& zPAuHqP*`kO)wVSK{P~dyJ`aSsR?vS_@i}FNd6tKwW8&VHVDB~*sauzGOKN=#bvOp3 z=?9v%KD+PWaA!+6U!zBR^s4PwCC=F_1&QlVN zE(2{Ji?!29=KPTfK6>C>`a2}l(w$c&<%gUxb{n` ztzs;o!HICwH`AVjHgNEBcfA|h=1bw9awbDZR_(VX$_WRJjGg|CfGpGks~rJ}SC~wA z1v_Y?yd7YxYWLl+ro&TTFun~o)a}CHeE~142>)Fol8{zGV_jFTY!5(=3IUr>6$0p2 z^{}4xAiXg7lE!8ds|w z6dbq@=Uh;^d1rS`QTqPzPKJ>w6QNn!_x^>~*Ms#>22!Ys`~5kvI4OT=ejhBhCJZoF z-TCuJf(;blT4w4`d=3Aj9c*}d7Q+!^DGfSJLx1wvmR3N@6JuB7IrXo`%)c7t_-YJM zAmtJHity@1Pj;0U)X@9)Q`r>#=*@^6UQOdEh&7skmkwQB4&ibz;azDZ^fwZ+^09X8 z5n@B(GN}rusX0ccV}^gvTPHA;f6;D=(Nloyrf&&+n|om4{Z5L}*fMsndJ(_*&Z}vX zzmA1mW`Kw6tIepO>6779y{)xQN*=jTB=*(q&SNXwFypg)z$daJN-g>S2=$;i15k94kf!Uzj5ea zpw!RKd_#g8o90Y|d(FwY1ccs``X&!KHZ}?`Ol59obZ8(m zF)@>&QYnA!T3d4y#}a<`uh_?P>J&ToTNRb65Q4)Y5XvSAf#N~Pi>*YK97!f5zy5sP zJu9t1;60%TFBGWV+tbt2)3@na$@o+n-58&B<30T~P0sY!Hpb!O38YAr&^SR-;}i4d zCYV4-X+k6^MK@80BOs=Ufho3$g?Nf$@g|2qW{Sk7EvKj5rg;tx@7`8nON&jn z*sLi*Bh5cjC*68^y_$AwNm`~o?9OJBJIgoCb5c5@!lYtfV4=whv!yH%etwSjp#~e+YV8n6EzO)u`H;&oG zHjXuh^{ugEnPFzi$x+M!mh*9>F;G`pRKk(W*q;q)Br|lz>2w1#Dv%G*SC8DB54lAR zAIamt%L`H{>av^Xk9GJD&mv0?0- zZmk*VJZDlH$CefcGou+B$82F{I!bT!w6$S;2wR(4bW|gmjc=(R8po_{tMf=3qrGdX zp}KK%#`zKP-b+O?Cp)qX8md-lWX!*}FF3&a-oD@f?|b`#LkH96>I;7i&fI9+=k5}M zE$?&*)c^k7E`crsqq>BBMru_Ha{dOs!7-N)McE}0k_^Z=y0=ClX6?eERWlLOZU}JRhjlG&R%80MbY`bFrokT z!F-OwB&+ThCSU%3VG8=j!t~GB_mi7+2bxA*oxi$Toxg0JZ+D{ZcCTmC?&SE+3ljC* z>E7A1&5KX@NM+kJAB5lvMYmM73FaJHUtw^jwe%7Qywr!AJ$irTw74SlJjQ`8u<{H> z9kRQZCZit%MUFsOWe9`DaaHjIo`T@B;7mwy@bK=FwQa=Bm-ppR)hnmVL=U*2(5p(? zV~jLfk|jCJQzf&6ilZ#WYC~D2uFDWdi`gU4<<;#OqvE&@#LBa0Di-Xa!ah!gIPLLN zV+%cMz-lCMow$E`z%M)=EiyT+w*)L%v9Oytw33gSKf9-D?JaF+3!>V< zWlKCIo*h_@0vYk`#$oGMF*R6AreAqT zu9{w!;Am8GtspULhG{Fec+U;YKo712c59J}$$aLhTCl8OxHfp!Wq{Kwz$g}Bs%4EV z&-W}*D5>mb?zjay-kZx@5u;QosYKkIGF@$wYryw!lKKohzgl@ea2Rk8>;x zXoAVP<_uZgd-8xl;uwxqjTon~v7b7dp~xG;;JMKh3OrA3Xy(?F>`W&wHK}|KSUQu6 zrgpi&W}f{V*pdZ}E&N%?a@16ki|Ih-lASU!3XY2w1p%8V6Gx_oP!=|ZJyf+|m^7V+ zyFGtbjP((Yp3>W0PLzt%+gMnhbfeiqt@dDQ)Tus;FY3H4FO7RXi+y0op4p9wl?bCx zs23McuTJVmbghtoH=wEQacrZS@DjA_-XVMDLLhLL;125K0adWQ0`i%POQj&tYf<2$ zlGyLH1W0qkK2Q9Ox}+CJ3D1rwk%iNZ0T;Se`F&Jj1LXfj%>F5?2L7Wy6i5LK4@K>DtQ zejmX-Asg;vpvV!J3TNB^Qm;kds|Jes%vCz`Eiv@HCtcPP?H+qel{4Yu3ER*wb2xwT zssEH48+EOjuegytRY-2&OR3;7aP}F_dq~oe-One6oIX_xhBot6JM($KyAiyeIb8pF zXTDI%1mtSw?+*8IXMArHrdm%oQk$3pJzS+^gr%!ILwO{?yqF>%lDNLA?NzJCaoW zA>^Y{8k@*1jFiASDkTV-hh75L<&ZVMLrUAZ6%M2cz9&u2b;gaZUEfZXDDQx{KJck6 z7~cVfqZ)%K)q9nr)1`qTcBe-`kN(3w2acBxUIDG z@hMUVw|faq?{e>U>*;ECwOOv@-R`5wB}R^aIzIX3*?+!&c(S~lER4Q&XE{Fu!+dhS zZoF{b;WyH^=!ZAAEdAn;x&vbz!cKj?p3e*K1!P=IR`mY&U+QahM}4F2s&CbI>c0A3Jys{` zR6S8Ysh`y^YNB4MsX9}g;>qfjdNsrU*PVK`yk4nub)hc)yt?QXYNmcub9Jc}YB5`M zYN?ihSL%1QQfsyDUW0#Sqc#_-u2Y*omg-u)R)45B>QD8T`m0+l|1CDSH-p|LBt3lp zev@&3{_*s|v*UqrPrCE#`DFDT`#Mebr5{St?;MRyJNxRPb@k4+`aOn?Wnfol4%_vf zI%eDcS3Q7zAF4;{hpm-=WII2FrJuppll62q+sx)?9nAi6HJN{Q^X}C~uoc^%(BHbv zmJGZOT+ip-2ELju=gS4)<>h4Hw{CGZSznO*=s#TeYQFR2ym#jLs+(-O)zGQG9(L;$ zeN)0(FeW-&LCNKrx|(0F;rHLKmz(bF<(#?t2Vvx=9bJeLCzmtXfJDrC_C~Ger1^gA zTrbYL)q1*Ibss$rBm4h^(bMBc4}SQ$52N_uD5BrZB8oDy)N>StL6+wIEY0JxG`sf( z(=Ox4{A87_HQw5>?|1w^&r-H*m!We76qf@12NSoOp9J1;mjeh06Sv571(`yZVGjrs zm)p4q5d<bu)8-UjAFGJPI4a{V2=Jpl_f~;*pK)SaQ2`6W7 zS6gcv@Sh$WOiX_|{izmb2FROP*gJW;+1molK$ZY`W+i5TvXkeV(-uJM1Ok`?ZOk03 z08Ul_O`tA7OG8Rs10bWWqNS=q$NYcRSi{}f*~#^Put;cVYRNDHB*m09r2s%}Mu3c# zhUTA7O(5tEzcnL3S@SLaXU<#VpK>KBO)*V9RVg->KWhN60X%@NZnl5M{s%VdH)Mc+ zLVGKb2YXE@O1`KxQXJPU5^klYncLOs!xmq(jJN$)D)5g{f;OXRQ4|sojx&j@5 ze-YyjvV5ZxYy-q-;#gT26iW&i0XCaK5|;AQ0ou<>yMSl>h{1+tWI za&&w{?S}M+K1tg*p1@A7-Yow|*Y+SMPmu5b^;_A3EUo@9Z|UyLq6L4lb#VvEN&Zjv zn+xfmK5HNtzzP7m0DxW=HY|U}{iT*aZni(}HyZqXot>NkR%Q-vKz~~+;M)Vq*UiiW z2mrgf1O0vfHSq5i5*rV|($)g}CiJ(%g7jB+IgphTfbVbj8Z-RfI{r_{${$rN3yMu$WnIn+)KPmmsJTpgI2k(E&{ErMB;2*5C z%1*A1W)A-mvvrfU^#WR|+JY@?{wDTszZ}@?P5WXXYX{)lru^m7`g5Ed-gNtR_t^fq zx&TaUJY4?~dy}MvJqYOL2H@oUD+GL_;XeSsasLM{fJIYHN>YDDp5gy!=C3paas6#^09fSy*W%*=u$cYR;sdZ){IB%}o5kWy^Z$&qv2p=eZ2!gN1+X~$(_~`> zuz>!>e4Fd^&u)L*02XJUtF4pezhu0%bNkEucV1Ng+zWq6p7ozZ{m+H@m#qPIb+QNQ z*jm2*So}+hk{Q_5*2{qPO|NWk{RkT_>sfy~&-Uq^s{@wTGRFHJ!sVGBNbu{!yTmxN0kIYOZ>B{Nxa0D0&i#GZhc(7F zSiBqvBv6W({1{A$(#R|Bwa5C18jena`7kg;Y2_L?+UK(fM**HN82e7=BY;ZX5;U_t ziJ#cj7@efg*>UU&>+@%oh{Lp+Wn z-4X#g-N?+oqxfK?0X++x^%kd2jUTbazP|PeTQ}Tg%;wrmnsBS*Nxzh`yq6)CZLNP2 z!v$MwZ&z#_B806e5r0W|{vx%F93%+N7K3lP1Cxk7Dcxp{ zI!s-Gt3-OZGKbdb1f16U>SIPoT+@Gm@*>`2P<6jI0&fFYliln*-2Y~4d%B`>0gGx9 zg+Nh)o?`_$ZH(JSKN5zQj)BP)o#nqLRCVnlNszte$o+le!@~Th3W)$vU=HLWw>9w< z#aiMnemo9r>kpRID{EruV6g;?XhR|&akp(g8(tg*JxjlO$1*Tuk$2JNHN=0r7vj+r zA~Z6O52;P^&!~cj^w9b5)a?oOPH?1e!C8ErU_XhL9}jc}p1k939+?3IiLe=+l0O5U z8yM8+@uW(^u;|!Kr8JB?0PL?V9__6vCY0IpH=L2bh1emj&}dA-?Cz3t?0Kh&L@K-)a>o)|f1_fN zS*GrqM6Y4k&mE>eM}(88^17h%#GHMPaeOj0+@z3NL{+w>)r{%Y3i<&FjdTXM(wKYit4b}{J62CJ8zYm zO|ew&{R125>-Fhu<^|Xf$07C|S#G=D)r6y8or-+9RnGf;SDgN%m8=+{(J=+;+5L82 zZxZQs=&6h6@af9z13G`kf^wf;`FEj0YocBURFBYt(z!U@q{A4*YM^=A$3`#UYkyer z$j1MY z3Z#uV!HGj0mHfeZez(`5vzMX>@XMUi{|<(>|1Q_tj$3St70FllgRa(#IzBFhiiZZC zNz7S7{U>J1?51_L!%ARKK)KNl;0)Po4R@utg^J1g3;sZfo~nC)aH1XlL?1vK)sykv z%Qt#Qj0}HsaZh=)%y|FdOu)3Zzz~#_P~RpW1{02S>ZW-=Uh@48R=5aw$X$x02P+s8omNXLID7%c!6x~8=_FcRX6ed{EltC^}k zg>n7t$rFO|TDp2KqZZiT=Nf~^4t}2QP=mN>_G@@p>)g@x4rzSkZsP-x_Eg_gOF3ML$a_D72Ji=tPc+R1Yc2 zz5I;Hstp8V*jRqC7j803|MnVXh&sA6e*!Hij_r{E&Bt4=x7h2nIYOb?NDQ#&$&~HY zJ8o^{S90yuKOp52fBTFcH=2Z(uPw52m|M_=ZrvbN2GojxqKL-Zb$+!^DVDeqJtBXG z5eXA7)~{#QbYuv#~eEgeBrk1UB{<#N9}`m7p6tYmKV)LMw3>L z67h1y|K+iWzMzd95IzK;x+Ies9$omJ#nZr{J+HA$P>r4+*3AYHG#M6Fp-ZE5Sz5&2 zq`^;#CZzZ1ty`1RAP|b-f`%CImRwaY3n^Gc4*CkQ_H~;Gcmtx7% zDyRN=vT0XYb0_x2h<4(Wb7f^@URPi%3sq_9R*6x=?}rW*^psj948=$sl9Sv9dmfj| z1_F2<@BmWutTs_o1n=yeeC4%n)oW^pwtPeM^y0!Xtf%nM~^O}Kzgre8PU9XIgy3PhGm zXd=Pq;@6I!R6+DGN@73!3t(;@y|e@reUJ~fLI(EN`OVB}v&tqvwsm?=OHmzR@LZ!j z)aS_3x9CTHN@Aeh?+by)o&AI!qkaT8BP{)0=VzbCJPvm8w^SYlqCkK7GVUEHcj12B zHk06w>+?Vwr&^-It~NlEI_Q%m8r%ftYb3`$h)1$k>Rn_mHnX7i&d`~HQ#*O zN>|7E1HNVihq$I$2VsVwyrbR#OFXG+mrP}-3({92!MrDJHZ55}lGWwNe#mP%92Fuv zme=N{LcT0<@kCq_+OU6nM*RLtmu5s;x}U4lVm;Neab-fGCbxL+r5QUq8Lf=sE7ZVP zJXFoY?zcy4_GcBo*T?TN^*>q>BqG98N-k}cx?NJLIU%PHij#&9ZIz>XrBt!w;FIlD zRHUhk;bcm(tB0~G{a%xvuC+E5?6#60J&pJd#gCT$H)^J=C+Q-rj)&(&F zxfrWAyB~^J3KY;%Aj$+PFvDP;xXFEW;PT%`+{|gXExKV6t*RvuQ+5Rk+3_c@@N0l~XCz8$?)0E&7zk^^?tqj3(`)x(Jt9>wtYN zVgdZtDAUr?M#x@mS$$}y?$%iGl^AeZ5_MvPH;AnJ^};o*4f&AOid6xJscb@>NVZ&z z7NXzcRN_V^B%|o>QmNyr=GR;?%uX!Ww+}QznRn*+HK)dJtSz7JYSvm&1(38fpD=LN zgdQ+RIPyx zgVJ-sd#uWXGn?i#U^Zso=Tl+M=Gi;0mv>j=t{KFEA8;O2K>^*UzodtPTzboE&WWj$dT+aJd62Ls*A;gPCy8U3L?k6w< zTtc~SgYfK*#g)sLgn)Cw6PBH?MDlNy@YfAkKbm!4jvT@)=?`!BYKIWU3ppy5Rf*O} zonI%)b9YO1dbK~4eJ}TT)|6)Ntb!02WPyUxd4L&NfA*lfExz5Me#MJ`j!53>`E-R$ zwRL|N@qTF6JVq#)gb{L^?Hkk&IMP``c(o|UZBjzRf+(CbN4zV2qFDbDmRWEKqiS0b z!)IYlI;@V!%D(p3>95zS1fJ2Ul8pA1rnTEvoNT5XTooH~EBPKdOT3!8r`$*_`zI|K z7Pg(?ZHI3BhAtG7)Kl<)L-!##InE~yWUhbOWUX`P8E~~u&5}a%(^w!Wb$HIOnJ(ZX z3tw!qyg>#mTm(~f!i#KbM}5GkifzM~kxChoGXELYBVsssfJJ&`JrF_QR#ZKIr zUa-MeGMI~^DBQ*{8n5II3Q}55I~~#h8tZQ)st6OBov{%=U!*a@W%kyvP?j5s4VQm8 zyzTm0uyj>=pbOR-CaA2T3 zm+ri-{%mqW#A;2usX88ShsO}C;}gw=Mha%?a9&e%34Tm+K`r(ozK&X!=Y~NKn=dES zEYW;$S4r?S)E2OqrwoPEj~UFT`O%;H^Tzv)dt1&{?l{C8y>d)Rj1hz{a-cjU%61=Ru`EApMkU&3JAvYkK_59%~XP8 z%^E+dzao*QMV1dWKj<;FO38oJLP~jr$53x&q(N1)Za)lzApGdJEd)76_d>XXKbMg# ze;9UwFo*i8jw;sZ+4r>4p~wi4cqb3Qjy+~V*%B(ZXi1S3RGY`}`23Q!619l6+2=p# zgoGi)^PJ~>aa1O*NxRK_LK)da-F;Tv`>ILvnR6PFc1xzBxz|+%KO%pP4`#Z?&P4d3 zk`_8_SVP21;=mf2G9y94ak~1)mPH@me0#|2{?d2YLLzgRHX{dkiAY$QEa~RjD#;&J z{(gqPuOj_ioM`U@xcO$1Q&{BEtO?1_=Si<$A93U%VuinLGC!^e3}pn~n{B^t;32&> z9GuWbko7aa?oWZMi{gLcbi(CcUGNblmz^_1b31_-FMG(NXs~@PhMRHp&Y7cM)fG)A zyZH+uwq_Vi;Jnr&MB>SK7%yGt?d{XVnEmdXh9#p97Aul!SXNW6D8!adQ>li(*JLJr z(~?vnd9>|N-**&&{fhdk-`GinYAIR&P!;GRB3C6^1Wm{TpqqdF@GJeEW18{z*X)M_ z!WoVmt}SC_alP5Lt5(g}eDeuS%_G;IyodbL?CNr~ZU}>bAfIrRC3MPfxCmXN^%>NS zTX3YmEfenpwaE8&O#%}im{vlE^9@poz^xK17 z8#>Gfi(h4@_455}3wuk%bY6BP{al+`BlV)DnWe`Wb&pJTCC8{8sZSIAZTMn1=*9 z*=Gm9u5&sSww~y|B{T7h%!<0IzGQ1C@L`sszZnLw=k!Y~3px(M9=s6`hqC{Ij8-|K zBHca?rTQbtZEn32lZQAk%vSHJtZ(@uIqQ<&6_mQ(#VX|{BoT$K1lgyQ*ECLCPRD%Y zX<+S9x>tYk*q{=R-cu+`t7G*URAKXgv#o}mKfOyo)-G-H>qAo1Y4JyGqgo<_J*Xas zo0F^)!RwL5ZNc{%0gFuq4|C)`nlcwqX<={`N9ad(i~89xga>}KV~-bS0sDkIA|M@<^n)45Mtz(8}(6n?`@nOT%}CoQEj-B{rS|Iio@1gGjnf zGW;CErXt+GV$RQ_R@*aK5eG^Nz8bVK8>{U*lq2Jc8?XWd;a`YlH4wJHXiL8{DPn0F zy$nQ1-wBDEoC%yDgWzajbL!_;{WXihE|5Sa#UJdjj|}@V;L$3wPPPfJb#`!z)H!i! z74d(a&}zAV>BnkWkbIrd4)2d*EGO|iuQ^Al-a}u}se_$l$xIqvqdpuY+6;nDD8w*N z|3NB_*+xxX!s42ZUhC@}77krITaFyKfpAkixpaO0;k(Z+CmTQfe@?sGb1_r?y0q7= z@`bSRY@DV)U?(m@5kh46F*Ss>BpJ&VCysv+#zkAxaXB{LPQNgWEzig48TmD1cN?_> zDKfj{T|ug;LGhyV;mP9W!S`8lBsW5WN>o#8dd_@inY5j^e_tV>dTMW%v6=%Y981Tgh%|{F$@0h5Lbbo6&oCf>Nf)VRj)oeADWhZ}o z6b>xR?sS;eD`KHSZqa9tsca^=mP=J0p`$qCuG@C(e>R=ld0yIgfs%eNdK8hFT;kWj z#In$#bqzKfrR=$e<;=oiRpe7*)(|lNP*`>CayLuf10yu1T?`jin6ptKJQ{|HT-Ut@ z5+z=ooLSp}H-dj0H6C)TnK}F%Ek=KVY`*5y=0rS~Tk6m0_wGO$k6{e+?-6Fs4%ov5 z{18m|RyfPxkMY_m49CVhOAIasBr5N^Hd{7o(lJqr(+8ge@x`SusL?{b2F<- z*EmPHlS$=@R6Z$Ve|3t!J_wjrdG6ssgAwxmm9d5(`>+K?+XeEf&Vg@5IIg^4#{v|9HqJT?2 zPFE2ZB~gYtkmxpA3~PV<0}M-pLsRxto(`#RgIDVQp*@hIw@INH_ckV+gTT8Fk4 zuj2%o?aQixZ<3Iaqc2o6Gz6L-#q#1zTHugyJhIhwBV^Q&WG6sqk4gHAvhVj{}-$CZ+%b8S5~El7-b^ecYpK6&%tsKzxT^b60=EcQ3f<@C@5CpDV_h+yC~jTi!%lz z9c<58kF&+bnmm7;Z}4!KWKp~$lpSxA09in$zjU*EbdkaSy9}#Yfupi+EGjN6fGjyM zNMihPrMPqB*=Bv(di$A(WpFAbM!?5>#{?Q|uEY0ylw&zJaxz)T#ibZ1UW@NNXbtbK z9IioaPS6w^`mioTvM3u<7Cs{`(I*X|wyHPFOh!olcyPvluVX%cXi0XJ%nj!($pMJX z-O+%P+%qMnBQEspwOCQi8JDqJQD{n|&Wno>E!T0gh?dyQXdn7{LM1;Wl=>-NKd6k| zhpP!ph~6oo!1cc9fmeiPJ4V$vh-!y zi*Vh#k*h$p5o_*$UAj6_F!}9yFKVFf=jLWyv1jnh)Ptx4H1c;hI@~e$+t6n#UdLBN}W8 zNI3)XWwi5LOXiy$afA)vQC4o?WnU(}rNL9THuTrG1*gjP?$X zc>5&bdn9%YVjM);QvSY{L57PE;13UF z2-AxAzI&1>0^UZ|Urab7o?x?E3L%T)1`ZNxm~DiAGOBT53_rlD-))EmaKmm+=E>|? zZik_egoKm}eTgFM@P)=K{JKK(s1q zeiFh4)VPNFiu8#QBOR-R>j)*rArO3|Zc=f7`MI01N;OO<+J$GuQdARVe;7xmiz1tw z)kE;74Kcuua`$t*3|Gv&$rNDk z>LY_Mr@|aEP8zWoXDya77C%Rgmt?qqlu%aEqe?-Oo}t48NL*#Rnn5>yWD`=4vYQ)<5<7bc6|z24W}e2qUja6^PTT2gqOBOln_-&%DqvcXxr$! z-5Y<|b`>l-pQ|}*nrs>0;Z&S6d`Pp>PFj5nnXuNu*o!G*M2pe=%y7?eTk;=&YFk^_ zIG<0tPPL#br7}TM6^uZuP0UEw4^Ky9qLXn=GN)c4`EwFUsTKU~i1@K8{1pM2!6N&Q z$Z*Vxb;dkbs|H!05YK6t-VdIA$dRsPY}uB}hND*bY=Go!(_$A>5|SeRWruk9Qz7S* zWlc4Q&AI7%_4<`lK&LHTp3SI#@YLoI3N(ok!H0QLv>d>^N0Slr1)oDNND3d{+ED`K z#ZxtpI|-~uUt>3~iVpme`1%23?KG*SsLz}opJ^dcXy+4kmj;KtPR=3!H>u%0CCgakEF=`6pogo}97zs=&OjAW(1Ns_>mYi^62aR1UlsR@={~v_N1ty1RfRvz( zchA}%K(7j4#ZegThxB0LTa-gu^#@PXivHjr!*hR~6ZGI<}AHT`P zYv*la!O<55j(y0KU&zu6Fe$H@_}(;AoMsiYjK_hICaSSot=$N(kHX7N4zE57^N5pU zlM}NM@!JzhuBS?iR_Inp`)li7yc}}pq&%62?I5zIKyD@JC5hgDDxl&NiEjLGJ);N{ z?;fuW-ZU^^xTe9rKrjQZ>Vwt&d#IjkxyMGjE8&Q-9`k4P9OF;A#izlya2&okI(v%T zp2UP7nxbSyJts_hL#W36F%xV->iiF8M`O_<4Rj*`jj0?7HrT4kfQFPw*h`%V9*68e zQjdm*CFm?s%3?BqSx+~o<8P{aipM)A3j?z_1IChM$H_i3g9oErej6 zVxGil4<+wW=iS_zE`+wt*1?O`LdE{^DapI~SKc87@iGnVB5nBM=h~N?)l}=X3^OqY zBorbCPYi1w9N(}iGrUP<`>r*No={=yiZ-V~rebUY^dftIt>^+wW)!H@pJ+VBez4e- zzz;31zC<;(s=B+)@QobH?krYV&*>U6sb7;%Nac9Ms&-fEy zO762V>MDBJLe!jnWEHS?4OI;jzSBdM%Z$aQngA+0FO8By7uDv2n}an`CAbwCqQ4_m z`_*Bc!8a^_!rjIBqo0)IUBZ{&fQ5Np^}W#+I~dF_fg~7htlh8rNm^e(H>dP`0j!xK z*kfaItmfdVF)~>yO=QSsN!L;b{T95O^5nShu9;^#=1{+3AcDLva+;n(8fSO6-OaRL z@8zNAG&piPHj^r4Q9M7EF-VQW3ue@ydg-|-@$>k9*xe7G$Lqq4NR;FyMF|+)LE?Xc zX|m>`b;2+?iSMKK(#N9*54Qan@3b{)7Hq1=*YD+XthU1SxFE~5Tr!2-buYK9>6tz9u?i(Y_7O3HrbD5 zYN8@|vC8TgMwuh<9UirDq0LLsc=!DV48JECN3&sp{EbT8-+8rdsjD6F-m_O?Im6$GfC(WHaf6 z3jloa#{d_CU3-SxknaaDH8S>PUV(D@?`kqqJvetYg{PoMqz)F5i5G8%#Dy^KOI1^U zA@fsF`VBDWLP?j%+=w!*;)oVXDj0m4KWP_|Zo5^%Y5&h|mH@QtexVt5dMXE*wtuydN5Q7aer zvs$YF_1PPm%C>~*A(AHV`UpKtEsO2jn&ef0kNDCOH)-O6i)S6CT3cIPx7fsU&9zb9 z$(d7r!Spi2#Bg@l#{R-^V@mw^({Zo4RXrTkFrz z2c)Ry%C}E!79+oRp*(F3Czv&hRK+UwYTRPlCV!eU-qM7-t{2y=gruoR=sFU-mc(2@ zj^`{o{wB62LfAPp@k}3o6pk|97%tZ^FH`q`--VxOeG-N5^%0Q>kr#N4EwICZ)}|>Y zknBgphybqDo@54syrh?e>bo&#?L12$z4L(Z1s;Jmosw;KVU}ts7YOsp_q}-rWl52D zeol}mDNxMAO$DXdXS)ksIT)?6N2uQ?@_p9q9Q14+izu{FH1-C6{KYwy1YR6IoB@KJ zrDtK`aXc*!zdU(geN7OZ{h4#1S3zxIf2A?VoPWKkh6;N@n3<+ILW`t(-@%J!Cdl5P znc}wY8GV>?fi;04>i{ma%Ob`PDu)S4FY>G<7A5cMEv%FkK1#zm+-vZ|DvH?_*cUwi zkapJfO)9VOz5WM(I>hNnmN9LabUl7oTmMfEA|CJTS@u_BI%#cy;nbgGXr3D_uin8v zL{H{uJ1ocps zL7Z33HUS<|Rk~ZLxMbN?Li;Uf>t3MgL$C~>|Fn95#^NS~7CaUbj{$aEWOCs&BA;pN}D>gm8Vr?Qr2TV79N9NBUt($GSy*};e!p@%=41AG# z9#L4>Ht??);wnnGrE4^r-j3x052k%bgw&uMy5@C%?lr_CQL6ghVISwSCv!YM`MRKx zG!1XF@A-M0qgU_69Kw!yXmGORWvae&gfgC0%lx#jQZrt2f2q(N!`QSA4SqgBy~1_~ zt<~@vFJz~6JHsc=)W{8|7aziH3Wv-6jO+(OeiL5nv9shC$M)}4xwOcgnbZsbYs9fwkTB}~!lU2=bM;wcpPuqlk@+#Bn6kuj&Dc1B5!Q86 zMQfveu~$0x3f4Lfukk8yC(5-_a5c`Np;v+7;Qn;Sz@V^U*5)GDPq$R^{)YK~@PG>} zol>dyr6oD<#Pd-Vt9U$~a;3^;;>tpJy{@Ao7|%kW$F!m1OIGtYZJ^THJ1xwquQ${I zc|39JvjPxLgTDt|5*NSGU~o&b{rIt^hM)E$3Dx%ksgSSD`!*C!VSPG}08gO5#wYXN$a3Oha!Ns)*?Y6B3Rn14`ipL3 z_AmT5A&eV@32q(Au^U$! zQhOLw`Sj~Tl#4zxFw$TjQ$TQdFl^`bKKH7@M!}lP5Y&vyJ0B?H!rcB*rEcb(>PhYRtpB1(J zeg}q}xjObbjbQf2E$;UjLm&IMVYxUNvL|x*DiHN03gwX8_j+#A@NeEiXjYjpXDL+q zqVHG+{YGq>MyI40NK#_syFjT~q;x8S4?}fATcAwKrUGzxkhzn8HV4_;rlE@&5}J5v zKQhK){A!yHicYLnsC_v)g@z(@{BP$uawJueYe&a43xNjmc_%BFcrI;1dK$k)QDHUv zU@cOso%Mc!GpVnhwp4p$aI;#g1GjjGRs5^h)y51{1bYiL)HpwaeNZuY7!DO3-lHd= zrvf7Ad-F5aNFcF)&1AAOq_B1MG#0iyIzH^RjpXLgscg?J0zZMXK1Uc8+@^j_a|;Un zHzR{@Wbb$r@t$&{(p#<%XD*jh-NF#QG+EwyFsIg%_z`dy(R>sJ;@0dMLA_hG59@2xH{IxQIBcQ!iw4LX-FRpLh-E7d5k z(B`okie0>an_$h~4m(nET114BYLzu(c^FOX%;E?csjCRYqi*=9XRR}jm(Ifcg*!jv zlIecamdt*MKG@87(49xN&3O09-od*~!Lgftqb&suD$m)m1;U*s!dE$7eoAd;UFHAs z`>7H@cW&;oJttB)Uv|O1@q<}Kb=8^>@xkHAX%%aKBW(ftJRec~n_u@iwK8QdbUTgA zP$2$#_~!d@RSYWl@Smxv(!}d7o3zVRJf4Hc#=OC7B-(@NLSv;aC_`RHgSr6n*uD+=8CDES6)S&u!+=gAWmN4esTW4X)BuXjagX`xi^) zYWfI;00l7nwZu~PfNP1;=J!z=Y0iKGEu91bt7lEJS)m=#+=Y0#0G6?nAFf7*T`B62 z<7p-cU$-lw83Tr)TyX4_H));`zKgAe9Vcaf7&^F6#MNe9oV+vcT!6QE#O?Nhc8odI z)Vppt?x*4q>ujI?+PFnjIjCFE6*$cS0yi!Ra2e1{eX3tVXj00mrZb^HViY@yTcIm8 z#>g&IoLNf}ywFKA?5XXu?NKA*jZe_W{rI%Ae^J>tu@poY8u+EcEjpiN=sOa{WKcySsm6pL@^V=e+y(wQ5zX`p`bc z9CNPKsuel0k}AEhsjV?k!WQI2&&%Z*g^{%xz}5_)2GjzmtBR|r0wh%w)sU$AsJ-j|?_UPEK|_jEt_Xt_FDJ6uZTc^nWZ)G4|~TyYi0@hOC~R@AT1%TszxvOK6oH{dE58yfEb+I zoc^-@6Hi!7jt9WS!~tODW&<$252-lFRMghS=AE@8{GaxTS-$tl$=1Q0@xRB~3S{dF z^8EjZ%`8EtW`Fu_f9h<x%GInW8f1OVCtfNmxhjDM2-H7kF_ z%zwo1P4M=#v$X@58Cg35y)Dgv?-zJaMqrHRw~n7?lo z_`jk{gUoCJ-2W24Gx=ZD{|o@tU)z-WeUF;jf~?&Era&`ze?|pcr}uH7`u}H_{Z}pt zXKQN(BO4&qe|7Y~&5Ud;t=<1=_+JK^z&}i>6l@)AjI94lXXz+m=>{}avUD=B_*Yy1 zC6{(GdY^k?khwMReM$ZjssGtZ*6%a>e(qTQIko`w%&g4+rF$Po6DttV(GkGP^_L3x z-h}_+``-CKe{2DailW-uD(bZVJurV+iGxgRO)Wv@02X!*fRTfPkvlxo`xLOSvjaSt z-^bY$==Rr`02moSwodOZ06S+VZ-AMt1N@(*FnoI01~B|3=*J$mnnMe;(81--wOv9ldX%zxB)RT zL;n^ty=OQ52Yjau{5O2>10(Q1?AhN5nOVC0!{nW>nXR+KKSI2lnEwO5Q?d95eD9Lw zKOh%?(fV)5{LTjSckK5HLGLU45B)nm+rO)PFUj^FYPNT}c0dP9+kX_q{GR?F0RNHl-Q3aA?H>;BG5=BidwwSi2jD;Ie`oCEYWoj|_ljKpru2?HfDZrC z|L0ID{W*~TI&GN#p3?uhQ~iZiog8effSQ)3?|12cn8+JBIas>sGQA%a%rVb@QZWV`T-3zCYr-4!C8a*3#78`Dq7<5(o8h<|TR=-D4r(!dq7@%kEPIm#D46fx=$Ao} zZ!0Ioqvw<44=U6m55ls3U296L7{4}E7TPlMk@vwz78f4=uEC%lkRiX|SK3ZOeIWBa ze^B#?J}9|vP?c3mA9+u)G}f=>(i>^LU|(AbeA`_}Z6U*jyE=fHM$K~8e88&mtS)-!%Fs0 zQxvQ1lnV!o)yvBhCofs}cbF6r@4}RhkvF}Peu@eHw!Xf7)THAl2aCZ{<|k4Re+8;1 zWE{QAjDKKt%Jw}oVHh|jhYzkj!YlA&e7h|vaZ)SQT@$B?#B0mJBK9)}5CojGZ5g`20K^}spcIoJXR;68RXnA;nH7nzsHc^u!=hvV`B*f8}#CL^J~1 zCc!V9EVWu(8C-|*<;~w}eGloW*5vs$PloHUlm6rnwQ^r`U?$dRVguhYxzjUt^BY2* z*z15%R|$HP+nS4}(Qn>PK{>>;AKPK^4sFO|I$6VA%ND5U1Zg*)eiElkD^6f~Kc-dQ zQztY|_tFVq(-`E0-Yq^%e+>%h%dUyUl2r${B&)lG6ZplGpS&hQym&*d$r?WNakX5>W}P7O+|pVJtKM>?ZbF`59yC+b za5Q{fO4WxcA5mxh>Q|zVIz8%A+dYz4i0{NmreLEKSpE(7f{aM>e|nUXW)G)DiUMXX z=+ME-6v`H$wo^kKsX_uQh*Y!dIT_|bv>ZjbpAP4aNZWNZy;7vQ*7k0mKW1PZ(>`JT}+zbB6C3*eKiwex=f2fPgPlsPRFmm(`p2Jzrp&sBy-BhNR=12 z+2a z6^xP`4jr%VEjDQtI{n1rzw%$T1VMV6rc0gbQ|2#hlaavTGC1V;6^5N_8<*M9-+^Fk zTW#GZ1!b}*e~VWKMT@| z>M|{<6YiXQYjng4CDFfbEo3onm#mB^E=sF>v_NtRZyMoqp%U5R58+)CmhYh5R+d*_ z^g3)HCt>OIuHpGN6(rHIbu-z*WejIkVp2Bg9$)$re;@NDnww^S!=+Z?C75sdMat{x zMsV&ncmz`EoCU(iZ@onP(=QBdLG=#TrD&2Fq?m`+$wQ2Lp5W5hObFLTk{iob$VFxs z5>FOj-YaQJLv$u0diWz8J+o9|b%)SUGZz~=ZePgy)X(j)6nL@iVTVc(rohw|nPRyN zyqI|ve@(60fcsj($kx^mJ3~~>rp`e(UBfs91Pz>=+U+vN7n~?3zct1-fq@~(kBI2S z;%$em@^f0hX=Iz|<6BPjIEA0)4H!q<;b?}WR{;QFphB2uhbNg)naWpJ?>gs+kHv@` zG}fcy15gPyWo1ohxMpDG#;8f1_KZ<897n>-cPSfdzURx_a|FkT?nX zdk}c_8VN#m$@XmtUFvdHl9!v%PMW#Rck+d7`P2^+wT{f_8EmXdSKr@2Z*8C$sIQM6 zYPE+WfSlWVuHrR}9?n=O;|G<)mKBETS8w~cpI{5T4V$_V=X^*;`98SgW#c&Uj48wJ ze-025=Db&}%JsM^#A{|2-uJNn+>?8sAy#65HmGfLenMb=R!WCQ6rU`uXE3Dn9{4K8 zrg7^YMewb3ei)D#%5$MiYm!M7m19JVF;bvGiT==t@vi_>;n&=qV;dp*az~ZGXtA3d zP8Gy1r-XBV)>x8FOKgx6{N}otzzRetXH|k@|Wr<7QO4_R~TV+ z16kM!O~_D4lw==q_)cdsdEh^Dm3J5k@V^q$w0z=<;|Cbz zJWFEqz;P%H=Iksh7JE)Kkw+G6bXT6@q3y@CNpLQ)IZ5G8ame*2(4TK|(2ZWkSTsp$ z$`Sqy6btM%EchvsK9ezHe{v2X9e%_nzAzqn=(`T75q_<}u)VySfb~2SJ0DH`ZPlzq zc#KKgNX-Un?DVbKOG1c^ib*}+Y}rXh>tX=01#~LAkh7v&tw1~kluv=vIvshCtTPmEf9mE=h386+d1%Di zSxE@89tnpTo4oq%`PFgipfkAT2PMdRA+$Ds3g0V6cH>u73d9gbjS2b7A~@aK8 z#ALg#+i2^-^$mBKgfYvia@)baGFTn9Sew@QG1vF^?4x9L7M0YPBPo-!UUWU3ho&Gd?wL^6iG1Z4guoL{~m zclBPL8&kU8ceE9Wh~v(j4x?2X%^&(i7v(-eZLwdiNE+2a!RB0)7nTd`L+!=Q=i{nc75ngJ`yVZ z!%1LP$Zi1so_=8Dmo=DYtb~#IWSRH$WAatB0dE}8cI;5iEJ4Q z+ZST^v~^}}qV;xNl0Ol$tX|zP(OlBkAyACTra&wza@O?H5!TRSo1G*`n_? zipQ4CmqnQ$4rmuoH347Bucb2f5gR)A2tJLVx*(2{e>k?47O}aEP~CyxJh2(ygJPK}OC_E(&dY0;nMWsgsU5MB}MPOI}kFfu2WM4zi`~*+gcX-8mlv z!T-RECZiiGcQa4+NT-W+g~x1FOj%!kwdUdVhKZ!Y)RxbL$FrYw1xpgV#+T>@vKy{K)Ta`Eh!V}PYfv`;TtZ-#D&jxt zkogwEhvlAqY5H7ARE?)5EWfBv>^@3pw+E|FHzr1*|7se16NLj*IUptIGbrr^Eu{sC ze<}V_N^sgP;yBu%Mz2ZWDr{pJTU7{G?xvoG!#X&B7CulQEUB+fNs>yZGaf{ZPAxl$n1D`VSY9Dn)ntzx>8wja=8BzWLVci9LGrI|ESC=Ey3AZL7bb? z|9$TnZcV|}VlIMmiSlGa?4F(oCKa}3e_yiLaUjlRPYNbHYF|5$oe)*%v-<5B&Z&G5 zUU(Mj1}Zj^7_DK#0PSTiGxpl>k58so+EeNSr#B*t>0iWYm%KK=Wx?Mu!k3w?w?u}~ zhxL9l3LPN5VTE-I%nl`$38%aiu&Xw zdm}@@yM3}&mM1OBzY)@O7aM_Vo_`ISE0!%Sj_+U=;}hCIc$O>hNR3s5rcpWzn(VcH zh5O~8HetCpJd-L~0XcZ8hBHYR1m#uQ01JyDYM;x+McPH1sTfpF&d89;`V^--HbeG$ zCiZiW6hx1PwK)-sy-{XAKSl`~f5DhZdbntK32&<`jfCUla3gvJYQ5qB=LR1%Cvv@# zF}X78)6DAoji?j6tw10}banT8Sc@+N`ibxq;w_Xk7#kf%NLW{S|9jW=S8qJ@UvEEg zr+5(Z-j=`Tpp6FgVQl8pzk!q-A1?&&*N}hwUr)GYD35d^zk_@3Q_g3;f1w#2j`Xf+ z;Z>-e;eO_f_Hs93L*@=v#_{mR_*p_ME!2#jdI8BC!P%BPSdMAsVH~fe)U*qIznlhK z-Qe>@ygS9oXyeWKto1C(_RMdUz^i8J-1-*RhklI~g<0K0m%>hSoXq3l**c6e;B)}{ z2tFFJoQ}#tZnKcXe39-se~5nQT^`M@NN||xGKr%3X$$?rNf8m1kkhoWeR`AJ4TV1A z$>3z&+XpJv`1U1ni2Cb;fwxC`=6YL~~SbqrXKTL|F z%Pc<{=1fD5Y8>lv*bgco>G?pTz=wpJH2Ckrb_!Xa)o3*7^w+>+t(u~XBKo=TMbzF9 zKH&`@HX;S7Tu+HLf9Gud40xg5r3v6t)EW0OAEMFzP9&Sn-SX4O{j!KWEsSpWU=eG6 zC(6}Z70bGA5gZyw#5XgXoW7M7NNtJfTgt%~`QaEvUJFbe?T3HaiE*eorCVM*`zNgf zqkU`&hO*7A$+5P8GE5t4nDe|9ur3rBKgR=<*5m*qF>T2{e`uc!e2(o|hxMO0A5boX zdFiVUF~`pUGXDQPQGCsv19Oa6YmHY}2(?|0CulnTYJ@N$9r6YX3C#Ug@P?sN^^fI)T`ZjMa$ zc?vSA3m}KGfAZ{6eWRj4Q=MBprsrsqmSrP!sM8lZ^?EL|9hG}Xgw>%^0`cWCUf1dNAS<|?zImZ_|BU$x=l$>q|=f0y+1bZ~bnMn%pT2C9B@sgi^8 zaY=g-)LRRwwx{sa({&y%xWNR_=kT46?!QlgBVx>8kX->!+V=uL;Ms`M#z@67-h>R> zw0%a3Fk&@pI8geHGu2F6BVz??vI(NQ#lJQSZR0E@-qKA@8_edyDJ+PbbAV6Z5aZX( z6xy?Kf9yhd4JPMC%QMmmE3}|0I&_~)hF0wcdV}Hjm(EciyWNRoj!9s|zL-=Dk70fH zidBJ;{hgG8_ElajCG+#zOGp#njZqXvGW3L1^toB%%NxA>x$ad+Qqjq(MN5f^_GwT8 zbhbfLYV1sZ@$skcqw6^?_;ZvCAj`J%NDPfJf0q=_je!?_bjjNvI{F@xDkg3-U)PwD z!9}rV_eDk7=Rq(qJ)qg0?qeTqH@@t|h%pZLO%+89iQ$q1tzw&cU&(J#jjaemb6j>c z(ZXPJ9^+ZHoetA@wrS67U&5IH$H|Sgk?M03O`{c-C}A#z_5rytg&cO^+-(5riQP;R zf23WGgDXFsRZiV~+--fEWFP!h<}NfVOVQsSlDqCBkU4hCVKOYEBY8FV2)dClJk*eN{6VH2RKsf>F0Mhs&`y z|819c_&nw-f8Snbr9K5*Ce^tz!2i3hf2>#LPn6?p${IeiEN8?dp`nP^vJ54|ugiQ7 znQlfrw*a*gk{=H$OULFFKU;lTD>m}fWe|3n!1}p(@1kVXg}!5>eJYQ5LP`X&?HKc0 zM7Edi1cuBP&dkcfnVM`|)$6-AS+bNCUsBH6<7H11#c5Q@yX+!&C!k%L;-EW3e>V;$ z>8|jh`m)oNt+hVnGJcnZ8Dh+(o+BVEia_cx&Xt#}R1KE&I1&`9u?6q9M;Ku;tqB8B zRXT=E8IFT})xd|{QaGcOVjPFP{Jg&#CNqU-=T68Afr7BsRWU8fHFAokJ^zycxX)H{ zCR^p%nCXLw!Vp8TipHyP%2;X`f1PN)RqbUN15hdH7lvYg<4038KO7ac&@Cn4?-h_^ z;LOx^smRtcW!8#fa7R;dd9APf=^J*9Ixt)s6Q{+`X#t)P@9omAG27UeQncY*S4$!+ zDdw6nx1vmflh5>XOA44sOX&_~b7pE4LZkW)0#%EtP{R^X`>=whmZ$j5m4>XrY zpnf;3DUUa&u;vOo4mnmce}mXfd3G(rB5zk4qPR3%>p2AMLAm>K77Lt_Sc~8?=)|u@ z!$srubHh~)X3lcRVQdd&j$uqkE=so$GQvC|80mxgaj~O!m9WZH1k5W z!-jS_ZX&KQ?moz0!M%wtr0Z6&Dm%NcRPG7eFiI%H$TgSn&7;ipe>`Ruq7pg>%Fr^@ zaBMOB!)G24v`U(#>syZagOHeP8`C^#H~>^E4uN6h3?bx=oYI9dzRwSaFja***Kcx5 z^h^*<&0of~_H$u|)j48ne9-;3Y;Tosv@LFVf?;|>o*STBuD?`zZE>qvB(I$Eb<8f) zOJohN%A<8>B+~$&e~`dA?@hzN>eh|B)QAAriSyBCS^XuiaT(~>3c?sWVB)-Y!C{eW z-)e=a+_rxj;nbTR;_q^Lq(l-Dk4n*UJ(1jVxXPVZH$`Jsk8JbDRdb%kCi`tW)N#j) zOxHvN*EOebez|2?+bHg?P8s!FpAU$D^YL*LBl}`%!!|L`e{KunP&ebErgE~{Fs&NC zzuAZWie;)t?6=UBzU_dc-PNAACR$6;x8eLl8%*~y?vvF{Cb|YJA(EF@=L#z?1uUdL zJ1s^Ypyi@x3a8Ana8oyQMp#HZkJ;U#i}nJTsHI0Xh)sE&6-bHilsY`;(e@i_WY#jA zV|1;#r)p6p?ktN*he*uC9mh;lkVODG*W{_lw?0uU4qsN@nhq%}G&G+N zUnC;T48@&>8h(amgNT{5S9Cl#cH;W&Sh6tJC#?9@f5$)y^5tog^>OKU>~*9r!Q9t5 z1+p8Q6Ba|J=Tci1qhr!SvNckisjdI0Ll+#QKXr0 z>}nTIrELW*1G#YM@ylxU*zJ8tlM^7_A?Cy=V^!ote>Cc_jNgImcjrg%i_(b)D@OF# zeeq9Cf5XAiJ`T#447xwQU#d$1YWEk+9uxe7F9^Wm{#*9Qc1pSsW0aLqaRTpx57O|NeL zf5k(A@DAwIG%TRi+jnaEWpi`gf730mEJ3^2txzFOAmle7-3*R6IhaauH-9TrVOw^) zOzY4@Fc<(`YeYI9No@;{1)>UKEy2Gr_rg*yyYfxH6E|}D$Y^fPK#46FnNi6Lf0PGS zH~W>5#8>~dVm4rq<>s6EiQ=pbRp$ZMe=Tek>Q)VYY7a=K6zeV4QuKqEWVy{ptZ~AR zoGIh`26eg`<usQUp8mvQe7$3_4#wtBf!GYK~(0B3*)3lMx>eQTn-g zhe{WmE)CPQdU6^#6eIW%I(0Fug!WmBB>zm0{QS`RRTY~j&QUIknJPzEZc$x32**J$wm+Wc|fvqG{_Sw(sNIH{0Yf;)33RvcKr z-{zKn&Q?25#;*Fy;XAO~GPys?G-PedfXquYBc|mG{zdTEG1~4uI(ooDOfga=u8wt% zouIV>se`qIM;)V=m(i)}fGt#h}c1tA>BCiW5sE_b*bsB}M zRzUs3texn0JUo6K*?w~G`8|DM^?XJ%io(6|0qLi=798{R=18_`iXPiREgq=wz*|4* zUobn*n2vkvNf33sKy&aCCP}N%$Ua4C`8ETj4w|g-+oI)fSN&-}SLdrbd)ufd^r)bXq4E`-FL2hN9-c@gXptLEr6uwZRRN54!orDR+}16Z;G9RlQ-)$j|C@27PD=dQcE!d8rQ>t-2)oTnTP= zl)p&oDf->2#~~DQnN!*r5JK%6n$x%^c;>j=t;&+vThB@te^>4a>z%47+E~Nx z%SSI(widC@pOeSUTSg9pG{W03zT0&jezi0r{3fq6FVnF=uWUY_|EpKgP24(Y>Dnb5 zKB4OKO-hiv48+$D`XTc-#Vpl?pVzHRrixMY+B0AiXjw;mHx70sc@8iUjGS34y5TR84gzSWxt{m z;?y~l-7fq_?rDr|0UsaAZ{JQg4bokP>VVMmvYY5G$%Q7zr9~(Yuki;)UBF^4bZ6i3 zfDO+J=|R!o(`UchWh6@Wy~eYrqeE@`Zf6%$nc&GIu_JW^f7LQ9^QQ1vPVFVP98KuM zG<2o>rs2WFEYwim0K0f)9$oDB9#MlxbVTJrjWfA6&*z9f9FJAKBa}(8>t7a~$9rV* zvj&R%;?u8EM%5&ZAai4kR~OR7I@0hl|IL+Uk!2g<>p(_lm3}lMnW2^u;4|)?!msB& zxnG2|Cti>!e;R9rW-jiJR!&EpGSxFT0r}Pl*3{sEYkr)$<&*Ka{yni&rUmzP_xI=X z6n9r>C^Zo*R%z!Rt>o|)laZ1Q9BT=OKs@c1b2Qa12hW#J*M$=bVAb=7tRG4-eu5o;OMTa7(cZyZmhU0fVM( z^0OEF+`}*8z~RyF(G&Ul^DE-a=S{*c0xeDrsz+zz-jHu!Pwv9n!h);-nK=UF6@R#Jh41wTBqtqIK zhY=YLOs^*SfiGa9sT7MN^CmaVHOuL4CQylAe|s`4mW;nt?pR>;gdHW2iGuy?klhwe zqhR-yPBdf56Om2vs9z~{hj4hB(Gt|JVhO^yuA3DoIHP6e4%U88)I+#YAu`^63X9V{r!WnD)FPi*fPm<;GkCvYxvd&9Vycpr zw!F~hS+Jm8KOiO3{+Va6a++q-1zaqP90XNci-v4!%24zkneie_bQ*L9e|9nk z%ZSRYzMMTzJL@m&wOMH#q^4<8%LBV< z9?X$M($jMOx0SlZ_A?9T?8OP17#6a~xgaH3R0u4D;9wc+yU2h^1+}|vVV|UY*HcD0 zOca36_q(bn1B@n7+hyCfZQHhOThp92-)T+Twr$(CZQJH-f8YMQ zn@y@tZlx+Wsk%3nJUHh(MY%Q~iBOBep%mfjjYE^9#G8^;x817+g$!)NIyjMXgQ2MZ zc>(*i9<CR@WN;sI!+lOGwYVNFLOb37?TbXgLm$d{h=us1)$Lto(o0sZ?n+PDO# zwqX2DE>W_)MgvU8|0C2AjdXN-*g{B&l=yT8^ZM*%7#~l;sjG0%9g0xr${3V5nrRmx z>YjNhE>j0?-7`x#z#+l1P6osmmXh9oW1E9nkQ8e^Og&j2_NnXv z1En;Jl5B^~WMAwo(nWPT6CZZ4%2n{$+&I^M8!5zpvHK+azThd`%oE;e8GEUBQblv? zMt~|TedTU5mQMTbGLeMRo@c{&!=X#G9r_Nr<)lOb+iFO&Y zpt^9^ANUwWt_IwCpwiaI?#F!fKH&@+HZfxnmhz0AQH}^(&rW9+|3hh~JXOGo0ankM zF=GknJV=`7Xk7R#bpFTBoPA_%>h*zRq6ft7ylmFFu>emUyf(;i9R1N9^K=Q}4$2Q12%q!Z!chjkI%wUFeM zh1-GrUwlm-5xu@v@aZC9XfC7tdwxI}bRcu`Zvtv&CUsCo!NnMij!K{Rgh4B| z7q*y&ZkpR~I-~leF$ACN$lduDc3(C_>xP#acUZ*kr_1u2sT{GphGq!SYq*cKx^+IXF3fTE( zvLpL0#U2KXyD~*ta5rW zTpd7ez^~jvCCruVI}_x0<^;$YaX`K^D&MF&95>F;3m$X-*IaSmj>xX-%C`)EHzj91 zx(E~x+?eAbl*9@tm3alj^ds|o<&N`Zo$0-{`DU$^{|WmWdcaDx3{MMd8L<$T)U?|} z1*ps$MCT|-2<(RtiU(D)pQ%`%?IR=3WI6yX!i%DS`!fnD?6P1_t2w3UD{tV35+6L> zytxgrO@3Pk1>5%k)`I^cHdZn?X*`fxD$uU}E9rO)k6h-(tNIDd?<|#vkl$u3X8}v) zRwO415k@|ARU^Xh?mPRs+F#K;j@s#ptzAL#N-yH=gr$ePZB-{F>&EbZ4npKiJr<)1uY!?214Y@u>n8dJAkaD-bWweWqQi%pmW zG^;};s2lit@WkodtzQ+)#*KTftPQAvNgkq`Tt66j)EhK2=KU*ti!Yz$fIqaIE9XaJ zTD6&N3?Ua&rIJl^>iWVhi0P|N_)FR}Vb6YXQ?k_kDyX&0U0Em7Shn5`zN(a7RF`S| zFLRP(!__eB_uX>?Gnl=gW9068-vO408HaaJ8dX!&4XXV|jgRCnqzybFcU6EI7UnQ3 zhg91OnUV)hWLrIOA6h3uaTu}PmwnptM8n0<=M|R~9*cz7w4(J-@+Rq$!$CrF0^>6& zANX*x`RS?7P-UG#L57tf%7ijUuiP4kCB+tM24UP`Q)gOS}9LTUF|d1MTcm_Mp3zDoj;@&R)PvYvLw1*6xQP?R%&_taeWEuh*kkIqY3!&$w*YOFU+6@<=rHS9n1)5$wRZYPwBRptII%gPTx{( zJoBwkDkrQ(WO+dki7YVWWKBa9RZu8j)LBt-kTjiw!dN7RnbeA4Foq0pi-!ZgX;r>{ zZ>fxy(cg^BzxE=x4TZ_T1k>V{Z()azJNF*MwHXj;SsZ+F$UOnvJ-SVSLWJ3?4irX^zC6yK`OG~-_)w5$B zTUz5Vi&Jv;?K2)L%gr|(W1WtE!uXKL zz2%P&e61P!i4f24gybET$(Uhd1-lTZ$a zq|0R|oB*@iRgxUvQwXU=nF(jQ&^#iLlzFp#K2hm;P%1K&5)nVjQCv+(N6~O93-Dr4 zV&NI-F=+thUdd2v3@7M%b1FrjvKy&S3At$BT;5)D9-ZTd6OGyKX?o|8K*;r?(Q1n+ zA*gn^&(=BJgxEOFUg=_T_&HjGBl8&1Mj$2UO;3jjUl#7}QrW|b0Ht69Az*kaS-#53 zZKVz_V|#IiLf%g5oU1g}?anAdzbd;bcg+_dKn;)&s{Lq{tlSl^IU57!Rs+Nv1^)P zXs1o@Gz&_4iMzwS^ZHDK>S=lyP5tpKfrzeWUG^d{nOp5u^xIPBU{Muny=T)FLOr|* zk_CvcLA`#A00SGtLLjaUb9B~-k&x-HESF=S8IInvTha;ipDJIhcGu#MV^P`N~kzIHSVW?1H_Ds+^t zp6A26f{b9_LPy#isaI%>_#N+>`*KaHnp9u79H)ns z$+W#?sZFyNaO%5%w98?fp|r~*^da|I)3f3J%5ddfi*HwCiSzI--PfNyzqw#>+FU?_ z6G_`GJ;70lNJlypmiGIP?TSiMMSs4T^vO~j*vid2&{_vyx(I9{HH*DGQlNn)etfRh z?S|?_pc=OzM=s4iOYM_pKO#hS!~?b&%^$Lr&_t4Fcuk5LGU^ccJR#_X!04>6L|{w8 z%lpmxnufnt2#O3=UL|0>iQgtBb1l8A6o33jpB_&6LFxKI9`=7@TFk~KYS|3{;2L|CFfC?{|~ zndqEdxW2vI&2fyrDJ^!V#RLE~EE;@t1?uq2=d|y-Squgmd{1im#1uun71ov_%%)5^hQhz z7Lt`UsMn8=Xnn=OBy1%TZ>X!U~%b82m2z_yF$P(Femx za||1JhJjdZ*Bpkvd*kt&mR^goS765Z()ataJTu`yURTAlMrZt;HdLKh#2@B&1yC|y zq5DUQY{gAC_r=qV*D&C@)Ap{n!VgCRN>k@@gP)FDo~bOn(S!XeM?)r({Of_*a8Y}f zmwsv~e*z|eHMm?4OrzL!a#r`+-BSPfu})vw(5+<>y_ZSiYw-l&JJn7Spk?OfQ2dWt zYQf-o4_>i1Y`;^P%R%Z6SOJ6Co;>8RGuV*11`WD!PZ1Q_JpoWyOrw=+orynD0W3zc zy9%%Lkdkg#ws1I#n&rtAjqOEFZk=d-!8?KRGKA^R_}SRV0~yTY#Y#3OeN4Y@8Q)9* z_~vdoEAL7)F=Qd6qY4800OO`G?isR9-I|*zYdUkq9j<8LR0T`psL?CS4a!-Y-EyIX zaqwSTa4pg)bOYEBvDK{H8wXRg>BKxO$%<~2^5XiQCE8>m4~>@j+CVwY^isM~F=Glz&_Lj$OKX13!9n53@GIwKSSdlu2k zdtc>GwfH}GIxcE4!H^(+2x##~0gV!WxOCZSB-S!%Vo57)iU1dIb*+T_wcWucrg=qYU6?06{TA`ne!ah)(n=Se?(q!7RiH1CFSZo z&wA@ESTrs92`8ofDHv3zE{H36gAx&&!->p|r2wp4&%nu*`z4x!G0dD$dW(-G5ft%Z zZnWClQHA-Tw!usLvg8rn^Ok73`wcI@8%V@4*(ecSEsnQ&2Cm^;WiH-j)#xs2u@$9fWf_xFjX`P9Zq_?hFU z?*IfvnTU@Ec#_}C%|=6$EC?&vrG4GfUwS2PU)9(IOjX=6cLiWD%IHmjI}q19?jehwnuPs5=YvD$63Qv!qF}e_CE0 z=s6fM7mQZhk@WoW8!01#?Lcel2Ok##iEO88F~Keim9yC6>!Aae#@?yyrBn`s-f3ho z%|w>sMZZG!J^V)O?PYZm)jhKMEF#dQO}g2OW2<;3A7j#NV`eR~3;4TbZid#WqJCyK8 zI8nG*guZ<2m49Uv$&k@b;Z*J2GGaulK9uUcFMapz3xr)b$P*-KsF_bd&O;-Ev~FY z@$-E@--Y}af9a%x|wB zXUyeWeLjB?Qt*&C#r!8eunTZ{-#us6eIx=y@8`QW!vrREbo@jxq3W8REbNof4(5FZ zF@96)3N6)wz{@(r{7y&%{=zqrd@(l;rUgC|qaPk(Ptdn)8-^yrTlqXB@##GqDD_E* zvG3yy^C{yNW6m5p{A?WS#sDj*W}atTOde8v@i_UK8YU;s#J9=haVgNxrb zo(`e1l6YMtWe9+(aI1urU#qxgLh4|moZP1L^wgMP=& zUmh7fRKFjJ@<7zPXdXVj23B<*&!ciQ`3_4LL$)&pO4Xe;7>IT4nqNr$NCX_q4T^=n!M^ihkHv zP8cC}dLN7%J?MEKa+qpSJ*{d7GUOOEfZwa&|tq1(o&v1qowMo>^EtFYs z`Ewl~+BZN_^j79UPzVH>;(7}!fmI25zbu;-YbJ}Q!JGN!-jGSC5>sIm@vjcDFOEPG zGNW|ebZn;eemO+P!12u{B^imwrbKJSQ*F)I!hgoFM@V}Yx!3hMT!9)%rbTm{!NiS9 zd~22&O+PP3ybPdMA(H1sh;8w%b>?B4!y8P((Z-*v&Xr%~n=g>`@L3HdP@<%mHG$fU z?60PI4zC^M8-iO_W0G6``%g)`+9tb)j5vaC_}5zJ-GglWEISM5bxgz`Mom{J1-4(n z#TV&}*GL{Fb#MA0C7J$HHGxBLaz)}uS5#GxI=bnQMTCHa4@2yje6R7-xnOcXN%Y!J z7ksMyn)h~s^sHN9`5Ki%?vN{=-x$#D9YnE-D4rVode!5Q>*CY^Wp1g8&IDYI$j@L5u^;U`(_0~~>F z06?=8w?)G?T8al9Kjg%)jggcd*k}f`8i$F`(LCnbWs;vD z@au6a9i^Um7bolLR|14Y(`M>d!gi@%<$K$JXdY%cL`iOe-;UP5KZx=?711#A@4-Yi zF-QR2o7bkg!3xpyC(O7et7nddlc$+RMMc~rujarl4MYd(`0ltt4`i5-Sa4^zct0&K zZ*Rd}()njCS$V+lUd&#mvrAve{KJJ3+|n6x7{?YIP)eedfGTLSj$%(Aye~&*VQ^bw zo)-M+ehV>B>t)D>;|=p~%mUV?AY-%lrXv8O?h`SPg3YG-5cZUsCR(>abRf!fK+Shd z*3-QH4jWBJ`KZD;Zq=j?{z}psN!$#dEG&aE zRb9pt*OUB*c0bzRPV2j@`T%`Y=T}^QTGgS5z+3ZMIvoLdJ+jGXj0%mpve(vG=*YA4HSrdqOVS#$b@~h?EHEOy!vqSVtf_Y4mtGxwKf2}#DGypZChd-CkZV1Lxg)f#yqtR>_mpW{PXHxFn z+{{UdWg>Es7cRr=BBG(a)h21_dursoS(8@|i-*M1pr}(bO4rh;Z5~+xSr6Eh;EGsc zH-^?tE}|LDlr9&VkrBb3eA}prU;N4Q}N-{#Q#VJ_+ zbIRikBOx*^MZH&~sZg09EnanQ*Lb+uEL-a`3@ux*hPt+wB~pm}VRQB67L(0Hd;Vr7 zc?hKCQHD#j7?%>?%Lgdq`AoHC>kZUap@hZTzVhe*qe{UW^N$&mTuo60-uuGFgVUMS zqvSY}#p6t-wfQ8;7{1Nb)bl}tzku^iy|A3lB!8x0xnSx#C}C8pb=WOX7)zhmsr;q-~UF6dlBG+)OIbk-KZ_3LVO+9x!uex?z7pT9v< zbF64-Azl#!1zC84q2zyxmQ(rj$U`=^sulbzSDl2FC7Sr`H!;gIT{jk226}V|J1N_* zrLwqL*y{cJQU-eQMcvfSDh&8jzUugCWQkIjOYLiVhD^Yccu$x^4MccWOwrJQEVH;H z;SpCZVLz+9mG8o1gQJ;G1s0oJOt?e@aJkjo{TFCObvuu??K4yY({m1}d#X&R!=J4T zVx{3E7)?km2lM0c@fuv2@x6LQ=oktdnjP;BX{lb`MKd)As1+G-Oio$bX9Z-}qWYuu z96$={6EVOV@H909J~KKu?noC?J<4y^zCA?(6=&E$2C+VJC;iiS(M~R5{o6v?unnZL zpB80~1U>RMpS48^6@By0*)O)~j_zCB!zYUgL=deU^myqWgzAV5a1agx)Hps+7vhlx zq2(!|?nTz@4v}F&q<3tIQroD1<^}qulhFe{Zmxi4)@YAW7lxeMPJB8+`By8~(m!ku zENoZWV4JZv>nf_Q4;T_$E@201?3D$tO?)WON)MZ3B3;d!Ll;#Jsr|65OZoXb?B*#Nc zEg%85V2;H-MW(C_Gm$h!5p>tK9u__jBXAW z&GtMuDUPBHOk&ZnkyCu~ZdZa}iZWf^!EN0zTbqN*zCx4=@4rj})R2(1;o(vTQwaHk z(Jlm@P1_$%9J7$ep35n&3P6w`n|)`AoN(iHu{o+G#d&LlSXBoucOzO%x*%!oBWibsn51K3F)B=5{U$j0^is|rfuB{jael=4r;2?+|2QnR zge(*b)bq!vx=I-$pul6D@?r_X117sR{jlp zSVZ^TQj3*UpQ{Uo1iEL-$~G?`aoWn<0~|L-%oO(s_tUxOeFEwrCp^mFK~&~L(Bzu> z)fN#+WM=l|N|SoG zVihJT&-%rirSlD!G9m@IqGiW#U9e>+M?YPxn{_>%os3`iX5+ZUzQ&6kFx4@>W`kCfECvD`h~lVqX7Ol$%JZ&dO7& z3T_iYVB3YA$6Zzda1pp)Anh?Mcpdn~h1ZyEP&Ai>XO3Ok>md{2Z+Q_p$WDblT?WGX zMWg{UoKVZ;+!6+Z-CSwF@k95IOhGEH%Y{vHFVU=Ew-qC?tlUBhr8Dg`bZcbNYJj}F zc-JR^F%c^uAO!Mt(2EO|)(^{DF=Vf~nSv$(sb}06GOYz#4aU4%M<`&shGv>#9iN_M zLd{=Au$Ar4YUgilmi8fs5}>~&W@GdoY}&ovWWXM*y>}0rXpE-gHf5ueru4UaD?lzogkIl;lVJVa3GRRGb{VGvwv$Az_G8dUr;em0{_G& zorVg%Y;)CZYBoIsG@@J#|Jg9!EE!7wgm#!O%bKW8@f{jRjMoTOwlp5f$KtBI+L>i? zViy7z%}mC_2ZI%P7mp$|3*SCmN0}nlC>e!`(wvdEMSL4igFu?JTo~Q*gLtg*sOtWP z2G=lqcBR1XF(tz4VaMRh=CFTF<5-o>6fpQ<%x2o*c*FT4=bV-1!O~_(5yn3n zNat>AXEruRo-n!MfIfziL0^u~J8a@VXi_m|vcz3dzH0AmM{gYTYa~<+2QmQb+9@}b z6$bLJ<27A0-sh}i8Goe{%89oySPO_`IMjt>A$go!C~_oSoDOyERVW*ZAAst0xL<8% zR~L~r>p{$EIy3;59Bx`!tdGj0a2C02H(4Ez66L59o4PO50*B(aWaFP2e68jAKg?5M z%f@Y#KjH*`WkD=@qb&xRhMmBDCWth&jKC5G`-df1*ndM{P(jo&SBK5P?VE>&?;&Nx z#$!bQ?V%lr34uxw*!PYiO#sYZr%@)j^N;Z(fr!Vj>O}72dbRsyNr3nw7+{5#X~v9m zLzj$XfQT{RVPO-DC9!(VB3gP?FUWG?AGHuip+OV6SV@5oxgfM)=|c}34SR!8cZ>eq z;@5(JLV$LH`|+3?!9pjn=hA}7aqKoCNeOsCG4cNT{NdAG{y_w$0s@#jMsO1$`w@9% z`yXt2?{mNQ_c_EIx19{i4#Gbkke`qAnFY7kGilRu>|;>iGR+W6IRK&98`Xnzw)u}C z;DI8Az3_}8t{Mq@;$e$y2=PVIt%9Wim9^G^{l&WE+viG=?xb}BFNM?^M8^?<6fib( zggs0I_GIcuN2uYh1_HG0;lKXqsT)Ip68NO{UP9#u10x;JMFNd5>9(T%K~qTnlRPwr z)iN}OlUdKT_NN_Afg?5qf>O7&$f;h{{&7K(^!<3lRrGXV$mdJ8A)T&d{oY!Y#9uLsIef{T58VWHV;|=^ex^0hL zWCZ81yYiiRcJu&Q>=R3mCJLA?%nqmQUG~WfL)>3-DK6rg3pFn6xHSxC>D7!W@}fVT z;HQ86@&I!+kGNkQ+6>>=1pqGan6|%aCWlL>CpkT^tB{n4+uh#FAQNlCZ~($u1b^_U zaV5qZgiBye`bICoM&w!gM5tZ1z2;NUrt5%t(ZL;vI8Fc~;OpqsUFh)1qkDfJqD=T6 zPpTAAiCWo4#}%nBmp63x$X#m6^-ifgVuaZjEH(GX_huM497rt4SRLZ()h@vAd-w2g ziICa~AUdgpfk5VhE9I)@e_i^=mDGaUpqWyuM{soj>Du`{pgZ8wYX#b;zV*9#kX#tY z*okq9gbnaOeW*HK9;!TAdJJnubga%<(5=P-eZEdl^m%o6P>_(I!FjoB#mu_{O5}nl zMLHY7u0?nh6Y+O~A$C1Uh+q!#5%Zna7b^A}BKKQ?FeLxU7WM|0%FqG$FhK|TgX>p= zLy1o?8y;iETjg78biwH4lWoJgg+-I&63|Ku@F!sCV?mN}$E-IeXR0`da|-AtLSE7J1QJkcUIJ?0fv=XC0*!Tw|lQWaQmbh1V=5HVtr+ZD* zFrpB5<~(CWp&w#zHb~>ak{M5yTuQ<4`{Nl@BwhOLH(c%PPPpYjRjKFY1KHw+;_r{oQ5YgvD-pYngJW z-Jmn%jIw;cZd|70lTJ>uq4A{_A>e>rt z>$+ok6JyxTH4THy7x+fTgsIX@%XAe%s?|D44I5Mb5p4u2Ge8!ZM0>nZE?$J`Py|r_ z=EWy}OhOqEl>G&{q`xofC!#iT1$9r`%)bWMb#`_aHo2akwR(I4pzwB>qm(1axEW%H> zRXaZ$WNtiUwj89l$+Nc+Y5-mYk*_>X-2Rw)v-XdA-`U>;O7C#b{MDw!4u31$lPnz(jWK_uV5Nq75D37J|KhNU{2$1nEw- z=*G0@)v-igt&>b=aO(C+_%*UF_EAnevetcPP;3g-wBRJUND-NHKvQv#b-H7NfM6^6=O`<8_s?Kcj>V=}PFHO^F7c zqTGlF?kA;#OE!Vt`fs8vsDMaS|RvV`@t38z(dn^%r;`lE_liHM^1*)$<;e@(iW}y z^qQL08)MdnU)BnL^qYa_hD3(2>ePPU2Dv@5$yKys;bRod;k>ShJ|nKB+@7|o+S7z} zxjDoYR`C%q*a}j)Tt`OF4wXEXh{f6(cFvQzd9ya&i_2^k;c7?z;@!*wzrJKww8Xya z3Sm$|oOkz(O?0P3vi6Q0XG<+BRsNlw#;{c&TW9}Rj!`qtN5$IOzAL=qp_B$me%`!) z-cE__sZG)YPU}T7foF#wVPwrr#hV5lZ{wIiqNoO-S2Tk#s3+FVFIB47$P+6TP8HS# zhp(3i9A$%IwyGc!Uz9>lLlcmKVZ23YI^4zf-mZ}8#DJW6y%+Y;_OCGt=JQZaTCX5O z+}?;c$4MpFte4s;|By4+_36d<238xvsF<5|%N9+wgS0#APu^@A+CW8Lj}L727}2;e zpGgL+uG@IqZfSTOt*_6c>)OGK>3Yp3)7jpo(ci=K5YLOXw#ZHK-RUi*QyU} zTU=fdJs0;*EZ4SRdoPT1V}y*ort`lRZ?*S$Apne0P_4Yx6^ZOwZvP^32CBRJ?Nnc1M7$;BlH4toId@bwR*ETh$83fx>9$$w$zv6z;Rq%LkP zm1BgCt5FFw>R>pPrn{+0Xsx$bHMSpzO~%S_hl(gWu`#mEwPU-cZf-7|v`zL#2=9u= zS*hdve8E#;U2&W-9b=R*onqRFIR1u3V9|@%k5v&L;Lyc&Kd_~Eyo6y4Djeai+baB zZ7WH#y!w&9=(*hw4MZ6x(XLvTqnugYKvyxcT9-qe3Ee=cFy&j91D#=;L9sBuT9*Bs zUz$LXHW&t*rZaGBu>Z84?lyxsU60TdBRJ`43$t^s?GaRrlhKS@&l&5QJMh}pRGmO< zT-21~)@?()8M0q<@cdUj7lfNTA@7|6nVE@+<^Ki~Y;0Ui3Cb;0fGA!07}B=5u9uq8 z0#_x)_&&v6rrKMRItVyZ;}45TVf~`?LI%vRfAMed&f*YB(z*!03t6Bg*Z6MSR3yh$acRExQ?lKcuPM2@EC`@t|;BX=Kp381WYNz|3|842bw@`jVUYQkL$blxc7ND< zhML*WqcY`9v5Ul7ap#hDd|GE`l2`O-F)=pbq((aEVh&e@g#7 zr2dMIK(i4)M&8bf4DVP0SE?OO=9=9YE%Z18H9S`VBFTy?|4~i+rT-;pF6NKxEG{Iw zye)(FE6>V-TsJx%9Z+^07yhiF-*kg>iIeHyVo{Es;MbVau**(0W^jTg@b&$YjC4&&U9e$#`o(0p?${PiiJqm zP9%gAU_maEvw+;ij$+;-y@WJ-Z)?H#Rt;i89!kXlMac1qi42 z#fydH(v1=m#fL|0EovF)g%KxnQzo5nZPh04?JUYUpV#}Dg<1d>s!qGuL&?MQT0k=~ z;By4j0daE*vA5B9t0pQszGmmOeXFy&$5vru1h)fWec@J6 zZ0O5Eilf7Dd57bp<;uFt(^Id905POwK_)3i&kLZu^YDChCwkJ|*!Q{%&h358j$jOwpDYpZ`bO+>*G1TYg@g4%jKEG^;#jlrKA;XxB1!-?X zLHy{MbKHIM_vhe;mlfHAD#9<3*2UhGEzhr-tCyyHUOxakm?|G+La%%I;4#2TVt?0A^`)z>B`iK~Eva+?^{Wdez5~U&B zwRnd(;P>xJ8@^2rex{>UvEyo`^m?{ zXF%3lKu4IJV{Ad873mo_N3(*9;ukIfSuokk*O3}J_JF=+>!J+(F`zHH8sP=Xbn76hSVY$DCP%<{mz z?sAU%u{&>by$or|Z_|Aj+=7A$BP+=SdO@B}>~5?Lh*T{RpqUaarRy0_ zsSXOuOU*+G{EfcmZANY6dX-d4o?XoL2Ad#_ez_T#E}eAipZh*Ild@a9jK{5wlhXnJ06)znX~} zfsGNi5&;cuWhvj{ARLa})E4LHe#W~C@EY1+zU;WDIjb=X0S$1vEdha~O1O0GJ@IA{ zkZel98C{`(uNX2cl#1>c+B}w&Q&Hp-?jAe3mewzd7>Qxk=3v(s{(3A*27NhCF+;NO z%i3}aj9X>ESZZ7!sFrs;53TAe?zW^^$Hllom{lSwfFIjB54V6gJEx(nIo<9{R^FUdy~Z zcsu}uW;isalGk*Q^+_obd1g_kX$jxkKJry&wF&{?EmH?;Llb%)KvX^)TB}_I^V}je zr)DaqHK%deQ%~GwBA8T`pKg5CU#_aHhWR(bCQ^!=T#J@YQ0DgN>TTk=)Z`zl#=fUL zmhlh$xVKRDeAG_M;p19JixI|pe`MD8RYtdF=M0nfIiu}$87kv|gYHDXxEV+{uNey0 zd#f10Jj0(7OJTG(HdD)OLtE=A4jc(m(DjHWDhr0(z+XR`%R`Pg`dzX!)nDK^ikZwgDEb5Ii zVi30nbES47{hjk0(=H;Tm7yQpyX>}F*sy$Y)lJPao9}cYQvmUug>t)K?J{LH8Qoc5 z1ooYz1o2XQnqV{{lg|;8+dY@T!bWu8R2ztfcE1%2wNYFmqp^hn(jL^V$dQz9B1;1x ztc%}ALigEv$$B^L|eXG(!4On^4y_`x0h7&pRs^oKE@y8wQ93 z8r~N)B{f~HNedw@4AGh0ZUX&%ByXP36^6(oLUhNpJX zRx@i&+`8lG(N8De;)JKoKwXNdr#yWPgRAi{cb0YB^dgI*CSjR*cC~=YM5pQ57`er*xG0I{H+onjVd!#C{VU>HDLNsr;DxnN*4_ssSp*Mp zxUqrHiNV`?J@ex9++I|qjYR5+2W{F0j-3WBOkp7$o2Gr~;Y+4x65BP|`10pyjaMUC zrcNko_N>Ba3u$c|Q^J*}$yBZcl^24Wr^-~Q`!vscRwt9S1sq`OM(%GHjj=!xcO`d(ljy*!>tM|8j9YziSw0)-0{{1J3F{;GiBy!Q$QGl;yGjVR5!> zl2r}(0x9PxP5|OBM&MZRT%qfyYrRKF9g3Gc=8F01m=G`Kt+lA|;&L@MK8cyi*lszc zZP0pjGQ$8wWZQOmPWr@Mo_kFCFh5(=VH{0Xz`}h{#@TjwTxN^apY7MVql_g-jF91t z9cPV@u*GNb#(>+)b@>;Fb3dGe46Jj-!wbd)n~-(*3N+rrHV}P|(_sj#**v6PnqJ#= zG*Vd_=o|b8n!Fk*-0s_YsD{NH8L5+eI8Mcw`7 zlW?e&9!y610F{Dr8u6U8WH6`*;Z)Vk@2neuxP5h=GVHQN+GdZ^q7VLKl8yro$(SUTFzj*=`cU%xdT>n6Z#4ch z7C<35>X*UxCXAp_G=`X;UHCunJDWz{&jnG{oI=n{+D|Hh@UT#gh@53kYQ9j6;-Q_5 zIu8G-o)9atk&;>VN;G2>QJbd;i7HGkF-b_;EWZ*=h6L4|TnQ!ZvIY8hRc@LP+=QrO z`wwHo0F1}avP+wh1c4=(P>4tYm|QJ?yHKRIv(B*ul<}g{lcu&iyOUP`Y;7GN3vLQt zv#Z@dQo+qniqk0|#d~rTAG7wqk9)HwY3YD65>1>hh+(fVEGaTnEm&+uBY#mG{FQ41 z)**qln@NXlhG$gWpV!Nw!)CI9o{bfvo-R6y*#p{ zd5U%vrHn1&uH$#f9dFOtpPK)Ep>FiHNy9S_c57o;$@c0TE!1_bL@KQ!E<_WY*xhyiSfDGS zdH3EI#r`4&hMg8s7y@a&ieQ{H5o|Dfpmy7qeHo>mye96ifCa$4%)zW3K($6`j24UZ zZW@fr@C;fIk4a655Q&1MT;p{7_a_rL&S-n?Kh9`Ij!%>e%iRne+aHX#0VcI4ay6ignsajPY5REFm(t5>GwHWE`)3mhOETZ^p-h?J0t!%1k`r_ zU#B0CApSuSh&wmRpwcQg@}STvE{q2AVf%j- zVKxqC&i^KHvh*h6ae04lUC`QC^8}>#^Rk+lXl$?T1$Vhj2K=w$zB($-r&$w+0KpxC z1((5Lkl+$rgF8WkyT3?q2<{#LU|I@`h#ugK^^88^YV zM*xXIQC^9!Lc53=%1tGunUPVi@9}lNh@m zt%t&ie-ZJYO5qK@6uY3CW6j?ph=>qln97zF>mF@u6!=Js^gfzoK$wjLl@|rZaRg&= zJ{mUnz4vzTMi_(MT`tuG+g`K^*3HJIQYA3h#_1<^J_aj3;ow6^E;Uu+P5@OaL}LHZ zNR|K*H6saY*^k~4=t9@5*6i`48`bKaM7a`9iiKO3g%Q|cI{7_-1XdwY06o#Z-b2U# zEaY|^=RDFJ3$@IW-devsdjE@R2xn}7$!)01d_qQw{Z2*m;Qge4rx~ul6f!GZ0hB}Z?09}$Ds`-Yv<`b09S^cZoB=iX{`8*YFp#3RwO<3~+a7(DAsv##6C$ zd1mlZD`bE+KX11*J?}!)aX%~EHp#dt6dXidW-;?6iMqN^E2$T6O?z2G3eOz4b+3b~ ze|#D-c(%D|Zb_jduIK>nmexqIP^QY!Z90pSX0+q9!z~Gi#3!;%jVlbjJh(-o)1hou znzxGKX=!r^<7=>`MtUs-H1STx(^nkqx{jip-sncBZ&)v9*^ew&G*IHz!;QdLhb6%; z8dLGhR_8S^m8qion0d^4x`Y9yn7opVIr*b-LzDy7TAGC)1(YO03kL(k5C%dvJdG{ALwjjvOqUEA56yKt3-B%;w}6@s~3<_AlJkj zf0ZJbf&D%y$h2>@MUbV)!r`EL$_ly-H(E7-##7-{+8!^pMb7+B*a%Z2=1LwR#^L@_ z+0n2VNo5H%@*)-qHQkLuOrpg)ewB;DH)@X#bp5tz&0604vxxuM#-D8U?C)S-l(kMV1< z^=N>p=Oj_Q9+0YE+i$H=$P>%95-Z*2d8ub<2Ip`%HO-U3VFt$?W$iRn86#9Sx857gc&LSyb<4k%=I3|xmMJSjdw(?cZ(T2lwOktCqC9C6O<7s*w&{bvE2N7 zDk1;ZXbRShW(@wy8o3UuO{&CgwjI^%1V{;DyB!FILykrtYLd}TpmcT^T3SSrj51^+_^T7S*$o%lT;L&W5wfx zRGVX(uDOJ*096l zUgr%%m0Pqbdk3g(2FdIN^>`|}tY>m?4xRCLG zun!Xx6De`Z_9r3WjKx)bgO+enXoLUtx&GX%TdDeEqO3&C$AmCQ1NB8!PT56*AZ<8L z6N6W^NWWKnsQZ34y6o@Qr#1|WE7e8$P(poJVpyrAx>8>WoHm4HGw4NchFb!#UpbDedE+kbTC~O z*QamAy1@m6-M;0Y2SQ=+<#4b zFhx&LNBkdTI2FMxDE*_rt?l)4b+38{NJJ=#CcC`2`v+Z>^1Mh_@uU(&rlQ985;3dd zsq*-@e=|5+OeH%=H8`VrMX1=1MxOdnfDqvKD~|YX=&c;oyocOR`vFqG$U4)>xC_%s z&icL(P!$x>Y>d*621*sTF@eQ*VZ)DHk<6Gg>7u)}*NzTa(0NP$bFN~9_24&tWI(J9 zWvMb-wR}FC0?Q)JPXZVIe)=#ou)J}FWcnGmuOiqAPrf*SGwnTfM86EQ%N0RnA^>x6 zz(&9yUR*kWVUlf--a~7rtmlca>5f-)8D=OSGkqt{iVV&erwvf*V2QvR7o>J4Xt zjqmb-H1goJOC~Wyj%+0|$9pCMkd;cENN}lLQm+Yaa|YLC8>`#kS*y!|Z{vEWVKDb4Rd# z{qEIyrLUG9TKdy~huh9XYtNLYx6jhCTS&I^l~2pFgFyL2`r3@59zgR3cqG4ceRAb% zw^PJ2B03%zsW`TLvT<5%D+6@V;m+L2y-F^pK6ad3CtsaZwr6mMa9q7KuLr{&@UOh< zu<1K(51b;cW!8EI9&ER!ed__;dRnagtSxs%<5eM(vS@(@V9iFlN^|5}!`K9K(b@I$ z9Pw{%ITw-dZpHH5fEk@YfU}d;`(poo$M1C!tGN^zhdfQ5A(FPB^JlcSuwihE7)y?d zP|-YpkkeGFtF5wKIVn`0RQ;$CIZDdu$(hXX%BM}~a+MSKt9-mj4%%nj&m-I*O`rN| z2ahq}y9+5{XQzMRuCHz8s;;6=qHlh{ zO#VoTa$}D@g0oI)Yn-amIFO`Sm~c{Mx=K@JKt|HUU0oGRj(KVlM>4dwDVpVI6)}Ci z?S9)H-%u+DYd3JYeVMe?Zp{D2pnjJ_(dV?I{dB&=4M;XPjNZK4WU~6KQ@R;_6+LDP zyt647;24A6B_lg(pt#8nnLl2qR1JQ|?Y?~joD|@S2u!dPtt^>7`83>lkc+BFCN!Tj z%7-2|Y+h9tYHcP)67Ke|tUomZyB703C&E$hzl~f!Jk`p+wc3!Q)K}bHX_31ZQcTxS z&bQTy1vamoH9PFC=a02k5u1p7v)}LZC}z3-bQ=|;bo=u9DLu^m?g8`>Eem0F-xC}f zb2y)gLnR)$GrAJJ5-~b|K^h6k-HxZ(KsTXgX#LpuoUyR~EgL4YF6Y)fbLH}a=Jn3? z(+?BYOPfZ3$m3>;C2#0t^MdAG%r|J+=#P4>-oR>pgJ@=gke%6giX>Dsuvrv;jOENO z!W#{k*L)y^q`k%@t<{Zi!&jQ&0cgLf(|CMQHN(Sb3Ln!PJyd;f>RN|7!YzIbi8sn+ zBsZ}N!HvB)E9cMIejAFAp~#-b*abUKxLrqR}k!8 z;W%*dohgwxw9NYQ{rkj80c;hETBl9au`(A#FyoSdOk_*bz%chjG7g!?E1d(#ze%xJ z`Ob!$R;%}H*7SO5=5h>iJ7IBO;fVfNaDQ((B|xTWc`eRgE2w@y48LB|jl9cPa zhWBN$!;s?x!saE2-s|D_)}`%M%Ra?XEs(}@lB2MU4SJw8@>z*}Zq>Q94UGAGl`9hJ z&BJ^m(-5sZVR*B;;IXxuT+DGu^iPqN1SzHw&6FwYQ2p`d=2rvLS z#6jML?QRvVZ=HM|+G8(v+7lk(9_oFXK4_U)2D?~td}7G_tVOHB`0~?sb?#vdF|oON zkmMLIyU)_&QG5ht#?>0WG2=T6K4|ru?^2n$rfFQo*X0I&JKs;=2DWv^rmv2V-J8p9 zTI`C(_QhPwN>2xX!-h@Yo9fkP5%|VyRA0+27{DzBrssI_5v;P8fb8f%q+E znueRtcUiQ1$|m5<7^$Z@iRj%PR<=!^#b*Kq2%p%0)jQug+)<;@;2%U>-kkpyvQFHl zI~_-^Pft2du0=?&rR4#=G(RXjgA|u$L5c^HK^6G9`n{f$kre=Md)dpSD4)u*<<@G& zmaVemaV{`}Qj8DQYYfkS^545gCxU6t^y2-_>&7wwoV`RB9Us<8mq@`rtfXRk>pfIS ztTS+Eq&5v(-`8R5spXIJMcf{(GH(Eu5ot4x_XUhQ5!g*is0Fy`qJZV%IGr zzIy?FzaC&+CBs;yRF`aGA5K*M&X*is@>^1oAernLzA{+hTcnJs8bh9n3kdha{_9Mr zkyz}uyU+xgZ)!41^dh)K3}q*=REV1W89shGVxrq{iP&liN{PYYg%5!%nrVO_gH|3c zBX*fwC2}M#syb`R%Zw0u0&}>ghhd@{L;W`6+Dtk~x9to#Fj%Wxg(?{Dx=K-arf%P- zoR3gp`K1U+Ty$w(_<}N3(u@7Ka1xjmoQ$V}LgZ@{mfWU-M2*bG%FD{Z#lg(VnS7*zMEI{|bX6o78D@46H!~ZElNH3yN>2C3h@7RX zDLFeU8!wBvsj;PzEj{@sdn0EHCsQMGS5rqPOFLU~ZV(5EjUHK0@XwhEJ7X(kHXiVw zJxU~myvQt&qj65okgL7H|Jpt4s@E*j_VZtB!$&s`$(bf9q^d)*DaH)F(cbXz=W7G?YcpTZwLo)%j z`}y-6)u_9{p`&{~#x<^V{l}Pg#M5*=jW&R~3ok{)`)P2>DlG2R481v^6qK%FDtmXF zKQ*i@f;4e4yR1~m12)Hr#!|Bq2fxLy-p(+8>_ETQGYdnpkW;Iyqo2(wmPH$b>?6R; z;+j0N7#xR(S3jJO4@JkeOmi1SYl6%|;NE<09LjY+ke^63TLxRW{W!^4p%6v{*uH?U zn%px()*ko_+^&qq>U@KlGAe|w{BEqg7UMB#HdJP-H)ONo-uG@b;12%T^ZE} zx3OvVSdSQgP#>NX@d!hE0|=Q!uB{VFx+7O&Vc7bmK(Vb;uiZs7aCM6K1^RvL5yD-+ zpnl4(!7}KdVH1o5{9%4TneB(RhMv@)co=!AH{q77xyRA1eGi@$YZx1zu=b~2oU~Q< zJzo!YH!eBH${!(S&L2h0uS}W5DW7k6Noo? z+ysdN0JE{`A+xAjdYY26K{zst2DuI!IR`l#M5|(F2N}s=RvvOzausA2XtZY~jVR#7fV2??+W513VgOOX7(Z-Vuw4aAk4sjWF= z@^Z5A{4F9({Zni3jivs;`DMmUIgeM-^dg@QEv;9FG;L-<4Q-;&F^{xcQM`g1UumN- zebBF*jUdPp-rb0*u)d%K`-LaaiEY)gi?!QNQw3IEnwQRf9btQxe6*9_QxLFg&)9v* za-gLvA!^E^){_$;Enq?WBIR@^QwL{K_tuJ$)7((~ z`14Q4G1Q%zlVav+T^QNflTzl{NFgST2PNiJECarG+C<~UW0v0o=4Tx1ZtrK$ntxK) zX^nB6^}BQGyBjbo*f5u=J_y^CHIZ`5eHxRjYb=X8EBx7F^>$3YQtNoHmitA<3B~#Y z|F>%uz=^oEz*YM=XvcLScgJ%#`;&rUQQBc9P}qdxTKZ1OtE36>y2PjCx@kvnL5Orr zZdJwW>mB!K>9Nv-+$9u=+S0e{Z#(?^LuyGHxM_7V z@+dZT^Xv0Z+`4Ek#cuk#5G!;}#U8>s#TmgV0RUxpX5**ei~u_RjQ%&DoYbB^%W^rZ z8!nbE(>lUBuQZKcB|nktTGHl!HUDI&gC8TdSG9@w`H<-x+qY}+<6?-;M%}BVkj0tLi|6=A3v**_c4o1qVP=DLPYTlNSV^bU^*zLcYe~7r zG$O>-Qu$672cQH|U6)74_jyURgWp>xD^j>my2bOG#8a+k7t*ON2+{IZI3RKMz2IkC%28nB8!`D z(>CY|u`Tk8R;&$r;EcxlIwa4s_CRB!hC&bvQ#lM(qLI=Cb70UC?pBw`=3&6HV&Mw^ zd=cpd-W<2Xmjk22gRqxn1uJx|!4#vzim}sf5x=yPWdXmm>vRtP)34W>D2Imcto@=O zmIKBr;p@A(-BId$&{8@T7T{Zq(2s(AD#=!Z-3&ebi=LSP-_6~XN^lgc7-J z&nt{z5ds7wf?I;ZH%E--8#UdmNIm3;fk>#7tf8IcF#k&2gwYVBNlv=oHKLPsh6MXM zM3CiA&UfI4Bm|0}A@CAx8O8)sIFhUMU}N};z#(7~h#USP!5ZxzaIgAVVQXT#NSOQ! zDgo4_9%Ri|rBi!C`uz>9D5cYTECANnywU64P*>(&uG#(1ccwwKlOXcI zFK{a&?Juf~fN6V#@oru)IzD+wg#9Z}4}jZUb zj1rNo3-*?PwEOKX9I05O%;vL?Efi^k&%M%Zmz?*Ssyo8OI(#df(HRB_PxlWbvA3vE ztepQRDgDKz`I_=asPJ2uv9N^kXEBn%1he~(x2J1g3L%%{uw{q6LM@e-)A^hmHWbdv z$tHmrOhZG{{iE0UBYrQHI9ghY=b*@2#3&NZGVW=z5VF%KG30;vBJsajcb6I2+3=zK zfw5-4`hS5%ru^FH7jzH&P&+}Waez3Ec+rBikaH2^bh9)4*%HEibeK%kMP)-fGSm;A+} zI54U2x3BU|D^B-2Ah&P#0!o`nnn`M}b*_=UX&+U&Kk#=SVGr4AplXlQkW2pGIP7{y z#{;uM-LY+EP&Zt>`XR}#r#_**>K$4wYzoLNz%QZ2f8Q}XdIj;O#JOhVE}?y;-y9uk zmwLCrG$8JFYD0L)_dfyn7X`hMsoYK&iwQCSzi{djb>S(qb|;d7@nAYSV<$2?0jW_} z@Rs%_#251>Z1{W|_ZOx}T0VAg)_}+Y@0{s13bdT*Q43fTx|JjeLRrLGeOLKQ^@UDd z&h<}EwhQq6eJzP9?gHH-(pOj%_a9=<^#P&Nt4m0W#eajV6G%_$viTOTZ-)in%{%@e z+Ti*YHt=aR;a7=~z9Gn{fVDkd=buZmQ<6A{eP|s`5o0$x!Ga#2Z2)XdpyQ z)bVA8Pt3wQtADW>j9>VmVflFGW_ zFq26cOa%UbMj&;>=BG~4zVkXmkBwVTz#aQbXFsRly~cULpYa-GbB1Rf0*-oh^jWWx z__|Yn0r6qoCM5*c9%I#C%${I1=w{u5$lx{}9B5)svKokOkEPIM35GRaC&>swiRqDO zgiBsW)(!e(|Higcz7f7*{kv&8wZ8nobc1Tf$e-1+Tj~r-FgWB4Nzfm1(hP8i$rb|x zf2|~+HNNZ+xWF9ha;?xoinQ1fr$q(7}UtrxFB_I@*a2_Q=D^!0)4nB8eD zY!Rfsz)tSS*;kk|pSqQG+cfE&|L@@@jC2Ur-tvR^yoWXHF#8wyqEaeF2tW0T>MxfT zSw0eTIBYm7jfgNK){)FqwA%gsL%<&(As948a7^{rH6u?Z{P%S6qu?}lT zs4{G#c~kWpj=+}DG+(pN$%N~slJ2Phrv5+qe??;#wto_-vOIZPMzOOb!#A3}{inz(2r0NF?>Y@b!{`844AjPkkBF9F+z|C}4t+ za43~Rh5t#qd_}x5W#g-u;}po;lhkCAm*Kx-Cl1N1W zsk+O2qB^2W3oDWQLsldI0mM(qvq`hp9%)+FZMXOMmOJwbeWl5ku6=GBv!$F5musP8 zrOMhD57APV*V!-NGu=87RyQUlD z@n6)lePCKcUh1?}YJYPCy^URY8P6XD2`(zUZE#6lnjf>#+;Mes8o9fJ4juF2k8bK) zTBh_RC0?!ywA0~lC`ckhB)0Uh-dqwKc@68xAMIh?w`4a8O!({dKf?6-K1zh@-HsS8 z(RU!v3lm)Y?JI5Q%j?jnd-z6_xzo#AME`~IXaMCFsh9SJz?x+@y0g&HRy$j#c0>sF z!Q*b%5T6CIj&*%kwoRvN7|@khy6Cc9J$$Wis@lZ9Tyf;C?o)4yMvl(zkU%0b7b`CZ8y7M)wS=N1^8W(M1djj! delta 281657 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 >1#J8ysRXy?`sF{BcLgNUw9op;`{20mu$SUDEY7 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%0D$oYX*Fauc;i=_FW$HKVzWzMt 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Μ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

xVS!!M4Q->cjfm@j#s~iY0(f?MI4YW`dI31a3M1 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 [u32; 5] { + x +} + +pub fn id_i8(x: i8) -> i8 { + x +} + +pub fn id_i16(x: i16) -> i16 { + x +} + +pub fn id_i32(x: i32) -> i32 { + x +} + +pub fn id_i64(x: i64) -> i64 { + x +} + +pub fn id_isize(x: isize) -> isize { + x +} + +pub fn id_tuple(x: (u32, u32)) -> (u32, u32) { + x +} + +pub fn id_u8(x: u8) -> u8 { + x +} + +pub fn id_u16(x: u16) -> u16 { + x +} + +pub fn id_u32(x: u32) -> u32 { + x +} + +pub fn id_u64(x: u64) -> u64 { + x +} + +pub fn id_usize(x: usize) -> usize { + x +} + +pub fn id_unit(x: ()) -> () { + x +} diff --git a/intTests/test_mir_verify_basic/test.saw b/intTests/test_mir_verify_basic/test.saw new file mode 100644 index 0000000000..5499e61850 --- /dev/null +++ b/intTests/test_mir_verify_basic/test.saw @@ -0,0 +1,87 @@ +enable_experimental; + +// Specifications using `mir_fresh_var` + +let id_spec mty = do { + x <- mir_fresh_var "x" mty; + + mir_execute_func [mir_term x]; + + mir_return (mir_term x); +}; + +let id_u32_wrong = do { + x <- mir_fresh_var "x" (mir_u32); + + mir_execute_func [mir_term x]; + + mir_return (mir_term {{ x + 1 : [32] }}); +}; + +let id_unit = do { + x <- mir_fresh_var "x" (mir_tuple []); + + mir_execute_func [mir_term x]; +}; + +// Specifications using specific Cryptol terms + +let id_array_cryptol_spec = do { + let t = mir_term {{ [42, 27, 100, 27, 42] : [5][32] }}; + + mir_execute_func [t]; + + mir_return t; +}; + +let id_tuple_cryptol_spec = do { + let t = mir_term {{ (42, 27) : ([32], [32]) }}; + + mir_execute_func [t]; + + mir_return t; +}; + +let id_u32_cryptol_spec = do { + let t = mir_term {{ 42 : [32] }}; + + mir_execute_func [t]; + + mir_return t; +}; + +let id_unit_cryptol_spec = do { + mir_execute_func [mir_term {{ () }}]; +}; + +///// + +m <- mir_load_module "test.linked-mir.json"; + +mir_verify m "test::id_array" [] false (id_spec (mir_array 5 mir_u32)) z3; +mir_verify m "test::id_i8" [] false (id_spec mir_i8) z3; +mir_verify m "test::id_i16" [] false (id_spec mir_i16) z3; +mir_verify m "test::id_i32" [] false (id_spec mir_i32) z3; +mir_verify m "test::id_i64" [] false (id_spec mir_i64) z3; +mir_verify m "test::id_isize" [] false (id_spec mir_isize) z3; +mir_verify m "test::id_tuple" [] false (id_spec (mir_tuple [mir_u32, mir_u32])) z3; +mir_verify m "test::id_u8" [] false (id_spec mir_u8) z3; +mir_verify m "test::id_u16" [] false (id_spec mir_u16) z3; +mir_verify m "test::id_u32" [] false (id_spec mir_u32) z3; +mir_verify m "test::id_u64" [] false (id_spec mir_u64) z3; +mir_verify m "test::id_usize" [] false (id_spec mir_usize) z3; +mir_verify m "test::id_unit" [] false id_unit z3; + +// Test using fully disambiguated names +mir_verify m "test/775505e0::id_u8" [] false (id_spec mir_u8) z3; +mir_verify m "test/775505e0::id_u8[0]" [] false (id_spec mir_u8) z3; + +mir_verify m "test::id_array" [] false id_array_cryptol_spec z3; +mir_verify m "test::id_tuple" [] false id_tuple_cryptol_spec z3; +mir_verify m "test::id_u32" [] false id_u32_cryptol_spec z3; +mir_verify m "test::id_unit" [] false id_unit_cryptol_spec z3; + +// A specification that is expected to fail +fails ( + mir_verify m "test::id_u32" [] false id_u32_wrong z3 +); diff --git a/intTests/test_mir_verify_basic/test.sh b/intTests/test_mir_verify_basic/test.sh new file mode 100755 index 0000000000..2315cc233c --- /dev/null +++ b/intTests/test_mir_verify_basic/test.sh @@ -0,0 +1,3 @@ +set -e + +$SAW test.saw diff --git a/intTests/test_mir_verify_conds/Makefile b/intTests/test_mir_verify_conds/Makefile new file mode 100644 index 0000000000..51d2be6864 --- /dev/null +++ b/intTests/test_mir_verify_conds/Makefile @@ -0,0 +1,9 @@ +all: test.linked-mir.json + +test.linked-mir.json: test.rs + saw-rustc $< + rm test libtest.mir libtest.rlib + +.PHONY: clean +clean: + rm -f test.linked-mir.json diff --git a/intTests/test_mir_verify_conds/test.linked-mir.json b/intTests/test_mir_verify_conds/test.linked-mir.json new file mode 100644 index 0000000000..c1a7cf2328 --- /dev/null +++ b/intTests/test_mir_verify_conds/test.linked-mir.json @@ -0,0 +1 @@ +{"fns":[{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::u32"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}},"pos":"test.rs:2:5: 2:6","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:2:5: 2:10","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"uint","size":4,"val":"1"},"ty":"ty::u32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Add"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _2 + const 1_u32`, which would overflow","pos":"test.rs:2:5: 2:10","target":"bb1"}},"blockid":"bb0"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"test.rs:2:5: 2:10","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}}],"terminator":{"kind":"Return","pos":"test.rs:3:2: 3:2"}},"blockid":"bb1"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Tuple::7063e33f0dbc8a58"}]},"name":"test/4ae812d0::add1","return_ty":"ty::u32","spread_arg":null}],"adts":[],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"test/4ae812d0::add1","kind":"Item","substs":[]},"name":"test/4ae812d0::add1"}],"tys":[{"name":"ty::u32","ty":{"kind":"Uint","uintkind":{"kind":"U32"}}},{"name":"ty::bool","ty":{"kind":"Bool"}},{"name":"ty::Tuple::7063e33f0dbc8a58","ty":{"kind":"Tuple","tys":["ty::u32","ty::bool"]}}],"roots":["test/4ae812d0::add1"]} \ No newline at end of file diff --git a/intTests/test_mir_verify_conds/test.rs b/intTests/test_mir_verify_conds/test.rs new file mode 100644 index 0000000000..1161df5eea --- /dev/null +++ b/intTests/test_mir_verify_conds/test.rs @@ -0,0 +1,3 @@ +pub fn add1(x: u32) -> u32 { + x + 1 +} diff --git a/intTests/test_mir_verify_conds/test.saw b/intTests/test_mir_verify_conds/test.saw new file mode 100644 index 0000000000..c35419ea13 --- /dev/null +++ b/intTests/test_mir_verify_conds/test.saw @@ -0,0 +1,56 @@ +enable_experimental; + +// A spec using mir_precond + +let add1_precond_spec = do { + x <- mir_fresh_var "x" mir_u32; + mir_precond {{ x < 0xffffffff }}; + + mir_execute_func [mir_term x]; + + mir_return (mir_term {{ x + 1 }}); +}; + +// A spec using mir_assert in a precondition + +let add1_precond_assert_spec = do { + x <- mir_fresh_var "x" mir_u32; + mir_assert {{ x < 0xffffffff }}; + + mir_execute_func [mir_term x]; + + mir_return (mir_term {{ x + 1 }}); +}; + +// A spec using mir_postcond + +let add1_postcond_spec = do { + x <- mir_fresh_var "x" mir_u32; + mir_precond {{ x < 0xffffffff }}; + + mir_execute_func [mir_term x]; + + x' <- mir_fresh_var "x'" mir_u32; + mir_return (mir_term x'); + mir_postcond {{ x < x' }}; +}; + +// A spec using mir_assert in a postcondition + +let add1_postcond_assert_spec = do { + x <- mir_fresh_var "x" mir_u32; + mir_precond {{ x < 0xffffffff }}; + + mir_execute_func [mir_term x]; + + x' <- mir_fresh_var "x'" mir_u32; + mir_return (mir_term x'); + mir_assert {{ x < x' }}; +}; + +m <- mir_load_module "test.linked-mir.json"; + +mir_verify m "test::add1" [] false add1_precond_spec z3; +mir_verify m "test::add1" [] false add1_precond_assert_spec z3; +mir_verify m "test::add1" [] false add1_postcond_spec z3; +mir_verify m "test::add1" [] false add1_postcond_assert_spec z3; diff --git a/intTests/test_mir_verify_conds/test.sh b/intTests/test_mir_verify_conds/test.sh new file mode 100755 index 0000000000..2315cc233c --- /dev/null +++ b/intTests/test_mir_verify_conds/test.sh @@ -0,0 +1,3 @@ +set -e + +$SAW test.saw diff --git a/intTests/test_mir_verify_pop_count/Makefile b/intTests/test_mir_verify_pop_count/Makefile new file mode 100644 index 0000000000..51d2be6864 --- /dev/null +++ b/intTests/test_mir_verify_pop_count/Makefile @@ -0,0 +1,9 @@ +all: test.linked-mir.json + +test.linked-mir.json: test.rs + saw-rustc $< + rm test libtest.mir libtest.rlib + +.PHONY: clean +clean: + rm -f test.linked-mir.json diff --git a/intTests/test_mir_verify_pop_count/test.linked-mir.json b/intTests/test_mir_verify_pop_count/test.linked-mir.json new file mode 100644 index 0000000000..92496ab136 --- /dev/null +++ b/intTests/test_mir_verify_pop_count/test.linked-mir.json @@ -0,0 +1 @@ +{"fns":[{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}},"pos":"test.rs:3:9: 3:10","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_5","ty":"ty::u32"}},"pos":"test.rs:3:15: 3:16","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_6","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:3:14: 3:22","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_5","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"int","size":4,"val":"1"},"ty":"ty::i32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Shr"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_6","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to shift right by `const 1_i32`, which would overflow","pos":"test.rs:3:14: 3:22","target":"bb1"}},"blockid":"bb0"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::u32"}},"pos":"test.rs:3:14: 3:22","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_6","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::u32"}},"pos":"test.rs:3:13: 3:36","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::u32"}},"kind":"Move"},"R":{"data":{"rendered":{"kind":"uint","size":4,"val":"1431655765"},"ty":"ty::u32"},"kind":"Constant"},"kind":"BinaryOp","op":{"kind":"BitAnd"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_7","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:3:9: 3:36","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::u32"}},"kind":"Copy"},"kind":"CheckedBinaryOp","op":{"kind":"Sub"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_7","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _2 - move _3`, which would overflow","pos":"test.rs:3:9: 3:36","target":"bb2"}},"blockid":"bb1"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"pos":"test.rs:3:5: 3:36","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_7","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_9","ty":"ty::u32"}},"pos":"test.rs:4:10: 4:11","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_8","ty":"ty::u32"}},"pos":"test.rs:4:9: 4:25","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_9","ty":"ty::u32"}},"kind":"Move"},"R":{"data":{"rendered":{"kind":"uint","size":4,"val":"858993459"},"ty":"ty::u32"},"kind":"Constant"},"kind":"BinaryOp","op":{"kind":"BitAnd"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_12","ty":"ty::u32"}},"pos":"test.rs:4:30: 4:31","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_13","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:4:29: 4:37","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_12","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"int","size":4,"val":"2"},"ty":"ty::i32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Shr"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_13","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to shift right by `const 2_i32`, which would overflow","pos":"test.rs:4:29: 4:37","target":"bb3"}},"blockid":"bb2"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_11","ty":"ty::u32"}},"pos":"test.rs:4:29: 4:37","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_13","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_10","ty":"ty::u32"}},"pos":"test.rs:4:28: 4:51","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_11","ty":"ty::u32"}},"kind":"Move"},"R":{"data":{"rendered":{"kind":"uint","size":4,"val":"858993459"},"ty":"ty::u32"},"kind":"Constant"},"kind":"BinaryOp","op":{"kind":"BitAnd"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_14","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:4:9: 4:51","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_8","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_10","ty":"ty::u32"}},"kind":"Copy"},"kind":"CheckedBinaryOp","op":{"kind":"Add"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_14","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _8 + move _10`, which would overflow","pos":"test.rs:4:9: 4:51","target":"bb4"}},"blockid":"bb3"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"pos":"test.rs:4:5: 4:51","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_14","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_16","ty":"ty::u32"}},"pos":"test.rs:5:10: 5:11","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_18","ty":"ty::u32"}},"pos":"test.rs:5:15: 5:16","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_19","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:5:14: 5:22","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_18","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"int","size":4,"val":"4"},"ty":"ty::i32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Shr"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_19","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to shift right by `const 4_i32`, which would overflow","pos":"test.rs:5:14: 5:22","target":"bb5"}},"blockid":"bb4"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_17","ty":"ty::u32"}},"pos":"test.rs:5:14: 5:22","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_19","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_20","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:5:9: 5:23","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_16","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_17","ty":"ty::u32"}},"kind":"Copy"},"kind":"CheckedBinaryOp","op":{"kind":"Add"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_20","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _16 + move _17`, which would overflow","pos":"test.rs:5:9: 5:23","target":"bb6"}},"blockid":"bb5"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_15","ty":"ty::u32"}},"pos":"test.rs:5:9: 5:23","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_20","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"pos":"test.rs:5:5: 5:36","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_15","ty":"ty::u32"}},"kind":"Move"},"R":{"data":{"rendered":{"kind":"uint","size":4,"val":"252645135"},"ty":"ty::u32"},"kind":"Constant"},"kind":"BinaryOp","op":{"kind":"BitAnd"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_21","ty":"ty::u32"}},"pos":"test.rs:6:9: 6:10","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_23","ty":"ty::u32"}},"pos":"test.rs:6:14: 6:15","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_24","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:6:13: 6:21","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_23","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"int","size":4,"val":"8"},"ty":"ty::i32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Shr"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_24","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to shift right by `const 8_i32`, which would overflow","pos":"test.rs:6:13: 6:21","target":"bb7"}},"blockid":"bb6"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_22","ty":"ty::u32"}},"pos":"test.rs:6:13: 6:21","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_24","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_25","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:6:9: 6:21","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_21","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_22","ty":"ty::u32"}},"kind":"Copy"},"kind":"CheckedBinaryOp","op":{"kind":"Add"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_25","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _21 + move _22`, which would overflow","pos":"test.rs:6:9: 6:21","target":"bb8"}},"blockid":"bb7"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"pos":"test.rs:6:5: 6:21","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_25","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_26","ty":"ty::u32"}},"pos":"test.rs:7:9: 7:10","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_28","ty":"ty::u32"}},"pos":"test.rs:7:14: 7:15","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_29","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:7:13: 7:22","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_28","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"rendered":{"kind":"int","size":4,"val":"16"},"ty":"ty::i32"},"kind":"Constant"},"kind":"CheckedBinaryOp","op":{"kind":"Shr"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_29","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to shift right by `const 16_i32`, which would overflow","pos":"test.rs:7:13: 7:22","target":"bb9"}},"blockid":"bb8"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_27","ty":"ty::u32"}},"pos":"test.rs:7:13: 7:22","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_29","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_30","ty":"ty::Tuple::7063e33f0dbc8a58"}},"pos":"test.rs:7:9: 7:22","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_26","ty":"ty::u32"}},"kind":"Copy"},"R":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_27","ty":"ty::u32"}},"kind":"Copy"},"kind":"CheckedBinaryOp","op":{"kind":"Add"}}}],"terminator":{"cleanup":null,"cond":{"data":{"data":[{"field":1,"kind":"Field","ty":"ty::bool"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_30","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"},"expected":false,"kind":"Assert","msg":"attempt to compute `move _26 + move _27`, which would overflow","pos":"test.rs:7:9: 7:22","target":"bb10"}},"blockid":"bb9"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"pos":"test.rs:7:5: 7:22","rhs":{"kind":"Use","usevar":{"data":{"data":[{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_30","ty":"ty::Tuple::7063e33f0dbc8a58"}},"kind":"Move"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_31","ty":"ty::u32"}},"pos":"test.rs:8:5: 8:6","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"test.rs:8:5: 8:19","rhs":{"L":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_31","ty":"ty::u32"}},"kind":"Move"},"R":{"data":{"rendered":{"kind":"uint","size":4,"val":"63"},"ty":"ty::u32"},"kind":"Constant"},"kind":"BinaryOp","op":{"kind":"BitAnd"}}}],"terminator":{"kind":"Return","pos":"test.rs:9:2: 9:2"}},"blockid":"bb10"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_5","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_6","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_7","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_8","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_9","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_10","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_11","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_12","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_13","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_14","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_15","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_16","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_17","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_18","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_19","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_20","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_21","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_22","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_23","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_24","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_25","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_26","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_27","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_28","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_29","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_30","ty":"ty::Tuple::7063e33f0dbc8a58"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_31","ty":"ty::u32"}]},"name":"test/6f0edd4f::pop_count","return_ty":"ty::u32","spread_arg":null}],"adts":[],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"test/6f0edd4f::pop_count","kind":"Item","substs":[]},"name":"test/6f0edd4f::pop_count"}],"tys":[{"name":"ty::u32","ty":{"kind":"Uint","uintkind":{"kind":"U32"}}},{"name":"ty::bool","ty":{"kind":"Bool"}},{"name":"ty::Tuple::7063e33f0dbc8a58","ty":{"kind":"Tuple","tys":["ty::u32","ty::bool"]}},{"name":"ty::i32","ty":{"intkind":{"kind":"I32"},"kind":"Int"}}],"roots":["test/6f0edd4f::pop_count"]} \ No newline at end of file diff --git a/intTests/test_mir_verify_pop_count/test.rs b/intTests/test_mir_verify_pop_count/test.rs new file mode 100644 index 0000000000..5d804221ea --- /dev/null +++ b/intTests/test_mir_verify_pop_count/test.rs @@ -0,0 +1,9 @@ +// From the book "Hacker's Delight" by Henry S. Warren, Jr. +pub fn pop_count(mut x: u32) -> u32 { + x = x - ((x >> 1) & 0x55555555); + x = (x & 0x33333333) + ((x >> 2) & 0x33333333); + x = (x + (x >> 4)) & 0x0F0F0F0F; + x = x + (x >> 8); + x = x + (x >> 16); + x & 0x0000003F +} diff --git a/intTests/test_mir_verify_pop_count/test.saw b/intTests/test_mir_verify_pop_count/test.saw new file mode 100644 index 0000000000..5fd5ac5a56 --- /dev/null +++ b/intTests/test_mir_verify_pop_count/test.saw @@ -0,0 +1,19 @@ +enable_experimental; + +let +{{ +popCount : [32] -> [32] +popCount bs = zext`{32,6} (ic ! 0) where + ic = [0] # [ if elt then prev + 1 else prev | elt <- bs | prev <- ic] +}}; + +let pop_count_spec = do { + x <- mir_fresh_var "x" mir_u32; + + mir_execute_func [mir_term x]; + + mir_return (mir_term {{ popCount x }}); +}; + +m <- mir_load_module "test.linked-mir.json"; +mir_verify m "test::pop_count" [] false pop_count_spec z3; diff --git a/intTests/test_mir_verify_pop_count/test.sh b/intTests/test_mir_verify_pop_count/test.sh new file mode 100755 index 0000000000..2315cc233c --- /dev/null +++ b/intTests/test_mir_verify_pop_count/test.sh @@ -0,0 +1,3 @@ +set -e + +$SAW test.saw diff --git a/saw-remote-api/docs/SAW.rst b/saw-remote-api/docs/SAW.rst index 34a12df8a8..bfaecdf7e6 100644 --- a/saw-remote-api/docs/SAW.rst +++ b/saw-remote-api/docs/SAW.rst @@ -433,7 +433,7 @@ Parameter fields -``module name`` +``JSON file`` The file containing the MIR JSON file to load. @@ -445,6 +445,93 @@ No return fields +SAW/MIR/verify (command) +~~~~~~~~~~~~~~~~~~~~~~~~ + +Verify the named MIR method meets its specification. + +Parameter fields +++++++++++++++++ + + +``module`` + The module of the function being verified. + + + +``function`` + The function being verified. + + + +``lemmas`` + The specifications to use for other functions during this verification. + + + +``check sat`` + Whether or not to enable path satisfiability checking. + + + +``contract`` + The specification to verify for the function. + + + +``script`` + The script to use to prove the validity of the resulting verification conditions. + + + +``lemma name`` + The name to refer to this verification/contract by later. + + + +Return fields ++++++++++++++ + +No return fields + + + +SAW/MIR/assume (command) +~~~~~~~~~~~~~~~~~~~~~~~~ + +Assume the named MIR method meets its specification. + +Parameter fields +++++++++++++++++ + + +``module`` + The LLVM module containing the function. + + + +``function`` + The function we are assuming a contract for. + + + +``contract`` + The specification to assume for the function. + + + +``lemma name`` + The name to refer to this assumed contract by later. + + + +Return fields ++++++++++++++ + +No return fields + + + SAW/Yosys/import (command) ~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/saw-remote-api/python/saw_client/__init__.py b/saw-remote-api/python/saw_client/__init__.py index af4b54b61a..c6a6189090 100644 --- a/saw-remote-api/python/saw_client/__init__.py +++ b/saw-remote-api/python/saw_client/__init__.py @@ -393,7 +393,7 @@ def jvm_load_class(class_name: str) -> JVMClass: __get_designated_connection().jvm_load_class(name, class_name).result() return JVMClass(class_name, name) -# TODO: this is almost identical to llvm_assume. Can we reduce duplication? +# TODO: this is almost identical to llvm_assume and mir_assume. Can we reduce duplication? def jvm_assume(cls: JVMClass, method_name: str, contract: llvm.Contract, @@ -433,7 +433,7 @@ def jvm_assume(cls: JVMClass, return result -# TODO: this is almost identical to llvm_verify. Can we reduce duplication? +# TODO: this is almost identical to llvm_verify and mir_assume. Can we reduce duplication? def jvm_verify(cls: JVMClass, method_name: str, contract: llvm.Contract, @@ -625,6 +625,134 @@ def llvm_verify(module: LLVMModule, return result + +@dataclass +class MIRModule: + json_file: str + server_name: str + + +def mir_load_module(json_file: str) -> MIRModule: + name = __fresh_server_name(json_file) + __get_designated_connection().mir_load_module(name, json_file).result() + return MIRModule(json_file, name) + + +# TODO: this is almost identical to llvm_assume and jvm_assume. Can we reduce duplication? +def mir_assume(module: MIRModule, + function: str, + contract: llvm.Contract, + lemma_name_hint: Optional[str] = None) -> VerificationResult: + """Assume that the given function satisfies the given contract. Returns an + override linking the function and contract that can be passed as an + argument in calls to `mir_verify` + """ + if lemma_name_hint is None: + lemma_name_hint = contract.__class__.__name__ + "_" + function + name = __fresh_server_name(lemma_name_hint) + + result: VerificationResult + try: + conn = __get_designated_connection() + res = conn.mir_assume(module.server_name, + function, + contract.to_json(), + name) + result = AssumptionSucceeded(server_name=name, + contract=contract, + stdout=res.stdout(), + stderr=res.stderr()) + __global_success = True + # If something stopped us from even **assuming**... + except exceptions.VerificationError as err: + __global_success = False + result = AssumptionFailed(server_name=name, + assumptions=[], + contract=contract, + exception=err) + except Exception as err: + __global_success = False + for view in __designated_views: + view.on_python_exception(err) + raise err from None + + return result + + +# TODO: this is almost identical to llvm_verify and jvm_assume. Can we reduce duplication? +def mir_verify(module: MIRModule, + function: str, + contract: llvm.Contract, + lemmas: List[VerificationResult] = [], + check_sat: bool = False, + script: Optional[proofscript.ProofScript] = None, + lemma_name_hint: Optional[str] = None) -> VerificationResult: + """Verify that the given function satisfies the given contract. Returns an + override linking the function and contract that can be passed as an + argument in further calls to `mir_verify` + """ + + if script is None: + script = proofscript.ProofScript([proofscript.z3([])]) + if lemma_name_hint is None: + lemma_name_hint = contract.__class__.__name__ + "_" + function + + name = __fresh_server_name(lemma_name_hint) + + result: VerificationResult + conn = __get_designated_connection() + + global __global_success + global __designated_views + + try: + res = conn.mir_verify(module.server_name, + function, + [l.server_name for l in lemmas], + check_sat, + contract.to_json(), + script.to_json(), + name) + + stdout = res.stdout() + stderr = res.stderr() + result = VerificationSucceeded(server_name=name, + assumptions=lemmas, + contract=contract, + stdout=stdout, + stderr=stderr) + # If the verification did not succeed... + except exceptions.VerificationError as err: + # FIXME add the goal as an assumption if it failed...? + result = VerificationFailed(server_name=name, + assumptions=lemmas, + contract=contract, + exception=err) + # If something else went wrong... + except Exception as err: + __global_success = False + for view in __designated_views: + view.on_python_exception(err) + raise err from None + + # Log or otherwise process the verification result + for view in __designated_views: + if isinstance(result, VerificationSucceeded): + view.on_success(result) + elif isinstance(result, VerificationFailed): + view.on_failure(result) + + # Note when any failure occurs + __global_success = __global_success and result.is_success() + + # Abort the proof if we failed to assume a failed verification, otherwise + # return the result of the verification + if isinstance(result, AssumptionFailed): + raise result.exception from None + + return result + + def prove(goal: cryptoltypes.CryptolJSON, proof_script: proofscript.ProofScript) -> ProofResult: """Atempts to prove that the expression given as the first argument, `goal`, is diff --git a/saw-remote-api/python/saw_client/commands.py b/saw-remote-api/python/saw_client/commands.py index 2d901631e3..2be5907553 100644 --- a/saw-remote-api/python/saw_client/commands.py +++ b/saw-remote-api/python/saw_client/commands.py @@ -251,6 +251,63 @@ def __init__( def process_result(self, res : Any) -> Any: return res +class MIRLoadModule(SAWCommand): + def __init__(self, connection : argo.HasProtocolState, + name : str, + json_file : str, + timeout : Optional[float]) -> None: + super(MIRLoadModule, self).__init__( + 'SAW/MIR/load module', + {'name': name, 'JSON file': json_file}, + connection, + timeout=timeout + ) + + def process_result(self, res : Any) -> Any: + return res + +class MIRAssume(SAWCommand): + def __init__( + self, + connection : argo.HasProtocolState, + module : str, + function : str, + setup : Any, + lemma_name : str, + timeout : Optional[float]) -> None: + params = {'module': module, + 'function': function, + 'contract': setup, + 'lemma name': lemma_name} + super(MIRAssume, self).__init__('SAW/MIR/assume', params, connection, timeout=timeout) + + def process_result(self, _res : Any) -> Any: + return None + +class MIRVerify(SAWCommand): + def __init__( + self, + connection : argo.HasProtocolState, + module : str, + function : str, + lemmas : List[str], + check_sat : bool, + setup : Any, + script : ProofScript, + lemma_name : str, + timeout : Optional[float]) -> None: + params = {'module': module, + 'function': function, + 'lemmas': lemmas, + 'check sat': check_sat, + 'contract': setup, + 'script': script, + 'lemma name': lemma_name} + super(MIRVerify, self).__init__('SAW/MIR/verify', params, connection, timeout=timeout) + + def process_result(self, res : Any) -> Any: + return res + class Prove(SAWCommand): def __init__( self, diff --git a/saw-remote-api/python/saw_client/connection.py b/saw-remote-api/python/saw_client/connection.py index 7d8d33dae1..d177624edd 100644 --- a/saw-remote-api/python/saw_client/connection.py +++ b/saw-remote-api/python/saw_client/connection.py @@ -229,6 +229,45 @@ def llvm_assume(self, LLVMAssume(self, module, function, contract, lemma_name, timeout) return self.most_recent_result + def mir_load_module(self, name: str, mir_json_file: str, timeout : Optional[float] = None) -> Command: + """Create an instance of the `MIRLoadClass` command. Documentation on the purpose + and use of this command is associated with the top-level `mir_load_class` + function. + """ + self.most_recent_result = MIRLoadModule(self, name, mir_json_file, timeout) + return self.most_recent_result + + def mir_verify(self, + module: str, + function: str, + lemmas: List[str], + check_sat: bool, + contract: Any, + script: ProofScript, + lemma_name: str, + timeout : Optional[float] = None) -> Command: + """Create an instance of the `MIRVerify` command. Documentation on the purpose + and use of this command is associated with the top-level `mir_assume` + function. + """ + self.most_recent_result = \ + MIRVerify(self, module, function, lemmas, check_sat, contract, script, lemma_name, timeout) + return self.most_recent_result + + def mir_assume(self, + module: str, + function: str, + contract: Any, + lemma_name: str, + timeout : Optional[float] = None) -> Command: + """Create an instance of the `MIRAssume` command. Documentation on the purpose + and use of this command is associated with the top-level `mir_assume` + function. + """ + self.most_recent_result = \ + LLVMAssume(self, module, function, contract, lemma_name, timeout) + return self.most_recent_result + def yosys_import(self, name: str, path: str, timeout : Optional[float] = None) -> Command: self.most_recent_result = YosysImport(self, name, path, timeout) return self.most_recent_result diff --git a/saw-remote-api/python/saw_client/crucible.py b/saw-remote-api/python/saw_client/crucible.py index 5d5ff39a0c..f4c18dfaa5 100644 --- a/saw-remote-api/python/saw_client/crucible.py +++ b/saw-remote-api/python/saw_client/crucible.py @@ -12,6 +12,7 @@ from .llvm_type import * from .jvm_type import * +from .mir_type import * JSON = Union[None, bool, int, float, str, Dict, Tuple, List] @@ -89,7 +90,7 @@ def __to_cryptol_str__(self) -> str: class FreshVar(NamedSetupVal): __name : Optional[str] - def __init__(self, spec : 'Contract', type : Union['LLVMType', 'JVMType'], suggested_name : Optional[str] = None) -> None: + def __init__(self, spec : 'Contract', type : Union['LLVMType', 'JVMType', 'MIRType'], suggested_name : Optional[str] = None) -> None: self.__name = suggested_name self.spec = spec self.type = type @@ -119,7 +120,7 @@ def to_json(self) -> JSON: class Allocated(NamedSetupVal): name : Optional[str] - def __init__(self, spec : 'Contract', type : Union['LLVMType','JVMType'], *, + def __init__(self, spec : 'Contract', type : Union['LLVMType', 'JVMType', 'MIRType'], *, mutable : bool = True, alignment : Optional[int] = None) -> None: self.name = None self.spec = spec @@ -247,7 +248,7 @@ class PointsTo: """The workhorse for ``points_to``. """ def __init__(self, pointer : SetupVal, target : SetupVal, *, - check_target_type : Union[PointerType, 'LLVMType', 'JVMType', None] = PointerType(), + check_target_type : Union[PointerType, 'LLVMType', 'JVMType', 'MIRType', None] = PointerType(), condition : Optional[Condition] = None) -> None: self.pointer = pointer self.target = target @@ -398,7 +399,7 @@ def get_fresh_name(self, hint : str = 'x') -> str: self.__used_names.add(new_name) return new_name - def fresh_var(self, type : Union['LLVMType','JVMType'], suggested_name : Optional[str] = None) -> FreshVar: + def fresh_var(self, type : Union['LLVMType','JVMType', 'MIRType'], suggested_name : Optional[str] = None) -> FreshVar: """Declares a fresh variable of type ``type`` (with name ``suggested_name`` if provided and available).""" fresh_name = self.get_fresh_name('x' if suggested_name is None else self.get_fresh_name(suggested_name)) v = FreshVar(self, type, fresh_name) @@ -410,7 +411,7 @@ def fresh_var(self, type : Union['LLVMType','JVMType'], suggested_name : Optiona raise Exception("wrong state") return v - def alloc(self, type : Union['LLVMType', 'JVMType'], *, read_only : bool = False, + def alloc(self, type : Union['LLVMType', 'JVMType', 'MIRType'], *, read_only : bool = False, alignment : Optional[int] = None, points_to : Optional[SetupVal] = None) -> SetupVal: """Allocates a pointer of type ``type``. @@ -439,7 +440,7 @@ def alloc(self, type : Union['LLVMType', 'JVMType'], *, read_only : bool = False return a def points_to(self, pointer : SetupVal, target : SetupVal, *, - check_target_type : Union[PointerType, 'LLVMType', 'JVMType', None] = PointerType(), + check_target_type : Union[PointerType, 'LLVMType', 'JVMType', 'MIRType', None] = PointerType(), condition : Optional[Condition] = None) -> None: """Declare that the memory location indicated by the ``pointer`` contains the ``target``. @@ -469,7 +470,7 @@ def points_to_bitfield(self, pointer : SetupVal, field_name : str, contains the ``target``. Currently, this function only supports LLVM verification. Attempting to - use this function for JVM verification will result in an error. + use this function for JVM or MIR verification will result in an error. """ pt = PointsToBitfield(pointer, field_name, target) if self.__state == 'pre': @@ -651,7 +652,7 @@ def cry_f(s : str) -> CryptolTerm: ``cry_f('{ {"x": 5, "y": 4} }')`` equals ``cry('{x = 5, y = 4}')`` but ``f'{ {"x": 5, "y": 4} }'`` equals ``'{"x": 5, "y": 4}'``. Only the former is valid Cryptol syntax for a record. - + Note that any conversion or format specifier will always result in the argument being rendered as a Cryptol string literal with the conversion and/or formating applied. For example, `cry('f {5}')` is equal to diff --git a/saw-remote-api/python/saw_client/mir.py b/saw-remote-api/python/saw_client/mir.py new file mode 100644 index 0000000000..f7dc895e58 --- /dev/null +++ b/saw-remote-api/python/saw_client/mir.py @@ -0,0 +1,42 @@ +from cryptol import cryptoltypes +from .utils import deprecated + +from .mir_type import * +from .crucible import * + +################################################## +# Helpers for type construction +################################################## + +bool_ty = MIRBoolType() +char_ty = MIRCharType() +str_ty = MIRStrType() + +i8 = MIRI8Type() +i16 = MIRI16Type() +i32 = MIRI32Type() +i64 = MIRI64Type() +i128 = MIRI128Type() +isize = MIRIsizeType() + +f32 = MIRF32Type() +f64 = MIRF64Type() + +u8 = MIRU8Type() +u16 = MIRU16Type() +u32 = MIRU32Type() +u64 = MIRU64Type() +u128 = MIRU128Type() +usize = MIRUsizeType() + +def array_ty(size : int, ty : 'MIRType') -> 'MIRArrayType': + """``[ty; size]``, i.e. a MIR array of ``size`` elements of type ``ty``.""" + return MIRArrayType(ty, size) + +def slice_ty(ty : MIRType) -> 'MIRSliceType': + """``[ty]``, i.e., a MIR slice to a type ``ty``.""" + return MIRSliceType(ty) + +def tuple_ty(*tuple_types : MIRType) -> 'MIRTupleType': + """A MIR tuple type with fields of type ``tuple_types``.""" + return MIRTupleType(list(tuple_types)) diff --git a/saw-remote-api/python/saw_client/mir_type.py b/saw-remote-api/python/saw_client/mir_type.py new file mode 100644 index 0000000000..60ad41e8a2 --- /dev/null +++ b/saw-remote-api/python/saw_client/mir_type.py @@ -0,0 +1,100 @@ +from abc import ABCMeta, abstractmethod +from typing import Any, Dict, List, Optional, Set, Union, overload + +class MIRType(metaclass=ABCMeta): + @abstractmethod + def to_json(self) -> Any: pass + +class MIRArrayType(MIRType): + def __init__(self, element_type : 'MIRType', size : int) -> None: + self.size = size + self.element_type = element_type + + def to_json(self) -> Any: + return { 'type': 'array', + 'element type': self.element_type.to_json(), + 'size': self.size } + +class MIRBoolType(MIRType): + def to_json(self) -> Any: + return { 'type': 'bool' } + +class MIRCharType(MIRType): + def to_json(self) -> Any: + return { 'type': 'char' } + +class MIRI8Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'i8' } + +class MIRI16Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'i16' } + +class MIRI32Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'i32' } + +class MIRI64Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'i64' } + +class MIRI128Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'i128' } + +class MIRF32Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'f32' } + +class MIRF64Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'f64' } + +class MIRIsizeType(MIRType): + def to_json(self) -> Any: + return { 'type': 'isize' } + +class MIRSliceType(MIRType): + def __init__(self, slice_type : 'MIRType') -> None: + self.slice_type = slice_type + + def to_json(self) -> Any: + return { 'type': 'slice', + 'slice type': self.slice_type.to_json() } + +class MIRStrType(MIRType): + def to_json(self) -> Any: + return { 'type': 'str' } + +class MIRTupleType(MIRType): + def __init__(self, tuple_types : List['MIRType']) -> None: + self.tuple_types = tuple_types + + def to_json(self) -> Any: + return { 'type': 'tuple', + 'tuple types': [ty.to_json() for ty in self.tuple_types] } + +class MIRU8Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'u8' } + +class MIRU16Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'u16' } + +class MIRU32Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'u32' } + +class MIRU64Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'u64' } + +class MIRU128Type(MIRType): + def to_json(self) -> Any: + return { 'type': 'u128' } + +class MIRUsizeType(MIRType): + def to_json(self) -> Any: + return { 'type': 'usize' } diff --git a/saw-remote-api/python/tests/saw/test-files/Makefile b/saw-remote-api/python/tests/saw/test-files/Makefile index f763f03e02..acb9f97702 100644 --- a/saw-remote-api/python/tests/saw/test-files/Makefile +++ b/saw-remote-api/python/tests/saw/test-files/Makefile @@ -1,11 +1,16 @@ -C_FILES := $(wildcard *.c) -BC_FILES := $(C_FILES:.c=.bc) +C_FILES := $(wildcard *.c) +BC_FILES := $(C_FILES:.c=.bc) +RS_FILES := $(wildcard *.rs) +JSON_FILES := $(RS_FILES:.rs=.linked-mir.json) -all: $(BC_FILES) +all: $(BC_FILES) $(JSON_FILES) %.bc: %.c clang -g -c -emit-llvm -o $@ $< +%.linked-mir.json: %.rs + saw-rustc $< + # This test case crucially relies on the use of -O2. llvm_lax_pointer_ordering.bc: llvm_lax_pointer_ordering.c clang -O2 -g -c -emit-llvm -o $@ $< diff --git a/saw-remote-api/python/tests/saw/test-files/basic_mir.linked-mir.json b/saw-remote-api/python/tests/saw/test-files/basic_mir.linked-mir.json new file mode 100644 index 0000000000..e03338d039 --- /dev/null +++ b/saw-remote-api/python/tests/saw/test-files/basic_mir.linked-mir.json @@ -0,0 +1 @@ +{"fns":[{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::u32"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"basic_mir.rs:2:5: 2:6","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}}],"terminator":{"kind":"Return","pos":"basic_mir.rs:3:2: 3:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}]},"name":"basic_mir/ce9b627a::basic","return_ty":"ty::u32","spread_arg":null}],"adts":[],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"basic_mir/ce9b627a::basic","kind":"Item","substs":[]},"name":"basic_mir/ce9b627a::basic"}],"tys":[{"name":"ty::u32","ty":{"kind":"Uint","uintkind":{"kind":"U32"}}}],"roots":["basic_mir/ce9b627a::basic"]} \ No newline at end of file diff --git a/saw-remote-api/python/tests/saw/test-files/basic_mir.rs b/saw-remote-api/python/tests/saw/test-files/basic_mir.rs new file mode 100644 index 0000000000..1957583bee --- /dev/null +++ b/saw-remote-api/python/tests/saw/test-files/basic_mir.rs @@ -0,0 +1,3 @@ +pub fn basic(x: u32) -> u32 { + x +} diff --git a/saw-remote-api/python/tests/saw/test_basic_mir.py b/saw-remote-api/python/tests/saw/test_basic_mir.py new file mode 100644 index 0000000000..338ebdecf0 --- /dev/null +++ b/saw-remote-api/python/tests/saw/test_basic_mir.py @@ -0,0 +1,32 @@ +import unittest +from pathlib import Path + +import saw_client as saw + +from saw_client.crucible import cry, cry_f +from saw_client.mir import Contract, u32 + +class Basic(Contract): + def __init__(self) -> None: + super().__init__() + + def specification(self) -> None: + x = self.fresh_var(u32, "x") + + self.execute_func(x) + + self.returns_f("{x}") + +class BasicTest(unittest.TestCase): + def test_basic(self): + saw.connect(reset_server=True) + if __name__ == "__main__": saw.view(saw.LogResults()) + json_name = str(Path('tests', 'saw', 'test-files', 'basic_mir.linked-mir.json')) + mod = saw.mir_load_module(json_name) + + basic_result = saw.mir_verify(mod, 'basic_mir::basic', Basic()) + self.assertIs(basic_result.is_success(), True) + + +if __name__ == "__main__": + unittest.main() diff --git a/saw-remote-api/saw-remote-api.cabal b/saw-remote-api/saw-remote-api.cabal index 6c10c6e724..58fee4b9d8 100644 --- a/saw-remote-api/saw-remote-api.cabal +++ b/saw-remote-api/saw-remote-api.cabal @@ -74,6 +74,7 @@ library SAWServer.Data.Contract, SAWServer.Data.JVMType, SAWServer.Data.LLVMType, + SAWServer.Data.MIRType, SAWServer.Data.SetupValue, SAWServer.Eval, SAWServer.Exceptions, @@ -83,6 +84,7 @@ library SAWServer.LLVMCrucibleSetup, SAWServer.LLVMVerify, SAWServer.MIRCrucibleSetup, + SAWServer.MIRVerify, SAWServer.NoParams, SAWServer.OK, SAWServer.ProofScript, diff --git a/saw-remote-api/saw-remote-api/Main.hs b/saw-remote-api/saw-remote-api/Main.hs index 68234bcfc4..e71de047b5 100644 --- a/saw-remote-api/saw-remote-api/Main.hs +++ b/saw-remote-api/saw-remote-api/Main.hs @@ -38,6 +38,9 @@ import SAWServer.LLVMVerify llvmVerifyX86 ) import SAWServer.MIRCrucibleSetup ( mirLoadModuleDescr, mirLoadModule ) +import SAWServer.MIRVerify + ( mirAssumeDescr, mirAssume, + mirVerifyDescr, mirVerify ) import SAWServer.ProofScript ( makeSimpsetDescr, makeSimpset, proveDescr, prove ) import SAWServer.SaveTerm ( saveTermDescr, saveTerm ) @@ -121,6 +124,14 @@ sawMethods = "SAW/MIR/load module" mirLoadModuleDescr mirLoadModule + , Argo.command + "SAW/MIR/verify" + mirVerifyDescr + mirVerify + , Argo.command + "SAW/MIR/assume" + mirAssumeDescr + mirAssume -- Yosys , Argo.command "SAW/Yosys/import" diff --git a/saw-remote-api/src/SAWServer.hs b/saw-remote-api/src/SAWServer.hs index 5ec7c5882c..7fb8729e84 100644 --- a/saw-remote-api/src/SAWServer.hs +++ b/saw-remote-api/src/SAWServer.hs @@ -40,6 +40,7 @@ import qualified Data.AIG as AIG import qualified Lang.Crucible.FunctionHandle as Crucible (HandleAllocator, newHandleAllocator) import qualified Lang.Crucible.JVM as CJ import qualified Lang.JVM.Codebase as JSS +import Mir.Intrinsics (MIR) import Mir.Generator (RustModule) --import qualified Verifier.SAW.CryptolEnv as CryptolEnv import Verifier.SAW.Module (emptyModule) @@ -83,7 +84,7 @@ import SAWServer.Exceptions notAJVMMethodSpecIR, notAYosysImport, notAYosysTheorem, notAYosysSequential, - notAMIRModule + notAMIRModule, notAMIRMethodSpecIR ) type SAWCont = (SAWEnv, SAWTask) @@ -94,11 +95,13 @@ data SAWTask = ProofScriptTask | LLVMCrucibleSetup ServerName | JVMSetup ServerName + | MIRSetup ServerName instance Show SAWTask where show ProofScriptTask = "ProofScript" show (LLVMCrucibleSetup n) = "(LLVMCrucibleSetup" ++ show n ++ ")" show (JVMSetup n) = "(JVMSetup" ++ show n ++ ")" + show (MIRSetup n) = "(MIRSetup" ++ show n ++ ")" data CrucibleSetupVal ty e @@ -328,6 +331,7 @@ data ServerVal | VMIRModule RustModule | VJVMMethodSpecIR (CMS.ProvedSpec CJ.JVM) | VLLVMMethodSpecIR (CMS.SomeLLVM CMS.ProvedSpec) + | VMIRMethodSpecIR (CMS.ProvedSpec MIR) | VGhostVar CMS.GhostGlobal | VYosysImport YosysImport | VYosysTheorem YosysTheorem @@ -345,6 +349,7 @@ instance Show ServerVal where show (VMIRModule _) = "VMIRModule" show (VLLVMMethodSpecIR _) = "VLLVMMethodSpecIR" show (VJVMMethodSpecIR _) = "VJVMMethodSpecIR" + show (VMIRMethodSpecIR _) = "VMIRMethodSpecIR" show (VGhostVar x) = "(VGhostVar " ++ show x ++ ")" show (VYosysImport _) = "VYosysImport" show (VYosysTheorem _) = "VYosysTheorem" @@ -371,6 +376,9 @@ instance IsServerVal (CMS.ProvedSpec CJ.JVM) where instance IsServerVal (CMS.SomeLLVM CMS.ProvedSpec) where toServerVal = VLLVMMethodSpecIR +instance IsServerVal (CMS.ProvedSpec MIR) where + toServerVal = VMIRMethodSpecIR + instance IsServerVal JSS.Class where toServerVal = VJVMClass @@ -451,6 +459,13 @@ getLLVMModule n = VLLVMModule m -> return m _other -> Argo.raise (notAnLLVMModule n) +getMIRMethodSpecIR :: ServerName -> Argo.Command SAWState (CMS.ProvedSpec MIR) +getMIRMethodSpecIR n = + do v <- getServerVal n + case v of + VMIRMethodSpecIR ir -> return ir + _other -> Argo.raise (notAMIRMethodSpecIR n) + getMIRModule :: ServerName -> Argo.Command SAWState RustModule getMIRModule n = do v <- getServerVal n diff --git a/saw-remote-api/src/SAWServer/Data/MIRType.hs b/saw-remote-api/src/SAWServer/Data/MIRType.hs new file mode 100644 index 0000000000..c84af365ca --- /dev/null +++ b/saw-remote-api/src/SAWServer/Data/MIRType.hs @@ -0,0 +1,89 @@ +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +module SAWServer.Data.MIRType (JSONMIRType, mirType) where + +import Control.Applicative +import qualified Data.Aeson as JSON +import Data.Aeson (withObject, withText, (.:)) + +import Mir.Mir (BaseSize(..), FloatKind(..), Ty(..)) + +data MIRTypeTag + = TagArray + | TagBool + | TagI8 + | TagI16 + | TagI32 + | TagI64 + | TagI128 + | TagIsize + | TagF32 + | TagF64 + | TagSlice + | TagStr + | TagTuple + | TagU8 + | TagU16 + | TagU32 + | TagU64 + | TagU128 + | TagUsize + +instance JSON.FromJSON MIRTypeTag where + parseJSON = + withText "MIR type tag" $ + \case + "array" -> pure TagArray + "bool" -> pure TagBool + "i8" -> pure TagI8 + "i16" -> pure TagI16 + "i32" -> pure TagI32 + "i64" -> pure TagI64 + "i128" -> pure TagI128 + "isize" -> pure TagIsize + "f32" -> pure TagF32 + "f64" -> pure TagF64 + "slice" -> pure TagSlice + "str" -> pure TagStr + "tuple" -> pure TagTuple + "u8" -> pure TagU8 + "u16" -> pure TagU16 + "u32" -> pure TagU32 + "u64" -> pure TagU64 + "u128" -> pure TagU128 + "usize" -> pure TagUsize + _ -> empty + +newtype JSONMIRType = JSONMIRType { getMIRType :: Ty } + +instance JSON.FromJSON JSONMIRType where + parseJSON = + primType + + where + primType = + withObject "MIR type" $ \o -> fmap JSONMIRType $ + o .: "type" >>= + \case + TagArray -> TyArray <$> (getMIRType <$> o .: "element type") <*> o .: "size" + TagBool -> pure TyBool + TagI8 -> pure $ TyInt B8 + TagI16 -> pure $ TyInt B16 + TagI32 -> pure $ TyInt B32 + TagI64 -> pure $ TyInt B64 + TagI128 -> pure $ TyInt B128 + TagIsize -> pure $ TyInt USize + TagF32 -> pure $ TyFloat F32 + TagF64 -> pure $ TyFloat F64 + TagSlice -> TySlice <$> (getMIRType <$> o .: "slice type") + TagStr -> pure TyStr + TagTuple -> TyTuple <$> (fmap getMIRType <$> o .: "tuple types") + TagU8 -> pure $ TyUint B8 + TagU16 -> pure $ TyUint B16 + TagU32 -> pure $ TyUint B32 + TagU64 -> pure $ TyUint B64 + TagU128 -> pure $ TyUint B128 + TagUsize -> pure $ TyUint USize + +mirType :: JSONMIRType -> Ty +mirType = getMIRType diff --git a/saw-remote-api/src/SAWServer/Exceptions.hs b/saw-remote-api/src/SAWServer/Exceptions.hs index f1584c0139..a34fd22f1c 100644 --- a/saw-remote-api/src/SAWServer/Exceptions.hs +++ b/saw-remote-api/src/SAWServer/Exceptions.hs @@ -15,6 +15,7 @@ module SAWServer.Exceptions ( , notAYosysImport , notAYosysSequential , notAMIRModule + , notAMIRMethodSpecIR -- * Wrong monad errors , notSettingUpCryptol , notSettingUpLLVMCrucible @@ -204,6 +205,17 @@ notAMIRModule name = " is not a MIR module") (Just $ object ["name" .= name]) +notAMIRMethodSpecIR :: + (ToJSON name, Show name) => + name {- ^ the name that should have been mapped to a method specification IR -}-> + JSONRPCException +notAMIRMethodSpecIR name = + makeJSONRPCException 10150 + ("The server value with name " <> + T.pack (show name) <> + " is not a MIR method specification") + (Just $ object ["name" .= name]) + cantLoadLLVMModule :: String -> JSONRPCException cantLoadLLVMModule err = makeJSONRPCException diff --git a/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs b/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs index a96da3bb4e..e0f16f83f9 100644 --- a/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs +++ b/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs @@ -1,41 +1,185 @@ +{-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TupleSections #-} -- | Support for interfacing with MIR-related commands in SAW. module SAWServer.MIRCrucibleSetup ( mirLoadModule , mirLoadModuleDescr + , compileMIRContract ) where +import Control.Exception (throw) import Control.Lens ( view ) +import Control.Monad.IO.Class ( MonadIO(liftIO) ) import Data.Aeson ( FromJSON(..), withObject, (.:) ) +import Data.ByteString (ByteString) +import Data.Map (Map) +import qualified Data.Map as Map -import SAWScript.Crucible.MIR.Builtins ( mir_load_module ) +import Mir.Intrinsics (MIR) + +import qualified Cryptol.Parser.AST as P +import Cryptol.Utils.Ident (mkIdent) +import SAWScript.Crucible.Common.MethodSpec as MS (SetupValue(..)) +import SAWScript.Crucible.MIR.Builtins + ( mir_alloc, + mir_alloc_mut, + mir_fresh_var, + mir_execute_func, + mir_load_module, + mir_postcond, + mir_precond, + mir_return ) +import SAWScript.Value (BuiltinContext, MIRSetupM(..), biSharedContext) +import qualified Verifier.SAW.CryptolEnv as CEnv +import Verifier.SAW.CryptolEnv (CryptolEnv) +import Verifier.SAW.TypedTerm (TypedTerm) import qualified Argo import qualified Argo.Doc as Doc -import SAWServer as Server +import SAWServer ( ServerName(..), SAWState, + CrucibleSetupVal(..), sawTask, setServerVal ) +import SAWServer.CryptolExpression (CryptolModuleException(..), getTypedTermOfCExp) +import SAWServer.Data.Contract + ( PointsTo, + PointsToBitfield, + Allocated(Allocated), + ContractVar(ContractVar), + Contract(preVars, preConds, preAllocated, prePointsTos, prePointsToBitfields, + argumentVals, postVars, postConds, postAllocated, postPointsTos, postPointsToBitfields, + returnVal) ) +import SAWServer.Data.MIRType (JSONMIRType, mirType) import SAWServer.Exceptions ( notAtTopLevel ) import SAWServer.OK ( OK, ok ) import SAWServer.TopLevel ( tl ) import SAWServer.TrackFile ( trackFile ) +newtype ServerSetupVal = Val (SetupValue MIR) + +compileMIRContract :: + (FilePath -> IO ByteString) -> + BuiltinContext -> + CryptolEnv -> + Contract JSONMIRType (P.Expr P.PName) -> + MIRSetupM () +compileMIRContract fileReader bic cenv0 c = + do allocsPre <- mapM setupAlloc (preAllocated c) + (envPre, cenvPre) <- setupState allocsPre (Map.empty, cenv0) (preVars c) + mapM_ (\p -> getTypedTerm cenvPre p >>= mir_precond) (preConds c) + mapM_ (setupPointsTo (envPre, cenvPre)) (prePointsTos c) + mapM_ setupPointsToBitfields (prePointsToBitfields c) + --mapM_ (setupGhostValue ghostEnv cenvPre) (preGhostValues c) + traverse (getSetupVal (envPre, cenvPre)) (argumentVals c) >>= mir_execute_func + allocsPost <- mapM setupAlloc (postAllocated c) + (envPost, cenvPost) <- setupState (allocsPre ++ allocsPost) (envPre, cenvPre) (postVars c) + mapM_ (\p -> getTypedTerm cenvPost p >>= mir_postcond) (postConds c) + mapM_ (setupPointsTo (envPost, cenvPost)) (postPointsTos c) + mapM_ setupPointsToBitfields (postPointsToBitfields c) + --mapM_ (setupGhostValue ghostEnv cenvPost) (postGhostValues c) + case returnVal c of + Just v -> getSetupVal (envPost, cenvPost) v >>= mir_return + Nothing -> return () + where + setupFresh :: ContractVar JSONMIRType -> MIRSetupM (ServerName, TypedTerm) + setupFresh (ContractVar n dn ty) = + do t <- mir_fresh_var dn (mirType ty) + return (n, t) + setupState allocs (env, cenv) vars = + do freshTerms <- mapM setupFresh vars + let cenv' = foldr (\(ServerName n, t) -> CEnv.bindTypedTerm (mkIdent n, t)) cenv freshTerms + let env' = Map.union env $ Map.fromList $ + [ (n, Val (MS.SetupTerm t)) | (n, t) <- freshTerms ] ++ + [ (n, Val v) | (n, v) <- allocs ] + return (env', cenv') + + setupAlloc :: Allocated JSONMIRType -> MIRSetupM (ServerName, MS.SetupValue MIR) + setupAlloc (Allocated _ _ _ (Just _)) = + MIRSetupM $ fail "Alignment not supported in the MIR API." + setupAlloc (Allocated n ty mut Nothing) + | mut = (n,) <$> mir_alloc_mut ty' + | otherwise = (n,) <$> mir_alloc ty' + where + ty' = mirType ty + + setupPointsTo :: + (Map ServerName ServerSetupVal, CryptolEnv) -> + PointsTo JSONMIRType (P.Expr P.PName) -> + MIRSetupM () + setupPointsTo _env _pt = + MIRSetupM $ fail "Points-to not currently implemented in the MIR API." + + setupPointsToBitfields :: PointsToBitfield JSONMIRType (P.Expr P.PName) -> MIRSetupM () + setupPointsToBitfields _ = + MIRSetupM $ fail "Points-to-bitfield not supported in the MIR API." + + --setupGhostValue _ _ _ = fail "Ghost values not supported yet in the MIR API." + + resolve :: Map ServerName a -> ServerName -> MIRSetupM a + resolve env name = + MIRSetupM $ + case Map.lookup name env of + Just v -> return v + Nothing -> fail $ unlines + [ "Server value " ++ show name ++ " not found - impossible!" -- rule out elsewhere + , show (Map.keys env) + ] + + getTypedTerm :: + CryptolEnv -> + P.Expr P.PName -> + MIRSetupM TypedTerm + getTypedTerm cenv expr = MIRSetupM $ + do (res, warnings) <- liftIO $ getTypedTermOfCExp fileReader (biSharedContext bic) cenv expr + case res of + Right (t, _) -> return t + Left err -> throw $ CryptolModuleException err warnings + + getSetupVal :: + (Map ServerName ServerSetupVal, CryptolEnv) -> + CrucibleSetupVal JSONMIRType (P.Expr P.PName) -> + MIRSetupM (MS.SetupValue MIR) + getSetupVal (env, _) (NamedValue n) = + resolve env n >>= \case Val x -> return x + getSetupVal (_, cenv) (CryptolExpr expr) = + MS.SetupTerm <$> getTypedTerm cenv expr + getSetupVal _ NullValue = + MIRSetupM $ fail "Null setup values unsupported in the MIR API." + getSetupVal env (ArrayValue elts) = + do elts' <- mapM (getSetupVal env) elts + MIRSetupM $ return $ MS.SetupArray () elts' + getSetupVal _ (TupleValue _) = + MIRSetupM $ fail "Tuple setup values unsupported in the MIR API." + getSetupVal _ (FieldLValue _ _) = + MIRSetupM $ fail "Field l-values unsupported in the MIR API." + getSetupVal _ (CastLValue _ _) = + MIRSetupM $ fail "Cast l-values unsupported in the MIR API." + getSetupVal _ (UnionLValue _ _) = + MIRSetupM $ fail "Union l-values unsupported in the MIR API." + getSetupVal _ (ElementLValue _ _) = + MIRSetupM $ fail "Element l-values unsupported in the MIR API." + getSetupVal _ (GlobalInitializer _) = + MIRSetupM $ fail "Global initializers unsupported in the MIR API." + getSetupVal _ (GlobalLValue _) = + MIRSetupM $ fail "Global l-values unsupported in the MIR API." + data MIRLoadModuleParams = MIRLoadModuleParams ServerName FilePath instance FromJSON MIRLoadModuleParams where parseJSON = withObject "params for \"SAW/MIR/load module\"" $ \o -> - MIRLoadModuleParams <$> o .: "name" <*> o .: "module name" + MIRLoadModuleParams <$> o .: "name" <*> o .: "JSON file" instance Doc.DescribedMethod MIRLoadModuleParams OK where parameterFieldDescription = [ ("name", Doc.Paragraph [Doc.Text "The name to refer to the loaded module by later."]) - , ("module name", + , ("JSON file", Doc.Paragraph [Doc.Text "The file containing the MIR JSON file to load."]) ] resultFieldDescription = [] diff --git a/saw-remote-api/src/SAWServer/MIRVerify.hs b/saw-remote-api/src/SAWServer/MIRVerify.hs new file mode 100644 index 0000000000..9f72addfcf --- /dev/null +++ b/saw-remote-api/src/SAWServer/MIRVerify.hs @@ -0,0 +1,80 @@ +{-# LANGUAGE OverloadedStrings #-} +-- | Support for the MIR @verify@ and @assume@ commands. +module SAWServer.MIRVerify + ( mirVerify + , mirVerifyDescr + , mirAssume + , mirAssumeDescr + ) where + +import Prelude hiding (mod) +import Control.Lens + +import SAWScript.Crucible.MIR.Builtins + ( mir_verify ) +import SAWScript.Value (rwCryptol) + +import qualified Argo +import qualified Argo.Doc as Doc +import SAWServer + ( SAWState, + SAWTask(MIRSetup), + sawBIC, + sawTask, + sawTopLevelRW, + pushTask, + dropTask, + setServerVal, + getMIRModule, + getMIRMethodSpecIR ) +import SAWServer.CryptolExpression (getCryptolExpr) +import SAWServer.Data.Contract ( ContractMode(..) ) +import SAWServer.Data.MIRType ( JSONMIRType ) +import SAWServer.Exceptions ( notAtTopLevel ) +import SAWServer.MIRCrucibleSetup ( compileMIRContract ) +import SAWServer.OK ( OK, ok ) +import SAWServer.ProofScript + ( ProofScript(ProofScript), interpretProofScript ) +import SAWServer.TopLevel ( tl ) +import SAWServer.VerifyCommon + ( AssumeParams(AssumeParams), VerifyParams(VerifyParams) ) + +mirVerifyAssume :: ContractMode -> VerifyParams JSONMIRType -> Argo.Command SAWState OK +mirVerifyAssume mode (VerifyParams modName fun lemmaNames checkSat contract script lemmaName) = + do tasks <- view sawTask <$> Argo.getState + case tasks of + (_:_) -> Argo.raise $ notAtTopLevel $ map fst tasks + [] -> + do pushTask (MIRSetup lemmaName) + state <- Argo.getState + rm <- getMIRModule modName + let bic = view sawBIC state + cenv = rwCryptol (view sawTopLevelRW state) + fileReader <- Argo.getFileReader + setup <- compileMIRContract fileReader bic cenv <$> + traverse getCryptolExpr contract + res <- case mode of + VerifyContract -> do + lemmas <- mapM getMIRMethodSpecIR lemmaNames + proofScript <- interpretProofScript script + tl $ mir_verify rm fun lemmas checkSat setup proofScript + AssumeContract -> + tl $ error "mir_unsafe_assume_spec not yet supported" + dropTask + setServerVal lemmaName res + ok + +mirVerify :: VerifyParams JSONMIRType -> Argo.Command SAWState OK +mirVerify = mirVerifyAssume VerifyContract + +mirVerifyDescr :: Doc.Block +mirVerifyDescr = + Doc.Paragraph [Doc.Text "Verify the named MIR method meets its specification."] + +mirAssume :: AssumeParams JSONMIRType -> Argo.Command SAWState OK +mirAssume (AssumeParams modName fun contract lemmaName) = + mirVerifyAssume AssumeContract (VerifyParams modName fun [] False contract (ProofScript []) lemmaName) + +mirAssumeDescr :: Doc.Block +mirAssumeDescr = + Doc.Paragraph [Doc.Text "Assume the named MIR method meets its specification."] diff --git a/saw-script.cabal b/saw-script.cabal index 56617e75f7..fdbaf42c9d 100644 --- a/saw-script.cabal +++ b/saw-script.cabal @@ -143,6 +143,7 @@ library SAWScript.Crucible.Common SAWScript.Crucible.Common.MethodSpec SAWScript.Crucible.Common.Override + SAWScript.Crucible.Common.ResolveSetupValue SAWScript.Crucible.Common.Setup.Builtins SAWScript.Crucible.Common.Setup.Type @@ -163,6 +164,10 @@ library SAWScript.Crucible.JVM.ResolveSetupValue SAWScript.Crucible.MIR.Builtins + SAWScript.Crucible.MIR.MethodSpecIR + SAWScript.Crucible.MIR.Override + SAWScript.Crucible.MIR.ResolveSetupValue + SAWScript.Crucible.MIR.TypeShape SAWScript.Prover.Mode SAWScript.Prover.Rewrite diff --git a/src/SAWScript/AST.hs b/src/SAWScript/AST.hs index 4f47dbb7bb..6ad51b80d2 100644 --- a/src/SAWScript/AST.hs +++ b/src/SAWScript/AST.hs @@ -32,7 +32,7 @@ module SAWScript.AST , toLName , tMono, tForall, tTuple, tRecord, tArray, tFun , tString, tTerm, tType, tBool, tInt, tAIG, tCFG - , tJVMSpec, tLLVMSpec + , tJVMSpec, tLLVMSpec, tMIRSpec , tBlock, tContext, tVar , PrettyPrint(..), pShow, commaSepAll, prettyWholeModule @@ -178,6 +178,7 @@ data Context = CryptolSetup | JavaSetup | LLVMSetup + | MIRSetup | ProofScript | TopLevel | CrucibleSetup @@ -212,6 +213,7 @@ data TyCon | CFGCon | JVMSpecCon | LLVMSpecCon + | MIRSpecCon | ContextCon Context deriving (Eq, Show) @@ -394,6 +396,7 @@ instance PrettyPrint TyCon where CFGCon -> "CFG" JVMSpecCon -> "JVMSpec" LLVMSpecCon -> "LLVMSpec" + MIRSpecCon -> "MIRSpec" BlockCon -> "" ContextCon cxt -> pretty par cxt @@ -402,6 +405,7 @@ instance PrettyPrint Context where CryptolSetup -> "CryptolSetup" JavaSetup -> "JavaSetup" LLVMSetup -> "LLVMSetup" + MIRSetup -> "MIRSetup" ProofScript -> "ProofScript" TopLevel -> "TopLevel" CrucibleSetup-> "CrucibleSetup" @@ -471,6 +475,9 @@ tJVMSpec = TyCon JVMSpecCon [] tLLVMSpec :: Type tLLVMSpec = TyCon LLVMSpecCon [] +tMIRSpec :: Type +tMIRSpec = TyCon MIRSpecCon [] + tBlock :: Type -> Type -> Type tBlock c t = TyCon BlockCon [c,t] diff --git a/src/SAWScript/Crucible/Common/MethodSpec.hs b/src/SAWScript/Crucible/Common/MethodSpec.hs index f80c3c24e0..551b7376f3 100644 --- a/src/SAWScript/Crucible/Common/MethodSpec.hs +++ b/src/SAWScript/Crucible/Common/MethodSpec.hs @@ -67,6 +67,10 @@ data PrePost = PreState | PostState deriving (Eq, Ord, Show) +stateCond :: PrePost -> String +stateCond PreState = "precondition" +stateCond PostState = "postcondition" + -------------------------------------------------------------------------------- -- *** Extension-specific information diff --git a/src/SAWScript/Crucible/Common/Override.hs b/src/SAWScript/Crucible/Common/Override.hs index de65b19d79..c02ad8baca 100644 --- a/src/SAWScript/Crucible/Common/Override.hs +++ b/src/SAWScript/Crucible/Common/Override.hs @@ -51,6 +51,7 @@ module SAWScript.Crucible.Common.Override , writeGlobal , failure , getSymInterface + , enforceCompleteSubstitution -- , assignmentToList , MetadataMap @@ -58,6 +59,7 @@ module SAWScript.Crucible.Common.Override import qualified Control.Exception as X import Control.Lens +import Control.Monad (unless) import Control.Monad.Trans.State hiding (get, put) import Control.Monad.State.Class (MonadState(..)) import Control.Monad.Error.Class (MonadError) @@ -67,6 +69,7 @@ import Control.Monad.Trans.Except import Control.Monad.Trans.Class import Control.Monad.IO.Class import Data.Kind (Type) +import qualified Data.Map as Map import Data.Map (Map) import Data.Set (Set) import Data.Typeable (Typeable) @@ -273,7 +276,7 @@ instance ( PP.Pretty (ExtType ext) instance ( PP.Pretty (ExtType ext) , PP.Pretty (MS.PointsTo ext) - , Typeable ext + , Typeable ext ) => X.Exception (OverrideFailure ext) -------------------------------------------------------------------------------- @@ -376,6 +379,26 @@ failure loc e = OM (lift (throwE (OF loc e))) getSymInterface :: Monad m => OverrideMatcher' sym ext md m sym getSymInterface = OM (use syminterface) +-- | Verify that all of the fresh variables for the given +-- state spec have been "learned". If not, throws +-- 'AmbiguousVars' exception. +enforceCompleteSubstitution :: + W4.ProgramLoc -> + MS.StateSpec ext -> + OverrideMatcher ext w () +enforceCompleteSubstitution loc ss = + + do sub <- OM (use termSub) + + let -- predicate matches terms that are not covered by the computed + -- term substitution + isMissing tt = ecVarIndex (tecExt tt) `Map.notMember` sub + + -- list of all terms not covered by substitution + missing = filter isMissing (view MS.csFreshVars ss) + + unless (null missing) (failure loc (AmbiguousVars missing)) + ------------------------------------------------------------------------ -- | Forget the type indexes and length of the arguments. diff --git a/src/SAWScript/Crucible/Common/ResolveSetupValue.hs b/src/SAWScript/Crucible/Common/ResolveSetupValue.hs new file mode 100644 index 0000000000..253aa430af --- /dev/null +++ b/src/SAWScript/Crucible/Common/ResolveSetupValue.hs @@ -0,0 +1,32 @@ +-- | Utilities for resolving 'SetupValue's that are used across language +-- backends. +module SAWScript.Crucible.Common.ResolveSetupValue + ( resolveBoolTerm + ) where + +import qualified What4.BaseTypes as W4 +import qualified What4.Interface as W4 + +import Verifier.SAW.SharedTerm + +import qualified Verifier.SAW.Simulator.Concrete as Concrete + +import Verifier.SAW.Simulator.What4.ReturnTrip + +import SAWScript.Crucible.Common + +-- | Resolve a SAWCore 'Term' into a What4 'W4.Pred'. +resolveBoolTerm :: Sym -> Term -> IO (W4.Pred Sym) +resolveBoolTerm sym tm = + do st <- sawCoreState sym + let sc = saw_ctx st + mx <- case getAllExts tm of + -- concretely evaluate if it is a closed term + [] -> + do modmap <- scGetModuleMap sc + let v = Concrete.evalSharedTerm modmap mempty mempty tm + pure (Just (Concrete.toBool v)) + _ -> return Nothing + case mx of + Just x -> return (W4.backendPred sym x) + Nothing -> bindSAWTerm sym st W4.BaseBoolRepr tm diff --git a/src/SAWScript/Crucible/JVM/Override.hs b/src/SAWScript/Crucible/JVM/Override.hs index 4fe4f7bce6..c9e53b4b30 100644 --- a/src/SAWScript/Crucible/JVM/Override.hs +++ b/src/SAWScript/Crucible/JVM/Override.hs @@ -354,24 +354,6 @@ learnCond opts sc cc cs prepost ss = enforceCompleteSubstitution loc ss --- | Verify that all of the fresh variables for the given --- state spec have been "learned". If not, throws --- 'AmbiguousVars' exception. -enforceCompleteSubstitution :: W4.ProgramLoc -> StateSpec -> OverrideMatcher CJ.JVM w () -enforceCompleteSubstitution loc ss = - - do sub <- OM (use termSub) - - let -- predicate matches terms that are not covered by the computed - -- term substitution - isMissing tt = ecVarIndex (tecExt tt) `Map.notMember` sub - - -- list of all terms not covered by substitution - missing = filter isMissing (view MS.csFreshVars ss) - - unless (null missing) (failure loc (AmbiguousVars missing)) - - -- execute a pre/post condition executeCond :: Options -> @@ -590,7 +572,7 @@ matchArg opts sc cc cs prepost md actual@(RVal ref) expectedTy setupval = MS.SetupNull () -> do sym <- Ov.getSymInterface p <- liftIO (CJ.refIsNull sym ref) - addAssert p md (Crucible.SimError (cs ^. MS.csLoc) (Crucible.AssertFailureSimError ("null-equality " ++ stateCond prepost) "")) + addAssert p md (Crucible.SimError (cs ^. MS.csLoc) (Crucible.AssertFailureSimError ("null-equality " ++ MS.stateCond prepost) "")) MS.SetupGlobal empty _ -> absurd empty @@ -659,7 +641,7 @@ matchTerm sc cc md prepost real expect = _ -> do t <- liftIO $ scEq sc real expect p <- liftIO $ resolveBoolTerm (cc ^. jccSym) t - addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError ("literal equality " ++ stateCond prepost) "")) + addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError ("literal equality " ++ MS.stateCond prepost) "")) ------------------------------------------------------------------------ @@ -756,10 +738,6 @@ learnPointsTo opts sc cc spec prepost pt = ------------------------------------------------------------------------ -stateCond :: PrePost -> String -stateCond PreState = "precondition" -stateCond PostState = "postcondition" - -- | Process a "crucible_equal" statement from the precondition -- section of the CrucibleSetup block. learnEqual :: @@ -776,7 +754,7 @@ learnEqual opts sc cc spec md prepost v1 v2 = do val1 <- resolveSetupValueJVM opts cc sc spec v1 val2 <- resolveSetupValueJVM opts cc sc spec v2 p <- liftIO (equalValsPred cc val1 val2) - let name = "equality " ++ stateCond prepost + let name = "equality " ++ MS.stateCond prepost let loc = MS.conditionLoc md addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError name "")) @@ -794,7 +772,7 @@ learnPred sc cc md prepost t = u <- liftIO $ scInstantiateExt sc s t p <- liftIO $ resolveBoolTerm (cc ^. jccSym) u let loc = MS.conditionLoc md - addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError (stateCond prepost) "")) + addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError (MS.stateCond prepost) "")) ------------------------------------------------------------------------ diff --git a/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs b/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs index 253269eda4..c0db25d7c6 100644 --- a/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs +++ b/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs @@ -69,6 +69,7 @@ import SAWScript.Crucible.Common.MethodSpec (AllocIndex(..)) import SAWScript.Panic import SAWScript.Crucible.JVM.MethodSpecIR import qualified SAWScript.Crucible.Common.MethodSpec as MS +import SAWScript.Crucible.Common.ResolveSetupValue (resolveBoolTerm) data JVMVal @@ -273,21 +274,6 @@ resolveBitvectorTerm sym w tm = Just x -> W4.bvLit sym w (BV.mkBV w x) Nothing -> bindSAWTerm sym st (W4.BaseBVRepr w) tm -resolveBoolTerm :: Sym -> Term -> IO (W4.Pred Sym) -resolveBoolTerm sym tm = - do st <- sawCoreState sym - let sc = saw_ctx st - mx <- case getAllExts tm of - -- concretely evaluate if it is a closed term - [] -> - do modmap <- scGetModuleMap sc - let v = Concrete.evalSharedTerm modmap mempty mempty tm - pure (Just (Concrete.toBool v)) - _ -> return Nothing - case mx of - Just x -> return (W4.backendPred sym x) - Nothing -> bindSAWTerm sym st W4.BaseBoolRepr tm - toJVMType :: Cryptol.TValue -> Maybe J.Type toJVMType tp = case tp of diff --git a/src/SAWScript/Crucible/LLVM/Override.hs b/src/SAWScript/Crucible/LLVM/Override.hs index d193f73864..f132747f2c 100644 --- a/src/SAWScript/Crucible/LLVM/Override.hs +++ b/src/SAWScript/Crucible/LLVM/Override.hs @@ -247,7 +247,7 @@ notEqual cond opts loc cc sc spec expected actual = do prettyLLVMVal <- ppLLVMVal cc actual prettySetupLLVMVal <- ppSetupValueAsLLVMVal opts cc sc spec expected let msg = unlines - [ "Equality " ++ stateCond cond + [ "Equality " ++ MS.stateCond cond , "Expected value (as a SAW value): " , show (MS.ppSetupValue expected) , "Expected value (as a Crucible value): " @@ -810,27 +810,6 @@ assertTermEqualities sc cc = do traverse_ assertTermEquality =<< OM (use termEqs) --- | Verify that all of the fresh variables for the given --- state spec have been "learned". If not, throws --- 'AmbiguousVars' exception. -enforceCompleteSubstitution :: - W4.ProgramLoc -> - MS.StateSpec (LLVM arch) -> - OverrideMatcher (LLVM arch) md () -enforceCompleteSubstitution loc ss = - - do sub <- OM (use termSub) - - let -- predicate matches terms that are not covered by the computed - -- term substitution - isMissing tt = ecVarIndex (tecExt tt) `Map.notMember` sub - - -- list of all terms not covered by substitution - missing = filter isMissing (view MS.csFreshVars ss) - - unless (null missing) (failure loc (AmbiguousVars missing)) - - -- execute a pre/post condition executeCond :: ( ?lc :: Crucible.TypeContext , ?memOpts :: Crucible.MemOptions @@ -1219,7 +1198,7 @@ assignTerm sc cc md prepost var val = -- do t <- liftIO $ scEq sc old val -- p <- liftIO $ resolveSAWPred cc t --- addAssert p (Crucible.AssertFailureSimError ("literal equality " ++ stateCond prepost)) +-- addAssert p (Crucible.AssertFailureSimError ("literal equality " ++ MS.stateCond prepost)) ------------------------------------------------------------------------ @@ -1504,7 +1483,7 @@ matchTerm sc cc md prepost real expect = _ -> do t <- liftIO $ scEq sc real expect let msg = unlines $ - [ "Literal equality " ++ stateCond prepost + [ "Literal equality " ++ MS.stateCond prepost -- , "Expected term: " ++ prettyTerm expect -- , "Actual term: " ++ prettyTerm real ] @@ -1642,7 +1621,7 @@ matchPointsToValue opts sc cc spec prepost md maybe_cond ptr val = Crucible.asMemAllocationArrayStore sym Crucible.PtrWidth ptr (Crucible.memImplHeap mem) let errMsg = PP.vcat $ map (PP.pretty . unwords) [ [ "When reading through pointer:", show (Crucible.ppPtr ptr) ] - , [ "in the ", stateCond prepost, "of an override" ] + , [ "in the ", MS.stateCond prepost, "of an override" ] , [ "Tried to read an array prefix of size:", show (MS.ppTypedTerm expected_sz_tm) ] ] case maybe_allocation_array of @@ -1816,7 +1795,7 @@ summarizeBadLoad cc memTy prepost ptr = sz = Crucible.memTypeSize dataLayout memTy in map (PP.pretty . unwords) [ [ "When reading through pointer:", show (Crucible.ppPtr ptr) ] - , [ "in the ", stateCond prepost, "of an override" ] + , [ "in the ", MS.stateCond prepost, "of an override" ] , [ "Tried to read something of size:" , show (Crucible.bytesToInteger sz) ] @@ -1856,10 +1835,6 @@ describeConcreteMemoryLoadFailure mem badLoadSummary ptr = do ------------------------------------------------------------------------ -stateCond :: PrePost -> String -stateCond PreState = "precondition" -stateCond PostState = "postcondition" - -- | Process an @llvm_equal@ statement from the precondition -- section of the CrucibleSetup block. learnEqual :: @@ -1877,7 +1852,7 @@ learnEqual opts sc cc spec md prepost v1 v2 = do (_, val1) <- resolveSetupValueLLVM opts cc sc spec v1 (_, val2) <- resolveSetupValueLLVM opts cc sc spec v2 p <- liftIO (equalValsPred cc val1 val2) - let name = "equality " ++ stateCond prepost + let name = "equality " ++ MS.stateCond prepost let loc = MS.conditionLoc md addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError name "")) @@ -1894,7 +1869,7 @@ learnPred :: learnPred sc cc md prepost t = do p <- instantiateExtResolveSAWPred sc cc t let loc = MS.conditionLoc md - addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError (stateCond prepost) "")) + addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError (MS.stateCond prepost) "")) instantiateExtResolveSAWPred :: (?w4EvalTactic :: W4EvalTactic) => diff --git a/src/SAWScript/Crucible/MIR/Builtins.hs b/src/SAWScript/Crucible/MIR/Builtins.hs index 293e88f965..eb40f35d71 100644 --- a/src/SAWScript/Crucible/MIR/Builtins.hs +++ b/src/SAWScript/Crucible/MIR/Builtins.hs @@ -1,20 +1,204 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} {-# LANGUAGE ImplicitParams #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} -- | Implementations of Crucible-related SAWScript primitives for MIR. module SAWScript.Crucible.MIR.Builtins - ( mir_load_module + ( -- * Commands + -- ** Setup + mir_alloc + , mir_alloc_mut + , mir_assert + , mir_execute_func + , mir_fresh_var + , mir_load_module + , mir_postcond + , mir_precond + , mir_return + , mir_verify + -- ** MIR types + , mir_array + , mir_bool + , mir_char + , mir_i8 + , mir_i16 + , mir_i32 + , mir_i64 + , mir_i128 + , mir_isize + , mir_f32 + , mir_f64 + , mir_ref + , mir_ref_mut + , mir_slice + , mir_str + , mir_tuple + , mir_u8 + , mir_u16 + , mir_u32 + , mir_u64 + , mir_u128 + , mir_usize ) where +import Control.Lens +import Control.Monad (foldM, forM, forM_, unless, when) +import qualified Control.Monad.Catch as X +import Control.Monad.IO.Class (MonadIO(..)) +import Control.Monad.Reader (runReaderT) +import Control.Monad.State (MonadState(..), StateT(..), execStateT, gets) +import Control.Monad.Trans.Class (MonadTrans(..)) import qualified Data.ByteString.Lazy as BSL +import qualified Data.Foldable as F +import Data.Foldable (for_) +import Data.IORef +import qualified Data.List.Extra as List (groupOn) +import Data.List.NonEmpty (NonEmpty(..)) +import qualified Data.Map as Map +import Data.Map (Map) +import Data.Maybe (fromMaybe) +import qualified Data.Parameterized.Context as Ctx +import Data.Parameterized.NatRepr (knownNat, natValue) +import Data.Parameterized.Some (Some(..)) +import qualified Data.Set as Set +import qualified Data.Text as Text +import Data.Text (Text) +import Data.Time.Clock (diffUTCTime, getCurrentTime) +import Data.Type.Equality (TestEquality(..)) +import Data.Void (absurd) +import Numeric.Natural (Natural) +import qualified Prettyprinter as PP +import System.IO (stdout) -import Mir.Generator -import Mir.ParseTranslate +import qualified Cryptol.TypeCheck.Type as Cryptol +import qualified Lang.Crucible.Analysis.Postdom as Crucible +import qualified Lang.Crucible.Backend as Crucible +import qualified Lang.Crucible.CFG.Core as Crucible +import qualified Lang.Crucible.FunctionHandle as Crucible +import qualified Lang.Crucible.Simulator as Crucible +import qualified Lang.Crucible.Simulator.SimError as Crucible + +import qualified Mir.DefId as Mir +import qualified Mir.Mir as Mir +import qualified Mir.Generator as Mir +import Mir.Intrinsics (MIR) +import qualified Mir.Intrinsics as Mir +import qualified Mir.ParseTranslate as Mir +import qualified Mir.Trans as Mir +import Mir.TransCustom (customOps) +import qualified Mir.TransTy as Mir + +import qualified What4.Config as W4 +import qualified What4.Interface as W4 +import qualified What4.ProgramLoc as W4 + +import Verifier.SAW.FiniteValue (ppFirstOrderValue) +import Verifier.SAW.Name (toShortName) +import Verifier.SAW.SharedTerm +import Verifier.SAW.Simulator.What4.ReturnTrip +import Verifier.SAW.TypedTerm + +import SAWScript.Crucible.Common +import qualified SAWScript.Crucible.Common.MethodSpec as MS +import SAWScript.Crucible.Common.Override +import qualified SAWScript.Crucible.Common.Setup.Builtins as Setup +import qualified SAWScript.Crucible.Common.Setup.Type as Setup +import SAWScript.Crucible.MIR.MethodSpecIR +import SAWScript.Crucible.MIR.Override +import SAWScript.Crucible.MIR.ResolveSetupValue +import SAWScript.Crucible.MIR.TypeShape +import SAWScript.Exceptions import SAWScript.Options +import SAWScript.Panic +import qualified SAWScript.Position as SS +import SAWScript.Proof +import SAWScript.Prover.SolverStats import SAWScript.Value +type AssumptionReason = (MS.ConditionMetadata, String) +type SetupValue = MS.SetupValue MIR +type Lemma = MS.ProvedSpec MIR +type MethodSpec = MS.CrucibleMethodSpecIR MIR +type SetupCondition = MS.SetupCondition MIR + +-- TODO: something useful with the global pair? +ppMIRAbortedResult :: MIRCrucibleContext + -> Crucible.AbortedResult Sym a + -> PP.Doc ann +ppMIRAbortedResult _cc = ppAbortedResult (\_gp -> mempty) + +----- +-- Commands +----- + +mir_alloc :: Mir.Ty -> MIRSetupM SetupValue +mir_alloc = mir_alloc_internal Mir.Immut + +mir_alloc_mut :: Mir.Ty -> MIRSetupM SetupValue +mir_alloc_mut = mir_alloc_internal Mir.Mut + +-- | The workhorse for 'mir_alloc' and 'mir_alloc_mut'. +mir_alloc_internal :: Mir.Mutability -> Mir.Ty -> MIRSetupM SetupValue +mir_alloc_internal mut mty = + MIRSetupM $ + do st <- get + let mcc = st ^. Setup.csCrucibleContext + let col = mcc ^. mccRustModule ^. Mir.rmCS ^. Mir.collection + Some tpr <- pure $ Mir.tyToRepr col mty + n <- Setup.csVarCounter <<%= MS.nextAllocIndex + Setup.currentState . MS.csAllocs . at n ?= + Some (MirAllocSpec { _maType = tpr + , _maMutbl = mut + , _maMirType = mty + , _maLen = 1 + }) + return (MS.SetupVar n) + +mir_execute_func :: [SetupValue] -> MIRSetupM () +mir_execute_func args = + MIRSetupM $ + do st <- get + let cc = st ^. Setup.csCrucibleContext + let mspec = st ^. Setup.csMethodSpec + let env = MS.csAllocations mspec + let nameEnv = MS.csTypeNames mspec + let argTys = mspec ^. MS.csArgs + let + checkArg i expectedTy val = + do valTy <- typeOfSetupValue cc env nameEnv val + unless (checkCompatibleTys expectedTy valTy) $ + X.throwM (MIRArgTypeMismatch i expectedTy valTy) + let + checkArgs _ [] [] = pure () + checkArgs i [] vals = + X.throwM (MIRArgNumberWrong i (i + length vals)) + checkArgs i tys [] = + X.throwM (MIRArgNumberWrong (i + length tys) i) + checkArgs i (ty : tys) (val : vals) = + do checkArg i ty val + checkArgs (i + 1) tys vals + checkArgs 0 argTys args + Setup.crucible_execute_func args + +-- | Generate a fresh variable term. The name will be used when +-- pretty-printing the variable in debug output. +mir_fresh_var :: + Text {- ^ variable name -} -> + Mir.Ty {- ^ variable type -} -> + MIRSetupM TypedTerm {- ^ fresh typed term -} +mir_fresh_var name mty = + MIRSetupM $ + do sc <- lift $ lift getSharedContext + case cryptolTypeOfActual mty of + Nothing -> X.throwM $ MIRFreshVarInvalidType mty + Just cty -> Setup.freshVariable sc name cty + -- | Load a MIR JSON file and return a handle to it. -mir_load_module :: String -> TopLevel RustModule +mir_load_module :: String -> TopLevel Mir.RustModule mir_load_module inputFile = do b <- io $ BSL.readFile inputFile @@ -26,5 +210,952 @@ mir_load_module inputFile = do let ?printCrucible = False halloc <- getHandleAlloc - col <- io $ parseMIR inputFile b - io $ translateMIR mempty col halloc + col <- io $ Mir.parseMIR inputFile b + io $ Mir.translateMIR mempty col halloc + +mir_return :: SetupValue -> MIRSetupM () +mir_return retVal = + MIRSetupM $ + do st <- get + let cc = st ^. Setup.csCrucibleContext + let mspec = st ^. Setup.csMethodSpec + let env = MS.csAllocations mspec + let nameEnv = MS.csTypeNames mspec + valTy <- typeOfSetupValue cc env nameEnv retVal + case mspec ^. MS.csRet of + Nothing -> + X.throwM (MIRReturnUnexpected valTy) + Just retTy -> + unless (checkCompatibleTys retTy valTy) $ + X.throwM (MIRReturnTypeMismatch retTy valTy) + Setup.crucible_return retVal + +mir_assert :: TypedTerm -> MIRSetupM () +mir_assert term = MIRSetupM $ do + loc <- SS.toW4Loc "mir_assert" <$> lift (lift getPosition) + tags <- view Setup.croTags + let md = MS.ConditionMetadata + { MS.conditionLoc = loc + , MS.conditionTags = tags + , MS.conditionType = "specification assertion" + , MS.conditionContext = "" + } + Setup.addCondition (MS.SetupCond_Pred md term) + +mir_precond :: TypedTerm -> MIRSetupM () +mir_precond term = MIRSetupM $ do + loc <- SS.toW4Loc "mir_precond" <$> lift (lift getPosition) + Setup.crucible_precond loc term + +mir_postcond :: TypedTerm -> MIRSetupM () +mir_postcond term = MIRSetupM $ do + loc <- SS.toW4Loc "mir_postcond" <$> lift (lift getPosition) + Setup.crucible_postcond loc term + +mir_verify :: + Mir.RustModule -> + String {- ^ method name -} -> + [Lemma] {- ^ overrides -} -> + Bool {- ^ path sat checking -} -> + MIRSetupM () -> + ProofScript () -> + TopLevel Lemma +mir_verify rm nm lemmas checkSat setup tactic = + do start <- io getCurrentTime + opts <- getOptions + + -- set up the metadata map for tracking proof obligation metadata + mdMap <- io $ newIORef mempty + + cc <- setupCrucibleContext rm + SomeOnlineBackend bak <- pure (cc^.mccBackend) + let sym = cc^.mccSym + + pos <- getPosition + let loc = SS.toW4Loc "_SAW_verify_prestate" pos + + profFile <- rwProfilingFile <$> getTopLevelRW + (writeFinalProfile, pfs) <- io $ setupProfiling sym "mir_verify" profFile + + let cs = rm ^. Mir.rmCS + col = cs ^. Mir.collection + crateDisambigs = cs ^. Mir.crateHashesMap + did <- findDefId crateDisambigs (Text.pack nm) + fn <- case Map.lookup did (col ^. Mir.functions) of + Just x -> return x + Nothing -> fail $ "Couldn't find MIR function named: " ++ nm + let st0 = initialCrucibleSetupState cc fn loc + + -- execute commands of the method spec + io $ W4.setCurrentProgramLoc sym loc + methodSpec <- view Setup.csMethodSpec <$> + execStateT + (runReaderT (runMIRSetupM setup) Setup.makeCrucibleSetupRO) + st0 + + printOutLnTop Info $ + unwords ["Verifying", show (methodSpec ^. MS.csMethod), "..."] + + -- construct the initial state for verifications + (args, assumes, env, globals1) <- io $ verifyPrestate cc methodSpec Crucible.emptyGlobals + + -- save initial path conditions + frameIdent <- io $ Crucible.pushAssumptionFrame bak + + -- run the symbolic execution + printOutLnTop Info $ + unwords ["Simulating", show (methodSpec ^. MS.csMethod), "..."] + top_loc <- SS.toW4Loc "mir_verify" <$> getPosition + (ret, globals2) <- + io $ verifySimulate opts cc pfs methodSpec args assumes top_loc lemmas globals1 checkSat mdMap + + -- collect the proof obligations + asserts <- verifyPoststate cc + methodSpec env globals2 ret mdMap + + -- restore previous assumption state + _ <- io $ Crucible.popAssumptionFrame bak frameIdent + + -- attempt to verify the proof obligations + printOutLnTop Info $ + unwords ["Checking proof obligations", show (methodSpec ^. MS.csMethod), "..."] + (stats,vcstats) <- verifyObligations cc methodSpec tactic assumes asserts + io $ writeFinalProfile + + let lemmaSet = Set.fromList (map (view MS.psSpecIdent) lemmas) + end <- io getCurrentTime + let diff = diffUTCTime end start + ps <- io (MS.mkProvedSpec MS.SpecProved methodSpec stats vcstats lemmaSet diff) + returnProof ps + +----- +-- Mir.Types +----- + +mir_array :: Int -> Mir.Ty -> Mir.Ty +mir_array n t = Mir.TyArray t n + +mir_bool :: Mir.Ty +mir_bool = Mir.TyBool + +mir_char :: Mir.Ty +mir_char = Mir.TyChar + +mir_i8 :: Mir.Ty +mir_i8 = Mir.TyInt Mir.B8 + +mir_i16 :: Mir.Ty +mir_i16 = Mir.TyInt Mir.B16 + +mir_i32 :: Mir.Ty +mir_i32 = Mir.TyInt Mir.B32 + +mir_i64 :: Mir.Ty +mir_i64 = Mir.TyInt Mir.B64 + +mir_i128 :: Mir.Ty +mir_i128 = Mir.TyInt Mir.B128 + +mir_isize :: Mir.Ty +mir_isize = Mir.TyInt Mir.USize + +mir_f32 :: Mir.Ty +mir_f32 = Mir.TyFloat Mir.F32 + +mir_f64 :: Mir.Ty +mir_f64 = Mir.TyFloat Mir.F64 + +mir_ref :: Mir.Ty -> Mir.Ty +mir_ref ty = Mir.TyRef ty Mir.Immut + +mir_ref_mut :: Mir.Ty -> Mir.Ty +mir_ref_mut ty = Mir.TyRef ty Mir.Mut + +mir_slice :: Mir.Ty -> Mir.Ty +mir_slice = Mir.TySlice + +mir_str :: Mir.Ty +mir_str = Mir.TyStr + +mir_tuple :: [Mir.Ty] -> Mir.Ty +mir_tuple = Mir.TyTuple + +mir_u8 :: Mir.Ty +mir_u8 = Mir.TyUint Mir.B8 + +mir_u16 :: Mir.Ty +mir_u16 = Mir.TyUint Mir.B16 + +mir_u32 :: Mir.Ty +mir_u32 = Mir.TyUint Mir.B32 + +mir_u64 :: Mir.Ty +mir_u64 = Mir.TyUint Mir.B64 + +mir_u128 :: Mir.Ty +mir_u128 = Mir.TyUint Mir.B128 + +mir_usize :: Mir.Ty +mir_usize = Mir.TyUint Mir.USize + +-------------------------------------------------------------------------------- +-- mir_verify +-------------------------------------------------------------------------------- + +-- | Create a SAWCore formula asserting that two 'MIRVal's are equal. +assertEqualVals :: + MIRCrucibleContext -> + MIRVal -> + MIRVal -> + IO Term +assertEqualVals cc v1 v2 = + do let sym = cc^.mccSym + st <- sawCoreState sym + toSC sym st =<< equalValsPred cc v1 v2 + +registerOverride :: + Options -> + MIRCrucibleContext -> + Crucible.SimContext (SAWCruciblePersonality Sym) Sym MIR -> + W4.ProgramLoc -> + IORef MetadataMap {- ^ metadata map -} -> + [MethodSpec] -> + Crucible.OverrideSim (SAWCruciblePersonality Sym) Sym MIR rtp args ret () +registerOverride _opts cc _ctx _top_loc _mdMap cs = + do let c0 = head cs + let method = c0 ^. MS.csMethod + let rm = cc^.mccRustModule + + Crucible.AnyCFG cfg <- lookupDefIdCFG rm method + let h = Crucible.cfgHandle cfg + let retTy = Crucible.handleReturnType h + + Crucible.bindFnHandle h + $ Crucible.UseOverride + $ Crucible.mkOverride' + (Crucible.handleName h) + retTy + (panic "registerOverride.methodSpecHandler" ["not yet implemented"]) + +resolveArguments :: + MIRCrucibleContext -> + MethodSpec -> + Map MS.AllocIndex (Some (MirPointer Sym)) -> + IO [(Mir.Ty, MIRVal)] +resolveArguments cc mspec env = mapM resolveArg [0..(nArgs-1)] + where + nArgs = toInteger (length (mspec ^. MS.csArgs)) + tyenv = MS.csAllocations mspec + nameEnv = mspec ^. MS.csPreState . MS.csVarTypeNames + nm = mspec ^. MS.csMethod + + checkArgTy i mt mt' = + unless (checkCompatibleTys mt mt') $ + fail $ unlines [ "Type mismatch in argument " ++ show i ++ " when verifying " ++ show nm + , "Argument is declared with type: " ++ show mt + , "but provided argument has incompatible type: " ++ show mt' + , "Note: this may be because the signature of your " ++ + "function changed during compilation." + ] + resolveArg i = + case Map.lookup i (mspec ^. MS.csArgBindings) of + Just (mt, sv) -> do + mt' <- typeOfSetupValue cc tyenv nameEnv sv + checkArgTy i mt mt' + v <- resolveSetupVal cc env tyenv nameEnv sv + return (mt, v) + Nothing -> fail $ unwords ["Argument", show i, "unspecified when verifying", show nm] + +-- | For each points-to constraint in the pre-state section of the +-- function spec, write the given value to the address of the given +-- pointer. +setupPrePointsTos :: + MethodSpec -> + MIRCrucibleContext -> + Map MS.AllocIndex (Some (MirPointer Sym)) -> + [MirPointsTo] -> + Crucible.SymGlobalState Sym -> + IO (Crucible.SymGlobalState Sym) +setupPrePointsTos _mspec _cc _env pts mem0 = foldM doPointsTo mem0 pts + where + doPointsTo :: Crucible.SymGlobalState Sym -> MirPointsTo -> IO (Crucible.SymGlobalState Sym) + doPointsTo _mem _pt = + panic "setupPrePointsTo" ["not yet implemented"] + +-- | Collects boolean terms that should be assumed to be true. +setupPrestateConditions :: + MethodSpec -> + MIRCrucibleContext -> + Map MS.AllocIndex (Some (MirPointer Sym)) -> + [SetupCondition] -> + IO [Crucible.LabeledPred Term AssumptionReason] +setupPrestateConditions mspec cc env = aux [] + where + tyenv = MS.csAllocations mspec + nameEnv = mspec ^. MS.csPreState . MS.csVarTypeNames + + aux acc [] = return acc + + aux acc (MS.SetupCond_Equal loc val1 val2 : xs) = + do val1' <- resolveSetupVal cc env tyenv nameEnv val1 + val2' <- resolveSetupVal cc env tyenv nameEnv val2 + t <- assertEqualVals cc val1' val2' + let lp = Crucible.LabeledPred t (loc, "equality precondition") + aux (lp:acc) xs + + aux acc (MS.SetupCond_Pred loc tm : xs) = + let lp = Crucible.LabeledPred (ttTerm tm) (loc, "precondition") in + aux (lp:acc) xs + + aux _ (MS.SetupCond_Ghost empty_ _ _ _ : _) = absurd empty_ + +verifyObligations :: + MIRCrucibleContext -> + MethodSpec -> + ProofScript () -> + [Crucible.LabeledPred Term AssumptionReason] -> + [(String, MS.ConditionMetadata, Term)] -> + TopLevel (SolverStats, [MS.VCStats]) +verifyObligations cc mspec tactic assumes asserts = + do let sym = cc^.mccSym + st <- io $ sawCoreState sym + let sc = saw_ctx st + assume <- io $ scAndList sc (toListOf (folded . Crucible.labeledPred) assumes) + let nm = show $ mspec ^. MS.csMethod + outs <- forM (zip [(0::Int)..] asserts) $ \(n, (msg, md, assert)) -> do + goal <- io $ scImplies sc assume assert + goal' <- io $ boolToProp sc [] goal -- TODO, generalize over inputs + let ploc = MS.conditionLoc md + let gloc = (unwords [show (W4.plSourceLoc ploc) + ,"in" + , show (W4.plFunction ploc)]) ++ + (if Prelude.null (MS.conditionContext md) then [] else + "\n" ++ MS.conditionContext md) + let goalname = concat [nm, " (", takeWhile (/= '\n') msg, ")"] + let proofgoal = ProofGoal + { goalNum = n + , goalType = MS.conditionType md + , goalName = nm + , goalLoc = gloc + , goalDesc = msg + , goalSequent = propToSequent goal' + , goalTags = MS.conditionTags md + } + res <- runProofScript tactic goal' proofgoal (Just ploc) + (Text.unwords + ["MIR verification condition:", Text.pack (show n), Text.pack goalname]) + False -- do not record in the theorem database + False -- TODO, useSequentGoals... + case res of + ValidProof stats thm -> + return (stats, MS.VCStats md stats (thmSummary thm) (thmNonce thm) (thmDepends thm) (thmElapsedTime thm)) + InvalidProof stats vals _pst -> do + printOutLnTop Info $ unwords ["Subgoal failed:", nm, msg] + printOutLnTop Info (show stats) + printOutLnTop OnlyCounterExamples "----------Counterexample----------" + opts <- sawPPOpts <$> rwPPOpts <$> getTopLevelRW + let showEC ec = Text.unpack (toShortName (ecName ec)) + let showAssignment (name, val) = " " ++ showEC name ++ ": " ++ show (ppFirstOrderValue opts val) + mapM_ (printOutLnTop OnlyCounterExamples . showAssignment) vals + io $ fail "Proof failed." -- Mirroring behavior of llvm_verify + UnfinishedProof pst -> + io $ fail $ "Proof failed " ++ show (length (psGoals pst)) ++ " goals remaining." + + printOutLnTop Info $ unwords ["Proof succeeded!", nm] + + let stats = mconcat (map fst outs) + let vcstats = map snd outs + return (stats, vcstats) + +verifyPoststate :: + MIRCrucibleContext {- ^ crucible context -} -> + MethodSpec {- ^ specification -} -> + Map MS.AllocIndex (Some (MirPointer Sym)) {- ^ allocation substitution -} -> + Crucible.SymGlobalState Sym {- ^ global variables -} -> + Maybe (Mir.Ty, MIRVal) {- ^ optional return value -} -> + IORef MetadataMap {- ^ metadata map -} -> + TopLevel [(String, MS.ConditionMetadata, Term)] {- ^ generated labels and verification conditions -} +verifyPoststate cc mspec env0 globals ret mdMap = + mccWithBackend cc $ \bak -> + do opts <- getOptions + sc <- getSharedContext + poststateLoc <- SS.toW4Loc "_SAW_verify_poststate" <$> getPosition + io $ W4.setCurrentProgramLoc sym poststateLoc + + -- This discards all the obligations generated during + -- symbolic execution itself, i.e., which are not directly + -- generated from specification postconditions. This + -- is, in general, unsound. + skipSafetyProofs <- gets rwSkipSafetyProofs + when skipSafetyProofs (io (Crucible.clearProofObligations bak)) + + let ecs0 = Map.fromList + [ (ecVarIndex ec, ec) + | tt <- mspec ^. MS.csPreState . MS.csFreshVars + , let ec = tecExt tt ] + terms0 <- io $ traverse (scExtCns sc) ecs0 + + let initialFree = Set.fromList (map (ecVarIndex . tecExt) + (view (MS.csPostState . MS.csFreshVars) mspec)) + matchPost <- io $ + runOverrideMatcher sym globals env0 terms0 initialFree poststateLoc $ + do matchResult opts sc + learnCond opts sc cc mspec MS.PostState (mspec ^. MS.csPostState) + + st <- case matchPost of + Left err -> fail (show err) + Right (_, st) -> return st + io $ forM_ (view osAsserts st) $ \(md, Crucible.LabeledPred p r) -> + do (ann,p') <- W4.annotateTerm sym p + modifyIORef mdMap (Map.insert ann md) + Crucible.addAssertion bak (Crucible.LabeledPred p' r) + + finalMdMap <- io $ readIORef mdMap + obligations <- io $ Crucible.getProofObligations bak + io $ Crucible.clearProofObligations bak + io $ mapM (verifyObligation sc finalMdMap) (maybe [] Crucible.goalsToList obligations) + + where + sym = cc^.mccSym + + verifyObligation sc finalMdMap + (Crucible.ProofGoal hyps (Crucible.LabeledPred concl (Crucible.SimError loc err))) = + do st <- sawCoreState sym + hypTerm <- toSC sym st =<< Crucible.assumptionsPred sym hyps + conclTerm <- toSC sym st concl + obligation <- scImplies sc hypTerm conclTerm + let defaultMd = MS.ConditionMetadata + { MS.conditionLoc = loc + , MS.conditionTags = mempty + , MS.conditionType = "safety assertion" + , MS.conditionContext = "" + } + let md = fromMaybe defaultMd $ + do ann <- W4.getAnnotation sym concl + Map.lookup ann finalMdMap + return (Crucible.simErrorReasonMsg err, md, obligation) + + matchResult opts sc = + case (ret, mspec ^. MS.csRetValue) of + (Just (rty,r), Just expect) -> + let md = MS.ConditionMetadata + { MS.conditionLoc = mspec ^. MS.csLoc + , MS.conditionTags = mempty + , MS.conditionType = "return value matching" + , MS.conditionContext = "" + } in + matchArg opts sc cc mspec MS.PostState md r rty expect + (Nothing , Just _ ) -> fail "verifyPoststate: unexpected mir_return specification" + _ -> return () + +-- | Evaluate the precondition part of a Crucible method spec: +-- +-- * Allocate heap space for each 'mir_alloc' statement. +-- +-- * Record an equality precondition for each 'mir_equal' +-- statement. +-- +-- * Write to memory for each 'mir_points_to' statement. (Writes +-- to already-initialized locations are transformed into equality +-- preconditions.) +-- +-- * Evaluate the function arguments from the 'mir_execute_func' +-- statement. +-- +-- Returns a tuple of (arguments, preconditions, pointer values, +-- memory). +verifyPrestate :: + MIRCrucibleContext -> + MS.CrucibleMethodSpecIR MIR -> + Crucible.SymGlobalState Sym -> + IO ([(Mir.Ty, MIRVal)], + [Crucible.LabeledPred Term AssumptionReason], + Map MS.AllocIndex (Some (MirPointer Sym)), + Crucible.SymGlobalState Sym) +verifyPrestate cc mspec globals0 = + do let sym = cc^.mccSym + let tyenv = MS.csAllocations mspec + let nameEnv = mspec ^. MS.csPreState . MS.csVarTypeNames + + let prestateLoc = W4.mkProgramLoc "_SAW_verify_prestate" W4.InternalPos + liftIO $ W4.setCurrentProgramLoc sym prestateLoc + + -- Allocate memory for each 'mir_alloc' + let doAlloc = panic "verifyPrestate.doAlloc" ["not yet implemented"] + (env, globals1) <- runStateT + (Map.traverseWithKey (doAlloc cc) (mspec ^. MS.csPreState . MS.csAllocs)) + globals0 + + globals2 <- setupPrePointsTos mspec cc env (mspec ^. MS.csPreState . MS.csPointsTos) globals1 + cs <- setupPrestateConditions mspec cc env (mspec ^. MS.csPreState . MS.csConditions) + args <- resolveArguments cc mspec env + + -- Check the type of the return setup value + let methodStr = show (mspec ^. MS.csMethod) + case (mspec ^. MS.csRetValue, mspec ^. MS.csRet) of + (Just _, Nothing) -> + fail $ unlines + [ "Return value specified, but method " ++ methodStr ++ + " has void return type" + ] + (Just sv, Just retTy) -> + do retTy' <- typeOfSetupValue cc tyenv nameEnv sv + unless (checkCompatibleTys retTy retTy') $ + fail $ unlines + [ "Incompatible types for return value when verifying " ++ methodStr + , "Expected: " ++ show retTy + , "but given value of type: " ++ show retTy' + ] + (Nothing, _) -> return () + + return (args, cs, env, globals2) + +verifySimulate :: + Options -> + MIRCrucibleContext -> + [Crucible.GenericExecutionFeature Sym] -> + MethodSpec -> + [(a, MIRVal)] -> + [Crucible.LabeledPred Term AssumptionReason] -> + W4.ProgramLoc -> + [Lemma] -> + Crucible.SymGlobalState Sym -> + Bool {- ^ path sat checking -} -> + IORef MetadataMap {- ^ metadata map -} -> + IO (Maybe (Mir.Ty, MIRVal), Crucible.SymGlobalState Sym) +verifySimulate opts cc pfs mspec args assumes top_loc lemmas globals _checkSat mdMap = + mccWithBackend cc $ \bak -> + do let rm = cc^.mccRustModule + let cfgMap = rm ^. Mir.rmCFGs + let cs = rm ^. Mir.rmCS + let col = cs ^. Mir.collection + let method = mspec ^. MS.csMethod + let verbosity = simVerbose opts + let halloc = cc^.mccHandleAllocator + + when (verbosity > 2) $ + putStrLn "starting executeCrucibleMIR" + + -- Translate the static initializer function + let ?debug = simVerbose opts + -- For now, we use the same default settings for implicit parameters as in + -- crux-mir. We may want to add options later that allow configuring these. + let ?assertFalseOnError = True + let ?customOps = customOps + Crucible.AnyCFG staticInitCfg <- Mir.transStatics cs halloc + let staticInitHndl = Crucible.cfgHandle staticInitCfg + Refl <- case testEquality (Crucible.handleArgTypes staticInitHndl) Ctx.Empty of + Just e -> pure e + Nothing -> fail "mir_verify: static initializer should not require arguments" + + -- Find and run the target function + Crucible.AnyCFG methodCfg <- lookupDefIdCFG rm method + let methodHndl = Crucible.cfgHandle methodCfg + let methodArgTys = Crucible.handleArgTypes methodHndl + let methodRetTy = Crucible.handleReturnType methodHndl + + regmap <- prepareArgs methodArgTys (map snd args) + res <- + do let feats = pfs + let simctx = Crucible.initSimContext bak Mir.mirIntrinsicTypes halloc stdout + (Crucible.FnBindings Crucible.emptyHandleMap) Mir.mirExtImpl + SAWCruciblePersonality + let simSt = Crucible.InitialState simctx globals Crucible.defaultAbortHandler methodRetTy + let fnCall = Crucible.regValue <$> Crucible.callCFG methodCfg regmap + let overrideSim = + do forM_ cfgMap $ \(Crucible.AnyCFG cfg) -> + Crucible.bindFnHandle (Crucible.cfgHandle cfg) $ + Crucible.UseCFG cfg (Crucible.postdomInfo cfg) + _ <- Crucible.callCFG staticInitCfg Crucible.emptyRegMap + + mapM_ (registerOverride opts cc simctx top_loc mdMap) + (List.groupOn (view MS.csMethod) (map (view MS.psSpec) lemmas)) + liftIO $ + for_ assumes $ \(Crucible.LabeledPred p (md, reason)) -> + do expr <- resolveSAWPred cc p + let loc = MS.conditionLoc md + Crucible.addAssumption bak (Crucible.GenericAssumption loc reason expr) + fnCall + Crucible.executeCrucible (map Crucible.genericToExecutionFeature feats) + (simSt (Crucible.runOverrideSim methodRetTy overrideSim)) + + case res of + Crucible.FinishedResult _ pr -> + do Crucible.GlobalPair retval globals1 <- + case pr of + Crucible.TotalRes gp -> return gp + Crucible.PartialRes _ _ gp _ -> + do printOutLn opts Info "Symbolic simulation completed with side conditions." + return gp + let ret_ty = mspec ^. MS.csRet + retval' <- + case ret_ty of + Nothing -> return Nothing + Just ret_mt -> + case retval of + Crucible.RegEntry ty val -> + case decodeMIRVal col ret_mt (Crucible.AnyValue ty val) of + Nothing -> error $ "FIXME: Unsupported return type: " ++ show ret_ty + Just v -> return (Just (ret_mt, v)) + return (retval', globals1) + + Crucible.AbortedResult _ ar -> + do let resultDoc = ppMIRAbortedResult cc ar + fail $ unlines [ "Symbolic execution failed." + , show resultDoc + ] + + Crucible.TimeoutResult _cxt -> fail "Symbolic execution timed out." + + where + prepareArg :: forall tp. Crucible.TypeRepr tp -> MIRVal -> IO (Crucible.RegValue Sym tp) + prepareArg ty (MIRVal vTy vVal) = + case testEquality ty (shapeType vTy) of + Just Refl -> pure vVal + Nothing -> fail $ unlines + [ "argument type mismatch" + , show ty + , show (shapeType vTy) + ] + + prepareArgs :: + forall xs. + Ctx.Assignment Crucible.TypeRepr xs -> + [MIRVal] -> + IO (Crucible.RegMap Sym xs) + prepareArgs ctx xs | length xs /= Ctx.sizeInt (Ctx.size ctx) = + fail $ "Wrong number of arguments: found " ++ show (length xs) ++ ", expected " ++ show (Ctx.sizeInt (Ctx.size ctx)) + prepareArgs ctx xs = + Crucible.RegMap <$> + Ctx.traverseWithIndex (\idx tr -> + do v <- prepareArg tr (xs !! Ctx.indexVal idx) + return (Crucible.RegEntry tr v)) + ctx + +-------------------------------------------------------------------------------- +-- Utilities +-------------------------------------------------------------------------------- + +-- | Check if two 'Mir.Ty's are compatible in SAW. This is a slightly coarser +-- notion of equality to reflect the fact that MIR's type system is richer than +-- Cryptol's type system, and some types which would be distinct in MIR are in +-- fact equal when converted to the equivalent Cryptol types. In particular: +-- +-- 1. A @u@ type is always compatible with an @i@ type. For instance, @u8@ +-- is compatible with @i8@, and @u16@ is compatible with @i16@. Note that the +-- bit sizes of both types must be the same. For instance, @u8@ is /not/ +-- compatible with @i16@. +-- +-- 2. The @usize@/@isize@ types are always compatible with @u@/@i@, where +-- @N@ is the number of bits corresponding to the 'Mir.SizeBits' type in +-- "Mir.Intrinsics". (This is a bit unsavory, as the actual size of +-- @usize@/@isize@ is platform-dependent, but this is the current approach.) +-- +-- 3. Compatibility applies recursively. For instance, @[ty_1; N]@ is compatible +-- with @[ty_2; N]@ iff @ty_1@ and @ty_2@ are compatibile. Similarly, a tuple +-- typle @(ty_1_a, ..., ty_n_a)@ is compatible with @(ty_1_b, ..., ty_n_b)@ +-- iff @ty_1_a@ is compatible with @ty_1_b@, ..., and @ty_n_a@ is compatible +-- with @ty_n_b@. +-- +-- See also @checkRegisterCompatibility@ in "SAWScript.Crucible.LLVM.Builtins" +-- and @registerCompatible@ in "SAWScript.Crucible.JVM.Builtins", which fill a +-- similar niche in the LLVM and JVM backends, respectively. +checkCompatibleTys :: Mir.Ty -> Mir.Ty -> Bool +checkCompatibleTys ty1 ty2 = tyView ty1 == tyView ty2 + +-- | Like 'Mir.Ty', but where: +-- +-- * The 'TyInt' and 'TyUint' constructors have been collapsed into a single +-- 'TyViewInt' constructor. +-- +-- * 'TyViewInt' uses 'BaseSizeView' instead of 'Mir.BaseSize'. +-- +-- * Recursive occurrences of 'Mir.Ty' use 'TyView' instead. This also applies +-- to fields of type 'SubstsView' and 'FnSigView', which also replace 'Mir.Ty' +-- with 'TyView' in their definitions. +-- +-- This provides a coarser notion of equality than what the 'Eq' instance for +-- 'Mir.Ty' provides, which distinguishes the two sorts of integer types. +-- +-- This is an internal data type that is used to power the 'checkCompatibleTys' +-- function. Refer to the Haddocks for that function for more information on why +-- this is needed. +data TyView + = TyViewBool + | TyViewChar + -- | The sole integer type. Both 'TyInt' and 'TyUint' are mapped to + -- 'TyViewInt', and 'BaseSizeView' is used instead of 'Mir.BaseSize'. + | TyViewInt !BaseSizeView + | TyViewTuple ![TyView] + | TyViewSlice !TyView + | TyViewArray !TyView !Int + | TyViewRef !TyView !Mir.Mutability + | TyViewAdt !Mir.DefId !Mir.DefId !SubstsView + | TyViewFnDef !Mir.DefId + | TyViewClosure [TyView] + | TyViewStr + | TyViewFnPtr !FnSigView + | TyViewDynamic !Mir.TraitName + | TyViewRawPtr !TyView !Mir.Mutability + | TyViewFloat !Mir.FloatKind + | TyViewDowncast !TyView !Integer + | TyViewNever + | TyViewForeign + | TyViewLifetime + | TyViewConst + | TyViewErased + | TyViewInterned Mir.TyName + deriving Eq + +-- | Like 'Mir.BaseSize', but without a special case for @usize@/@isize@. +-- Instead, these are mapped to their actual size, which is determined by the +-- number of bits in the 'Mir.SizeBits' type in "Mir.Intrinsics". (This is a bit +-- unsavory, as the actual size of @usize@/@isize@ is platform-dependent, but +-- this is the current approach.) +data BaseSizeView + = B8View + | B16View + | B32View + | B64View + | B128View + deriving Eq + +-- | Like 'Mir.Substs', but using 'TyView's instead of 'Mir.Ty'. +-- +-- This is an internal data type that is used to power the 'checkCompatibleTys' +-- function. Refer to the Haddocks for that function for more information on why +-- this is needed. +newtype SubstsView = SubstsView [TyView] + deriving Eq + +-- | Like 'Mir.FnSig', but using 'TyView's instead of 'Mir.Ty'. +-- +-- This is an internal data type that is used to power the 'checkCompatibleTys' +-- function. Refer to the Haddocks for that function for more information on why +-- this is needed. +data FnSigView = FnSigView { + _fsvarg_tys :: ![TyView] + , _fsvreturn_ty :: !TyView + , _fsvabi :: Mir.Abi + , _fsvspreadarg :: Maybe Int + } + deriving Eq + +-- | Convert a 'Mir.Ty' value to a 'TyView' value. +tyView :: Mir.Ty -> TyView +-- The two most important cases. Both sorts of integers are mapped to TyViewInt. +tyView (Mir.TyInt bs) = TyViewInt (baseSizeView bs) +tyView (Mir.TyUint bs) = TyViewInt (baseSizeView bs) +-- All other cases are straightforward. +tyView Mir.TyBool = TyViewBool +tyView Mir.TyChar = TyViewChar +tyView (Mir.TyTuple tys) = TyViewTuple (map tyView tys) +tyView (Mir.TySlice ty) = TyViewSlice (tyView ty) +tyView (Mir.TyArray ty n) = TyViewArray (tyView ty) n +tyView (Mir.TyRef ty mut) = TyViewRef (tyView ty) mut +tyView (Mir.TyAdt monoDid origDid substs) = + TyViewAdt monoDid origDid (substsView substs) +tyView (Mir.TyFnDef did) = TyViewFnDef did +tyView (Mir.TyClosure tys) = TyViewClosure (map tyView tys) +tyView Mir.TyStr = TyViewStr +tyView (Mir.TyFnPtr sig) = TyViewFnPtr (fnSigView sig) +tyView (Mir.TyDynamic trait) = TyViewDynamic trait +tyView (Mir.TyRawPtr ty mut) = TyViewRawPtr (tyView ty) mut +tyView (Mir.TyFloat fk) = TyViewFloat fk +tyView (Mir.TyDowncast ty n) = TyViewDowncast (tyView ty) n +tyView Mir.TyNever = TyViewNever +tyView Mir.TyForeign = TyViewForeign +tyView Mir.TyLifetime = TyViewLifetime +tyView Mir.TyConst = TyViewConst +tyView Mir.TyErased = TyViewErased +tyView (Mir.TyInterned nm) = TyViewInterned nm + +-- | Convert a 'Mir.BaseSize' value to a 'BaseSizeView' value. +baseSizeView :: Mir.BaseSize -> BaseSizeView +baseSizeView Mir.B8 = B8View +baseSizeView Mir.B16 = B16View +baseSizeView Mir.B32 = B32View +baseSizeView Mir.B64 = B64View +baseSizeView Mir.B128 = B128View +baseSizeView Mir.USize = + case Map.lookup (natValue sizeBitsRepr) bitSizesMap of + Just bsv -> bsv + Nothing -> + error $ "Mir.Intrinsics.BaseSize bit size not supported: " ++ show sizeBitsRepr + where + sizeBitsRepr = knownNat @Mir.SizeBits + + bitSizesMap :: Map Natural BaseSizeView + bitSizesMap = Map.fromList + [ (natValue (knownNat @8), B8View) + , (natValue (knownNat @16), B16View) + , (natValue (knownNat @32), B32View) + , (natValue (knownNat @64), B64View) + , (natValue (knownNat @128), B128View) + ] + +-- | Convert a 'Mir.Substs' value to a 'SubstsView' value. +substsView :: Mir.Substs -> SubstsView +substsView (Mir.Substs tys) = SubstsView (map tyView tys) + +-- | Convert a 'Mir.FnSig' value to a 'FnSigView' value. +fnSigView :: Mir.FnSig -> FnSigView +fnSigView (Mir.FnSig argTys retTy abi spreadarg) = + FnSigView (map tyView argTys) (tyView retTy) abi spreadarg + +-- | Returns the Cryptol type of a MIR type, returning 'Nothing' if it is not +-- easily expressible in Cryptol's type system or if it is not currently +-- supported. +cryptolTypeOfActual :: Mir.Ty -> Maybe Cryptol.Type +cryptolTypeOfActual mty = + case mty of + Mir.TyBool -> Just Cryptol.tBit + Mir.TyChar -> Just $ Cryptol.tWord $ Cryptol.tNum (32 :: Integer) + Mir.TyUint bs -> baseSizeType bs + Mir.TyInt bs -> baseSizeType bs + Mir.TyArray t n -> Cryptol.tSeq (Cryptol.tNum n) <$> cryptolTypeOfActual t + Mir.TyTuple tys -> Cryptol.tTuple <$> traverse cryptolTypeOfActual tys + + Mir.TyFloat _ -> Nothing + Mir.TyStr -> Nothing + Mir.TyAdt _ _ _ -> Nothing + Mir.TyRef _ _ -> Nothing + Mir.TyFnDef _ -> Nothing + Mir.TyFnPtr _ -> Nothing + Mir.TyRawPtr _ _ -> Nothing + Mir.TyClosure _ -> Nothing + Mir.TySlice _ -> Nothing + Mir.TyDowncast _ _ -> Nothing + Mir.TyNever -> Nothing + Mir.TyForeign -> Nothing + Mir.TyLifetime -> Nothing + Mir.TyConst -> Nothing + Mir.TyErased -> Nothing + Mir.TyInterned _ -> Nothing + Mir.TyDynamic _ -> Nothing + where + baseSizeType :: Mir.BaseSize -> Maybe Cryptol.Type + baseSizeType Mir.B8 = Just $ Cryptol.tWord $ Cryptol.tNum (8 :: Integer) + baseSizeType Mir.B16 = Just $ Cryptol.tWord $ Cryptol.tNum (16 :: Integer) + baseSizeType Mir.B32 = Just $ Cryptol.tWord $ Cryptol.tNum (32 :: Integer) + baseSizeType Mir.B64 = Just $ Cryptol.tWord $ Cryptol.tNum (64 :: Integer) + baseSizeType Mir.B128 = Just $ Cryptol.tWord $ Cryptol.tNum (128 :: Integer) + baseSizeType Mir.USize = Just $ Cryptol.tWord $ Cryptol.tNum $ natValue $ knownNat @Mir.SizeBits + +-- | Given a function name @fnName@, attempt to look up its corresponding +-- 'Mir.DefId'. Currently, the following types of function names are permittd: +-- +-- * @/::: A fully disambiguated name. +-- +-- * @::: A name without a disambiguator. In this +-- case, SAW will attempt to look up a disambiguator from the @crateDisambigs@ +-- map. If none can be found, or if there are multiple disambiguators for the +-- given @@, then this will fail. +findDefId :: Map Text (NonEmpty Text) -> Text -> TopLevel Mir.DefId +findDefId crateDisambigs fnName = do + (crate, path) <- + case edid of + crate:path -> pure (crate, path) + [] -> fail $ unlines + [ "The function `" ++ fnNameStr ++ "` lacks a crate." + , "Consider providing one, e.g., `::" ++ fnNameStr ++ "`." + ] + let crateStr = Text.unpack crate + case Text.splitOn "/" crate of + [crateNoDisambig, disambig] -> + pure $ Mir.textId $ Text.intercalate "::" + $ (crateNoDisambig <> "/" <> disambig) : path + [_] -> + case Map.lookup crate crateDisambigs of + Just allDisambigs@(disambig :| otherDisambigs) + | F.null otherDisambigs + -> pure $ Mir.textId $ Text.intercalate "::" + $ (crate <> "/" <> disambig) : path + | otherwise + -> fail $ unlines $ + [ "ambiguous crate " ++ crateStr + , "crate disambiguators:" + ] ++ F.toList (Text.unpack <$> allDisambigs) + Nothing -> fail $ "unknown crate " ++ crateStr + _ -> fail $ "Malformed crate name: " ++ show crateStr + where + fnNameStr = Text.unpack fnName + edid = Text.splitOn "::" fnName + +-- | Look up the control-flow graph (CFG) for a 'Mir.DefId', failing if a CFG +-- cannot be found. +lookupDefIdCFG :: + MonadFail m + => Mir.RustModule + -> Mir.DefId + -> m (Crucible.AnyCFG MIR) +lookupDefIdCFG rm method = + case Map.lookup (Mir.idText method) (rm ^. Mir.rmCFGs) of + Just x -> return x + Nothing -> fail $ "Couldn't find CFG for MIR function: " ++ show method + +setupCrucibleContext :: Mir.RustModule -> TopLevel MIRCrucibleContext +setupCrucibleContext rm = + do halloc <- getHandleAlloc + sc <- getSharedContext + pathSatSolver <- gets rwPathSatSolver + sym <- io $ newSAWCoreExprBuilder sc + bak <- io $ newSAWCoreBackend pathSatSolver sym + opts <- getOptions + io $ do let cfg = W4.getConfiguration sym + verbSetting <- W4.getOptionSetting W4.verbosity cfg + _ <- W4.setOpt verbSetting $ toInteger $ simVerbose opts + return () + + -- TODO! there's a lot of options setup we need to replicate + -- from SAWScript.Crucible.LLVM.Builtins + + return MIRCrucibleContext { _mccRustModule = rm + , _mccBackend = bak + , _mccHandleAllocator = halloc + } + +-------------------------------------------------------------------------------- +-- Errors +-------------------------------------------------------------------------------- + +data MIRSetupError + = MIRFreshVarInvalidType Mir.Ty + | MIRArgTypeMismatch Int Mir.Ty Mir.Ty -- argument position, expected, found + | MIRArgNumberWrong Int Int -- number expected, number found + | MIRReturnUnexpected Mir.Ty -- found + | MIRReturnTypeMismatch Mir.Ty Mir.Ty -- expected, found + +instance X.Exception MIRSetupError where + toException = topLevelExceptionToException + fromException = topLevelExceptionFromException + +instance Show MIRSetupError where + show err = + case err of + MIRFreshVarInvalidType jty -> + "mir_fresh_var: Invalid type: " ++ show jty + MIRArgTypeMismatch i expected found -> + unlines + [ "mir_execute_func: Argument type mismatch" + , "Argument position: " ++ show i + , "Expected type: " ++ show expected + , "Given type: " ++ show found + ] + MIRArgNumberWrong expected found -> + unlines + [ "mir_execute_func: Wrong number of arguments" + , "Expected: " ++ show expected + , "Given: " ++ show found + ] + MIRReturnUnexpected found -> + unlines + [ "mir_return: Unexpected return value for void method" + , "Given type: " ++ show found + ] + MIRReturnTypeMismatch expected found -> + unlines + [ "mir_return: Return type mismatch" + , "Expected type: " ++ show expected + , "Given type: " ++ show found + ] diff --git a/src/SAWScript/Crucible/MIR/MethodSpecIR.hs b/src/SAWScript/Crucible/MIR/MethodSpecIR.hs new file mode 100644 index 0000000000..21895c7ee7 --- /dev/null +++ b/src/SAWScript/Crucible/MIR/MethodSpecIR.hs @@ -0,0 +1,162 @@ +{-# Language DataKinds #-} +{-# Language OverloadedStrings #-} +{-# Language RankNTypes #-} +{-# Language TemplateHaskell #-} +{-# Language TypeFamilies #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} + +-- | Provides type-checked representations for Rust/MIR function specifications +-- and functions for creating them from ASTs. +module SAWScript.Crucible.MIR.MethodSpecIR + ( -- * @MIRCrucibleContext@ + MIRCrucibleContext(..) + , mccRustModule + , mccBackend + , mccHandleAllocator + , mccWithBackend + , mccSym + + -- * @MirPointsTo@ + , MirPointsTo(..) + + -- * @MirAllocSpec@ + , MirAllocSpec(..) + , maType + , maMutbl + , maMirType + , maLen + + -- * @MirPointer@ + , MirPointer(..) + , mpType + , mpMutbl + , mpMirType + , mpRef + + -- * @MIRMethodSpec@ + , MIRMethodSpec + + -- * Initial CrucibleSetupMethodSpec + , initialDefCrucibleMethodSpecIR + , initialCrucibleSetupState + ) where + +import Control.Lens (Getter, (^.), makeLenses, to) +import Data.Parameterized.Classes +import Data.Parameterized.Some +import Data.Text (Text) +import qualified Prettyprinter as PP + +import Lang.Crucible.FunctionHandle (HandleAllocator) +import Lang.Crucible.Types +import Mir.DefId +import Mir.Generator +import Mir.Intrinsics +import qualified Mir.Mir as M +import What4.ProgramLoc (ProgramLoc) + +import SAWScript.Crucible.Common +import qualified SAWScript.Crucible.Common.MethodSpec as MS +import qualified SAWScript.Crucible.Common.Override as MS +import qualified SAWScript.Crucible.Common.Setup.Type as Setup + +type instance MS.HasSetupNull MIR = 'False +type instance MS.HasSetupGlobal MIR = 'False +type instance MS.HasSetupStruct MIR = 'True +type instance MS.HasSetupArray MIR = 'True +type instance MS.HasSetupElem MIR = 'True +type instance MS.HasSetupField MIR = 'True +type instance MS.HasSetupCast MIR = 'False +type instance MS.HasSetupUnion MIR = 'False +type instance MS.HasSetupGlobalInitializer MIR = 'False + +type instance MS.HasGhostState MIR = 'False + +type instance MS.TypeName MIR = Text +type instance MS.ExtType MIR = M.Ty + +type instance MS.MethodId MIR = DefId +type instance MS.AllocSpec MIR = Some MirAllocSpec +type instance MS.PointsTo MIR = MirPointsTo +type instance MS.ResolvedState MIR = () +type instance MS.CastType MIR = () + +type instance MS.Codebase MIR = CollectionState + +data MIRCrucibleContext = + MIRCrucibleContext + { _mccRustModule :: RustModule + , _mccBackend :: SomeOnlineBackend + , _mccHandleAllocator :: HandleAllocator + } + +type instance MS.CrucibleContext MIR = MIRCrucibleContext + +mccWithBackend :: + MIRCrucibleContext -> + (forall solver. OnlineSolver solver => Backend solver -> a) -> + a +mccWithBackend cc k = + case _mccBackend cc of SomeOnlineBackend bak -> k bak + +mccSym :: Getter MIRCrucibleContext Sym +mccSym = to (\mcc -> mccWithBackend mcc backendGetSym) + +type instance MS.Pointer' MIR sym = Some (MirPointer sym) + + +data MirPointsTo = MirPointsTo MS.AllocIndex [MS.SetupValue MIR] + deriving (Show) + +instance PP.Pretty MirPointsTo where + pretty (MirPointsTo alloc sv) = PP.parens $ + PP.pretty (show alloc) PP.<+> "->" PP.<+> PP.list (map MS.ppSetupValue sv) + +data MirAllocSpec tp = MirAllocSpec + { _maType :: TypeRepr tp + , _maMutbl :: M.Mutability + , _maMirType :: M.Ty + , _maLen :: Int + } + deriving (Show) + +instance ShowF MirAllocSpec where + +data MirPointer sym tp = MirPointer + { _mpType :: TypeRepr tp + , _mpMutbl :: M.Mutability + , _mpMirType :: M.Ty + , _mpRef :: MirReferenceMux sym tp + } + +type MIRMethodSpec = MS.CrucibleMethodSpecIR MIR + +makeLenses ''MIRCrucibleContext +makeLenses ''MirAllocSpec +makeLenses ''MirPointer + +initialDefCrucibleMethodSpecIR :: + CollectionState -> + M.Fn -> + ProgramLoc -> + MS.CrucibleMethodSpecIR MIR +initialDefCrucibleMethodSpecIR rm fn loc = + let fname = fn ^. M.fname + fsig = fn ^. M.fsig + argTys = fsig ^. M.fsarg_tys + retTy = case fsig ^. M.fsreturn_ty of + M.TyTuple [] -> Nothing + ty -> Just ty in + MS.makeCrucibleMethodSpecIR fname argTys retTy loc rm + +initialCrucibleSetupState :: + MIRCrucibleContext -> + M.Fn -> + ProgramLoc -> + Setup.CrucibleSetupState MIR +initialCrucibleSetupState cc fn loc = + Setup.makeCrucibleSetupState () cc $ + initialDefCrucibleMethodSpecIR + (cc ^. mccRustModule ^. rmCS) + fn + loc diff --git a/src/SAWScript/Crucible/MIR/Override.hs b/src/SAWScript/Crucible/MIR/Override.hs new file mode 100644 index 0000000000..93939e22e2 --- /dev/null +++ b/src/SAWScript/Crucible/MIR/Override.hs @@ -0,0 +1,503 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE TypeApplications #-} + +-- | Override matching and application for MIR. +module SAWScript.Crucible.MIR.Override + ( OverrideMatcher + , OverrideMatcher'(..) + , runOverrideMatcher + + , setupValueSub + , osAsserts + , termSub + + , learnCond + , matchArg + , decodeMIRVal + ) where + +import qualified Control.Exception as X +import Control.Lens +import Control.Monad.IO.Class (MonadIO(..)) +import Data.Foldable (for_, traverse_) +import qualified Data.Functor.Product as Functor +import Data.List (tails) +import qualified Data.Map as Map +import Data.Map (Map) +import qualified Data.Parameterized.Context as Ctx +import Data.Parameterized.Some (Some(..)) +import qualified Data.Parameterized.TraversableFC as FC +import qualified Data.Set as Set +import qualified Data.Vector as V +import Data.Void (absurd) +import qualified Prettyprinter as PP + +import qualified Cryptol.TypeCheck.AST as Cryptol +import qualified Cryptol.Eval.Type as Cryptol (TValue(..), evalType) +import qualified Lang.Crucible.Backend as Crucible +import qualified Lang.Crucible.Simulator as Crucible +import qualified Lang.Crucible.Types as Crucible +import qualified Mir.Intrinsics as Mir +import Mir.Intrinsics (MIR) +import qualified Mir.Mir as Mir +import qualified What4.Expr as W4 +import qualified What4.Interface as W4 +import qualified What4.Partial as W4 +import qualified What4.ProgramLoc as W4 + +import Verifier.SAW.Prelude (scEq) +import Verifier.SAW.SharedTerm +import Verifier.SAW.Simulator.What4.ReturnTrip (saw_ctx, toSC) +import Verifier.SAW.TypedAST +import Verifier.SAW.TypedTerm + +import SAWScript.Crucible.Common +import qualified SAWScript.Crucible.Common.MethodSpec as MS +import SAWScript.Crucible.Common.MethodSpec (AllocIndex(..)) +import qualified SAWScript.Crucible.Common.Override as Ov (getSymInterface) +import SAWScript.Crucible.Common.Override hiding (getSymInterface) +import SAWScript.Crucible.MIR.MethodSpecIR +import SAWScript.Crucible.MIR.ResolveSetupValue +import SAWScript.Crucible.MIR.TypeShape +import SAWScript.Options +import SAWScript.Panic +import SAWScript.Utils (handleException) + +-- A few convenient synonyms +type SetupValue = MS.SetupValue MIR +type CrucibleMethodSpecIR = MS.CrucibleMethodSpecIR MIR +type StateSpec = MS.StateSpec MIR +type SetupCondition = MS.SetupCondition MIR + +assertTermEqualities :: + SharedContext -> + MIRCrucibleContext -> + OverrideMatcher MIR md () +assertTermEqualities sc cc = do + let assertTermEquality (t, md, e) = do + p <- instantiateExtResolveSAWPred sc cc t + addAssert p md e + traverse_ assertTermEquality =<< OM (use termEqs) + +-- | Assign the given reference value to the given allocation index in +-- the current substitution. If there is already a binding for this +-- index, then add a reference-equality constraint. +assignVar :: + MIRCrucibleContext {- ^ context for interacting with Crucible -} -> + MS.ConditionMetadata -> + AllocIndex {- ^ variable index -} -> + Some (MirPointer Sym) {- ^ concrete value -} -> + OverrideMatcher MIR w () + +assignVar cc md var sref@(Some ref) = + do old <- OM (setupValueSub . at var <<.= Just sref) + let loc = MS.conditionLoc md + for_ old $ \(Some ref') -> + do p <- liftIO (equalRefsPred cc ref ref') + addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError "equality of aliased references" "")) + +assignTerm :: + SharedContext {- ^ context for constructing SAW terms -} -> + MIRCrucibleContext {- ^ context for interacting with Crucible -} -> + MS.ConditionMetadata -> + MS.PrePost -> + VarIndex {- ^ external constant index -} -> + Term {- ^ value -} -> + OverrideMatcher MIR w () + +assignTerm sc cc md prepost var val = + do mb <- OM (use (termSub . at var)) + case mb of + Nothing -> OM (termSub . at var ?= val) + Just old -> + matchTerm sc cc md prepost val old + +decodeMIRVal :: Mir.Collection -> Mir.Ty -> Crucible.AnyValue Sym -> Maybe MIRVal +decodeMIRVal col ty (Crucible.AnyValue repr rv) + | Some shp <- tyToShape col ty + = case W4.testEquality repr (shapeType shp) of + Just Refl -> Just (MIRVal shp rv) + Nothing -> Nothing + +-- | Generate assertions that all of the memory allocations matched by +-- an override's precondition are disjoint. +enforceDisjointness :: + MIRCrucibleContext -> W4.ProgramLoc -> StateSpec -> OverrideMatcher MIR w () +enforceDisjointness cc loc ss = + do let sym = cc^.mccSym + sub <- OM (use setupValueSub) + let mems = Map.elems $ Map.intersectionWith (,) (view MS.csAllocs ss) sub + + let md = MS.ConditionMetadata + { MS.conditionLoc = loc + , MS.conditionTags = mempty + , MS.conditionType = "memory region disjointness" + , MS.conditionContext = "" + } + -- Ensure that all regions are disjoint from each other. + sequence_ + [ do c <- liftIO $ W4.notPred sym =<< equalRefsPred cc p q + addAssert c md a + + | let a = Crucible.SimError loc $ + Crucible.AssertFailureSimError "Memory regions not disjoint" "" + , (_, Some p) : ps <- tails mems + , (_, Some q) <- ps + ] + +instantiateExtResolveSAWPred :: + SharedContext -> + MIRCrucibleContext -> + Term -> + OverrideMatcher MIR md (W4.Pred Sym) +instantiateExtResolveSAWPred sc cc cond = do + sub <- OM (use termSub) + liftIO $ resolveSAWPred cc =<< scInstantiateExt sc sub cond + +-- | Map the given substitution over all 'SetupTerm' constructors in +-- the given 'SetupValue'. +instantiateSetupValue :: + SharedContext -> + Map VarIndex Term -> + SetupValue -> + IO SetupValue +instantiateSetupValue sc s v = + case v of + MS.SetupVar _ -> return v + MS.SetupTerm tt -> MS.SetupTerm <$> doTerm tt + MS.SetupNull empty -> absurd empty + MS.SetupGlobal empty _ -> absurd empty + MS.SetupStruct _ _ _ -> return v + MS.SetupArray _ _ -> return v + MS.SetupElem _ _ _ -> return v + MS.SetupField _ _ _ -> return v + MS.SetupCast empty _ _ -> absurd empty + MS.SetupUnion empty _ _ -> absurd empty + MS.SetupGlobalInitializer empty _ -> absurd empty + where + doTerm (TypedTerm schema t) = TypedTerm schema <$> scInstantiateExt sc s t + +-- learn pre/post condition +learnCond :: + Options -> + SharedContext -> + MIRCrucibleContext -> + CrucibleMethodSpecIR -> + MS.PrePost -> + StateSpec -> + OverrideMatcher MIR w () +learnCond opts sc cc cs prepost ss = + do let loc = cs ^. MS.csLoc + matchPointsTos opts sc cc cs prepost (ss ^. MS.csPointsTos) + traverse_ (learnSetupCondition opts sc cc cs prepost) (ss ^. MS.csConditions) + assertTermEqualities sc cc + enforceDisjointness cc loc ss + enforceCompleteSubstitution loc ss + +-- | Process a "crucible_equal" statement from the precondition +-- section of the CrucibleSetup block. +learnEqual :: + Options -> + SharedContext -> + MIRCrucibleContext -> + CrucibleMethodSpecIR -> + MS.ConditionMetadata -> + MS.PrePost -> + SetupValue {- ^ first value to compare -} -> + SetupValue {- ^ second value to compare -} -> + OverrideMatcher MIR w () +learnEqual opts sc cc spec md prepost v1 v2 = + do val1 <- resolveSetupValueMIR opts cc sc spec v1 + val2 <- resolveSetupValueMIR opts cc sc spec v2 + p <- liftIO (equalValsPred cc val1 val2) + let name = "equality " ++ MS.stateCond prepost + let loc = MS.conditionLoc md + addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError name "")) + +-- | Process a "points_to" statement from the precondition section of +-- the CrucibleSetup block. First, load the value from the address +-- indicated by 'ptr', and then match it against the pattern 'val'. +learnPointsTo :: + Options -> + SharedContext -> + MIRCrucibleContext -> + CrucibleMethodSpecIR -> + MS.PrePost -> + MirPointsTo -> + OverrideMatcher MIR w () +learnPointsTo _opts _sc _cc _spec _prepost _pt = + panic "learnPointsTo" ["not yet implemented"] + +-- | Process a "crucible_precond" statement from the precondition +-- section of the CrucibleSetup block. +learnPred :: + SharedContext -> + MIRCrucibleContext -> + MS.ConditionMetadata -> + MS.PrePost -> + Term {- ^ the precondition to learn -} -> + OverrideMatcher MIR w () +learnPred sc cc md prepost t = + do s <- OM (use termSub) + u <- liftIO $ scInstantiateExt sc s t + p <- liftIO $ resolveBoolTerm (cc ^. mccSym) u + let loc = MS.conditionLoc md + addAssert p md (Crucible.SimError loc (Crucible.AssertFailureSimError (MS.stateCond prepost) "")) + +-- | Use the current state to learn about variable assignments based on +-- preconditions for a procedure specification. +learnSetupCondition :: + Options -> + SharedContext -> + MIRCrucibleContext -> + CrucibleMethodSpecIR -> + MS.PrePost -> + SetupCondition -> + OverrideMatcher MIR w () +learnSetupCondition opts sc cc spec prepost (MS.SetupCond_Equal md val1 val2) = learnEqual opts sc cc spec md prepost val1 val2 +learnSetupCondition _opts sc cc _ prepost (MS.SetupCond_Pred md tm) = learnPred sc cc md prepost (ttTerm tm) +learnSetupCondition _opts _ _ _ _ (MS.SetupCond_Ghost empty _ _ _) = absurd empty + +-- | Match the value of a function argument with a symbolic 'SetupValue'. +matchArg :: + Options {- ^ saw script print out opts -} -> + SharedContext {- ^ context for constructing SAW terms -} -> + MIRCrucibleContext {- ^ context for interacting with Crucible -} -> + CrucibleMethodSpecIR {- ^ specification for current function override -} -> + MS.PrePost -> + MS.ConditionMetadata -> + MIRVal {- ^ concrete simulation value -} -> + Mir.Ty {- ^ expected memory type -} -> + SetupValue {- ^ expected specification value -} -> + OverrideMatcher MIR w () + +matchArg opts sc cc cs prepost md actual expectedTy expected@(MS.SetupTerm expectedTT) + | TypedTermSchema (Cryptol.Forall [] [] tyexpr) <- ttType expectedTT + , Right tval <- Cryptol.evalType mempty tyexpr + = do sym <- Ov.getSymInterface + failMsg <- mkStructuralMismatch opts cc sc cs actual expected expectedTy + realTerm <- valueToSC sym md failMsg tval actual + matchTerm sc cc md prepost realTerm (ttTerm expectedTT) + +matchArg opts sc cc cs _prepost md actual@(MIRVal (RefShape _refTy pointeeTy mutbl tpr) ref) expectedTy setupval = + case setupval of + MS.SetupVar var -> + do assignVar cc md var (Some (MirPointer tpr mutbl pointeeTy ref)) + + MS.SetupNull empty -> absurd empty + MS.SetupGlobal empty _ -> absurd empty + MS.SetupCast empty _ _ -> absurd empty + MS.SetupUnion empty _ _ -> absurd empty + MS.SetupGlobalInitializer empty _ -> absurd empty + + _ -> failure (cs ^. MS.csLoc) =<< + mkStructuralMismatch opts cc sc cs actual setupval expectedTy + +matchArg opts sc cc cs _prepost md actual expectedTy expected = + failure (MS.conditionLoc md) =<< + mkStructuralMismatch opts cc sc cs actual expected expectedTy + +-- | For each points-to statement read the memory value through the +-- given pointer (lhs) and match the value against the given pattern +-- (rhs). Statements are processed in dependency order: a points-to +-- statement cannot be executed until bindings for any/all lhs +-- variables exist. +matchPointsTos :: + Options {- ^ saw script print out opts -} -> + SharedContext {- ^ term construction context -} -> + MIRCrucibleContext {- ^ simulator context -} -> + CrucibleMethodSpecIR -> + MS.PrePost -> + [MirPointsTo] {- ^ points-tos -} -> + OverrideMatcher MIR w () +matchPointsTos opts sc cc spec prepost = go False [] + where + go :: + Bool {- progress indicator -} -> + [MirPointsTo] {- delayed conditions -} -> + [MirPointsTo] {- queued conditions -} -> + OverrideMatcher MIR w () + + -- all conditions processed, success + go _ [] [] = return () + + -- not all conditions processed, no progress, failure + go False delayed [] = failure (spec ^. MS.csLoc) (AmbiguousPointsTos delayed) + + -- not all conditions processed, progress made, resume delayed conditions + go True delayed [] = go False [] delayed + + -- progress the next points-to in the work queue + go progress delayed (c:cs) = + do ready <- checkPointsTo c + if ready then + do learnPointsTo opts sc cc spec prepost c + go True delayed cs + else + do go progress (c:delayed) cs + + -- determine if a precondition is ready to be checked + checkPointsTo :: MirPointsTo -> OverrideMatcher MIR w Bool + checkPointsTo = panic "matchPointsTos" ["not yet implemented"] + +matchTerm :: + SharedContext {- ^ context for constructing SAW terms -} -> + MIRCrucibleContext {- ^ context for interacting with Crucible -} -> + MS.ConditionMetadata -> + MS.PrePost -> + Term {- ^ exported concrete term -} -> + Term {- ^ expected specification term -} -> + OverrideMatcher MIR md () + +matchTerm _ _ _ _ real expect | real == expect = return () +matchTerm sc cc md prepost real expect = + do let loc = MS.conditionLoc md + free <- OM (use osFree) + case unwrapTermF expect of + FTermF (ExtCns ec) + | Set.member (ecVarIndex ec) free -> + do assignTerm sc cc md prepost (ecVarIndex ec) real + + _ -> + do t <- liftIO $ scEq sc real expect + let msg = unlines $ + [ "Literal equality " ++ MS.stateCond prepost +-- , "Expected term: " ++ prettyTerm expect +-- , "Actual term: " ++ prettyTerm real + ] + addTermEq t md $ Crucible.SimError loc $ Crucible.AssertFailureSimError msg "" + +-- | Try to translate the spec\'s 'SetupValue' into a 'MIRVal', pretty-print +-- the 'MIRVal'. +mkStructuralMismatch :: + Options {- ^ output/verbosity options -} -> + MIRCrucibleContext -> + SharedContext {- ^ context for constructing SAW terms -} -> + CrucibleMethodSpecIR {- ^ for name and typing environments -} -> + MIRVal {- ^ the value from the simulator -} -> + SetupValue {- ^ the value from the spec -} -> + Mir.Ty {- ^ the expected type -} -> + OverrideMatcher MIR w (OverrideFailureReason MIR) +mkStructuralMismatch _opts cc _sc spec (MIRVal shp _) setupval mty = do + setupTy <- typeOfSetupValueMIR cc spec setupval + pure $ StructuralMismatch + (PP.pretty shp) -- TODO: Print the entire value, not just the type shape + (MS.ppSetupValue setupval) + (Just setupTy) + mty + +readMaybeType :: + Crucible.IsSymInterface sym + => sym + -> String + -> Crucible.TypeRepr tp + -> Crucible.RegValue sym (Crucible.MaybeType tp) + -> IO (Crucible.RegValue sym tp) +readMaybeType sym desc tpr rv = + case readPartExprMaybe sym rv of + Just x -> return x + Nothing -> error $ "readMaybeType: accessed possibly-uninitialized " ++ desc ++ + " of type " ++ show tpr + +readPartExprMaybe :: + Crucible.IsSymInterface sym + => sym + -> W4.PartExpr (W4.Pred sym) a + -> Maybe a +readPartExprMaybe _sym W4.Unassigned = Nothing +readPartExprMaybe _sym (W4.PE p v) + | Just True <- W4.asConstantPred p = Just v + | otherwise = Nothing + +resolveSetupValueMIR :: + Options -> + MIRCrucibleContext -> + SharedContext -> + CrucibleMethodSpecIR -> + SetupValue -> + OverrideMatcher MIR w MIRVal +resolveSetupValueMIR opts cc sc spec sval = + do m <- OM (use setupValueSub) + s <- OM (use termSub) + let tyenv = MS.csAllocations spec + nameEnv = MS.csTypeNames spec + sval' <- liftIO $ instantiateSetupValue sc s sval + liftIO $ resolveSetupVal cc m tyenv nameEnv sval' `X.catch` handleException opts + +typeOfSetupValueMIR :: + MIRCrucibleContext -> + CrucibleMethodSpecIR -> + SetupValue -> + OverrideMatcher MIR w Mir.Ty +typeOfSetupValueMIR cc spec sval = + do let tyenv = MS.csAllocations spec + nameEnv = MS.csTypeNames spec + liftIO $ typeOfSetupValue cc tyenv nameEnv sval + +valueToSC :: + Sym -> + MS.ConditionMetadata -> + OverrideFailureReason MIR -> + Cryptol.TValue -> + MIRVal -> + OverrideMatcher MIR w Term +valueToSC sym md failMsg tval (MIRVal shp val) = + case (tval, shp) of + (Cryptol.TVBit, PrimShape _ W4.BaseBoolRepr) -> + liftIO (toSC sym st val) + (Cryptol.TVSeq n Cryptol.TVBit, PrimShape _ (W4.BaseBVRepr w)) + | n == 8, Just _ <- W4.testEquality w (W4.knownNat @8) + -> liftIO (toSC sym st val) + | n == 16, Just _ <- W4.testEquality w (W4.knownNat @16) + -> liftIO (toSC sym st val) + | n == 32, Just _ <- W4.testEquality w (W4.knownNat @32) + -> liftIO (toSC sym st val) + | n == 64, Just _ <- W4.testEquality w (W4.knownNat @64) + -> liftIO (toSC sym st val) + | n == 128, Just _ <- W4.testEquality w (W4.knownNat @128) + -> liftIO (toSC sym st val) + (Cryptol.TVTuple [], UnitShape _) -> + liftIO (scUnitValue sc) + (Cryptol.TVTuple tys, TupleShape _ _ flds) + | length tys == Ctx.sizeInt (Ctx.size flds) + -> do terms <- + traverse + fieldToSC + (zip tys (FC.toListFC Some (Ctx.zipWith Functor.Pair flds val))) + liftIO (scTupleReduced sc terms) + (Cryptol.TVSeq n cryty, ArrayShape _ _ arrShp) + | Mir.MirVector_Vector vals <- val + , toInteger (V.length vals) == n + -> do terms <- V.toList <$> + traverse (\v -> valueToSC sym md failMsg cryty (MIRVal arrShp v)) vals + t <- shapeToTerm sc arrShp + liftIO (scVectorReduced sc t terms) + | Mir.MirVector_PartialVector vals <- val + , toInteger (V.length vals) == n + -> do vals' <- liftIO $ V.toList <$> + traverse (readMaybeType sym "vector element" (shapeType arrShp)) vals + terms <- + traverse (\v -> valueToSC sym md failMsg cryty (MIRVal arrShp v)) vals' + t <- shapeToTerm sc arrShp + liftIO (scVectorReduced sc t terms) + | Mir.MirVector_Array{} <- val + -> fail "valueToSC: Symbolic arrays not supported" + _ -> + failure (MS.conditionLoc md) failMsg + where + st = sym ^. W4.userState + sc = saw_ctx st + + fieldToSC :: + (Cryptol.TValue, Some (Functor.Product FieldShape (Crucible.RegValue' Sym))) + -> OverrideMatcher MIR w Term + fieldToSC (ty, Some (Functor.Pair fldShp (Crucible.RV tm))) = do + mirVal <- + case fldShp of + ReqField shp' -> + pure $ MIRVal shp' tm + OptField shp' -> do + tm' <- liftIO $ readMaybeType sym "field" (shapeType shp') tm + pure $ MIRVal shp' tm' + valueToSC sym md failMsg ty mirVal diff --git a/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs b/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs new file mode 100644 index 0000000000..4553295309 --- /dev/null +++ b/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs @@ -0,0 +1,397 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} +{-# LANGUAGE TypeOperators #-} + +-- | Turns 'SetupValue's back into 'MIRVal's. +module SAWScript.Crucible.MIR.ResolveSetupValue + ( MIRVal(..) + , resolveSetupVal + , typeOfSetupValue + , lookupAllocIndex + , toMIRType + , resolveTypedTerm + , resolveBoolTerm + , resolveSAWPred + , equalRefsPred + , equalValsPred + , MIRTypeOfError(..) + ) where + +import Control.Lens +import Control.Monad (zipWithM) +import qualified Control.Monad.Catch as X +import qualified Data.BitVector.Sized as BV +import qualified Data.Functor.Product as Functor +import Data.Map (Map) +import qualified Data.Map as Map +import qualified Data.Parameterized.Context as Ctx +import Data.Parameterized.Some (Some(..)) +import Data.Text (Text) +import qualified Data.Vector as V +import Data.Vector (Vector) +import Data.Void (absurd) + +import qualified Cryptol.Eval.Type as Cryptol (TValue(..), tValTy, evalValType) +import qualified Cryptol.TypeCheck.AST as Cryptol (Type, Schema(..)) +import qualified Cryptol.Utils.PP as Cryptol (pp) +import Lang.Crucible.Simulator (RegValue, RegValue'(..)) +import qualified Mir.Generator as Mir +import qualified Mir.Intrinsics as Mir +import Mir.Intrinsics (MIR) +import qualified Mir.Mir as Mir + +import qualified What4.BaseTypes as W4 +import qualified What4.Interface as W4 +import qualified What4.Partial as W4 + +import Verifier.SAW.Cryptol (importType, emptyEnv) +import Verifier.SAW.SharedTerm +import qualified Verifier.SAW.Prim as Prim +import qualified Verifier.SAW.Simulator.Concrete as Concrete +import Verifier.SAW.Simulator.What4.ReturnTrip +import Verifier.SAW.TypedTerm + +import SAWScript.Crucible.Common +import qualified SAWScript.Crucible.Common.MethodSpec as MS +import SAWScript.Crucible.Common.MethodSpec (AllocIndex(..)) +import SAWScript.Crucible.Common.ResolveSetupValue (resolveBoolTerm) +import SAWScript.Crucible.MIR.MethodSpecIR +import SAWScript.Crucible.MIR.TypeShape +import SAWScript.Panic + +-- | A pair of a simulation-time MIR value ('RegValue') and its corresponding +-- type ('TypeShape'), where the @tp@ type parameter is closed over +-- existentially. SAW's MIR backend passes around 'MIRVal's at simulation time. +data MIRVal where + MIRVal :: TypeShape tp -> RegValue Sym tp -> MIRVal + +type SetupValue = MS.SetupValue MIR + +data MIRTypeOfError + = MIRPolymorphicType Cryptol.Schema + | MIRNonRepresentableType Cryptol.Type ToMIRTypeErr + | MIRInvalidTypedTerm TypedTermType + +instance Show MIRTypeOfError where + show (MIRPolymorphicType s) = + unlines + [ "Expected monomorphic term" + , "instead got:" + , show (Cryptol.pp s) + ] + show (MIRNonRepresentableType ty err) = + unlines + [ "Type not representable in MIR:" + , show (Cryptol.pp ty) + , toMIRTypeErrToString err + ] + show (MIRInvalidTypedTerm tp) = + unlines + [ "Expected typed term with Cryptol-representable type, but got" + , show (MS.ppTypedTermType tp) + ] + +instance X.Exception MIRTypeOfError + +typeOfSetupValue :: + X.MonadThrow m => + MIRCrucibleContext -> + Map AllocIndex (Some MirAllocSpec) -> + Map AllocIndex Text -> + SetupValue -> + m Mir.Ty +typeOfSetupValue _mcc env _nameEnv val = + case val of + MS.SetupVar i -> + case Map.lookup i env of + Nothing -> panic "MIRSetup" ["typeOfSetupValue", "Unresolved prestate variable:" ++ show i] + Just (Some alloc) -> + return $ Mir.TyRef (alloc^.maMirType) (alloc^.maMutbl) + MS.SetupTerm tt -> + case ttType tt of + TypedTermSchema (Cryptol.Forall [] [] ty) -> + case toMIRType (Cryptol.evalValType mempty ty) of + Left err -> X.throwM (MIRNonRepresentableType ty err) + Right mirTy -> return mirTy + TypedTermSchema s -> X.throwM (MIRPolymorphicType s) + tp -> X.throwM (MIRInvalidTypedTerm tp) + + MS.SetupNull empty -> absurd empty + MS.SetupGlobal empty _ -> absurd empty + MS.SetupStruct _ _ _ -> panic "typeOfSetupValue" ["structs not yet implemented"] + MS.SetupArray _ _ -> panic "typeOfSetupValue" ["arrays not yet implemented"] + MS.SetupElem _ _ _ -> panic "typeOfSetupValue" ["elems not yet implemented"] + MS.SetupField _ _ _ -> panic "typeOfSetupValue" ["fields not yet implemented"] + MS.SetupCast empty _ _ -> absurd empty + MS.SetupUnion empty _ _ -> absurd empty + MS.SetupGlobalInitializer empty _ -> absurd empty + +lookupAllocIndex :: Map AllocIndex a -> AllocIndex -> a +lookupAllocIndex env i = + case Map.lookup i env of + Nothing -> panic "MIRSetup" ["Unresolved prestate variable:" ++ show i] + Just x -> x + +-- | Translate a SetupValue into a Crucible MIR value, resolving +-- references +resolveSetupVal :: + MIRCrucibleContext -> + Map AllocIndex (Some (MirPointer Sym)) -> + Map AllocIndex (Some MirAllocSpec) -> + Map AllocIndex Text -> + SetupValue -> + IO MIRVal +resolveSetupVal mcc env tyenv nameEnv val = + case val of + MS.SetupVar i -> do + Some ptr <- pure $ lookupAllocIndex env i + let pointeeType = ptr ^. mpMirType + pure $ MIRVal (RefShape + (Mir.TyRef pointeeType (ptr ^. mpMutbl)) + pointeeType + (ptr ^. mpMutbl) + (ptr ^. mpType)) + (ptr ^. mpRef) + MS.SetupTerm tm -> resolveTypedTerm mcc tm + MS.SetupNull empty -> absurd empty + MS.SetupGlobal empty _ -> absurd empty + MS.SetupStruct _ _ _ -> panic "resolveSetupValue" ["structs not yet implemented"] + MS.SetupArray () [] -> fail "resolveSetupVal: invalid empty array" + MS.SetupArray () vs -> do + vals <- V.mapM (resolveSetupVal mcc env tyenv nameEnv) (V.fromList vs) + + Some (shp :: TypeShape tp) <- + case V.head vals of + MIRVal shp _ -> pure (Some shp) + + let mirTy :: Mir.Ty + mirTy = shapeMirTy shp + + vals' :: Vector (RegValue Sym tp) + vals' = V.map (\(MIRVal shp' val') -> + case W4.testEquality shp shp' of + Just Refl -> val' + Nothing -> error $ unlines + [ "resolveSetupVal: internal error" + , show shp + , show shp' + ]) + vals + return $ MIRVal (ArrayShape (Mir.TyArray mirTy (V.length vals)) mirTy shp) + (Mir.MirVector_Vector vals') + MS.SetupElem _ _ _ -> panic "resolveSetupValue" ["elems not yet implemented"] + MS.SetupField _ _ _ -> panic "resolveSetupValue" ["fields not yet implemented"] + MS.SetupCast empty _ _ -> absurd empty + MS.SetupUnion empty _ _ -> absurd empty + MS.SetupGlobalInitializer empty _ -> absurd empty + +resolveTypedTerm :: + MIRCrucibleContext -> + TypedTerm -> + IO MIRVal +resolveTypedTerm mcc tm = + case ttType tm of + TypedTermSchema (Cryptol.Forall [] [] ty) -> + resolveSAWTerm mcc (Cryptol.evalValType mempty ty) (ttTerm tm) + tp -> fail $ unlines + [ "resolveTypedTerm: expected monomorphic term" + , "but got a term of type" + , show (MS.ppTypedTermType tp) + ] + +resolveSAWPred :: + MIRCrucibleContext -> + Term -> + IO (W4.Pred Sym) +resolveSAWPred cc tm = + do let sym = cc^.mccSym + st <- sawCoreState sym + bindSAWTerm sym st W4.BaseBoolRepr tm + +resolveSAWTerm :: + MIRCrucibleContext -> + Cryptol.TValue -> + Term -> + IO MIRVal +resolveSAWTerm mcc tp tm = + case tp of + Cryptol.TVBit -> + do b <- resolveBoolTerm sym tm + pure $ MIRVal (PrimShape Mir.TyBool W4.BaseBoolRepr) b + Cryptol.TVInteger -> + fail "resolveSAWTerm: unimplemented type Integer (FIXME)" + Cryptol.TVIntMod _ -> + fail "resolveSAWTerm: unimplemented type Z n (FIXME)" + Cryptol.TVFloat{} -> + fail "resolveSAWTerm: unimplemented type Float e p (FIXME)" + Cryptol.TVArray{} -> + fail "resolveSAWTerm: unimplemented type Array a b (FIXME)" + Cryptol.TVRational -> + fail "resolveSAWTerm: unimplemented type Rational (FIXME)" + Cryptol.TVSeq sz Cryptol.TVBit -> + case sz of + 8 -> bv_term Mir.B8 $ W4.knownNat @8 + 16 -> bv_term Mir.B16 $ W4.knownNat @16 + 32 -> bv_term Mir.B32 $ W4.knownNat @32 + 64 -> bv_term Mir.B64 $ W4.knownNat @64 + 128 -> bv_term Mir.B128 $ W4.knownNat @128 + _ -> fail ("Invalid bitvector width: " ++ show sz) + where + bv_term :: forall w. 1 W4.<= w + => Mir.BaseSize -> W4.NatRepr w -> IO MIRVal + bv_term b n = + MIRVal (PrimShape (Mir.TyUint b) (W4.BaseBVRepr n)) <$> + resolveBitvectorTerm sym n tm + Cryptol.TVSeq sz tp' -> do + st <- sawCoreState sym + let sc = saw_ctx st + sz_tm <- scNat sc (fromIntegral sz) + tp_tm <- importType sc emptyEnv (Cryptol.tValTy tp') + case toMIRType tp' of + Left e -> fail ("In resolveSAWTerm: " ++ toMIRTypeErrToString e) + Right mirTy -> do + Some (shp :: TypeShape tp) <- pure $ tyToShape col mirTy + + let sz' = fromInteger sz + + f :: Int -> IO (RegValue Sym tp) + f i = do + i_tm <- scNat sc (fromIntegral i) + tm' <- scAt sc sz_tm tp_tm tm i_tm + MIRVal shp' val <- resolveSAWTerm mcc tp' tm' + Refl <- case W4.testEquality shp shp' of + Just r -> pure r + Nothing -> fail $ unlines + [ "resolveSAWTerm: internal error" + , show shp + , show shp' + ] + pure val + + vals <- V.generateM sz' f + pure $ MIRVal (ArrayShape (Mir.TyArray mirTy sz') mirTy shp) + $ Mir.MirVector_Vector vals + Cryptol.TVStream _tp' -> + fail "resolveSAWTerm: unsupported infinite stream type" + Cryptol.TVTuple tps -> do + st <- sawCoreState sym + let sc = saw_ctx st + tms <- traverse (\i -> scTupleSelector sc tm i (length tps)) [1 .. length tps] + vals <- zipWithM (resolveSAWTerm mcc) tps tms + if null vals + then pure $ MIRVal (UnitShape (Mir.TyTuple [])) () + else do + let mirTys = map (\(MIRVal shp _) -> shapeMirTy shp) vals + let mirTupleTy = Mir.TyTuple mirTys + Some fldAssn <- + pure $ Ctx.fromList $ + map (\(MIRVal shp val) -> + Some $ Functor.Pair (OptField shp) (RV (W4.justPartExpr sym val))) + vals + let (fldShpAssn, valAssn) = Ctx.unzip fldAssn + pure $ MIRVal (TupleShape mirTupleTy mirTys fldShpAssn) valAssn + Cryptol.TVRec _flds -> + fail "resolveSAWTerm: unsupported record type" + Cryptol.TVFun _ _ -> + fail "resolveSAWTerm: unsupported function type" + Cryptol.TVAbstract _ _ -> + fail "resolveSAWTerm: unsupported abstract type" + Cryptol.TVNewtype{} -> + fail "resolveSAWTerm: unsupported newtype" + where + sym = mcc ^. mccSym + col = mcc ^. mccRustModule ^. Mir.rmCS ^. Mir.collection + +resolveBitvectorTerm :: + forall w. + (1 W4.<= w) => + Sym -> + W4.NatRepr w -> + Term -> + IO (W4.SymBV Sym w) +resolveBitvectorTerm sym w tm = + do st <- sawCoreState sym + let sc = saw_ctx st + mx <- case getAllExts tm of + -- concretely evaluate if it is a closed term + [] -> + do modmap <- scGetModuleMap sc + let v = Concrete.evalSharedTerm modmap mempty mempty tm + pure (Just (Prim.unsigned (Concrete.toWord v))) + _ -> return Nothing + case mx of + Just x -> W4.bvLit sym w (BV.mkBV w x) + Nothing -> bindSAWTerm sym st (W4.BaseBVRepr w) tm + +data ToMIRTypeErr = NotYetSupported String | Impossible String + +toMIRTypeErrToString :: ToMIRTypeErr -> String +toMIRTypeErrToString = + \case + NotYetSupported ty -> + unwords [ "SAW doesn't yet support translating Cryptol's" + , ty + , "type(s) into crucible-mir's type system." + ] + Impossible ty -> + unwords [ "User error: It's impossible to store Cryptol" + , ty + , "values in crucible-mir's memory model." + ] + +toMIRType :: + Cryptol.TValue -> + Either ToMIRTypeErr Mir.Ty +toMIRType tp = + case tp of + Cryptol.TVBit -> Right Mir.TyBool + Cryptol.TVInteger -> Left (NotYetSupported "integer") + Cryptol.TVIntMod _ -> Left (NotYetSupported "integer (mod n)") + Cryptol.TVFloat{} -> Left (NotYetSupported "float e p") + Cryptol.TVArray{} -> Left (NotYetSupported "array a b") + Cryptol.TVRational -> Left (NotYetSupported "rational") + Cryptol.TVSeq n Cryptol.TVBit -> + case n of + 8 -> Right $ Mir.TyUint Mir.B8 + 16 -> Right $ Mir.TyUint Mir.B16 + 32 -> Right $ Mir.TyUint Mir.B32 + 64 -> Right $ Mir.TyUint Mir.B64 + 128 -> Right $ Mir.TyUint Mir.B128 + _ -> Left (Impossible ("unsupported bitvector size: " ++ show n)) + Cryptol.TVSeq n t -> do + t' <- toMIRType t + let n' = fromIntegral n + Right $ Mir.TyArray t' n' + Cryptol.TVStream _tp' -> Left (Impossible "stream") + Cryptol.TVTuple tps -> do + tps' <- traverse toMIRType tps + Right $ Mir.TyTuple tps' + Cryptol.TVRec _flds -> Left (NotYetSupported "record") + Cryptol.TVFun _ _ -> Left (Impossible "function") + Cryptol.TVAbstract _ _ -> Left (Impossible "abstract") + Cryptol.TVNewtype{} -> Left (Impossible "newtype") + +-- | Check if two MIR references are equal. +equalRefsPred :: + MIRCrucibleContext -> + MirPointer Sym tp1 -> + MirPointer Sym tp2 -> + IO (W4.Pred Sym) +equalRefsPred cc mp1 mp2 = + mccWithBackend cc $ \bak -> + let sym = backendGetSym bak in + case W4.testEquality (mp1^.mpType) (mp2^.mpType) of + Nothing -> pure $ W4.falsePred sym + Just Refl -> Mir.mirRef_eqIO bak (mp1^.mpRef) (mp2^.mpRef) + +equalValsPred :: + MIRCrucibleContext -> + MIRVal -> + MIRVal -> + IO (W4.Pred Sym) +equalValsPred = panic "equalValsPred" ["not yet implemented"] diff --git a/src/SAWScript/Crucible/MIR/TypeShape.hs b/src/SAWScript/Crucible/MIR/TypeShape.hs new file mode 100644 index 0000000000..e2d389b347 --- /dev/null +++ b/src/SAWScript/Crucible/MIR/TypeShape.hs @@ -0,0 +1,274 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE TypeApplications #-} + +-- | The 'TypeShape' data type and related utilities. +module SAWScript.Crucible.MIR.TypeShape + ( TypeShape(..) + , FieldShape(..) + , tyToShape + , tyToShapeEq + , shapeType + , fieldShapeType + , shapeMirTy + , fieldShapeMirTy + , shapeToTerm + ) where + +import Control.Lens ((^.), (^..), each) +import Control.Monad.IO.Class (MonadIO(..)) +import Data.Functor.Const (Const(..)) +import qualified Data.Map as Map +import Data.Parameterized.Classes (ShowF) +import Data.Parameterized.Context (pattern Empty, pattern (:>), Assignment) +import Data.Parameterized.Some +import Data.Parameterized.TH.GADT +import Data.Parameterized.TraversableFC +import GHC.Stack (HasCallStack) +import qualified Prettyprinter as PP + +import Lang.Crucible.Types + +import Mir.Intrinsics +import qualified Mir.Mir as M +import Mir.TransTy ( tyListToCtx, tyToRepr, tyToReprCont, canInitialize + , isUnsized, reprTransparentFieldTy ) + +import qualified Verifier.SAW.SharedTerm as SAW + +-- | TypeShape is used to classify MIR `Ty`s and their corresponding +-- CrucibleTypes into a few common cases. We don't use `Ty` directly because +-- there are some `Ty`s that have identical structure (such as TyRef vs. +-- TyRawPtr) or similar enough structure that we'd rather write only one case +-- (such as `u8` vs `i8` vs `i32`, all primitives/BaseTypes). And we don't use +-- TypeRepr directly because it's lacking information in some cases (notably +-- `TyAdt`, which is always AnyRepr, concealing the actual field types of the +-- struct). +-- +-- In each constructor, the first `M.Ty` is the overall MIR type (e.g., for +-- ArrayShape, this is the TyArray type). The overall `TypeRepr tp` isn't +-- stored directly, but can be computed with `shapeType`. +data TypeShape (tp :: CrucibleType) where + UnitShape :: M.Ty -> TypeShape UnitType + PrimShape :: M.Ty -> BaseTypeRepr btp -> TypeShape (BaseToType btp) + TupleShape :: M.Ty -> [M.Ty] -> Assignment FieldShape ctx -> TypeShape (StructType ctx) + ArrayShape :: M.Ty -> M.Ty -> TypeShape tp -> TypeShape (MirVectorType tp) + StructShape :: M.Ty -> [M.Ty] -> Assignment FieldShape ctx -> TypeShape AnyType + TransparentShape :: M.Ty -> TypeShape tp -> TypeShape tp + -- | Note that RefShape contains only a TypeRepr for the pointee type, not + -- a TypeShape. None of our operations need to recurse inside pointers, + -- and also this saves us from some infinite recursion. + RefShape :: M.Ty + -- ^ The reference type + -> M.Ty + -- ^ The pointee type + -> M.Mutability + -- ^ Is the reference mutable or immutable? + -> TypeRepr tp + -- ^ The Crucible representation of the pointee type + -> TypeShape (MirReferenceType tp) + -- | Note that 'FnPtrShape' contains only 'TypeRepr's for the argument and + -- result types, not 'TypeShape's, as none of our operations need to recurse + -- inside them. + FnPtrShape :: M.Ty -> CtxRepr args -> TypeRepr ret + -> TypeShape (FunctionHandleType args ret) + +-- TODO: Improve? +instance PP.Pretty (TypeShape tp) where + pretty = PP.viaShow + +deriving instance Show (TypeShape tp) +instance ShowF TypeShape + +-- | The TypeShape of a struct field, which might have a MaybeType wrapper to +-- allow for partial initialization. +data FieldShape (tp :: CrucibleType) where + OptField :: TypeShape tp -> FieldShape (MaybeType tp) + ReqField :: TypeShape tp -> FieldShape tp + +-- TODO: Improve? +instance PP.Pretty (FieldShape tp) where + pretty = PP.viaShow + +deriving instance Show (FieldShape tp) +instance ShowF FieldShape + +-- | Return the `TypeShape` of `ty`. +-- +-- It is guaranteed that the `tp :: CrucibleType` index of the resulting +-- `TypeShape` matches that returned by `tyToRepr`. +tyToShape :: M.Collection -> M.Ty -> Some TypeShape +tyToShape col = go + where + go :: M.Ty -> Some TypeShape + go ty = case ty of + M.TyBool -> goPrim ty + M.TyChar -> goPrim ty + M.TyInt _ -> goPrim ty + M.TyUint _ -> goPrim ty + M.TyTuple [] -> goUnit ty + M.TyTuple tys -> goTuple ty tys + M.TyClosure tys -> goTuple ty tys + M.TyFnDef _ -> goUnit ty + M.TyArray ty' _ | Some shp <- go ty' -> Some $ ArrayShape ty ty' shp + M.TyAdt nm _ _ -> case Map.lookup nm (col ^. M.adts) of + Just adt | Just ty' <- reprTransparentFieldTy col adt -> + mapSome (TransparentShape ty) $ go ty' + Just (M.Adt _ M.Struct [v] _ _ _ _) -> goStruct ty (v ^.. M.vfields . each . M.fty) + Just (M.Adt _ ak _ _ _ _ _) -> error $ "tyToShape: AdtKind " ++ show ak ++ " NYI" + Nothing -> error $ "tyToShape: bad adt: " ++ show ty + M.TyRef ty' mutbl -> goRef ty ty' mutbl + M.TyRawPtr ty' mutbl -> goRef ty ty' mutbl + M.TyFnPtr sig -> goFnPtr ty sig + _ -> error $ "tyToShape: " ++ show ty ++ " NYI" + + goPrim :: M.Ty -> Some TypeShape + goPrim ty | Some tpr <- tyToRepr col ty, AsBaseType btpr <- asBaseType tpr = + Some $ PrimShape ty btpr + goPrim ty | Some tpr <- tyToRepr col ty = + error $ "tyToShape: type " ++ show ty ++ " produced non-primitive type " ++ show tpr + + goUnit :: M.Ty -> Some TypeShape + goUnit ty = Some $ UnitShape ty + + goTuple :: M.Ty -> [M.Ty] -> Some TypeShape + goTuple ty tys | Some flds <- loop tys Empty = Some $ TupleShape ty tys flds + where + loop :: forall ctx. [M.Ty] -> Assignment FieldShape ctx -> Some (Assignment FieldShape) + loop [] flds = Some flds + loop (ty':tys') flds | Some fld <- go ty' = loop tys' (flds :> OptField fld) + + goStruct :: M.Ty -> [M.Ty] -> Some TypeShape + goStruct ty tys | Some flds <- loop tys Empty = Some $ StructShape ty tys flds + where + loop :: forall ctx. [M.Ty] -> Assignment FieldShape ctx -> Some (Assignment FieldShape) + loop [] flds = Some flds + loop (ty':tys') flds | Some fld <- goField ty' = loop tys' (flds :> fld) + + goField :: M.Ty -> Some FieldShape + goField ty | Some shp <- go ty = case canInitialize col ty of + True -> Some $ ReqField shp + False -> Some $ OptField shp + + goRef :: M.Ty -> M.Ty -> M.Mutability -> Some TypeShape + goRef ty ty' mutbl + | M.TySlice slicedTy <- ty' + , Some tpr <- tyToRepr col slicedTy + = Some $ + TupleShape ty [refTy, usizeTy] + (Empty + :> ReqField (RefShape refTy slicedTy mutbl tpr) + :> ReqField (PrimShape usizeTy BaseUsizeRepr)) + | M.TyStr <- ty' + = Some $ + TupleShape ty [refTy, usizeTy] + (Empty + :> ReqField (RefShape refTy (M.TyUint M.B8) mutbl (BVRepr (knownNat @8))) + :> ReqField (PrimShape usizeTy BaseUsizeRepr)) + where + -- We use a ref (of the same mutability as `ty`) when possible, to + -- avoid unnecessary clobbering. + refTy = case ty of + M.TyRef _ _ -> M.TyRef ty' mutbl + _ -> M.TyRef ty' mutbl + usizeTy = M.TyUint M.USize + goRef ty ty' _ | isUnsized ty' = error $ + "tyToShape: fat pointer " ++ show ty ++ " NYI" + goRef ty ty' mutbl | Some tpr <- tyToRepr col ty' = Some $ RefShape ty ty' mutbl tpr + + goFnPtr :: M.Ty -> M.FnSig -> Some TypeShape + goFnPtr ty (M.FnSig args ret _abi _spread) = + tyListToCtx col args $ \argsr -> + tyToReprCont col ret $ \retr -> + Some (FnPtrShape ty argsr retr) + +-- | Given a `Ty` and the result of `tyToRepr ty`, produce a `TypeShape` with +-- the same index `tp`. Raises an `error` if the `TypeRepr` doesn't match +-- `tyToRepr ty`. +tyToShapeEq :: HasCallStack => M.Collection -> M.Ty -> TypeRepr tp -> TypeShape tp +tyToShapeEq col ty tpr | Some shp <- tyToShape col ty = + case testEquality (shapeType shp) tpr of + Just Refl -> shp + Nothing -> error $ "tyToShapeEq: type " ++ show ty ++ + " does not have representation " ++ show tpr ++ + " (got " ++ show (shapeType shp) ++ " instead)" + +shapeType :: TypeShape tp -> TypeRepr tp +shapeType = go + where + go :: forall tp. TypeShape tp -> TypeRepr tp + go (UnitShape _) = UnitRepr + go (PrimShape _ btpr) = baseToType btpr + go (TupleShape _ _ flds) = StructRepr $ fmapFC fieldShapeType flds + go (ArrayShape _ _ shp) = MirVectorRepr $ shapeType shp + go (StructShape _ _ _flds) = AnyRepr + go (TransparentShape _ shp) = go shp + go (RefShape _ _ _ tpr) = MirReferenceRepr tpr + go (FnPtrShape _ args ret) = FunctionHandleRepr args ret + +fieldShapeType :: FieldShape tp -> TypeRepr tp +fieldShapeType (ReqField shp) = shapeType shp +fieldShapeType (OptField shp) = MaybeRepr $ shapeType shp + +shapeMirTy :: TypeShape tp -> M.Ty +shapeMirTy (UnitShape ty) = ty +shapeMirTy (PrimShape ty _) = ty +shapeMirTy (TupleShape ty _ _) = ty +shapeMirTy (ArrayShape ty _ _) = ty +shapeMirTy (StructShape ty _ _) = ty +shapeMirTy (TransparentShape ty _) = ty +shapeMirTy (RefShape ty _ _ _) = ty +shapeMirTy (FnPtrShape ty _ _) = ty + +fieldShapeMirTy :: FieldShape tp -> M.Ty +fieldShapeMirTy (ReqField shp) = shapeMirTy shp +fieldShapeMirTy (OptField shp) = shapeMirTy shp + +shapeToTerm :: forall tp m. + (MonadIO m, MonadFail m) => + SAW.SharedContext -> + TypeShape tp -> + m SAW.Term +shapeToTerm sc = go + where + go :: forall tp'. TypeShape tp' -> m SAW.Term + go (UnitShape _) = liftIO $ SAW.scUnitType sc + go (PrimShape _ BaseBoolRepr) = liftIO $ SAW.scBoolType sc + go (PrimShape _ (BaseBVRepr w)) = liftIO $ SAW.scBitvector sc (natValue w) + go (TupleShape _ _ flds) = do + tys <- toListFC getConst <$> traverseFC (\x -> Const <$> goField x) flds + liftIO $ SAW.scTupleType sc tys + go (ArrayShape (M.TyArray _ n) _ shp) = do + ty <- go shp + n' <- liftIO $ SAW.scNat sc (fromIntegral n) + liftIO $ SAW.scVecType sc n' ty + go shp = fail $ "shapeToTerm: unsupported type " ++ show (shapeType shp) + + goField :: forall tp'. FieldShape tp' -> m SAW.Term + goField (OptField shp) = go shp + goField (ReqField shp) = go shp + +$(pure []) + +instance TestEquality TypeShape where + testEquality = + $(structuralTypeEquality + [t|TypeShape|] + [ (TypeApp (ConType [t|TypeShape|]) AnyType, [|testEquality|]) + , (TypeApp (ConType [t|BaseTypeRepr|]) AnyType, [|testEquality|]) + , (TypeApp (TypeApp (ConType [t|Assignment|]) AnyType) AnyType, [|testEquality|]) + , (TypeApp (ConType [t|TypeRepr|]) AnyType, [|testEquality|]) + , (TypeApp (ConType [t|CtxRepr|]) AnyType, [|testEquality|]) + ]) + +instance TestEquality FieldShape where + testEquality = + $(structuralTypeEquality + [t|FieldShape|] + [ (TypeApp (ConType [t|TypeShape|]) AnyType, [|testEquality|]) + ]) diff --git a/src/SAWScript/Interpreter.hs b/src/SAWScript/Interpreter.hs index b96ddf79b6..fb44fab5d6 100644 --- a/src/SAWScript/Interpreter.hs +++ b/src/SAWScript/Interpreter.hs @@ -92,6 +92,7 @@ import qualified Verifier.SAW.Cryptol.Prelude as CryptolSAW -- Crucible import qualified Lang.Crucible.JVM as CJ +import Mir.Intrinsics (MIR) import qualified SAWScript.Crucible.Common as CC import qualified SAWScript.Crucible.Common.MethodSpec as CMS import qualified SAWScript.Crucible.JVM.BuiltinsJVM as CJ @@ -3836,11 +3837,212 @@ primitives = Map.fromList --------------------------------------------------------------------- -- Crucible/MIR commands + , prim "mir_alloc" "MIRType -> MIRSetup SetupValue" + (pureVal mir_alloc) + Experimental + [ "Declare that an immutable reference to the given type should be allocated" + , "in a MIR specification. Before `mir_execute_func`, this states that" + , "the function expects the object to be allocated before it runs." + , "After `mir_execute_func`, it states that the function being" + , "verified is expected to perform the allocation." + ] + + , prim "mir_alloc_mut" "MIRType -> MIRSetup SetupValue" + (pureVal mir_alloc_mut) + Experimental + [ "Declare that a mutable reference to the given type should be allocated" + , "in a MIR specification. Before `mir_execute_func`, this states that" + , "the function expects the object to be allocated before it runs." + , "After `mir_execute_func`, it states that the function being" + , "verified is expected to perform the allocation." + ] + + , prim "mir_assert" "Term -> MIRSetup ()" + (pureVal mir_assert) + Experimental + [ "State that the given predicate must hold. Acts as `mir_precond`" + , "or `mir_postcond` depending on the phase of specification in which" + , "it appears (i.e., before or after `mir_execute_func`." + ] + + , prim "mir_execute_func" "[MIRValue] -> MIRSetup ()" + (pureVal mir_execute_func) + Experimental + [ "Specify the given list of values as the arguments of the method." + , "" + , "The mir_execute_func statement also serves to separate the pre-state" + , "section of the spec (before mir_execute_func) from the post-state" + , "section (after mir_execute_func). The effects of some MIRSetup" + , "statements depend on whether they occur in the pre-state or post-state" + , "section." + ] + + , prim "mir_fresh_var" "String -> MIRType -> MIRSetup Term" + (pureVal mir_fresh_var) + Experimental + [ "Create a fresh symbolic variable for use within a MIR" + , "specification. The name is used only for pretty-printing." + ] + , prim "mir_load_module" "String -> TopLevel MIRModule" (pureVal mir_load_module) Experimental [ "Load a MIR JSON file and return a handle to it." ] + , prim "mir_postcond" "Term -> MIRSetup ()" + (pureVal mir_postcond) + Experimental + [ "State that the given predicate is a post-condition of execution of the" + , "method being verified." + ] + + , prim "mir_precond" "Term -> MIRSetup ()" + (pureVal mir_precond) + Experimental + [ "State that the given predicate is a pre-condition on execution of the" + , "method being verified." + ] + + , prim "mir_return" "MIRValue -> MIRSetup ()" + (pureVal mir_return) + Experimental + [ "Specify the given value as the return value of the method. A" + , "mir_return statement is required if and only if the method" + , "has a non-() return type." ] + + , prim "mir_term" + "Term -> MIRValue" + (pureVal (CMS.SetupTerm :: TypedTerm -> CMS.SetupValue MIR)) + Experimental + [ "Construct a `MIRValue` from a `Term`." ] + + , prim "mir_verify" + "MIRModule -> String -> [MIRSpec] -> Bool -> MIRSetup () -> ProofScript () -> TopLevel MIRSpec" + (pureVal mir_verify) + Experimental + [ "Verify the MIR function named by the second parameter in the module" + , "specified by the first. The third parameter lists the MIRSpec" + , "values returned by previous calls to use as overrides. The fourth (Bool)" + , "parameter enables or disables path satisfiability checking. The fifth" + , "describes how to set up the symbolic execution engine before verification." + , "And the last gives the script to use to prove the validity of the resulting" + , "verification conditions." + ] + + , prim "mir_array" "Int -> MIRType -> MIRType" + (pureVal mir_array) + Experimental + [ "The type of MIR arrays with the given number of elements of the" + , "given type." ] + + , prim "mir_bool" "MIRType" + (pureVal mir_bool) + Experimental + [ "The type of MIR booleans." ] + + , prim "mir_char" "MIRType" + (pureVal mir_char) + Experimental + [ "The type of MIR characters." ] + + , prim "mir_i8" "MIRType" + (pureVal mir_i8) + Experimental + [ "The type of MIR 8-bit signed integers." ] + + , prim "mir_i16" "MIRType" + (pureVal mir_i16) + Experimental + [ "The type of MIR 16-bit signed integers." ] + + , prim "mir_i32" "MIRType" + (pureVal mir_i32) + Experimental + [ "The type of MIR 32-bit signed integers." ] + + , prim "mir_i64" "MIRType" + (pureVal mir_i64) + Experimental + [ "The type of MIR 64-bit signed integers." ] + + , prim "mir_i128" "MIRType" + (pureVal mir_i128) + Experimental + [ "The type of MIR 128-bit signed integers." ] + + , prim "mir_isize" "MIRType" + (pureVal mir_isize) + Experimental + [ "The type of MIR pointer-sized signed integers." ] + + , prim "mir_f32" "MIRType" + (pureVal mir_f32) + Experimental + [ "The type of MIR single-precision floating-point values." ] + + , prim "mir_f64" "MIRType" + (pureVal mir_f64) + Experimental + [ "The type of MIR double-precision floating-point values." ] + + , prim "mir_ref" "MIRType -> MIRType" + (pureVal mir_ref) + Experimental + [ "The type of MIR immutable references." ] + + , prim "mir_ref_mut" "MIRType -> MIRType" + (pureVal mir_ref_mut) + Experimental + [ "The type of MIR mutable references." ] + + , prim "mir_slice" "MIRType -> MIRType" + (pureVal mir_slice) + Experimental + [ "The type of MIR slices, i.e., dynamically sized views into a" + , "contiguous sequence of the given type. Currently, SAW can only" + , "handle references to slices (&[T])." ] + + , prim "mir_str" "MIRType" + (pureVal mir_str) + Experimental + [ "The type of MIR strings, which are a particular kind of slice." + , "Currently, SAW can only handle references to strings (&str)." ] + + , prim "mir_tuple" "[MIRType] -> MIRType" + (pureVal mir_tuple) + Experimental + [ "The type of MIR tuples of the given types." ] + + , prim "mir_u8" "MIRType" + (pureVal mir_u8) + Experimental + [ "The type of MIR 8-bit unsigned integers." ] + + , prim "mir_u16" "MIRType" + (pureVal mir_u16) + Experimental + [ "The type of MIR 16-bit unsigned integers." ] + + , prim "mir_u32" "MIRType" + (pureVal mir_u32) + Experimental + [ "The type of MIR 32-bit unsigned integers." ] + + , prim "mir_u64" "MIRType" + (pureVal mir_u64) + Experimental + [ "The type of MIR 64-bit unsigned integers." ] + + , prim "mir_u128" "MIRType" + (pureVal mir_u128) + Experimental + [ "The type of MIR 128-bit unsigned integers." ] + + , prim "mir_usize" "MIRType" + (pureVal mir_usize) + Experimental + [ "The type of MIR pointer-sized unsigned integers." ] + --------------------------------------------------------------------- , prim "yosys_import" "String -> TopLevel Term" diff --git a/src/SAWScript/Lexer.x b/src/SAWScript/Lexer.x index 23a02cc3f4..11b42f4386 100644 --- a/src/SAWScript/Lexer.x +++ b/src/SAWScript/Lexer.x @@ -41,9 +41,9 @@ $idchar = [$alpha $digit \' \_] $codechar = [$graphic $whitechar] @reservedid = import|and|let|rec|in|do|if|then|else|as|hiding|typedef - |CryptolSetup|JavaSetup|LLVMSetup|ProofScript|TopLevel|CrucibleSetup + |CryptolSetup|JavaSetup|LLVMSetup|MIRSetup|ProofScript|TopLevel|CrucibleSetup |Int|String|Term|Type|Bool|AIG|CFG - |CrucibleMethodSpec|LLVMSpec|JVMMethodSpec|JVMSpec + |CrucibleMethodSpec|LLVMSpec|JVMMethodSpec|JVMSpec|MIRSpec @punct = "," | ";" | "(" | ")" | ":" | "::" | "[" | "]" | "<-" | "->" | "=" | "{" | "}" | "." | "\" diff --git a/src/SAWScript/Parser.y b/src/SAWScript/Parser.y index 6a28a05cee..9494deb1fd 100644 --- a/src/SAWScript/Parser.y +++ b/src/SAWScript/Parser.y @@ -59,6 +59,7 @@ import Control.Exception 'CryptolSetup' { TReserved _ "CryptolSetup" } 'JavaSetup' { TReserved _ "JavaSetup" } 'LLVMSetup' { TReserved _ "LLVMSetup" } + 'MIRSetup' { TReserved _ "MIRSetup" } 'ProofScript' { TReserved _ "ProofScript" } 'TopLevel' { TReserved _ "TopLevel" } 'CrucibleSetup'{ TReserved _ "CrucibleSetup" } @@ -66,6 +67,7 @@ import Control.Exception 'LLVMSpec' { TReserved _ "LLVMSpec" } 'JVMMethodSpec'{ TReserved _ "JVMMethodSpec" } 'JVMSpec' { TReserved _ "JVMSpec" } + 'MIRSpec' { TReserved _ "MIRSpec" } 'Bool' { TReserved _ "Bool" } 'Int' { TReserved _ "Int" } 'String' { TReserved _ "String" } @@ -229,6 +231,7 @@ BaseType :: { Type } | 'LLVMSpec' { LType (getPos $1) tLLVMSpec } | 'JVMMethodSpec' { LType (getPos $1) tJVMSpec } | 'JVMSpec' { LType (getPos $1) tJVMSpec } + | 'MIRSpec' { LType (getPos $1) tMIRSpec } | '(' Type ')' { LType (maxSpan [$1, $3]) $2 } | '(' commas2(Type) ')' { LType (maxSpan [$1, $3]) (tTuple $2) } | '[' Type ']' { LType (maxSpan [$1, $3]) (tArray $2) } @@ -238,6 +241,7 @@ Context :: { Type } : 'CryptolSetup' { tContext CryptolSetup } | 'JavaSetup' { tContext JavaSetup } | 'LLVMSetup' { tContext LLVMSetup } + | 'MIRSetup' { tContext MIRSetup } | 'ProofScript' { tContext ProofScript } | 'TopLevel' { tContext TopLevel } | 'CrucibleSetup' { tContext LLVMSetup } diff --git a/src/SAWScript/Value.hs b/src/SAWScript/Value.hs index c5b597c687..e890402aac 100644 --- a/src/SAWScript/Value.hs +++ b/src/SAWScript/Value.hs @@ -70,6 +70,7 @@ import qualified SAWScript.Crucible.Common.MethodSpec as CMS import qualified SAWScript.Crucible.LLVM.MethodSpecIR as CMSLLVM import qualified SAWScript.Crucible.LLVM.CrucibleLLVM as Crucible import qualified SAWScript.Crucible.JVM.MethodSpecIR () +import qualified SAWScript.Crucible.MIR.MethodSpecIR () import qualified Lang.JVM.Codebase as JSS import qualified Text.LLVM.AST as LLVM (Type) import qualified Text.LLVM.PP as LLVM (ppType) @@ -116,6 +117,8 @@ import Lang.Crucible.Utils.StateContT import Lang.Crucible.LLVM.ArraySizeProfile import Mir.Generator +import Mir.Intrinsics (MIR) +import qualified Mir.Mir as MIR import What4.ProgramLoc (ProgramLoc(..)) @@ -152,6 +155,10 @@ data Value | VJVMMethodSpec !(CMS.ProvedSpec CJ.JVM) | VJVMSetupValue !(CMS.SetupValue CJ.JVM) ----- + | VMIRSetup !(MIRSetupM Value) + | VMIRMethodSpec !(CMS.ProvedSpec MIR) + | VMIRSetupValue !(CMS.SetupValue MIR) + ----- | VLLVMModuleSkeleton ModuleSkeleton | VLLVMFunctionSkeleton FunctionSkeleton | VLLVMSkeletonState SkeletonState @@ -159,6 +166,7 @@ data Value ----- | VJavaType JavaType | VLLVMType LLVM.Type + | VMIRType MIR.Ty | VCryptolModule CryptolModule | VJavaClass JSS.Class | VLLVMModule (Some CMSLLVM.LLVMModule) @@ -340,6 +348,7 @@ showsPrecValue opts nenv p v = VLLVMFunctionProfile _ -> showString "<>" VJavaType {} -> showString "<>" VLLVMType t -> showString (show (LLVM.ppType t)) + VMIRType t -> showString (show (PP.pretty t)) VCryptolModule m -> showString (showCryptolModule m) VLLVMModule (Some m) -> showString (CMSLLVM.showLLVMModule m) VMIRModule m -> shows (PP.pretty (m^.rmCS^.collection)) @@ -360,6 +369,9 @@ showsPrecValue opts nenv p v = VJVMSetup _ -> showString "<>" VJVMMethodSpec _ -> showString "<>" VJVMSetupValue x -> shows x + VMIRSetup{} -> showString "<>" + VMIRMethodSpec{} -> showString "<>" + VMIRSetupValue x -> shows x where opts' = sawPPOpts opts @@ -876,6 +888,13 @@ type JVMSetup = CrucibleSetup CJ.JVM newtype JVMSetupM a = JVMSetupM { runJVMSetupM :: JVMSetup a } deriving (Applicative, Functor, Monad) +-- + +type MIRSetup = CrucibleSetup MIR + +newtype MIRSetupM a = MIRSetupM { runMIRSetupM :: MIRSetup a } + deriving (Applicative, Functor, Monad) + -- newtype ProofScript a = ProofScript { unProofScript :: ExceptT (SolverStats, CEX) (StateT ProofState TopLevel) a } deriving (Functor, Applicative, Monad) @@ -1040,6 +1059,19 @@ instance FromValue a => FromValue (JVMSetupM a) where runJVMSetupM (fromValue m2) fromValue _ = error "fromValue JVMSetup" +instance IsValue a => IsValue (MIRSetupM a) where + toValue m = VMIRSetup (fmap toValue m) + +instance FromValue a => FromValue (MIRSetupM a) where + fromValue (VMIRSetup m) = fmap fromValue m + fromValue (VReturn v) = return (fromValue v) + fromValue (VBind pos m1 v2) = MIRSetupM $ do + v1 <- underReaderT (underStateT (withPosition pos)) + (runMIRSetupM (fromValue m1)) + m2 <- lift $ lift $ applyValue v2 v1 + runMIRSetupM (fromValue m2) + fromValue _ = error "fromValue MIRSetup" + instance IsValue (CMSLLVM.AllLLVM CMS.SetupValue) where toValue = VLLVMCrucibleSetupValue @@ -1054,6 +1086,13 @@ instance FromValue (CMS.SetupValue CJ.JVM) where fromValue (VJVMSetupValue v) = v fromValue _ = error "fromValue Crucible.SetupValue" +instance IsValue (CMS.SetupValue MIR) where + toValue v = VMIRSetupValue v + +instance FromValue (CMS.SetupValue MIR) where + fromValue (VMIRSetupValue v) = v + fromValue _ = error "fromValue Crucible.SetupValue" + instance IsValue SAW_CFG where toValue t = VCFG t @@ -1075,6 +1114,13 @@ instance FromValue (CMS.ProvedSpec CJ.JVM) where fromValue (VJVMMethodSpec t) = t fromValue _ = error "fromValue ProvedSpec JVM" +instance IsValue (CMS.ProvedSpec MIR) where + toValue t = VMIRMethodSpec t + +instance FromValue (CMS.ProvedSpec MIR) where + fromValue (VMIRMethodSpec t) = t + fromValue _ = error "fromValue ProvedSpec MIR" + instance IsValue ModuleSkeleton where toValue s = VLLVMModuleSkeleton s @@ -1196,6 +1242,13 @@ instance FromValue LLVM.Type where fromValue (VLLVMType t) = t fromValue _ = error "fromValue LLVMType" +instance IsValue MIR.Ty where + toValue t = VMIRType t + +instance FromValue MIR.Ty where + fromValue (VMIRType t) = t + fromValue _ = error "fromValue MIRType" + instance IsValue Uninterp where toValue me = VUninterp me