Skip to content

Commit

Permalink
Update Heapster, Monadification, and MRSolver to handle high-order Sp…
Browse files Browse the repository at this point in the history
…ecM functions (#2017)

* wrote translateCompletePureFun

* re-added translateCompleteFunPerm, with documentation reflecting the fact that it now generates a SpecDef type

* added helper functions to SAWTranslation.hs to support IRTTranslation.hs

* added the notion of pure vs impure type translations, to support IRTTranslation

* added psubstOfSubst

* added an OpenTermLike instance for OpenTerm itself

* Finished rewriting IRTTranslation.hs

* added one more import to HeapsterBuiltins.hs to get it to compile

* fixed some variable-binding issues in the definition of defineSpecOpenTerm

* added applyCallClos to the prelude

* fixed translation code that was only applying closures to apply and call them

* added the LRT_SpecM constructor to LRT output types

* fixed the translation of the folding and unfolding functions for recursive shapes and permissions to use exprCtxPureTypeTerms for the arguments, to match their definitions

* fixed importDefSpecTerm to turn the import into a SpecImp

* changed all uses of the LetRecType eliminator to use the explicit eliminator

* fixed permEnvAddGlobalSymFun to use a spec definition translation instead of a translation term

* fixed up call to importDefSpecTerm to use its new def

* removed old CompM Coq files from _CoqProject

* Got all the Coq export stuff for the prelude working

* changed Void to translate to the Empty_set type in the Coq standard library

* removed SpecMExtra from the defaul list of imports in Coq files generated by Heapster

* Changed the type-checker to *not* normalize argument types in lambdas and pis when they are type-checked, in order to make the Coq translation work in cases where these argument types have identifiers that translate to alternate Coq definitions

* added the termIsClosed function to test if a SAW core term is closed

* refactored the saw-core-coq translator so that all the local variable information is in a reader effect and not a state effect, making it clearer where in the translator code variables are bound; also fixed #1927

* moved linked_list.sawcore to use the new SpecDef framework

* replaced llvmZeroInitValue with a new function translateZeroInit that directly translates an LLVM zero initializer to a Heapster permission + SAW core term, so that we use repeatBVVec in the SAW term rather than a giant vector literal

* updated mbox_proofs.v after changes to the Coq translator

* renamed askTrr and localTrr to askTR and localTR

* replaced a number of equality tests on the free variables of terms against emptyBitSet with the new termIsClosed function

* replaced checkGroundTerm with the now standard termIsClosed function

* whoops, fixed a few lingering bugs related to using termIsClosed

* made a few fixes to make the code more readable

* a few more tweaks to make the code look nicer

* finished writing a comment on withSAWVar

* indentation change requested by review

* started defining type descriptions; removed the old IRT stuff

* Defined tpElem and indElem

* Updated the SAW core prelude with the new definition of SpecM based on TpDescs

* renamed arithmetic kinds to expression kinds

* fixed a comment; added Tp_BVVec

* whoops, fixed the type of FixS

* fix defaultMonTable entry for PZeroMSeq, add PZeroMSeqBool

* add missing takeCryM and dropCryM defns, VWord cases in MRSolver/SMT.hs

* allow Integer in monadifyType (for Cryptol prelude fns like abs, sext)

* include info about the errorS in ReturnNotError

* check whether assumptions and assertions are provable or not in mrRefines

* fixed indentation

* added the Sigmas type

* Working on rewriting SAWTranslation.hs to work with the new definition of SpecM

* Got the first portion of SAWTranslation.hs to compile with the new version of SpecM

* updated the translation of the implication rules to work with the new SpecM monad

* updated the translation of the EndLifetime rule

* Started translating recursive and opaque shapes

* updated the translations of shapes and permissions to also contain the translation of shapes and permissions to types, not just type descriptions; also updated the translation of shape expressions to generate this information

* added explicit substitutions to type descriptions, for use in translating named type descriptions

* updated the translation of Crucible expressions

* updated the translation of jump targets and statements

* whoops, just realized that lownedTransTerm needs to partially apply its function to the existing ps_extra

* changed the MultiFixBodies type to a single function type over all the function indexes that returns a tuple of all the specFuns, instead of a tuple of functions over the function indexes

* small tweak to the type of LetRecS

* finished updating the translation of CFGs to the new SpecM monad

* always unfold assumingS, assertingS in normComp

* defined translateCFGs in the new SpecM monad

* finished updating tcTranslateAddCFGs to the new SpecM

* finished updating the remaining top-level entrypoints in SAWTranslation.hs

* added the TranslateDescs instances for permissions and atomic permissions; define the translations for the folding and unfolding rules for recursive shapes and permissions

* changed recursive permissions to have a body with a permission variable free, similar to how recursive shapes work

* implemented translateCompleteFunType

* removed the no longer needed IRTTranslation.hs file

* started updating HeapsterBuiltins.hs to work with the new SpecM monad

* Moved most of the details of adding and translating recursive permissions to SAWTranslation.hs

* finished defining the heapster_define_recursive_shape in the new SpecM monad approach; updated the interpreter docs for the commands that have so far been updated

* expanded the comments on SomePartialNamedShape

* updated more of HeapsterBuiltins.hs to work with the new SpecM

* finished updating SAW to the new SpecM monad!

* added varKindExpr for use in translating descriptions from expression variables

* fixed BV proofs to use the correct, non-monadic type to pass to the errorS combinator

* bug fix: the type description for an existential permission needs to handle the special case of an equality permission in the body of the existential

* implemented proveEqNat

* added a Tp_M constructor to the output type of function descriptions; changed pis to lambdas for generated functions; changed constants to use the more general constKindExpr function

* whoops, translateCallEntry should not pass in the top-level arguments as inputs

* removed some unused arguments; made some small cosmetic changes

* updated Coq translation to work with the new SpecM monad

* updated CryptolM.sawcore to work with the new SpecM monad

* redefined all the SpecM definitions in a new SpecM.v module in saw-core-coq, which now supplies the operations for type-level expressions

* whoops, fixed the translation of function permissions to apply SpecM to the return type

* whoops, re-added invariantHint

* updated arrays.sawcore to the new SpecM

* started working on a new arrays example for iteratively initializing arrays

* whoops, forgot to add the type description argument to heapster_define_opaque_llvmshape in Interpreter.hs

* whoops, was computing the type of the type function incorrectly in heapster_define_opaque_llvmshape

* make atM, updateM cases of MRSolver more flexible

* updating the rust_data example to work with the new SpecM monad, and also to contain a few lifetime examples

* whoops, forgot to update the translation of the SImpl_ElimLLVMBlockNamed rule for defined shapes to accommodate the fact that shapes now translate to have 0 or more element instead of always just 1

* added helper definitions for writing type descriptions

* more SAW translation bug fixes: made sure to add the Tp_M constructor for the return types of functional type descriptions; fixed some of the array types to reflect the fact that cell shapes can have 0 or more types instead of just 1

* re-enabled the ref_sum example in rust_data

* added projTupleOpenTerm' to OpenTerm.hs

* fixed the LLVM global translations in LLVMGlobalConst.hs to match the new translation of shapes as 0 or more types instead of a fixed 1 type

* changed transTerms to have a monadic version for permissions

* whoops, used pairTypeOpenTerm instead o9f pairOpenTerm in tupleOpenTerm'

* whoops, forgot to add a SpecM to the output type of LambdaS

* small bug fixes

* whoops, messed up the translation of the SImpl_LLVMArrayCellReturn rule when converting to monadic transTermsM

* bug fix in bindTransM to use lambdaTupleTransM; also added some FIXMEs for optimizing the translation of lifetimes

* fixed projTupleOpenTerm' and its uses to be consistent

* make MRSolver debug commands uniformly named

* warn on Heapster implication failures

* Changed tpElemEnv to no longer use function indices at all

* moved SpecM and its related definitions to its own SAW core module

* updated Heapster to use the new version of SpecM that does not use FunIxs and is contained in a separate SpecM SAW core module

* whoops, forgot to update an identifier from the Prelude to the SpecM module

* small bug fixes in the translation

* updated Coq translation to work with the new definition of SpecM

* more small bug fixes to the translation

* bug fixes to get folding of inductive types to work properly

* updated the arrays and linked_list examples to work with the new version of SpecM

* whoops, tpElem needs to be applied to an event type

* uncommented a bunch of the old rust_data functions, and got them working

* changed translateCallEntry to not convert permissions to terms and then back again when it calls non-recursive entrypoints

* moved the SpecM OpenTerm operations to OpenTerm.hs

* add case for unset variable plus offset to proveEqH

* make minor tweaks to refinement in MRSolver, errors in Heapster

* started updating monadification to work with the new SpecM type

* combined monadifyType and monadifyNum into a single monadifyTpExpr function; replaced the Either type used for type- vs term-level arguments with a new helper type MonArg

* updated a bit more of Monadify.hs

* mostly finished updating monadification, other than quantifying over event types

* changed the EventType type to hold an arbitrary term, rather than just an identifier, in order to support event type polymorphism in monadification

* added documentation for monadifyLambdas and monadifyEtaExpand

* updated comments to remove SpecMParams

* re-added an updated version of refinesS

* updated MR solver to work with the new definition of SpecM

* whoops, changed some identifiers from the Prelude to the new SpecM SAW core module; also made sure the SpecM and CryptolM modules are loaded when needed

* updated a use of EvType from the Prelude to the SpecM SAW core module

* whoops, forgot to monadify the bitvector type

* updated monadify example to work with the new SpecM

* whoops, forgot to update a number of SpecM identifiers to the new SpecM module

* added a case to the MR solver normalizer to recognize LetRecS terms

* whoops, updated two more identifiers to point to the new SpecM module

* small bug fixes

* updated SpecPrims to work with the new SpecM monad

* fixed the printing for NormComp and friends to have the correct number of underscores for the new SpecM

* removed the notion of an indescribable num expression, replacing it with just Num terms

* reordered to arguments of Tp_Seq to match the definition of Vec, seq, and mseq

* updated the SMT solver part of MR solver to use the new SpecM in the new SpecM SAW core module

* whoops, updated mrGetInvariant to use the new version of assertFiniteS

* whoops, fixed the argument order when constructing a Tp_BVVec

* added support to MR solver for a new fixpoint operation forNatLtThenS that is defined by induction on Nat instead of via FixS; added MR solver reasoning about vector maps using forNatLtThenS

* refactored the MaybeElim cases by defining a function asDecProp that checks if a proposition can be decided by MR solver

* updated the MR solver normalizer to unfold forNatLtThenSBody when it applies that function to form the body of a forNatLtThenS corecursive function

* added refinesS_eq combinator

* finished updating arrays_mr_solver.saw example to work

* updated mr_solver_unit_tests.saw example to work

* add PPOpts to MREnv, make naming of P.P. fns. consistent (see PPInCtxM docs)

* add mrsolver_set_debug_printing_depth

* only check fn body, not arg values, when checking whether a fn is recursive

* expand `FunBind |= FunBind` case to include all `FunName`s

* add check for reflexivity in mrProveRel

* improve error messages for `FunBind |= FunBind` case

* add error handling for return types not being equal to refinementTermH

* when applying a FunAssump, always substEvars in the rewritten RHS

* have both arguments to mrLambdaLift2 be in the same context

* added genBVVecNoPf and atBVVecNoPf primitives to the SAW core prelude

* updated MR solver to use a more general notion of injective representation in place of the previously-used injective conversions; note that this change is not yet complete...

* finished implementing injUnifyRepr

* fixed lifting bug in mrApplyRepr

* fixed mrTrySetAppliedEVar to correctly handle higher-order variables

* changed genBVVecNoPf to use gen instead of genBVVec

* changed the normalizer to prefer caller-supplied primitives over its default primitive implementations

* updated implementations of the primitives to work directly with gen and at

* fixed a lifting bug in generalizeCoIndHyp

* commented out the no-longer used cases of instUVar

* added evar lowering as part of mrProvable, to ensure evars over function variables do not become higher-order variables in SMT

* whoops, forgot to lift the arg0 repr in generalizeCoIndHyp

* added loop detection to proveCoIndHyp

* added calls to mrIndexBVVec in the mrProveRelH for vectors, though mrIndexBVVec is not yet defined...

* resolve all but one unused import and variable warnings

* add mrAtBVVec, potentially finish BVVec case of mrProveRelH'

* add `genBVVecNoPf` case to `asGenBVVecTerm`

* add `mkInjReprType` to forall/exists cases of `mrRefines`

* removed TermLike instance for tuples of length longer than 7 because those do not work with GHC 8.10

* Fixed vecLenIx to use mrAtVec and mrAtBVVec instead of directly applying the at and atBVVec accessors

* changed heapster_init_env to add an import of the SpecM SAW core module instead of Prelude when it creates a SAW core module

* updated the docs for heapster_define_reachability_perm

* started updating mbox example to work with the new SpecM monad...

* add case for `Vec const_n` back to Monadification

* clean up MRSolver/SMT.hs

* add special handling of constant-length vecs in VecLength, etc.

* add scWhnf to mrFunOutType and do some minor cleanup

* fix ConstNatVecLen case of mrVecLenGen

* remove top-level type conversion check from mrProveRel

* add a (albeit hacky) check for type equality back to refinementTermH

* add mrNormOpenTerm before any calls to mrRefinesFunH or mkInjReprType

* change "Prelude." to "SpecM.", remove unused OpenTerm code

* only unfold main fun in warnErrs, unfold __bodies in print_fun_trans

* added tuple shapes; changed the translation of memblock permissions to always be 0 or 1 terms, tupling what used to be multiple terms together; still need to update the translations of the implication rules for memblock permissions to work with this new translation

* updated the translations of the memblock implication rules

* added more debug info for translating LLVM globals

* whoops, fixed the translation of sequence shapes where both sides have no empty translations

* updated permEnvAddGlobalConst to fit with the new translation of memblock permissions to have 0 or 1 terms

* added parsing support for tuple shapes

* added an explicit tuple shape to the type of memcpy in rust_data.saw

* fix type error in unsafeAssertMacro

* attempting to get `take` to work property with MRSolver smtNorm

* add VVec case to primGenVec, use iteWithProof instead of maybe

* make the translation of `ETrans_Shape Nothing` be `unitTpDesc`

* simplify types of assumingS/assertingS, add non-S versions, fix typo

* resolve some unused import warnings

* expand tuples for exists/forall evars, get arrays_mr_solver working again

* handle SpecM fns in mrProveEq, clean up unused heterogeneity

* minimize `sawLet`s and beta normalize in `heapster_print_fun_trans`

* add Dilithium example

* update pinned commit of entree-specs

* fix Haddock in Heapster + MRSolver, fix typos found by @RyanGlScott

* add more info about generating dilithium2.bc

* add comments about dilithium commit sha

* updated the commit number for the entree-specs repo

* removed references to functions that are no longer used from unfold_bv_funs

* removing unsafeAsserts from the definition of iteWithProof because the unsafeAssert Coq tactic is currently defined *after* the translation to Coq of the Prelude

* changed the Coq translations of tcAdd and tcMul to be written by hand in SpecM.v instead of automatically generated

* changed SpecM.v to rely on CryptolPrimitivesForSAWCore.v rather than the other way around, so that it can use the generated Num operations like tcAdd and tcMul

* fixed up the imports for the heapster_export_coq command

* added MR solver support for the iteWithProof combinator

* changed all the examples to import SpecM instead of the SAW core Prelude

* added checks to heapster_define_opaque_perm and heapster_define_opaque_llvmshape to make sure the user-supplied type and type description match

* updated global_var example to work

* added more info to the error message when a type does not match a type description

* updated checkTypeAgreesWithDesc, since the previous version was incorrect

* updated memcpy example to work with the new SpecM

* updated ListDescType to the correct version to agree with ListDesc, now that Heapster checks that these agree

* started updating the string_set example, but ended up commenting most of it out

* commented out stuff that does not work in the Heapster examples for now

* added an override for iteWithProof when calling into SMT

* added tracing for terms being inserted by Heapster commands when the debug level is at least 2

* removed iso_recursive example, since it is now superseded by the linked_list example

* whoops, forgot to remove the iso_recursive example from the _CoqProject

* simplified memcpy permissions to help with translation

* commented out all the _proofs.v files from the _CoqProject

* updated rust_lifetimes example to work with the new SpecM

* commented out the processBlocks function from the sha512 example because it currently has a panic

* updated io example to work with the new SpecM

---------

Co-authored-by: Eddy Westbrook <[email protected]>
  • Loading branch information
m-yac and Eddy Westbrook authored Feb 9, 2024
1 parent 3dc551c commit 2a3ca89
Show file tree
Hide file tree
Showing 107 changed files with 10,488 additions and 7,837 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ jobs:

# If you change the entree-specs commit below, make sure you update the
# documentation in saw-core-coq/README.md accordingly.
- run: opam pin -y entree-specs https://github.com/GaloisInc/entree-specs.git#52c4868f1f65c7ce74e90000214de27e23ba98fb
- run: opam pin -y entree-specs https://github.com/GaloisInc/entree-specs.git#5cf91e69c08376bcb17a95a8d2bf2daf406ae8cd

# FIXME: the following steps generate Coq libraries for the SAW core to
# Coq translator and builds them; if we do other Coq tests, these steps
Expand Down
2 changes: 2 additions & 0 deletions cryptol-saw-core/cryptol-saw-core.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Description:

extra-source-files:
saw/Cryptol.sawcore
saw/SpecM.sawcore
saw/CryptolM.sawcore

library
Expand All @@ -39,6 +40,7 @@ library
sbv,
vector,
text,
template-haskell,
executable-path,
filepath
hs-source-dirs: src
Expand Down
1,065 changes: 478 additions & 587 deletions cryptol-saw-core/saw/CryptolM.sawcore

Large diffs are not rendered by default.

Loading

0 comments on commit 2a3ca89

Please sign in to comment.