From 484fb25da6ff287a5004367e00a0e2af3d31d649 Mon Sep 17 00:00:00 2001 From: Ryan Scott Date: Sun, 19 Nov 2023 19:14:17 -0500 Subject: [PATCH] MIR enums This adds basic support for enums in the MIR backend. In particular: * There is now a `mir_enum_value : MIRAdt -> String -> [MIRValue] -> MIRValue` function that constructs a value representing a specific enum variant, where the `String` indicates which variant to use. * The `mir_fresh_expanded_value` command can now create symbolic enum values. Implementation-wise, much of the complexity in this patch arises from the fact that MIR enums are represented with `VariantType`s at the Crucible level, which are a fair bit more involved than the `StructType`s used to power MIR structs. Some highlights of the implementation are: * There is now a new `EnumShape` constructor for `TypeShape`, which is in turn defined in terms of a new `VariantShape` data type that characterizes the shapes of all the fields in an enum variant. * There is a `MirSetupEnum` data type (exported by `SAWScript.Crucible.MIR.MethodSpecIR`) which categorizes the different forms of enum `MIRValue`s that one can construct. Currently, there is `MirSetupEnumVariant` (which is what `mir_enum_value` returns) and `MirSetupEnumSymbolic` (which is what `mir_fresh_expanded_value` returns when it creates a fresh enum value). * TODO RGS: Say something about symbolic enums * For now, there is no `crux-mir-comp` support for enums. We could conceivable add support, but there is not a pressing need to do so right now. I have opened https://github.com/GaloisInc/saw-script/issues/1990 as a reminder to do this later. This checks off one box in #1859. --- .../src/Mir/Compositional/Builder.hs | 8 + .../src/Mir/Compositional/Clobber.hs | 4 + .../src/Mir/Compositional/Override.hs | 2 + crux-mir-comp/src/Mir/Cryptol.hs | 2 + doc/manual/manual.md | 60 ++- doc/manual/manual.pdf | Bin 587289 -> 589301 bytes intTests/test_mir_verify_enums/Makefile | 13 + .../test.linked-mir.json | 1 + intTests/test_mir_verify_enums/test.rs | 35 ++ intTests/test_mir_verify_enums/test.saw | 78 ++++ intTests/test_mir_verify_enums/test.sh | 3 + saw-remote-api/CHANGELOG.md | 1 + saw-remote-api/python/CHANGELOG.md | 1 + saw-remote-api/python/saw_client/crucible.py | 29 ++ .../saw/test-files/mir_enums.linked-mir.json | 1 + .../python/tests/saw/test-files/mir_enums.rs | 35 ++ .../python/tests/saw/test_mir_enums.py | 136 +++++++ saw-remote-api/src/SAWServer.hs | 1 + .../src/SAWServer/Data/SetupValue.hs | 3 + .../src/SAWServer/JVMCrucibleSetup.hs | 2 + .../src/SAWServer/LLVMCrucibleSetup.hs | 2 + .../src/SAWServer/MIRCrucibleSetup.hs | 22 +- saw-script.cabal | 1 + src/SAWScript/Crucible/Common/MethodSpec.hs | 19 +- src/SAWScript/Crucible/Common/Setup/Value.hs | 6 + src/SAWScript/Crucible/JVM/Override.hs | 2 + .../Crucible/JVM/ResolveSetupValue.hs | 2 + src/SAWScript/Crucible/JVM/Setup/Value.hs | 1 + src/SAWScript/Crucible/LLVM/Override.hs | 4 + .../Crucible/LLVM/ResolveSetupValue.hs | 4 + src/SAWScript/Crucible/LLVM/Setup/Value.hs | 1 + src/SAWScript/Crucible/MIR/Builtins.hs | 88 ++++- src/SAWScript/Crucible/MIR/MethodSpecIR.hs | 3 + src/SAWScript/Crucible/MIR/Override.hs | 141 +++++-- .../Crucible/MIR/ResolveSetupValue.hs | 344 ++++++++++++++++-- src/SAWScript/Crucible/MIR/Setup/Value.hs | 50 +++ src/SAWScript/Crucible/MIR/TypeShape.hs | 118 +++++- src/SAWScript/Interpreter.hs | 9 + 38 files changed, 1139 insertions(+), 93 deletions(-) create mode 100644 intTests/test_mir_verify_enums/Makefile create mode 100644 intTests/test_mir_verify_enums/test.linked-mir.json create mode 100644 intTests/test_mir_verify_enums/test.rs create mode 100644 intTests/test_mir_verify_enums/test.saw create mode 100755 intTests/test_mir_verify_enums/test.sh create mode 100644 saw-remote-api/python/tests/saw/test-files/mir_enums.linked-mir.json create mode 100644 saw-remote-api/python/tests/saw/test-files/mir_enums.rs create mode 100644 saw-remote-api/python/tests/saw/test_mir_enums.py diff --git a/crucible-mir-comp/src/Mir/Compositional/Builder.hs b/crucible-mir-comp/src/Mir/Compositional/Builder.hs index 0e77b644b7..9743a2af2f 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Builder.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Builder.hs @@ -629,6 +629,7 @@ substMethodSpec sc sm ms = do MS.SetupStruct b svs -> MS.SetupStruct b <$> mapM goSetupValue svs MS.SetupTuple b svs -> MS.SetupTuple b <$> mapM goSetupValue svs MS.SetupSlice slice -> MS.SetupSlice <$> goSetupSlice slice + MS.SetupEnum enum_ -> MS.SetupEnum <$> goSetupEnum enum_ MS.SetupArray b svs -> MS.SetupArray b <$> mapM goSetupValue svs MS.SetupElem b sv idx -> MS.SetupElem b <$> goSetupValue sv <*> pure idx MS.SetupField b sv name -> MS.SetupField b <$> goSetupValue sv <*> pure name @@ -644,6 +645,11 @@ substMethodSpec sc sm ms = do goSetupCondition (MS.SetupCond_Ghost b loc gg tt) = MS.SetupCond_Ghost b loc gg <$> goTypedTerm tt + goSetupEnum (MirSetupEnumVariant adt variantNm svs) = + MirSetupEnumVariant adt variantNm <$> mapM goSetupValue svs + goSetupEnum sv@(MirSetupEnumSymbolic _) = + return sv + goSetupSlice (MirSetupSliceRaw ref len) = MirSetupSliceRaw <$> goSetupValue ref <*> goSetupValue len goSetupSlice (MirSetupSlice arr) = @@ -742,6 +748,8 @@ regToSetup bak p eval shp rv = go shp rv refSV <- go refShp refRV lenSV <- go lenShp lenRV pure $ MS.SetupSlice $ MirSetupSliceRaw refSV lenSV + go (EnumShape _ _ _ _) _ = + error "Enums not currently supported in overrides" go (FnPtrShape _ _ _) _ = error "Function pointers not currently supported in overrides" diff --git a/crucible-mir-comp/src/Mir/Compositional/Clobber.hs b/crucible-mir-comp/src/Mir/Compositional/Clobber.hs index f9bebc062d..64301bdf93 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Clobber.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Clobber.hs @@ -62,6 +62,8 @@ clobberSymbolic sym loc nameStr 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 (EnumShape _ _ _ _) _rv = + error "Enums not currently supported in overrides" go (FnPtrShape _ _ _) _rv = error "Function pointers not currently supported in overrides" go (RefShape _ _ _ _) _rv = error "clobberSymbolic: RefShape NYI" @@ -120,6 +122,8 @@ clobberImmutSymbolic sym loc nameStr shp rv = go shp rv ref' <- go refShp ref len' <- go lenShp len pure $ Ctx.Empty Ctx.:> RV ref' Ctx.:> RV len' + go (EnumShape _ _ _ _) _rv = + error "Enums not currently supported in overrides" go (FnPtrShape _ _ _) _rv = error "Function pointers not currently supported in overrides" diff --git a/crucible-mir-comp/src/Mir/Compositional/Override.hs b/crucible-mir-comp/src/Mir/Compositional/Override.hs index da5d4ce55e..a9231015b0 100644 --- a/crucible-mir-comp/src/Mir/Compositional/Override.hs +++ b/crucible-mir-comp/src/Mir/Compositional/Override.hs @@ -544,6 +544,8 @@ setupToReg sym sc termSub regMap allocMap shp sv = go shp sv refRV <- go refShp refSV lenRV <- go lenShp lenSV pure $ Ctx.Empty Ctx.:> RV refRV Ctx.:> RV lenRV + go (EnumShape _ _ _ _) _ = + error "Enums not currently supported in overrides" go (FnPtrShape _ _ _) _ = error "Function pointers not currently supported in overrides" go shp sv = error $ "setupToReg: type error: bad SetupValue for " ++ show (shapeType shp) ++ diff --git a/crux-mir-comp/src/Mir/Cryptol.hs b/crux-mir-comp/src/Mir/Cryptol.hs index 08bf240b29..37ebe45463 100644 --- a/crux-mir-comp/src/Mir/Cryptol.hs +++ b/crux-mir-comp/src/Mir/Cryptol.hs @@ -337,6 +337,8 @@ munge sym shp rv = do AnyValue tpr <$> goFields flds rvs | otherwise = error $ "munge: StructShape AnyValue with NYI TypeRepr " ++ show tpr go (TransparentShape _ shp) rv = go shp rv + go (EnumShape _ _ _ _) _ = + error "Enums not currently supported in overrides" go (FnPtrShape _ _ _) _ = error "Function pointers not currently supported in overrides" -- TODO: RefShape diff --git a/doc/manual/manual.md b/doc/manual/manual.md index 9fb91a2d73..f1a83ac958 100644 --- a/doc/manual/manual.md +++ b/doc/manual/manual.md @@ -2117,12 +2117,9 @@ mir_verify : ### 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. Features that are not yet -implemented include the following: - -* The ability to construct MIR `enum` values in specifications +(Note: API functions involving MIR verification require `enable_experimental` +in order to be used. As such, some parts of this API may change before being +finalized.) 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 @@ -2926,6 +2923,14 @@ construct compound values: * `mir_array_value : MIRType -> [MIRValue] -> MIRValue` constructs an array of the given type whose elements consist of the given values. Supplying the element type is necessary to support length-0 arrays. +* `mir_enum_value : MIRAdt -> String -> [MIRValue] -> MIRValue` constructs an + enum using a particular enum variant. The `MIRAdt` arguments determines what + enum type to create, the `String` value determines the name of the variant to + use, and the `[MIRValue]` list are the values to use as elements in the + variant. + + See the "Finding MIR alegraic data types" section for more information on how + to compute a `MIRAdt` value to pass to `mir_enum_value`. * `mir_slice_value : MIRValue -> MIRValue`: see the "MIR slices" section below. * `mir_slice_range_value : MIRValue -> Int -> Int -> MIRValue`: see the "MIR slices" section below. @@ -3102,9 +3107,46 @@ s_8_16 <- mir_find_adt m "example::S" [mir_u8, mir_u16]; s_32_64 <- mir_find_adt m "example::S" [mir_u32, mir_u64]; ~~~~ -The `mir_adt` command (for constructing a struct type) and `mir_struct_value` -(for constructing a struct value) commands in turn take a `MIRAdt` as an -argument. +The `mir_adt` command (for constructing a struct type), `mir_struct_value` (for +constructing a struct value), and `mir_enum_value` (for constructing an enum +value) commands in turn take a `MIRAdt` as an argument. + +In addition to taking a `MIRAdt` as an argument, `mir_enum_variant` also takes +a `String` representing the name of the variant to construct. The variant name +should be a short name such as `"None"` or `"Some"`, and not a full identifier +such as `"core::option::None"` or `"core::option::Some"`. This is because the +`MIRAdt` already contains the full identifiers for all of an enum's variants, +so SAW will use this information to look up a variant's identifier from a short +name. Here is an example of using `mir_enum_value` in practice: + +~~~~ .rs +pub fn n() -> Option { + None +} + +pub fn s(x: u32) -> Option { + Some(x) +} +~~~~ +~~~~ +m <- mir_load_module "example.linked-mir.json"; + +option_u32 <- mir_find_adt m "core::option::Option" [mir_u32]; + +let n_spec = do { + mir_execute_func []; + + mir_return (mir_enum_value option_u32 "None" []); +}; + +let s_spec = do { + x <- mir_fresh_var "x" mir_u32; + + mir_execute_func [mir_term x]; + + mir_return (mir_enum_value option_u32 "Some" [mir_term x]); +}; +~~~~ ### Bitfields diff --git a/doc/manual/manual.pdf b/doc/manual/manual.pdf index 80e0c8ad8c4b32a041ff75e6ade359f83307846c..9784c508905dd9a5fb8346934dc84c62dc8ff9ee 100644 GIT binary patch delta 138246 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 Ezq6c}F8}}l diff --git a/intTests/test_mir_verify_enums/Makefile b/intTests/test_mir_verify_enums/Makefile new file mode 100644 index 0000000000..bc6297ae15 --- /dev/null +++ b/intTests/test_mir_verify_enums/Makefile @@ -0,0 +1,13 @@ +all: test.linked-mir.json + +test.linked-mir.json: test.rs + saw-rustc $< + $(MAKE) remove-unused-build-artifacts + +.PHONY: remove-unused-build-artifacts +remove-unused-build-artifacts: + rm -f test libtest.mir libtest.rlib + +.PHONY: clean +clean: remove-unused-build-artifacts + rm -f test.linked-mir.json diff --git a/intTests/test_mir_verify_enums/test.linked-mir.json b/intTests/test_mir_verify_enums/test.linked-mir.json new file mode 100644 index 0000000000..0b503737b6 --- /dev/null +++ b/intTests/test_mir_verify_enums/test.linked-mir.json @@ -0,0 +1 @@ +{"fns":[{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Deinit","pos":"test.rs:17:5: 17:9"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:17:5: 17:9","variant_index":0}],"terminator":{"kind":"Return","pos":"test.rs:18:2: 18:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}]},"name":"test/f696fd3c::h_none","return_ty":"ty::Adt::3fa7c2d95c7fce06","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Deinit","pos":"test.rs:30:5: 30:11"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::7746688b48f54a60"}},"pos":"test.rs:30:5: 30:11","variant_index":0}],"terminator":{"kind":"Return","pos":"test.rs:31:2: 31:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::7746688b48f54a60"}]},"name":"test/f696fd3c::i42","return_ty":"ty::Adt::7746688b48f54a60","spread_arg":null},{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::bool"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::bool"}},"pos":"test.rs:9:8: 9:9","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::bool"}},"kind":"Copy"}}}],"terminator":{"discr":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::bool"}},"kind":"Move"},"discr_span":"test.rs:9:8: 9:9 !test.rs:9:8: 9:9","kind":"SwitchInt","pos":"test.rs:9:8: 9:9 !test.rs:9:8: 9:9","switch_ty":"ty::bool","targets":["bb2","bb1"],"values":["0"]}},"blockid":"bb0"},{"block":{"data":[{"kind":"Deinit","pos":"test.rs:10:11: 10:15"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:10:11: 10:15","variant_index":0}],"terminator":{"args":[{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Move"}],"cleanup":null,"destination":[{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"bb3"],"from_hir_call":true,"func":{"data":{"rendered":{"kind":"zst"},"ty":"ty::FnDef::935b79106a1ed847"},"kind":"Constant"},"kind":"Call","pos":"test.rs:10:9: 10:16"}},"blockid":"bb1"},{"block":{"data":[{"kind":"Deinit","pos":"test.rs:12:11: 12:19"},{"kind":"Assign","lhs":{"data":[{"kind":"Downcast","variant":1},{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:12:11: 12:19","rhs":{"kind":"Use","usevar":{"data":{"rendered":{"kind":"uint","size":4,"val":"42"},"ty":"ty::u32"},"kind":"Constant"}}},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:12:11: 12:19","variant_index":1}],"terminator":{"args":[{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Move"}],"cleanup":null,"destination":[{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"bb3"],"from_hir_call":true,"func":{"data":{"rendered":{"kind":"zst"},"ty":"ty::FnDef::935b79106a1ed847"},"kind":"Constant"},"kind":"Call","pos":"test.rs:12:9: 12:20"}},"blockid":"bb2"},{"block":{"data":[],"terminator":{"kind":"Return","pos":"test.rs:14:2: 14:2"}},"blockid":"bb3"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::bool"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}]},"name":"test/f696fd3c::g","return_ty":"ty::u32","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Deinit","pos":"test.rs:34:5: 34:11"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::7746688b48f54a60"}},"pos":"test.rs:34:5: 34:11","variant_index":1}],"terminator":{"kind":"Return","pos":"test.rs:35:2: 35:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::7746688b48f54a60"}]},"name":"test/f696fd3c::i43","return_ty":"ty::Adt::7746688b48f54a60","spread_arg":null},{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::isize"}},"pos":"test.rs:2:11: 2:12","rhs":{"kind":"Discriminant","ty":"ty::isize","val":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}}}}],"terminator":{"discr":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::isize"}},"kind":"Move"},"discr_span":"test.rs:3:9: 3:16","kind":"SwitchInt","pos":"test.rs:2:5: 2:12","switch_ty":"ty::isize","targets":["bb1","bb3","bb2"],"values":["0","1"]}},"blockid":"bb0"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"test.rs:4:17: 4:19","rhs":{"kind":"Use","usevar":{"data":{"rendered":{"kind":"uint","size":4,"val":"27"},"ty":"ty::u32"},"kind":"Constant"}}}],"terminator":{"kind":"Goto","pos":"test.rs:4:17: 4:19","target":"bb4"}},"blockid":"bb1"},{"block":{"data":[],"terminator":{"kind":"Unreachable","pos":"test.rs:2:11: 2:12"}},"blockid":"bb2"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_3","ty":"ty::u32"}},"pos":"test.rs:3:14: 3:15","rhs":{"kind":"Use","usevar":{"data":{"data":[{"kind":"Downcast","variant":1},{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"test.rs:3:20: 3:21","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_3","ty":"ty::u32"}},"kind":"Copy"}}}],"terminator":{"kind":"Goto","pos":"test.rs:3:20: 3:21","target":"bb4"}},"blockid":"bb3"},{"block":{"data":[],"terminator":{"kind":"Return","pos":"test.rs:6:2: 6:2"}},"blockid":"bb4"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::isize"},{"is_zst":false,"mut":{"kind":"Not"},"name":"_3","ty":"ty::u32"}]},"name":"test/f696fd3c::f","return_ty":"ty::u32","spread_arg":null},{"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:21:10: 21:11","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Deinit","pos":"test.rs:21:5: 21:12"},{"kind":"Assign","lhs":{"data":[{"kind":"Downcast","variant":1},{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:21:5: 21:12","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}},"kind":"Move"}}},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:21:5: 21:12","variant_index":1}],"terminator":{"kind":"Return","pos":"test.rs:22:2: 22:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}]},"name":"test/f696fd3c::h_some","return_ty":"ty::Adt::3fa7c2d95c7fce06","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::isize"}},"pos":"test.rs:25:11: 25:13","rhs":{"kind":"Use","usevar":{"data":{"rendered":{"kind":"isize","size":8,"val":"42"},"ty":"ty::isize"},"kind":"Constant"}}}],"terminator":{"kind":"Return","pos":"test.rs:25:11: 25:13"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::isize"}]},"name":"test/f696fd3c::I::I42::{constant#0}","return_ty":"ty::isize","spread_arg":null}],"adts":[{"kind":{"discr_ty":"ty::isize","kind":"Enum"},"name":"core/73237d41::option::Option::_adtc5e93708b8ca6e2a[0]","orig_def_id":"core/73237d41::option::Option","orig_substs":["ty::u32"],"repr_transparent":false,"size":8,"variants":[{"ctor_kind":{"kind":"Const"},"discr":{"index":0,"kind":"Relative"},"discr_value":"0","fields":[],"inhabited":true,"name":"core/73237d41::option::Option::None"},{"ctor_kind":{"kind":"Fn"},"discr":{"index":1,"kind":"Relative"},"discr_value":"1","fields":[{"name":"core/73237d41::option::Option::Some::0","ty":"ty::u32"}],"inhabited":true,"name":"core/73237d41::option::Option::Some"}]},{"kind":{"discr_ty":"ty::isize","kind":"Enum"},"name":"test/f696fd3c::I::_adtb7803c2264daf0ec[0]","orig_def_id":"test/f696fd3c::I","orig_substs":[],"repr_transparent":false,"size":1,"variants":[{"ctor_kind":{"kind":"Const"},"discr":{"kind":"Explicit","name":"test/f696fd3c::I::I42::{constant#0}"},"discr_value":"42","fields":[],"inhabited":true,"name":"test/f696fd3c::I::I42"},{"ctor_kind":{"kind":"Const"},"discr":{"index":1,"kind":"Relative"},"discr_value":"43","fields":[],"inhabited":true,"name":"test/f696fd3c::I::I43"}]}],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"test/f696fd3c::h_none","kind":"Item","substs":[]},"name":"test/f696fd3c::h_none"},{"inst":{"def_id":"test/f696fd3c::i42","kind":"Item","substs":[]},"name":"test/f696fd3c::i42"},{"inst":{"def_id":"test/f696fd3c::g","kind":"Item","substs":[]},"name":"test/f696fd3c::g"},{"inst":{"def_id":"test/f696fd3c::i43","kind":"Item","substs":[]},"name":"test/f696fd3c::i43"},{"inst":{"def_id":"test/f696fd3c::f","kind":"Item","substs":[]},"name":"test/f696fd3c::f"},{"inst":{"def_id":"test/f696fd3c::h_some","kind":"Item","substs":[]},"name":"test/f696fd3c::h_some"},{"inst":{"def_id":"test/f696fd3c::I::I42::{constant#0}","kind":"Item","substs":[]},"name":"test/f696fd3c::I::I42::{constant#0}"}],"tys":[{"name":"ty::u32","ty":{"kind":"Uint","uintkind":{"kind":"U32"}}},{"name":"ty::Adt::3fa7c2d95c7fce06","ty":{"kind":"Adt","name":"core/73237d41::option::Option::_adtc5e93708b8ca6e2a[0]","orig_def_id":"core/73237d41::option::Option","substs":["ty::u32"]}},{"name":"ty::Adt::7746688b48f54a60","ty":{"kind":"Adt","name":"test/f696fd3c::I::_adtb7803c2264daf0ec[0]","orig_def_id":"test/f696fd3c::I","substs":[]}},{"name":"ty::bool","ty":{"kind":"Bool"}},{"name":"ty::FnDef::935b79106a1ed847","ty":{"defid":"test/f696fd3c::f","kind":"FnDef"}},{"name":"ty::isize","ty":{"intkind":{"kind":"Isize"},"kind":"Int"}}],"roots":["test/f696fd3c::f","test/f696fd3c::g","test/f696fd3c::h_none","test/f696fd3c::h_some","test/f696fd3c::i42","test/f696fd3c::i43"]} \ No newline at end of file diff --git a/intTests/test_mir_verify_enums/test.rs b/intTests/test_mir_verify_enums/test.rs new file mode 100644 index 0000000000..e4f25f1e2c --- /dev/null +++ b/intTests/test_mir_verify_enums/test.rs @@ -0,0 +1,35 @@ +pub fn f(x: Option) -> u32 { + match x { + Some(x) => x, + None => 27, + } +} + +pub fn g(b: bool) -> u32 { + if b { + f(None) + } else { + f(Some(42)) + } +} + +pub fn h_none() -> Option { + None +} + +pub fn h_some(x: u32) -> Option { + Some(x) +} + +pub enum I { + I42 = 42, + I43, +} + +pub fn i42() -> I { + I::I42 +} + +pub fn i43() -> I { + I::I43 +} diff --git a/intTests/test_mir_verify_enums/test.saw b/intTests/test_mir_verify_enums/test.saw new file mode 100644 index 0000000000..aa5b84def5 --- /dev/null +++ b/intTests/test_mir_verify_enums/test.saw @@ -0,0 +1,78 @@ +enable_experimental; + +m <- mir_load_module "test.linked-mir.json"; + +let option_u32_adt = mir_find_adt m "core::option::Option" [mir_u32]; +let i_adt = mir_find_adt m "test::I" []; + +let f_none_spec = do { + let x = mir_enum_value option_u32_adt "None" []; + + mir_execute_func [x]; + + mir_return (mir_term {{ 27 : [32] }}); +}; + +let f_some_spec = do { + let ret = mir_term {{ 42 : [32] }}; + let x = mir_enum_value option_u32_adt "Some" [ret]; + + mir_execute_func [x]; + + mir_return ret; +}; + +let g_spec = do { + b <- mir_fresh_var "b" mir_bool; + + mir_execute_func [mir_term b]; + + mir_return (mir_term {{ if b then 27 else 42 : [32] }}); +}; + +let h_none_spec = do { + mir_execute_func []; + + mir_return (mir_enum_value option_u32_adt "None" []); +}; + +let h_some_spec = do { + x <- mir_fresh_var "x" mir_u32; + + mir_execute_func [mir_term x]; + + mir_return (mir_enum_value option_u32_adt "Some" [mir_term x]); +}; + +let i42_spec = do { + mir_execute_func []; + + mir_return (mir_enum_value i_adt "I42" []); +}; + +let i43_spec = do { + mir_execute_func []; + + mir_return (mir_enum_value i_adt "I43" []); +}; + +// `mir_enum_value` should error if it cannot find a variant name. +let i43_bad_spec = do { + mir_execute_func []; + + mir_return (mir_enum_value i_adt "I44" []); +}; + +f_none_ov <- mir_verify m "test::f" [] false f_none_spec z3; +f_some_ov <- mir_verify m "test::f" [] false f_some_spec z3; + +mir_verify m "test::g" [f_none_ov, f_some_ov] false g_spec z3; + +mir_verify m "test::h_none" [] false h_none_spec z3; +mir_verify m "test::h_some" [] false h_some_spec z3; + +mir_verify m "test::i42" [] false i42_spec z3; +mir_verify m "test::i43" [] false i43_spec z3; +fails ( + mir_verify m "test::i43" [] false i43_bad_spec z3 +); diff --git a/intTests/test_mir_verify_enums/test.sh b/intTests/test_mir_verify_enums/test.sh new file mode 100755 index 0000000000..2315cc233c --- /dev/null +++ b/intTests/test_mir_verify_enums/test.sh @@ -0,0 +1,3 @@ +set -e + +$SAW test.saw diff --git a/saw-remote-api/CHANGELOG.md b/saw-remote-api/CHANGELOG.md index 1316e3e6ba..33b2dc02c2 100644 --- a/saw-remote-api/CHANGELOG.md +++ b/saw-remote-api/CHANGELOG.md @@ -35,6 +35,7 @@ * Add `"slice"` and `"slice range"` `setup value`s representing slices in MIR verification. Attempting to use these in LLVM or JVM verification will raise an error. +* Add `"enum"` `setup value`s representing enums in MIR verification. ## 1.0.0 -- 2023-06-26 diff --git a/saw-remote-api/python/CHANGELOG.md b/saw-remote-api/python/CHANGELOG.md index 4892e5c863..947e644e3f 100644 --- a/saw-remote-api/python/CHANGELOG.md +++ b/saw-remote-api/python/CHANGELOG.md @@ -38,6 +38,7 @@ variable. This function is currently only supported with LLVM and MIR verification, and using this function with JVM verification will raise an error. +* Add an `enum()` function for constructing MIR enum values. ## 1.0.1 -- YYYY-MM-DD diff --git a/saw-remote-api/python/saw_client/crucible.py b/saw-remote-api/python/saw_client/crucible.py index 984d79cc62..93f9827310 100644 --- a/saw-remote-api/python/saw_client/crucible.py +++ b/saw-remote-api/python/saw_client/crucible.py @@ -154,6 +154,22 @@ def to_json(self) -> JSON: 'elements': [fld.to_json() for fld in self.fields], 'MIR ADT server name': self.mir_adt.server_name if self.mir_adt is not None else None} +class EnumVal(SetupVal): + adt : MIRAdt + variant_name : str + fields : List[SetupVal] + + def __init__(self, adt : MIRAdt, variant_name : str, fields : List[SetupVal]) -> None: + self.adt = adt + self.variant_name = variant_name + self.fields = fields + + def to_json(self) -> JSON: + return {'setup value': 'enum', + 'MIR ADT server name': self.adt.server_name, + 'variant name': self.variant_name, + 'elements': [fld.to_json() for fld in self.fields]} + class TupleVal(SetupVal): fields : List[SetupVal] @@ -766,6 +782,19 @@ def elem(base: SetupVal, index: int) -> SetupVal: raise ValueError('elem expected an int, but got {index!r}') return ElemVal(base, index) +def enum(adt : MIRAdt, variant_name : str, *fields : SetupVal) -> SetupVal: + """Returns a MIR enum value (i.e., an ``EnumVal``) whose type corresponds to + the given ``adt``, whose variant corresponds to the given ``variant_name``, + and whose field values correspond to the given ``fields``. + + At present, this is only supported with MIR verification. Using this + function with LLVM or JVM verification will raise an error. + """ + for field in fields: + if not isinstance(field, SetupVal): + raise ValueError('enum expected a SetupVal, but got {field!r}') + return EnumVal(adt, variant_name, list(fields)) + def field(base : SetupVal, field_name : str) -> SetupVal: """Returns the value of struct ``base``'s field ``field_name`` (i.e., a ``FieldVal``). diff --git a/saw-remote-api/python/tests/saw/test-files/mir_enums.linked-mir.json b/saw-remote-api/python/tests/saw/test-files/mir_enums.linked-mir.json new file mode 100644 index 0000000000..d2a9e3e66c --- /dev/null +++ b/saw-remote-api/python/tests/saw/test-files/mir_enums.linked-mir.json @@ -0,0 +1 @@ +{"fns":[{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::bool"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::bool"}},"pos":"mir_enums.rs:9:8: 9:9","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::bool"}},"kind":"Copy"}}}],"terminator":{"discr":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::bool"}},"kind":"Move"},"discr_span":"mir_enums.rs:9:8: 9:9 !mir_enums.rs:9:8: 9:9","kind":"SwitchInt","pos":"mir_enums.rs:9:8: 9:9 !mir_enums.rs:9:8: 9:9","switch_ty":"ty::bool","targets":["bb2","bb1"],"values":["0"]}},"blockid":"bb0"},{"block":{"data":[{"kind":"Deinit","pos":"mir_enums.rs:10:11: 10:15"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"mir_enums.rs:10:11: 10:15","variant_index":0}],"terminator":{"args":[{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Move"}],"cleanup":null,"destination":[{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"bb3"],"from_hir_call":true,"func":{"data":{"rendered":{"kind":"zst"},"ty":"ty::FnDef::be69c9ad94113883"},"kind":"Constant"},"kind":"Call","pos":"mir_enums.rs:10:9: 10:16"}},"blockid":"bb1"},{"block":{"data":[{"kind":"Deinit","pos":"mir_enums.rs:12:11: 12:19"},{"kind":"Assign","lhs":{"data":[{"kind":"Downcast","variant":1},{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"mir_enums.rs:12:11: 12:19","rhs":{"kind":"Use","usevar":{"data":{"rendered":{"kind":"uint","size":4,"val":"42"},"ty":"ty::u32"},"kind":"Constant"}}},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"mir_enums.rs:12:11: 12:19","variant_index":1}],"terminator":{"args":[{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Move"}],"cleanup":null,"destination":[{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"bb3"],"from_hir_call":true,"func":{"data":{"rendered":{"kind":"zst"},"ty":"ty::FnDef::be69c9ad94113883"},"kind":"Constant"},"kind":"Call","pos":"mir_enums.rs:12:9: 12:20"}},"blockid":"bb2"},{"block":{"data":[],"terminator":{"kind":"Return","pos":"mir_enums.rs:14:2: 14:2"}},"blockid":"bb3"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::bool"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_4","ty":"ty::Adt::3fa7c2d95c7fce06"}]},"name":"mir_enums/284a9f79::g","return_ty":"ty::u32","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Deinit","pos":"mir_enums.rs:34:5: 34:11"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::d1797ca6daa8927f"}},"pos":"mir_enums.rs:34:5: 34:11","variant_index":1}],"terminator":{"kind":"Return","pos":"mir_enums.rs:35:2: 35:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::d1797ca6daa8927f"}]},"name":"mir_enums/284a9f79::i43","return_ty":"ty::Adt::d1797ca6daa8927f","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Deinit","pos":"mir_enums.rs:17:5: 17:9"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"mir_enums.rs:17:5: 17:9","variant_index":0}],"terminator":{"kind":"Return","pos":"mir_enums.rs:18:2: 18:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}]},"name":"mir_enums/284a9f79::h_none","return_ty":"ty::Adt::3fa7c2d95c7fce06","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Deinit","pos":"mir_enums.rs:30:5: 30:11"},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::d1797ca6daa8927f"}},"pos":"mir_enums.rs:30:5: 30:11","variant_index":0}],"terminator":{"kind":"Return","pos":"mir_enums.rs:31:2: 31:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::d1797ca6daa8927f"}]},"name":"mir_enums/284a9f79::i42","return_ty":"ty::Adt::d1797ca6daa8927f","spread_arg":null},{"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":"mir_enums.rs:21:10: 21:11","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::u32"}},"kind":"Copy"}}},{"kind":"Deinit","pos":"mir_enums.rs:21:5: 21:12"},{"kind":"Assign","lhs":{"data":[{"kind":"Downcast","variant":1},{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"mir_enums.rs:21:5: 21:12","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}},"kind":"Move"}}},{"kind":"SetDiscriminant","lvalue":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"mir_enums.rs:21:5: 21:12","variant_index":1}],"terminator":{"kind":"Return","pos":"mir_enums.rs:22:2: 22:2"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Adt::3fa7c2d95c7fce06"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::u32"}]},"name":"mir_enums/284a9f79::h_some","return_ty":"ty::Adt::3fa7c2d95c7fce06","spread_arg":null},{"abi":{"kind":"Rust"},"args":[{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::isize"}},"pos":"mir_enums.rs:2:11: 2:12","rhs":{"kind":"Discriminant","ty":"ty::isize","val":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}}}}],"terminator":{"discr":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::isize"}},"kind":"Move"},"discr_span":"mir_enums.rs:3:9: 3:16","kind":"SwitchInt","pos":"mir_enums.rs:2:5: 2:12","switch_ty":"ty::isize","targets":["bb1","bb3","bb2"],"values":["0","1"]}},"blockid":"bb0"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"mir_enums.rs:4:17: 4:19","rhs":{"kind":"Use","usevar":{"data":{"rendered":{"kind":"uint","size":4,"val":"27"},"ty":"ty::u32"},"kind":"Constant"}}}],"terminator":{"kind":"Goto","pos":"mir_enums.rs:4:17: 4:19","target":"bb4"}},"blockid":"bb1"},{"block":{"data":[],"terminator":{"kind":"Unreachable","pos":"mir_enums.rs:2:11: 2:12"}},"blockid":"bb2"},{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_3","ty":"ty::u32"}},"pos":"mir_enums.rs:3:14: 3:15","rhs":{"kind":"Use","usevar":{"data":{"data":[{"kind":"Downcast","variant":1},{"field":0,"kind":"Field","ty":"ty::u32"}],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Copy"}}},{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"}},"pos":"mir_enums.rs:3:20: 3:21","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_3","ty":"ty::u32"}},"kind":"Copy"}}}],"terminator":{"kind":"Goto","pos":"mir_enums.rs:3:20: 3:21","target":"bb4"}},"blockid":"bb3"},{"block":{"data":[],"terminator":{"kind":"Return","pos":"mir_enums.rs:6:2: 6:2"}},"blockid":"bb4"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_2","ty":"ty::isize"},{"is_zst":false,"mut":{"kind":"Not"},"name":"_3","ty":"ty::u32"}]},"name":"mir_enums/284a9f79::f","return_ty":"ty::u32","spread_arg":null},{"abi":{"kind":"Rust"},"args":[],"body":{"blocks":[{"block":{"data":[{"kind":"Assign","lhs":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::isize"}},"pos":"mir_enums.rs:25:11: 25:13","rhs":{"kind":"Use","usevar":{"data":{"rendered":{"kind":"isize","size":8,"val":"42"},"ty":"ty::isize"},"kind":"Constant"}}}],"terminator":{"kind":"Return","pos":"mir_enums.rs:25:11: 25:13"}},"blockid":"bb0"}],"vars":[{"is_zst":false,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::isize"}]},"name":"mir_enums/284a9f79::I::I42::{constant#0}","return_ty":"ty::isize","spread_arg":null}],"adts":[{"kind":{"discr_ty":"ty::isize","kind":"Enum"},"name":"mir_enums/284a9f79::I::_adtb7803c2264daf0ec[0]","orig_def_id":"mir_enums/284a9f79::I","orig_substs":[],"repr_transparent":false,"size":1,"variants":[{"ctor_kind":{"kind":"Const"},"discr":{"kind":"Explicit","name":"mir_enums/284a9f79::I::I42::{constant#0}"},"discr_value":"42","fields":[],"inhabited":true,"name":"mir_enums/284a9f79::I::I42"},{"ctor_kind":{"kind":"Const"},"discr":{"index":1,"kind":"Relative"},"discr_value":"43","fields":[],"inhabited":true,"name":"mir_enums/284a9f79::I::I43"}]},{"kind":{"discr_ty":"ty::isize","kind":"Enum"},"name":"core/73237d41::option::Option::_adtc5e93708b8ca6e2a[0]","orig_def_id":"core/73237d41::option::Option","orig_substs":["ty::u32"],"repr_transparent":false,"size":8,"variants":[{"ctor_kind":{"kind":"Const"},"discr":{"index":0,"kind":"Relative"},"discr_value":"0","fields":[],"inhabited":true,"name":"core/73237d41::option::Option::None"},{"ctor_kind":{"kind":"Fn"},"discr":{"index":1,"kind":"Relative"},"discr_value":"1","fields":[{"name":"core/73237d41::option::Option::Some::0","ty":"ty::u32"}],"inhabited":true,"name":"core/73237d41::option::Option::Some"}]}],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"mir_enums/284a9f79::g","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::g"},{"inst":{"def_id":"mir_enums/284a9f79::i43","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::i43"},{"inst":{"def_id":"mir_enums/284a9f79::h_none","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::h_none"},{"inst":{"def_id":"mir_enums/284a9f79::i42","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::i42"},{"inst":{"def_id":"mir_enums/284a9f79::h_some","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::h_some"},{"inst":{"def_id":"mir_enums/284a9f79::f","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::f"},{"inst":{"def_id":"mir_enums/284a9f79::I::I42::{constant#0}","kind":"Item","substs":[]},"name":"mir_enums/284a9f79::I::I42::{constant#0}"}],"tys":[{"name":"ty::bool","ty":{"kind":"Bool"}},{"name":"ty::u32","ty":{"kind":"Uint","uintkind":{"kind":"U32"}}},{"name":"ty::Adt::3fa7c2d95c7fce06","ty":{"kind":"Adt","name":"core/73237d41::option::Option::_adtc5e93708b8ca6e2a[0]","orig_def_id":"core/73237d41::option::Option","substs":["ty::u32"]}},{"name":"ty::FnDef::be69c9ad94113883","ty":{"defid":"mir_enums/284a9f79::f","kind":"FnDef"}},{"name":"ty::Adt::d1797ca6daa8927f","ty":{"kind":"Adt","name":"mir_enums/284a9f79::I::_adtb7803c2264daf0ec[0]","orig_def_id":"mir_enums/284a9f79::I","substs":[]}},{"name":"ty::isize","ty":{"intkind":{"kind":"Isize"},"kind":"Int"}}],"roots":["mir_enums/284a9f79::f","mir_enums/284a9f79::g","mir_enums/284a9f79::h_none","mir_enums/284a9f79::h_some","mir_enums/284a9f79::i42","mir_enums/284a9f79::i43"]} \ No newline at end of file diff --git a/saw-remote-api/python/tests/saw/test-files/mir_enums.rs b/saw-remote-api/python/tests/saw/test-files/mir_enums.rs new file mode 100644 index 0000000000..e4f25f1e2c --- /dev/null +++ b/saw-remote-api/python/tests/saw/test-files/mir_enums.rs @@ -0,0 +1,35 @@ +pub fn f(x: Option) -> u32 { + match x { + Some(x) => x, + None => 27, + } +} + +pub fn g(b: bool) -> u32 { + if b { + f(None) + } else { + f(Some(42)) + } +} + +pub fn h_none() -> Option { + None +} + +pub fn h_some(x: u32) -> Option { + Some(x) +} + +pub enum I { + I42 = 42, + I43, +} + +pub fn i42() -> I { + I::I42 +} + +pub fn i43() -> I { + I::I43 +} diff --git a/saw-remote-api/python/tests/saw/test_mir_enums.py b/saw-remote-api/python/tests/saw/test_mir_enums.py new file mode 100644 index 0000000000..490832140c --- /dev/null +++ b/saw-remote-api/python/tests/saw/test_mir_enums.py @@ -0,0 +1,136 @@ +import unittest +from pathlib import Path + +from saw_client import * +from saw_client.crucible import cry_f, enum +from saw_client.mir import Contract, MIRAdt, adt_ty, bool_ty, u32 + + +class FNoneContract(Contract): + adt: MIRAdt + + def __init__(self, adt: MIRAdt): + super().__init__() + self.adt = adt + + def specification(self) -> None: + x = enum(self.adt, 'None') + + self.execute_func(x) + + self.returns_f('27 : [32]') + + +class FSomeContract(Contract): + adt: MIRAdt + + def __init__(self, adt: MIRAdt): + super().__init__() + self.adt = adt + + def specification(self) -> None: + ret = cry_f('42 : [32]') + x = enum(self.adt, 'Some', ret) + + self.execute_func(x) + + self.returns(ret) + + +class GContract(Contract): + def specification(self) -> None: + b = self.fresh_var(bool_ty, 'b') + + self.execute_func(b) + + self.returns_f('if {b} then 27 else 42 : [32]') + + +class HNoneContract(Contract): + adt: MIRAdt + + def __init__(self, adt: MIRAdt): + super().__init__() + self.adt = adt + + def specification(self) -> None: + self.execute_func() + + self.returns(enum(self.adt, 'None')) + + +class HSomeContract(Contract): + adt: MIRAdt + + def __init__(self, adt: MIRAdt): + super().__init__() + self.adt = adt + + def specification(self) -> None: + x = self.fresh_var(u32, 'x') + + self.execute_func(x) + + self.returns(enum(self.adt, 'Some', x)) + + +class I42Contract(Contract): + adt: MIRAdt + + def __init__(self, adt: MIRAdt): + super().__init__() + self.adt = adt + + def specification(self) -> None: + self.execute_func() + + self.returns(enum(self.adt, 'I42')) + + +class I43Contract(Contract): + adt: MIRAdt + + def __init__(self, adt: MIRAdt): + super().__init__() + self.adt = adt + + def specification(self) -> None: + self.execute_func() + + self.returns(enum(self.adt, 'I43')) + + +class MIRStructsTest(unittest.TestCase): + def test_mir_points_to(self): + connect(reset_server=True) + if __name__ == "__main__": view(LogResults()) + json_name = str(Path('tests', 'saw', 'test-files', 'mir_enums.linked-mir.json')) + mod = mir_load_module(json_name) + + option_adt = mir_find_adt(mod, 'core::option::Option', u32) + i_adt = mir_find_adt(mod, "mir_enums::I") + + f_none_ov = mir_verify(mod, 'mir_enums::f', FNoneContract(option_adt)) + self.assertIs(f_none_ov.is_success(), True) + + f_some_ov = mir_verify(mod, 'mir_enums::f', FSomeContract(option_adt)) + self.assertIs(f_some_ov.is_success(), True) + + g_result = mir_verify(mod, 'mir_enums::g', GContract(), lemmas=[f_none_ov, f_some_ov]) + self.assertIs(g_result.is_success(), True) + + h_none_result = mir_verify(mod, 'mir_enums::h_none', HNoneContract(option_adt)) + self.assertIs(h_none_result.is_success(), True) + + h_some_result = mir_verify(mod, 'mir_enums::h_some', HSomeContract(option_adt)) + self.assertIs(h_some_result.is_success(), True) + + i42_result = mir_verify(mod, 'mir_enums::i42', I42Contract(i_adt)) + self.assertIs(i42_result.is_success(), True) + + i43_result = mir_verify(mod, 'mir_enums::i43', I43Contract(i_adt)) + self.assertIs(i43_result.is_success(), True) + + +if __name__ == "__main__": + unittest.main() diff --git a/saw-remote-api/src/SAWServer.hs b/saw-remote-api/src/SAWServer.hs index d7b2f2942b..76a5600590 100644 --- a/saw-remote-api/src/SAWServer.hs +++ b/saw-remote-api/src/SAWServer.hs @@ -112,6 +112,7 @@ data CrucibleSetupVal ty e -- ^ The @'Maybe' 'ServerName'@ value represents a possible MIR -- ADT. This should always be 'Just' with MIR verification and -- 'Nothing' with LLVM or JVM verification. + | EnumValue ServerName String [CrucibleSetupVal ty e] | TupleValue [CrucibleSetupVal ty e] | SliceValue (CrucibleSetupVal ty e) | SliceRangeValue (CrucibleSetupVal ty e) Int Int diff --git a/saw-remote-api/src/SAWServer/Data/SetupValue.hs b/saw-remote-api/src/SAWServer/Data/SetupValue.hs index 13ae0bedbd..04cc3f0a25 100644 --- a/saw-remote-api/src/SAWServer/Data/SetupValue.hs +++ b/saw-remote-api/src/SAWServer/Data/SetupValue.hs @@ -14,6 +14,7 @@ data SetupValTag | TagCryptol | TagArrayValue | TagStructValue + | TagEnumValue | TagTupleValue | TagSliceValue | TagSliceRangeValue @@ -34,6 +35,7 @@ instance FromJSON SetupValTag where "Cryptol" -> pure TagCryptol "array" -> pure TagArrayValue "struct" -> pure TagStructValue + "enum" -> pure TagEnumValue "tuple" -> pure TagTupleValue "slice" -> pure TagSliceValue "slice range" -> pure TagSliceRangeValue @@ -57,6 +59,7 @@ instance (FromJSON ty, FromJSON cryptolExpr) => FromJSON (CrucibleSetupVal ty cr TagCryptol -> CryptolExpr <$> o .: "expression" TagArrayValue -> ArrayValue <$> o .:? "element type" <*> o .: "elements" TagStructValue -> StructValue <$> o .:? "MIR ADT server name" <*> o .: "elements" + TagEnumValue -> EnumValue <$> o .: "MIR ADT server name" <*> o .: "variant name" <*> o .: "elements" TagTupleValue -> TupleValue <$> o .: "elements" TagSliceValue -> SliceValue <$> o .: "base" TagSliceRangeValue -> SliceRangeValue <$> o .: "base" <*> o .: "start" <*> o .: "end" diff --git a/saw-remote-api/src/SAWServer/JVMCrucibleSetup.hs b/saw-remote-api/src/SAWServer/JVMCrucibleSetup.hs index c601974f4a..b6e94c2fc4 100644 --- a/saw-remote-api/src/SAWServer/JVMCrucibleSetup.hs +++ b/saw-remote-api/src/SAWServer/JVMCrucibleSetup.hs @@ -184,6 +184,8 @@ compileJVMContract fileReader bic cenv0 c = JVMSetupM $ fail "Array setup values unsupported in JVM API." getSetupVal _ (StructValue _ _) = JVMSetupM $ fail "Struct setup values unsupported in JVM API." + getSetupVal _ (EnumValue _ _ _) = + JVMSetupM $ fail "Enum setup values unsupported in JVM API." getSetupVal _ (TupleValue _) = JVMSetupM $ fail "Tuple setup values unsupported in JVM API." getSetupVal _ (SliceValue _) = diff --git a/saw-remote-api/src/SAWServer/LLVMCrucibleSetup.hs b/saw-remote-api/src/SAWServer/LLVMCrucibleSetup.hs index 6b05fe1d65..c091d0f029 100644 --- a/saw-remote-api/src/SAWServer/LLVMCrucibleSetup.hs +++ b/saw-remote-api/src/SAWServer/LLVMCrucibleSetup.hs @@ -190,6 +190,8 @@ compileLLVMContract fileReader bic ghostEnv cenv0 c = LLVMCrucibleSetupM $ fail "Tuple setup values unsupported in the LLVM API." getSetupVal _ (SliceValue _) = LLVMCrucibleSetupM $ fail "Slice setup values unsupported in the LLVM API." + getSetupVal _ (EnumValue _ _ _) = + LLVMCrucibleSetupM $ fail "Enum setup values unsupported in the LLVM API." getSetupVal _ (SliceRangeValue _ _ _) = LLVMCrucibleSetupM $ fail "Slice range setup values unsupported in the LLVM API." getSetupVal env (FieldLValue base fld) = diff --git a/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs b/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs index a1ce2f07d3..62e31fce5e 100644 --- a/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs +++ b/saw-remote-api/src/SAWServer/MIRCrucibleSetup.hs @@ -19,6 +19,7 @@ import Data.Map (Map) import qualified Data.Map as Map import Mir.Intrinsics (MIR) +import qualified Mir.Mir as Mir import qualified Cryptol.Parser.AST as P import Cryptol.Utils.Ident (mkIdent) @@ -30,6 +31,7 @@ import SAWScript.Crucible.MIR.Builtins mir_alloc_mut, mir_fresh_expanded_value, mir_fresh_var, + mir_enum_value, mir_execute_func, mir_load_module, mir_points_to, @@ -188,14 +190,14 @@ compileMIRContract fileReader bic cenv0 sawenv c = return $ MS.SetupArray ty' (elt':eltss') getSetupVal _ (StructValue Nothing _) = MIRSetupM $ fail "MIR struct without a corresponding ADT." - getSetupVal env (StructValue (Just adtServerName) elts) = - -- First, we look up the MIR ADT from its ServerName. If we find it, - -- proceed to handle the struct field types. Otherwise, raise an error. - case getMIRAdtEither sawenv adtServerName of - Left ex -> throw ex - Right adt -> do - elts' <- mapM (getSetupVal env) elts - pure $ MS.SetupStruct adt elts' + getSetupVal env (StructValue (Just adtServerName) elts) = do + adt <- getMirAdt adtServerName + elts' <- mapM (getSetupVal env) elts + pure $ MS.SetupStruct adt elts' + getSetupVal env (EnumValue adtServerName variantName elts) = do + adt <- getMirAdt adtServerName + elts' <- mapM (getSetupVal env) elts + MIRSetupM $ mir_enum_value adt variantName elts' getSetupVal env (TupleValue elems) = do elems' <- mapM (getSetupVal env) elems pure $ MS.SetupTuple () elems' @@ -221,6 +223,10 @@ compileMIRContract fileReader bic cenv0 sawenv c = getSetupVal _ (ElementLValue _ _) = MIRSetupM $ fail "Element l-values unsupported in the MIR API." + getMirAdt :: ServerName -> MIRSetupM Mir.Adt + getMirAdt adtServerName = + either throw pure $ getMIRAdtEither sawenv adtServerName + data MIRLoadModuleParams = MIRLoadModuleParams ServerName FilePath diff --git a/saw-script.cabal b/saw-script.cabal index 2b52c55716..7804376543 100644 --- a/saw-script.cabal +++ b/saw-script.cabal @@ -54,6 +54,7 @@ library , haskeline , heapster-saw , hobbits >= 1.3.1 + , indexed-traversable , galois-dwarf >= 0.2.2 , IfElse , jvm-parser diff --git a/src/SAWScript/Crucible/Common/MethodSpec.hs b/src/SAWScript/Crucible/Common/MethodSpec.hs index e8ce39d657..e198622d5e 100644 --- a/src/SAWScript/Crucible/Common/MethodSpec.hs +++ b/src/SAWScript/Crucible/Common/MethodSpec.hs @@ -142,7 +142,8 @@ import Verifier.SAW.SharedTerm as SAWVerifier import SAWScript.Crucible.Common.Setup.Value import SAWScript.Crucible.LLVM.Setup.Value (LLVM) import SAWScript.Crucible.JVM.Setup.Value () -import SAWScript.Crucible.MIR.Setup.Value (MirSetupSlice(..)) +import SAWScript.Crucible.MIR.Setup.Value + (MirSetupEnum(..), MirSetupSlice(..)) import SAWScript.Options import SAWScript.Prover.SolverStats import SAWScript.Utils (bullets) @@ -196,6 +197,14 @@ ppSetupValue setupval = case setupval of absurd empty (MIRExt, _defId) -> ppSetupStructDefault vs + SetupEnum x -> + case (ext, x) of + (LLVMExt, empty) -> + absurd empty + (JVMExt, empty) -> + absurd empty + (MIRExt, enum_) -> + ppMirSetupEnum enum_ SetupTuple x vs -> case (ext, x) of (LLVMExt, empty) -> @@ -242,12 +251,18 @@ ppSetupValue setupval = case setupval of | packed = PP.angles (ppSetupStructDefault vs) | otherwise = ppSetupStructDefault vs - ppSetupStructDefault :: [SetupValue ext] -> PP.Doc ann + ppSetupStructDefault :: forall ext'. IsExt ext' => [SetupValue ext'] -> PP.Doc ann ppSetupStructDefault vs = PP.braces (commaList (map ppSetupValue vs)) ppSetupTuple :: [SetupValue MIR] -> PP.Doc ann ppSetupTuple vs = PP.parens (commaList (map ppSetupValue vs)) + ppMirSetupEnum :: MirSetupEnum -> PP.Doc ann + ppMirSetupEnum (MirSetupEnumVariant _defId variantName _discr _varIdx fields) = + PP.pretty variantName PP.<+> ppSetupStructDefault fields + ppMirSetupEnum (MirSetupEnumSymbolic _defId) = + PP.pretty "" + ppMirSetupSlice :: MirSetupSlice -> PP.Doc ann ppMirSetupSlice (MirSetupSliceRaw ref len) = PP.pretty "SliceRaw" <> ppSetupTuple [ref, len] diff --git a/src/SAWScript/Crucible/Common/Setup/Value.hs b/src/SAWScript/Crucible/Common/Setup/Value.hs index 505acce1c9..fca67f5fd3 100644 --- a/src/SAWScript/Crucible/Common/Setup/Value.hs +++ b/src/SAWScript/Crucible/Common/Setup/Value.hs @@ -38,6 +38,7 @@ module SAWScript.Crucible.Common.Setup.Value , XSetupNull , XSetupStruct + , XSetupEnum , XSetupTuple , XSetupSlice , XSetupArray @@ -123,6 +124,7 @@ type family ResolvedState ext :: Type type family XSetupNull ext type family XSetupStruct ext +type family XSetupEnum ext type family XSetupTuple ext type family XSetupSlice ext type family XSetupArray ext @@ -153,6 +155,9 @@ data SetupValue ext where -- | A slice value. At the moment, this is only ever used for MIR -- verification. SetupSlice :: XSetupSlice ext -> SetupValue ext + -- | An enumeration value. At the moment, this is only ever used for MIR + -- verification. + SetupEnum :: XSetupEnum ext -> SetupValue ext -- | A pointer to a global variable SetupGlobal :: XSetupGlobal ext -> String -> SetupValue ext @@ -168,6 +173,7 @@ data SetupValue ext where type SetupValueHas (c :: Type -> Constraint) ext = ( c (XSetupNull ext) , c (XSetupStruct ext) + , c (XSetupEnum ext) , c (XSetupTuple ext) , c (XSetupSlice ext) , c (XSetupArray ext) diff --git a/src/SAWScript/Crucible/JVM/Override.hs b/src/SAWScript/Crucible/JVM/Override.hs index 258249647c..fb0ff1e0ef 100644 --- a/src/SAWScript/Crucible/JVM/Override.hs +++ b/src/SAWScript/Crucible/JVM/Override.hs @@ -560,6 +560,7 @@ matchArg opts sc cc cs prepost md actual@(RVal ref) expectedTy setupval = addAssert p md (Crucible.SimError (cs ^. MS.csLoc) (Crucible.AssertFailureSimError ("null-equality " ++ MS.stateCond prepost) "")) MS.SetupGlobal empty _ -> absurd empty + MS.SetupEnum empty -> absurd empty MS.SetupTuple empty _ -> absurd empty MS.SetupSlice empty -> absurd empty @@ -952,6 +953,7 @@ instantiateSetupValue sc s v = MS.SetupNull () -> return v MS.SetupGlobal empty _ -> absurd empty MS.SetupStruct empty _ -> absurd empty + MS.SetupEnum empty -> absurd empty MS.SetupTuple empty _ -> absurd empty MS.SetupSlice empty -> absurd empty MS.SetupArray empty _ -> absurd empty diff --git a/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs b/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs index 9364b7716c..98f38a0d14 100644 --- a/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs +++ b/src/SAWScript/Crucible/JVM/ResolveSetupValue.hs @@ -140,6 +140,7 @@ typeOfSetupValue _cc env _nameEnv val = return (J.ClassType (J.mkClassName "java/lang/Object")) MS.SetupGlobal empty _ -> absurd empty MS.SetupStruct empty _ -> absurd empty + MS.SetupEnum empty -> absurd empty MS.SetupTuple empty _ -> absurd empty MS.SetupSlice empty -> absurd empty MS.SetupArray empty _ -> absurd empty @@ -173,6 +174,7 @@ resolveSetupVal cc env _tyenv _nameEnv val = return (RVal (W4.maybePartExpr sym Nothing)) MS.SetupGlobal empty _ -> absurd empty MS.SetupStruct empty _ -> absurd empty + MS.SetupEnum empty -> absurd empty MS.SetupTuple empty _ -> absurd empty MS.SetupSlice empty -> absurd empty MS.SetupArray empty _ -> absurd empty diff --git a/src/SAWScript/Crucible/JVM/Setup/Value.hs b/src/SAWScript/Crucible/JVM/Setup/Value.hs index 8286704750..ba50ba6dee 100644 --- a/src/SAWScript/Crucible/JVM/Setup/Value.hs +++ b/src/SAWScript/Crucible/JVM/Setup/Value.hs @@ -78,6 +78,7 @@ import qualified SAWScript.Crucible.Common.Setup.Value as MS type instance MS.XSetupNull CJ.JVM = () type instance MS.XSetupGlobal CJ.JVM = Void type instance MS.XSetupStruct CJ.JVM = Void +type instance MS.XSetupEnum CJ.JVM = Void type instance MS.XSetupTuple CJ.JVM = Void type instance MS.XSetupSlice CJ.JVM = Void type instance MS.XSetupArray CJ.JVM = Void diff --git a/src/SAWScript/Crucible/LLVM/Override.hs b/src/SAWScript/Crucible/LLVM/Override.hs index f28768f11b..8718a712a7 100644 --- a/src/SAWScript/Crucible/LLVM/Override.hs +++ b/src/SAWScript/Crucible/LLVM/Override.hs @@ -1010,6 +1010,7 @@ matchPointsTos opts sc cc spec prepost = go False [] case v of SetupVar i -> Set.singleton i SetupStruct _ xs -> foldMap setupVars xs + SetupEnum empty -> absurd empty SetupTuple empty _ -> absurd empty SetupSlice empty -> absurd empty SetupArray _ xs -> foldMap setupVars xs @@ -1193,6 +1194,8 @@ matchArg opts sc cc cs prepost md actual expectedTy expected = (V.toList (Crucible.fiType <$> Crucible.siFields fields)) zs ] + (_, _, SetupEnum empty) -> + absurd empty (_, _, SetupTuple empty _) -> absurd empty (_, _, SetupSlice empty) -> @@ -2380,6 +2383,7 @@ instantiateSetupValue sc s v = SetupNull{} -> return v SetupGlobal{} -> return v SetupGlobalInitializer{} -> return v + SetupEnum empty -> absurd empty SetupTuple empty _ -> absurd empty SetupSlice empty -> absurd empty where diff --git a/src/SAWScript/Crucible/LLVM/ResolveSetupValue.hs b/src/SAWScript/Crucible/LLVM/ResolveSetupValue.hs index 84b29b9784..b5fd1bdbf6 100644 --- a/src/SAWScript/Crucible/LLVM/ResolveSetupValue.hs +++ b/src/SAWScript/Crucible/LLVM/ResolveSetupValue.hs @@ -451,6 +451,8 @@ typeOfSetupValue cc env nameEnv val = let si = Crucible.mkStructInfo dl packed memTys return (Crucible.StructType si) + SetupEnum empty -> + absurd empty SetupTuple empty _ -> absurd empty SetupSlice empty -> @@ -632,6 +634,8 @@ resolveSetupVal cc mem env tyenv nameEnv val = Crucible.Struct v -> v _ -> error "impossible" return $ Crucible.LLVMValStruct (V.zip flds (V.fromList vals)) + SetupEnum empty -> + absurd empty SetupTuple empty _ -> absurd empty SetupSlice empty -> diff --git a/src/SAWScript/Crucible/LLVM/Setup/Value.hs b/src/SAWScript/Crucible/LLVM/Setup/Value.hs index ac5baba510..55b2abc27c 100644 --- a/src/SAWScript/Crucible/LLVM/Setup/Value.hs +++ b/src/SAWScript/Crucible/LLVM/Setup/Value.hs @@ -120,6 +120,7 @@ data LLVM (arch :: CL.LLVMArch) type instance Setup.XSetupNull (LLVM _) = () -- 'True' if this is an LLVM packed struct, 'False' otherwise. type instance Setup.XSetupStruct (LLVM _) = Bool +type instance Setup.XSetupEnum (LLVM _) = Void type instance Setup.XSetupTuple (LLVM _) = Void type instance Setup.XSetupSlice (LLVM _) = Void type instance Setup.XSetupArray (LLVM _) = () diff --git a/src/SAWScript/Crucible/MIR/Builtins.hs b/src/SAWScript/Crucible/MIR/Builtins.hs index 341e6dac0c..deb53ff676 100644 --- a/src/SAWScript/Crucible/MIR/Builtins.hs +++ b/src/SAWScript/Crucible/MIR/Builtins.hs @@ -25,6 +25,8 @@ module SAWScript.Crucible.MIR.Builtins , mir_return , mir_unsafe_assume_spec , mir_verify + -- ** MIR enums + , mir_enum_value -- ** MIR slices , mir_slice_value , mir_slice_range_value @@ -63,8 +65,9 @@ import Control.Monad.State (MonadState(..), StateT(..), execStateT, gets) import Control.Monad.Trans.Class (MonadTrans(..)) import qualified Data.ByteString.Lazy as BSL import Data.Foldable (for_) +import qualified Data.Foldable.WithIndex as FWI import Data.IORef -import qualified Data.List as List (find) +import qualified Data.List.Extra as List (find, unsnoc) import qualified Data.List.NonEmpty as NE import Data.List.NonEmpty (NonEmpty(..)) import qualified Data.Map as Map @@ -328,6 +331,23 @@ constructExpandedSetupValue cc sc = go adt_not_found_panic "StructShape" adtName _ -> non_adt_type_panic "StructShape" ty + EnumShape ty _ _ _ -> + case ty of + Mir.TyAdt adtName _ _ -> + case col ^. Mir.adts . at adtName of + Just adt@(Mir.Adt _ kind _ _ _ _ _) -> + case kind of + Mir.Enum _ -> + pure $ MS.SetupEnum $ MirSetupEnumSymbolic adt + _ -> + panic "constructExpandedSetupValue" + [ "Expected enum, encountered " ++ + show kind + ] + Nothing -> + adt_not_found_panic "EnumShape" adtName + _ -> + non_adt_type_panic "EnumShape" ty TransparentShape ty shp' -> case ty of Mir.TyAdt adtName _ _ -> do @@ -338,7 +358,7 @@ constructExpandedSetupValue cc sc = go val <- go pfx shp' pure $ MS.SetupStruct adt [val] Mir.Enum{} -> - fail "`repr(transparent)` enums not currently supported" + pure $ MS.SetupEnum $ MirSetupEnumSymbolic adt Mir.Union -> panic "constructExpandedSetupValue" [ "Unexpected `repr(transparent)` union:" @@ -587,6 +607,58 @@ mir_verify rm nm lemmas checkSat setup tactic = ps <- io (MS.mkProvedSpec MS.SpecProved methodSpec stats vcstats lemmaSet diff) returnProof ps +----- +-- MIR enums +----- + +-- | Construct a specific enum variant. This does a light amount of validity +-- checking, which is the only reason that this function is monadic. +mir_enum_value :: + X.MonadThrow m => + Mir.Adt -> + String -> + [MS.SetupValue MIR] -> + m (MS.SetupValue MIR) +mir_enum_value adt variantNm vs = + -- MIRSetupM $ + case adt of + Mir.Adt adtNm (Mir.Enum _) variants _ _ _ _ -> do + (variantIdx, variant) <- + case FWI.ifind (\_ v -> variantDefIdMatches (v ^. Mir.vname)) variants of + Just iv -> + pure iv + Nothing -> + X.throwM $ MIREnumValueVariantNotFound adtNm variantNm + discr <- + case variant ^. Mir.discrval of + Just discr -> pure discr + Nothing -> + panic "mir_enum_value" + [ "discrval not set for variant:" + , show (variant ^. Mir.vname) + ] + pure $ MS.SetupEnum $ MirSetupEnumVariant adt variant discr variantIdx vs + Mir.Adt adtNm Mir.Struct _ _ _ _ _ -> + X.throwM $ MIREnumValueNonEnum adtNm "struct" + Mir.Adt adtNm Mir.Union _ _ _ _ _ -> + X.throwM $ MIREnumValueNonEnum adtNm "union" + where + variantNmText :: Text + variantNmText = Text.pack variantNm + + -- Check if the user-supplied String argument matches the name of the given + -- variant's DefId. For instance, the variant might be named + -- @core::option[0]::Option[0]::Some[0]@, but the user will simply write + -- @Some@, so this function decomposes the DefId to retrieve the @Some@ + -- portion. + variantDefIdMatches :: Mir.DefId -> Bool + variantDefIdMatches variantDefId + | Just (_, (variantNmText', _idx)) <- List.unsnoc (variantDefId ^. Mir.didPath) + = variantNmText == variantNmText' + + | otherwise + = False + ----- -- MIR slices ----- @@ -1363,6 +1435,8 @@ data MIRSetupError | MIRArgNumberWrong Int Int -- number expected, number found | MIRReturnUnexpected Mir.Ty -- found | MIRReturnTypeMismatch Mir.Ty Mir.Ty -- expected, found + | MIREnumValueVariantNotFound Mir.DefId String + | MIREnumValueNonEnum Mir.DefId String -- The String is either \"struct\" or \"union\" instance X.Exception MIRSetupError where toException = topLevelExceptionToException @@ -1400,3 +1474,13 @@ instance Show MIRSetupError where , "Expected type: " ++ show (PP.pretty expected) , "Given type: " ++ show (PP.pretty found) ] + MIREnumValueVariantNotFound adtNm variantNm -> + unlines + [ "mir_enum_value: Could not find a variant named `" ++ variantNm ++ "`" + , "in the enum " ++ show adtNm + ] + MIREnumValueNonEnum adtNm what -> + unlines + [ "mir_enum_value: Expected enum, received " ++ what + , show adtNm + ] diff --git a/src/SAWScript/Crucible/MIR/MethodSpecIR.hs b/src/SAWScript/Crucible/MIR/MethodSpecIR.hs index b66b3cc02a..ea4480c1e4 100644 --- a/src/SAWScript/Crucible/MIR/MethodSpecIR.hs +++ b/src/SAWScript/Crucible/MIR/MethodSpecIR.hs @@ -47,6 +47,9 @@ module SAWScript.Crucible.MIR.MethodSpecIR -- * @MIRMethodSpec@ , MIRMethodSpec + -- * @MirSetupEnum@ + , MirSetupEnum(..) + -- * @MirSetupSlice@ , MirSetupSlice(..) diff --git a/src/SAWScript/Crucible/MIR/Override.hs b/src/SAWScript/Crucible/MIR/Override.hs index bea3d78edf..980dc5a3fa 100644 --- a/src/SAWScript/Crucible/MIR/Override.hs +++ b/src/SAWScript/Crucible/MIR/Override.hs @@ -67,6 +67,7 @@ import qualified Mir.TransTy as Mir import qualified What4.Expr as W4 import qualified What4.Interface as W4 import qualified What4.LabeledPred as W4 +import qualified What4.Partial as W4 import qualified What4.ProgramLoc as W4 import Verifier.SAW.Prelude (scEq) @@ -905,6 +906,7 @@ instantiateSetupValue sc s v = MS.SetupTerm tt -> MS.SetupTerm <$> doTerm tt MS.SetupArray elemTy vs -> MS.SetupArray elemTy <$> mapM (instantiateSetupValue sc s) vs MS.SetupStruct did vs -> MS.SetupStruct did <$> mapM (instantiateSetupValue sc s) vs + MS.SetupEnum enum_ -> MS.SetupEnum <$> instantiateSetupEnum enum_ MS.SetupTuple x vs -> MS.SetupTuple x <$> mapM (instantiateSetupValue sc s) vs MS.SetupSlice slice -> MS.SetupSlice <$> instantiateSetupSlice slice MS.SetupNull empty -> absurd empty @@ -917,6 +919,13 @@ instantiateSetupValue sc s v = where doTerm (TypedTerm schema t) = TypedTerm schema <$> scInstantiateExt sc s t + instantiateSetupEnum :: MirSetupEnum -> IO MirSetupEnum + instantiateSetupEnum (MirSetupEnumVariant adt variant discr variantIdx vs) = + MirSetupEnumVariant adt variant discr variantIdx <$> + mapM (instantiateSetupValue sc s) vs + instantiateSetupEnum v'@(MirSetupEnumSymbolic _adt) = + return v' + instantiateSetupSlice :: MirSetupSlice -> IO MirSetupSlice instantiateSetupSlice (MirSetupSliceRaw ref len) = MirSetupSliceRaw @@ -1032,6 +1041,7 @@ learnSetupCondition _opts _ _ _ _ (MS.SetupCond_Ghost empty _ _ _) = absurd empt -- | Match the value of a function argument with a symbolic 'SetupValue'. matchArg :: + forall w. Options {- ^ saw script print out opts -} -> SharedContext {- ^ context for constructing SAW terms -} -> MIRCrucibleContext {- ^ context for interacting with Crucible -} -> @@ -1082,40 +1092,77 @@ matchArg opts sc cc cs prepost md actual expectedTy expected = (MIRVal (StructShape _ _ xsFldShps) (Crucible.AnyValue tpr@(Crucible.StructRepr _) xs), Mir.TyAdt _ _ _, MS.SetupStruct adt zs) - | Ctx.sizeInt (Ctx.size xs) == length zs - , let xsTpr = Crucible.StructRepr (FC.fmapFC fieldShapeType xsFldShps) + | let xsTpr = Crucible.StructRepr (FC.fmapFC fieldShapeType xsFldShps) , Just Refl <- W4.testEquality tpr xsTpr -> case adt of - Mir.Adt _ Mir.Struct [v] _ _ _ _ -> - let ys = v ^.. Mir.vfields . each . Mir.fty in - sequence_ - [ case xFldShp of - ReqField shp -> - matchArg opts sc cc cs prepost md (MIRVal shp x) y z - OptField shp -> do - let x' = readMaybeType sym "field" (shapeType shp) x - matchArg opts sc cc cs prepost md (MIRVal shp x') y z - | (Some (Functor.Pair xFldShp (Crucible.RV x)), y, z) <- - zip3 (FC.toListFC Some (Ctx.zipWith Functor.Pair xsFldShps xs)) - ys - zs ] - Mir.Adt _ ak _ _ _ _ _ -> - panic "matchArg" ["AdtKind " ++ show ak ++ " not yet implemented"] + Mir.Adt nm Mir.Struct variants _ _ _ _ -> do + variant <- + case variants of + [variant] -> + pure variant + _ -> + panic "matchArg" + [ "Encountered struct Adt with " ++ + show (length variants) ++ + " variants:" + , show nm + ] + let ys = variant ^.. Mir.vfields . each . Mir.fty + matchFields sym xsFldShps xs ys zs + Mir.Adt nm (Mir.Enum _) _ _ _ _ _ -> + panic "matchArg" + [ "Expected struct type, received enum:" + , show nm + ] + Mir.Adt nm Mir.Union _ _ _ _ _ -> + panic "matchArg" + [ "Expected struct type, received union:" + , show nm + ] + + (MIRVal (EnumShape _ variantShps _ discrShp) + (Crucible.AnyValue + (Mir.RustEnumRepr discrTpr variantCtx) + (Ctx.Empty + Ctx.:> Crucible.RV actualDiscr + Ctx.:> Crucible.RV variantAssn)), + _, + MS.SetupEnum enum_) + | Just Refl <- W4.testEquality (shapeType discrShp) discrTpr + , Just Refl <- W4.testEquality (FC.fmapFC variantShapeType variantShps) variantCtx -> + case enum_ of + -- match the fields of a particular enum variant point-wise + MirSetupEnumVariant adt variant discr variantIdxInt zs -> do + Some variantIdx <- pure $ + variantIntIndex (adt ^. Mir.adtname) variantIdxInt (Ctx.size variantAssn) + VariantShape _ xsFldShps <- pure $ variantShps Ctx.! variantIdx + let Crucible.VB expectedVariant = variantAssn Ctx.! variantIdx + let ys = variant ^.. Mir.vfields . each . Mir.fty + + -- Ensure that the discriminant values match. + IsBVShape _ discrW <- pure $ testDiscriminantIsBV discrShp + expectedDiscr <- liftIO $ + W4.bvLit sym discrW $ BV.mkBV discrW discr + discrEq <- liftIO $ + W4.bvEq sym expectedDiscr actualDiscr + addAssert discrEq md =<< notEq + + -- Ensure that the variant is defined, i.e., that the predicate in + -- the underlying PartialExpr holds. + (xsPred, xs) <- + case expectedVariant of + W4.PE xsPred xs -> pure (xsPred, xs) + W4.Unassigned -> fail_ + addAssert xsPred md =<< notEq + + -- Finally, ensure that the fields match point-wise. + matchFields sym xsFldShps xs ys zs + MirSetupEnumSymbolic{} -> + error "TODO RGS: Symbolic enums" -- match the fields of a tuple point-wise (MIRVal (TupleShape _ _ xsFldShps) xs, Mir.TyTuple ys, MS.SetupTuple () zs) -> - sequence_ - [ case xFldShp of - ReqField shp -> - matchArg opts sc cc cs prepost md (MIRVal shp x) y z - OptField shp -> do - let x' = readMaybeType sym "field" (shapeType shp) x - matchArg opts sc cc cs prepost md (MIRVal shp x') y z - | (Some (Functor.Pair xFldShp (Crucible.RV x)), y, z) <- - zip3 (FC.toListFC Some (Ctx.zipWith Functor.Pair xsFldShps xs)) - ys - zs - ] + matchFields sym xsFldShps xs ys zs -- Match the parts of a slice point-wise (MIRVal (SliceShape _ actualElemTy actualMutbl actualElemTpr) @@ -1190,8 +1237,36 @@ matchArg opts sc cc cs prepost md actual expectedTy expected = nameEnv = MS.csTypeNames cs loc = MS.conditionLoc md + + fail_ :: OverrideMatcher MIR w a fail_ = failure loc =<< mkStructuralMismatch opts cc sc cs actual expected expectedTy + + -- Match the fields (point-wise) in a tuple, a struct, or enum variant. + matchFields :: + Sym -> + Ctx.Assignment FieldShape ctx -> + Ctx.Assignment (Crucible.RegValue' Sym) ctx -> + [Mir.Ty] -> + [SetupValue] -> + OverrideMatcher MIR w () + matchFields sym xsFldShps xs ys zs = do + -- As a sanity check, first ensure that the number of fields matches + -- what is expected. + unless (Ctx.sizeInt (Ctx.size xs) == length zs) fail_ + -- Then match the fields point-wise. + sequence_ + [ case xFldShp of + ReqField shp -> + matchArg opts sc cc cs prepost md (MIRVal shp x) y z + OptField shp -> do + let x' = readMaybeType sym "field" (shapeType shp) x + matchArg opts sc cc cs prepost md (MIRVal shp x') y z + | (Some (Functor.Pair xFldShp (Crucible.RV x)), y, z) <- + zip3 (FC.toListFC Some (Ctx.zipWith Functor.Pair xsFldShps xs)) + ys + zs ] + notEq = notEqual prepost opts loc cc sc cs expected actual iTypes :: Crucible.IntrinsicTypes Sym @@ -1251,6 +1326,7 @@ matchPointsTos opts sc cc spec prepost = go False [] case v of MS.SetupVar i -> Set.singleton i MS.SetupStruct _ xs -> foldMap setupVars xs + MS.SetupEnum enum_ -> setupEnum enum_ MS.SetupTuple _ xs -> foldMap setupVars xs MS.SetupSlice slice -> setupSlice slice MS.SetupArray _ xs -> foldMap setupVars xs @@ -1263,6 +1339,13 @@ matchPointsTos opts sc cc spec prepost = go False [] MS.SetupUnion empty _ _ -> absurd empty MS.SetupNull empty -> absurd empty + -- Compute the set of variable identifiers in a 'MirSetupEnum' + setupEnum :: MirSetupEnum -> Set AllocIndex + setupEnum (MirSetupEnumVariant _ _ _ _ xs) = + foldMap setupVars xs + setupEnum (MirSetupEnumSymbolic _) = + Set.empty + -- Compute the set of variable identifiers in a 'MirSetupSlice' setupSlice :: MirSetupSlice -> Set AllocIndex setupSlice (MirSetupSliceRaw ref len) = diff --git a/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs b/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs index 1426e62f02..2993253f5e 100644 --- a/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs +++ b/src/SAWScript/Crucible/MIR/ResolveSetupValue.hs @@ -29,10 +29,15 @@ module SAWScript.Crucible.MIR.ResolveSetupValue , mirAdtToTy , findDefId , findDefIdEither + -- * Static items , findStatic , findStaticInitializer , findStaticVar , staticRefMux + -- * Enum discriminants + , testDiscriminantIsBV + , variantIntIndex + -- * Types of errors , MIRTypeOfError(..) ) where @@ -45,6 +50,7 @@ import qualified Data.BitVector.Sized as BV import qualified Data.Foldable as F import qualified Data.Functor.Product as Functor import Data.Kind (Type) +import qualified Data.List.Extra as List (firstJust) import Data.List.NonEmpty (NonEmpty(..)) import Data.Map (Map) import qualified Data.Map as Map @@ -67,7 +73,9 @@ import qualified Cryptol.TypeCheck.AST as Cryptol (Type, Schema(..)) import qualified Cryptol.Utils.PP as Cryptol (pp) import Lang.Crucible.Backend (IsSymInterface) import Lang.Crucible.Simulator - ( AnyValue(..), GlobalVar(..), RegValue, RegValue'(..), SymGlobalState ) + ( AnyValue(..), GlobalVar(..), RegValue, RegValue'(..), SymGlobalState + , VariantBranch(..), injectVariant + ) import Lang.Crucible.Types (MaybeType, TypeRepr(..)) import qualified Mir.DefId as Mir import qualified Mir.FancyMuxTree as Mir @@ -115,7 +123,7 @@ ppMIRVal sym (MIRVal shp val) = PrimShape _ _ -> W4.printSymExpr val TupleShape _ _ fldShp -> - PP.parens $ prettyStructOrTuple fldShp val + PP.parens $ prettyAdtOrTuple fldShp val ArrayShape _ _ shp' -> case val of Mir.MirVector_Vector vec -> @@ -130,10 +138,22 @@ ppMIRVal sym (MIRVal shp val) = StructShape _ _ fldShp | AnyValue (StructRepr fldTpr) fldVals <- val , Just Refl <- W4.testEquality (FC.fmapFC fieldShapeType fldShp) fldTpr - -> PP.braces $ prettyStructOrTuple fldShp fldVals + -> PP.braces $ prettyAdtOrTuple fldShp fldVals | otherwise -> error "Malformed MIRVal struct" + EnumShape _ variantShps _ _ + | AnyValue (Mir.RustEnumRepr _ variantCtx) + (Ctx.Empty Ctx.:> RV _ Ctx.:> RV variants) <- val + , Just Refl <- W4.testEquality (FC.fmapFC variantShapeType variantShps) variantCtx + -> case firstConcreteVariant variantShps variants of + Just (Some (Functor.Pair fldShps fldVals)) -> + PP.braces $ prettyAdtOrTuple fldShps fldVals + Nothing -> + "" + + | otherwise + -> error "Malformed MIRVal enum" TransparentShape _ shp' -> ppMIRVal sym $ MIRVal shp' val RefShape _ _ _ _ -> @@ -147,12 +167,35 @@ ppMIRVal sym (MIRVal shp val) = commaList [] = PP.emptyDoc commaList (x:xs) = x PP.<> PP.hcat (map (\y -> PP.comma PP.<+> y) xs) - prettyStructOrTuple :: + -- Return Just the first VariantBranch whose predicate is concretely equal + -- to True. If none of the VariantBranches satisfy this property, then + -- return Nothing. + firstConcreteVariant :: + Ctx.Assignment VariantShape ctx -> + Ctx.Assignment (VariantBranch Sym) ctx -> + Maybe (Some (Functor.Product + (Ctx.Assignment FieldShape) + (Ctx.Assignment (RegValue' Sym)))) + firstConcreteVariant variantShapes variantBranches = + List.firstJust + (\(Some (Functor.Pair (VariantShape _ fldShps) (VB branch))) -> + case branch of + W4.PE fldPred fldVals + | W4.asConstantPred fldPred == Just True + -> Just $ Some $ Functor.Pair fldShps fldVals + | otherwise + -> Nothing + W4.Unassigned -> + Nothing) $ + FC.toListFC Some $ + Ctx.zipWith Functor.Pair variantShapes variantBranches + + prettyAdtOrTuple :: forall ctx. Ctx.Assignment FieldShape ctx -> Ctx.Assignment (RegValue' Sym) ctx -> PP.Doc ann - prettyStructOrTuple fldShp fldVals = + prettyAdtOrTuple fldShp fldVals = commaList $ map (\(Some (Functor.Pair shp' (RV v))) -> prettyField shp' v) $ FC.toListFC Some $ @@ -245,6 +288,12 @@ typeOfSetupValue mcc env nameEnv val = pure $ Mir.TyArray elemTy (length vs) MS.SetupStruct adt _ -> pure $ mirAdtToTy adt + MS.SetupEnum enum_ -> + case enum_ of + MirSetupEnumVariant adt _ _ _ _ -> + pure $ mirAdtToTy adt + MirSetupEnumSymbolic adt -> + pure $ mirAdtToTy adt MS.SetupTuple () vals -> do tys <- traverse (typeOfSetupValue mcc env nameEnv) vals pure $ Mir.TyTuple tys @@ -312,48 +361,133 @@ resolveSetupVal mcc env tyenv nameEnv val = MS.SetupStruct adt flds -> case adt of _ | adt ^. Mir.adtReprTransparent, - [fld] <- flds -> do - MIRVal shp fld' <- resolveSetupVal mcc env tyenv nameEnv fld - pure $ MIRVal (TransparentShape (mirAdtToTy adt) shp) fld' - Mir.Adt nm Mir.Struct [variant] _ _ _ _ -> do + [fld] <- flds -> + resolveTransparentSetupVal adt fld + Mir.Adt nm Mir.Struct variants _ _ _ _ -> do + -- First, retrieve the struct variant. + variant <- + case variants of + [variant] -> + pure variant + _ -> + panic "resolveSetupVal" + [ "Encountered struct Adt with " ++ + show (length variants) ++ + " variants:" + , show nm + ] + + -- Next, resolve the field values and check that they have the + -- expected types. flds' <- traverse (resolveSetupVal mcc env tyenv nameEnv) flds let expectedFlds = variant ^. Mir.vfields - let expectedFldsNum = length expectedFlds let actualFldTys = map (\(MIRVal shp _) -> shapeMirTy shp) flds' - let actualFldsNum = length actualFldTys - unless (expectedFldsNum == actualFldsNum) $ - fail $ unlines - [ "Mismatch in number of struct fields" - , "Struct name: " ++ show nm - , "Expected number of fields: " ++ show expectedFldsNum - , "Actual number of fields: " ++ show actualFldsNum - ] - zipWithM_ - (\expectedFld actualFldTy -> - let expectedFldTy = expectedFld ^. Mir.fty in - let expectedFldName = expectedFld ^. Mir.fName in - unless (checkCompatibleTys expectedFldTy actualFldTy) $ - fail $ unlines - [ "Struct field type mismatch" - , "Field name: " ++ show expectedFldName - , "Expected type: " ++ show (PP.pretty expectedFldTy) - , "Given type: " ++ show (PP.pretty actualFldTy) - ]) - expectedFlds - actualFldTys - Some fldAssn <- - pure $ Ctx.fromList $ - map (\(MIRVal shp v) -> - if Mir.canInitialize col (shapeMirTy shp) - then Some $ Functor.Pair (ReqField shp) (RV v) - else Some $ Functor.Pair (OptField shp) (RV (W4.justPartExpr sym v))) - flds' + checkFields nm "Struct" "struct fields" expectedFlds actualFldTys + + -- Finally, construct a MIRVal of the appropriate shape. + Some fldAssn <- pure $ variantFieldsToAssn sym flds' let (fldShpAssn, valAssn) = Ctx.unzip fldAssn let structShp = StructShape (mirAdtToTy adt) actualFldTys fldShpAssn let structTpr = StructRepr (FC.fmapFC fieldShapeType fldShpAssn) pure $ MIRVal structShp (AnyValue structTpr valAssn) - Mir.Adt _ ak _ _ _ _ _ -> - panic "resolveSetupVal" ["AdtKind " ++ show ak ++ " not yet implemented"] + Mir.Adt nm (Mir.Enum _) _ _ _ _ _ -> + panic "resolveSetupVal" + [ "Expected struct type, received enum:" + , show nm + ] + Mir.Adt nm Mir.Union _ _ _ _ _ -> + panic "resolveSetupVal" + [ "Expected struct type, received union:" + , show nm + ] + MS.SetupEnum enum_ -> + case enum_ of + MirSetupEnumVariant adt variant discr variantIdxInt flds -> + case adt of + _ | adt ^. Mir.adtReprTransparent, + [fld] <- flds -> do + resolveTransparentSetupVal adt fld + Mir.Adt nm (Mir.Enum discrTp) variants _ _ _ _ -> do + -- Resolve the field values and check that they have the expected + -- types. + flds' <- traverse (resolveSetupVal mcc env tyenv nameEnv) flds + let expectedFlds = variant ^. Mir.vfields + let actualFldTys = map (\(MIRVal shp _) -> shapeMirTy shp) flds' + checkFields + nm + "Enum" + ("fields in enum variant " ++ show (variant ^. Mir.vname)) + expectedFlds + actualFldTys + + -- Ensure that the discriminant has an integral type and build + -- a symbolic bitvector from it. + Some discrTpr <- pure $ Mir.tyToRepr col discrTp + let discrShp = tyToShapeEq col discrTp discrTpr + IsBVShape _ discrW <- pure $ testDiscriminantIsBV discrShp + discrVal <- W4.bvLit sym discrW $ BV.mkBV discrW discr + + -- Construct an EnumShape and RustEnumRepr. This requires mapping + -- over /all/ variants, not just the particular variant that we + -- are building. + Some variantShps <- + pure $ Ctx.fromList $ + map (\variantTys -> + case Ctx.fromList $ + map + (\ty -> + case tyToShape col ty of + Some shp -> + if Mir.canInitialize col ty + then Some $ ReqField shp + else Some $ OptField shp) + variantTys of + Some fldAssn -> Some $ VariantShape variantTys fldAssn) + (map (\v -> v ^.. Mir.vfields . each . Mir.fty) variants) + let enumShp = EnumShape (mirAdtToTy adt) variantShps discrTp discrShp + let variantTprs = FC.fmapFC variantShapeType variantShps + let enumTpr = Mir.RustEnumRepr + discrTpr + variantTprs + + -- Construct the VariantShape of the particular variant that we + -- are building. + Some variantIdx <- pure $ + variantIntIndex nm variantIdxInt (Ctx.size variantShps) + VariantShape _ expectedFldAssn <- pure $ variantShps Ctx.! variantIdx + + -- Check that the actual field values match the expected types. + Some actualFldValAssn <- pure $ variantFieldsToAssn sym flds' + let (actualFldAssn, actualValAssn) = + Ctx.unzip actualFldValAssn + Refl <- + case W4.testEquality expectedFldAssn actualFldAssn of + Just r -> pure r + Nothing -> + panic "resolveSetupVal" + [ "Enum field shape mismatch" + , "Expected: " ++ show expectedFldAssn + , "Actual: " ++ show actualFldAssn + ] + + -- Finally, construct a MIRVal. + let enumVal = + Ctx.empty + Ctx.:> RV discrVal + Ctx.:> RV (injectVariant sym variantTprs variantIdx actualValAssn) + pure $ MIRVal enumShp (AnyValue enumTpr enumVal) + Mir.Adt nm Mir.Struct _ _ _ _ _ -> + panic "resolveSetupVal" + [ "Expected enum type, received struct:" + , show nm + ] + Mir.Adt nm Mir.Union _ _ _ _ _ -> + panic "resolveSetupVal" + [ "Expected enum type, received union:" + , show nm + ] + MirSetupEnumSymbolic _adt -> + error "TODO RGS: Symbolic enums" MS.SetupTuple () flds -> do flds' <- traverse (resolveSetupVal mcc env tyenv nameEnv) flds let fldMirTys = map (\(MIRVal shp _) -> shapeMirTy shp) flds' @@ -427,6 +561,41 @@ resolveSetupVal mcc env tyenv nameEnv val = usizeBvLit :: Sym -> Int -> IO (W4.SymBV Sym Mir.SizeBits) usizeBvLit sym = W4.bvLit sym W4.knownNat . BV.mkBV W4.knownNat . toInteger + -- Perform a light amount of typechecking on the fields in a struct or enum + -- variant. This ensures that the variant receives the expected number of + -- types and that the types of each field match. + checkFields :: + Mir.DefId {- The struct or enum name. (Only used for error messages.) -} -> + String {- "Struct" or "Enum". (Only used for error messages.) -} -> + String {- What type of fields are we checking? + (Only used for error messages.) -} -> + [Mir.Field] {- The expected fields. -} -> + [Mir.Ty] {- The actual field types. -} -> + IO () + checkFields adtNm what fieldDiscr expectedFlds actualFldTys = do + let expectedFldsNum = length expectedFlds + let actualFldsNum = length actualFldTys + unless (expectedFldsNum == actualFldsNum) $ + fail $ unlines + [ "Mismatch in number of " ++ fieldDiscr + , what ++ " name: " ++ show adtNm + , "Expected number of fields: " ++ show expectedFldsNum + , "Actual number of fields: " ++ show actualFldsNum + ] + zipWithM_ + (\expectedFld actualFldTy -> + let expectedFldTy = expectedFld ^. Mir.fty in + let expectedFldName = expectedFld ^. Mir.fName in + unless (checkCompatibleTys expectedFldTy actualFldTy) $ + fail $ unlines + [ what ++ " field type mismatch" + , "Field name: " ++ show expectedFldName + , "Expected type: " ++ show (PP.pretty expectedFldTy) + , "Given type: " ++ show (PP.pretty actualFldTy) + ]) + expectedFlds + actualFldTys + -- Resolve parts of a slice that are shared in common between -- 'MirSetupSlice' and 'MirSetupSliceRange'. resolveSetupSliceFromArray :: @@ -445,6 +614,26 @@ resolveSetupVal mcc env tyenv nameEnv val = pure $ SetupSliceFromArray elemTpr sliceShp refVal len _ -> X.throwM $ MIRSliceNonArrayReference $ shapeMirTy arrRefShp + -- Resolve a transparent struct or enum value. + resolveTransparentSetupVal :: Mir.Adt -> SetupValue -> IO MIRVal + resolveTransparentSetupVal adt fld = do + MIRVal shp fld' <- resolveSetupVal mcc env tyenv nameEnv fld + pure $ MIRVal (TransparentShape (mirAdtToTy adt) shp) fld' + + -- Given the list of fields in a struct or enum variant, construct an + -- Assignment, consisting of each field's type and value. + variantFieldsToAssn :: + Sym -> + [MIRVal] -> + Some (Ctx.Assignment (Functor.Product FieldShape (RegValue' Sym))) + variantFieldsToAssn sym flds = + Ctx.fromList $ + map (\(MIRVal shp v) -> + if Mir.canInitialize col (shapeMirTy shp) + then Some $ Functor.Pair (ReqField shp) (RV v) + else Some $ Functor.Pair (OptField shp) (RV (W4.justPartExpr sym v))) + flds + -- | An intermediate data structure that is only used by -- 'resolveSetupSliceFromArray'. data SetupSliceFromArray where @@ -697,6 +886,21 @@ equalValsPred cc mv1 mv2 = goFldAssn fldShp fldAssn1 fldAssn2 (_, _) -> pure $ W4.falsePred sym + goTy (EnumShape _ variantShp _ discrShp) any1 any2 = + case (any1, any2) of + (AnyValue (Mir.RustEnumRepr discrTpr1 variantCtx1) + (Ctx.Empty Ctx.:> RV discr1 Ctx.:> RV variant1), + AnyValue (Mir.RustEnumRepr discrTpr2 variantCtx2) + (Ctx.Empty Ctx.:> RV discr2 Ctx.:> RV variant2)) -> do + Refl <- testEquality discrTpr1 discrTpr2 + Refl <- testEquality (shapeType discrShp) discrTpr1 + Refl <- testEquality variantCtx1 variantCtx2 + Refl <- testEquality (FC.fmapFC variantShapeType variantShp) variantCtx1 + discrPred <- goTy discrShp discr1 discr2 + variantPred <- goVariantAssn variantShp variant1 variant2 + liftIO $ W4.andPred sym discrPred variantPred + (_, _) -> + pure $ W4.falsePred sym goTy (TransparentShape _ shp) v1 v2 = goTy shp v1 v2 goTy (RefShape _ _ _ _) ref1 ref2 = @@ -749,6 +953,34 @@ equalValsPred cc mv1 mv2 = (W4.truePred sym) (Ctx.zipWith Functor.Pair fldAssn1 fldAssn2) + goVariantAssn :: Ctx.Assignment VariantShape ctx + -> Ctx.Assignment (VariantBranch Sym) ctx + -> Ctx.Assignment (VariantBranch Sym) ctx + -> MaybeT IO (W4.Pred Sym) + goVariantAssn variantShp vbAssn1 vbAssn2 = + FCI.ifoldrMFC + (\idx (Functor.Pair (VB var1) (VB var2)) z -> do + VariantShape _ fldShp <- pure $ variantShp Ctx.! idx + varPred <- goVariantFlds fldShp var1 var2 + liftIO $ W4.andPred sym varPred z) + (W4.truePred sym) + (Ctx.zipWith Functor.Pair vbAssn1 vbAssn2) + + goVariantFlds :: Ctx.Assignment FieldShape ctx + -> W4.PartExpr (W4.Pred Sym) (Ctx.Assignment (RegValue' Sym) ctx) + -> W4.PartExpr (W4.Pred Sym) (Ctx.Assignment (RegValue' Sym) ctx) + -> MaybeT IO (W4.Pred Sym) + goVariantFlds fldShp (W4.PE p1 fldAssn1) (W4.PE p2 fldAssn2) = do + pPred <- liftIO $ W4.eqPred sym p1 p2 + fldPred <- goFldAssn fldShp fldAssn1 fldAssn2 + liftIO $ W4.andPred sym pPred fldPred + goVariantFlds _ W4.Unassigned W4.Unassigned = + pure $ W4.truePred sym + goVariantFlds _ (W4.PE{}) W4.Unassigned = + pure $ W4.falsePred sym + goVariantFlds _ W4.Unassigned (W4.PE{}) = + pure $ W4.falsePred sym + goFld :: FieldShape tp -> RegValue Sym tp -> RegValue Sym tp @@ -1163,3 +1395,35 @@ staticTyRef static = Mir.TyRef (static ^. Mir.sTy) (staticMutability static) + +-- | An enum's discriminant should have an integral type such as @isize@ or +-- @i8@, which this function checks. If this is not the case, this function will +-- panic. +testDiscriminantIsBV :: TypeShape shp -> IsBVShape shp +testDiscriminantIsBV discrShp = + case testBVShape discrShp of + Just ibvs -> ibvs + Nothing -> + panic "testDiscriminantIsBV" + [ "Unexpected non-integral discriminant type:" + , show $ PP.pretty $ shapeMirTy discrShp + ] + +-- | Compute the index of a variant as an 'Ctx.Index'. If the index is out of +-- range, this function will panic. +variantIntIndex :: + Mir.DefId {-^ The enum identifier. (Only used for error messages.) -} -> + Int {-^ The index of the variant as an 'Int'. -} -> + Ctx.Size ctx {-^ The number of variants as a 'Ctx.Size'. -} -> + Some (Ctx.Index ctx) +variantIntIndex adtNm variantIdx variantsSize = + case Ctx.intIndex variantIdx variantsSize of + Just someIdx -> + someIdx + Nothing -> + panic "variantIntIndex" + [ "Enum variant index out of range" + , "Enum: " ++ show adtNm + , "Index: " ++ show variantIdx + , "Number of variants: " ++ show variantsSize + ] diff --git a/src/SAWScript/Crucible/MIR/Setup/Value.hs b/src/SAWScript/Crucible/MIR/Setup/Value.hs index f764de1f17..ecb2062fba 100644 --- a/src/SAWScript/Crucible/MIR/Setup/Value.hs +++ b/src/SAWScript/Crucible/MIR/Setup/Value.hs @@ -47,6 +47,9 @@ module SAWScript.Crucible.MIR.Setup.Value , mpMirType , mpRef + -- * @MirSetupEnum@ + , MirSetupEnum(..) + -- * @MirSetupSlice@ , MirSetupSlice(..) ) where @@ -71,6 +74,7 @@ import qualified SAWScript.Crucible.Common.Setup.Value as MS type instance MS.XSetupNull MIR = Void type instance MS.XSetupGlobal MIR = () type instance MS.XSetupStruct MIR = M.Adt +type instance MS.XSetupEnum MIR = MirSetupEnum type instance MS.XSetupTuple MIR = () type instance MS.XSetupSlice MIR = MirSetupSlice -- The 'M.Ty' represents the type of array elements. @@ -140,6 +144,52 @@ data MirPointer sym tp = MirPointer , _mpRef :: MirReferenceMux sym tp } +-- | A enum-related MIR 'SetupValue'. +data MirSetupEnum + = MirSetupEnumVariant M.Adt M.Variant Integer Int [MS.SetupValue MIR] + -- ^ A specific variant of an enum, where: + -- + -- * The 'M.Adt' represents the enum type. + -- + -- * The 'M.Variant' represents the variant. + -- + -- * The 'Integer' is the discriminant value for the variant. + -- + -- * The 'Int' is the index of the variant within the list of all the enum's + -- variants. In most circumstances, this index will be the same as the + -- discriminant value, but the index can be different if a variant uses an + -- explicit value. For instance, in this example: + -- + -- @ + -- enum A { + -- A0, + -- A1, + -- } + -- + -- enum B { + -- B0 = 42, + -- B1, + -- } + -- @ + -- + -- The indexes for @A0@ and @B0@ are both @0@, and the indexes for @A1@ + -- and @B1@ are both @1@. The discriminant values are different, however. + -- The discriminants for @A0@ and @A1@ are @0@ and @1@, respectively, + -- while the discriminants for @B0@ and @B1@ are @42@ and @43@, + -- respectively. + -- + -- * The list of 'MS.SetupValue's are the values of the variant's fields. + -- + -- Note that the discriminant value and index are accessible within the + -- 'M.Variant', but retrieving the information is somewhat involved. (See + -- the implementation of @mir_enum_variant@.) For this reason, we store + -- this information separately in 'MirSetupEnumVariant' to make it easier + -- to look up later. + | MirSetupEnumSymbolic M.Adt + -- ^ A symbolic enum value, where the 'M.Adt' represents the enum type. + -- This is only used in the implementation of @mir_fresh_expanded_value@. + deriving Show + -- | A slice-related MIR 'SetupValue'. data MirSetupSlice = MirSetupSliceRaw (MS.SetupValue MIR) (MS.SetupValue MIR) diff --git a/src/SAWScript/Crucible/MIR/TypeShape.hs b/src/SAWScript/Crucible/MIR/TypeShape.hs index f24d372ea8..b20ffffc97 100644 --- a/src/SAWScript/Crucible/MIR/TypeShape.hs +++ b/src/SAWScript/Crucible/MIR/TypeShape.hs @@ -6,18 +6,23 @@ {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeApplications #-} +{-# LANGUAGE TypeOperators #-} -- | The 'TypeShape' data type and related utilities. module SAWScript.Crucible.MIR.TypeShape ( TypeShape(..) , FieldShape(..) + , VariantShape(..) , tyToShape , tyToShapeEq , shapeType , fieldShapeType + , variantShapeType , shapeMirTy , fieldShapeMirTy , shapeToTerm + , IsBVShape(..) + , testBVShape , IsRefShape(..) , testRefShape , sliceShapeParts @@ -95,6 +100,19 @@ data TypeShape (tp :: CrucibleType) where -> TypeRepr tp -- ^ The Crucible representation of @T@. -> TypeShape (MirSlice tp) + -- | A shape for an enum type. Like 'StructShape', this is indexed by + -- 'AnyType', so code that matches on 'EnumShape' may need to further match + -- on the 'VariantShape's in order to bring additional type information into + -- scope. + EnumShape :: M.Ty + -- ^ The overall enum type. + -> Assignment VariantShape ctx + -- ^ The shapes of the enum type's variants. + -> M.Ty + -- ^ The discriminant type. + -> TypeShape discrTp + -- ^ The shape of the discriminant type. + -> TypeShape AnyType -- | 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. @@ -121,6 +139,27 @@ instance PP.Pretty (FieldShape tp) where deriving instance Show (FieldShape tp) instance ShowF FieldShape +-- | The 'TypeShape' of an enum variant, which consists of some numer of field +-- types. +-- +-- This is indexed by a 'StructType', but that is simply an artifact of the +-- particular way that @crucible-mir@ encodes enum types. Despite the use of +-- 'StructType' as a type index, we only use 'VariantShape' for enums, not +-- structs. +data VariantShape (tp :: CrucibleType) where + VariantShape :: [M.Ty] + -- ^ The types of the variant's fields. + -> Assignment FieldShape ctx + -- ^ The shapes of the variant's field types. + -> VariantShape (StructType ctx) + +-- TODO: Improve? +instance PP.Pretty (VariantShape tp) where + pretty = PP.viaShow + +deriving instance Show (VariantShape tp) +instance ShowF VariantShape + -- | Return the `TypeShape` of `ty`. -- -- It is guaranteed that the `tp :: CrucibleType` index of the resulting @@ -142,8 +181,16 @@ tyToShape col = go 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" + Just (M.Adt _ kind vs _ _ _ _) -> + case kind of + M.Struct + | [v] <- vs + -> goStruct ty (variantFieldTys v) + | otherwise + -> error $ "tyToShape: Unexpected struct with multiple variants: " + ++ show (PP.pretty vs) + M.Enum discrTy -> goEnum ty discrTy vs + M.Union -> error "tyToShape: Union types NYI" Nothing -> error $ "tyToShape: bad adt: " ++ show ty M.TyRef ty' mutbl -> goRef ty ty' mutbl M.TyRawPtr ty' mutbl -> goRef ty ty' mutbl @@ -167,7 +214,36 @@ tyToShape col = go 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 + goStruct ty tys | Some flds <- goFields tys = Some $ StructShape ty tys flds + + -- The first Ty is the overall enum type, and the second Ty is the + -- discriminant type. + goEnum :: M.Ty -> M.Ty -> [M.Variant] -> Some TypeShape + goEnum ty discrTy vs + | Some discrShp <- go discrTy + , Some variants <- loop vs Empty + = Some $ EnumShape ty variants discrTy discrShp + where + loop :: + forall ctx. + [M.Variant] -> + Assignment VariantShape ctx -> + Some (Assignment VariantShape) + loop [] variants = Some variants + loop (v':vs') variants + | Some variant <- goVariant v' + = loop vs' (variants :> variant) + + -- Process a single Variant in an enum type. + goVariant :: M.Variant -> Some VariantShape + goVariant v + | Some flds <- goFields tys + = Some $ VariantShape tys flds + where + tys = variantFieldTys v + + goFields :: [M.Ty] -> Some (Assignment FieldShape) + goFields tys = loop tys Empty where loop :: forall ctx. [M.Ty] -> Assignment FieldShape ctx -> Some (Assignment FieldShape) loop [] flds = Some flds @@ -195,6 +271,11 @@ tyToShape col = go tyToReprCont col ret $ \retr -> Some (FnPtrShape ty argsr retr) + -- Retrieve the field types in a variant. This used for both struct and enum + -- variants. + variantFieldTys :: M.Variant -> [M.Ty] + variantFieldTys v = v ^.. M.vfields . each . M.fty + -- | 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`. @@ -215,6 +296,7 @@ shapeType = go go (TupleShape _ _ flds) = StructRepr $ fmapFC fieldShapeType flds go (ArrayShape _ _ shp) = MirVectorRepr $ shapeType shp go (StructShape _ _ _flds) = AnyRepr + go (EnumShape _ _ _ _variants) = AnyRepr go (TransparentShape _ shp) = go shp go (RefShape _ _ _ tpr) = MirReferenceRepr tpr go (SliceShape _ _ _ tpr) = MirSliceRepr tpr @@ -224,12 +306,17 @@ fieldShapeType :: FieldShape tp -> TypeRepr tp fieldShapeType (ReqField shp) = shapeType shp fieldShapeType (OptField shp) = MaybeRepr $ shapeType shp +variantShapeType :: VariantShape tp -> TypeRepr tp +variantShapeType (VariantShape _ flds) = + StructRepr $ fmapFC fieldShapeType flds + 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 (EnumShape ty _ _ _) = ty shapeMirTy (TransparentShape ty _) = ty shapeMirTy (RefShape ty _ _ _) = ty shapeMirTy (SliceShape ty _ _ _) = ty @@ -263,6 +350,24 @@ shapeToTerm sc = go goField (OptField shp) = go shp goField (ReqField shp) = go shp +-- | A witness that a 'TypeShape' is equal to a 'PrimShape' that characterizes +-- a bitvector. +data IsBVShape (tp :: CrucibleType) where + IsBVShape :: (1 <= w) + => M.Ty + -> NatRepr w + -> IsBVShape (BVType w) + +-- | Check that a 'TypeShape' is equal to a 'PrimShape' that characterizes a +-- bitvector. If so, return 'Just' a witness of that equality. Otherwise, return +-- 'Nothing'. +testBVShape :: TypeShape tp -> Maybe (IsBVShape tp) +testBVShape shp = + case shp of + PrimShape ty (BaseBVRepr w) + -> Just $ IsBVShape ty w + _ -> Nothing + -- | A witness that a 'TypeShape' is equal to a 'RefShape'. data IsRefShape (tp :: CrucibleType) where IsRefShape :: M.Ty @@ -313,6 +418,13 @@ instance TestEquality TypeShape where , (TypeApp (ConType [t|CtxRepr|]) AnyType, [|testEquality|]) ]) +instance TestEquality VariantShape where + testEquality = + $(structuralTypeEquality + [t|VariantShape|] + [ (TypeApp (TypeApp (ConType [t|Assignment|]) AnyType) AnyType, [|testEquality|]) + ]) + instance TestEquality FieldShape where testEquality = $(structuralTypeEquality diff --git a/src/SAWScript/Interpreter.hs b/src/SAWScript/Interpreter.hs index 9f4830e4a0..dae3eb1ca9 100644 --- a/src/SAWScript/Interpreter.hs +++ b/src/SAWScript/Interpreter.hs @@ -3917,6 +3917,15 @@ primitives = Map.fromList , "it appears (i.e., before or after `mir_execute_func`)." ] + , prim "mir_enum_value" "MIRAdt -> String -> [MIRValue] -> MIRValue" + (funVal3 mir_enum_value) + Experimental + [ "Create a MIRValue representing a variant of a MIR enum with the given" + , "list of values as elements. The MIRAdt argument determines what enum" + , "type to create; use `mir_find_adt` to retrieve a MIRAdt value. The" + , "String argument represents the variant name." + ] + , prim "mir_execute_func" "[MIRValue] -> MIRSetup ()" (pureVal mir_execute_func) Experimental