Skip to content

Commit 14c7213

Browse files
committed
Draft: Some progress on symbolic enum values
TODO RGS: Investigate why using `mir_fresh_expanded_value` in an override doesn't work TODO RGS: Copy over test case to saw-remote-api
1 parent 21dc831 commit 14c7213

File tree

15 files changed

+471
-168
lines changed

15 files changed

+471
-168
lines changed

crucible-mir-comp/src/Mir/Compositional/Builder.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ substMethodSpec sc sm ms = do
648648
goSetupEnum (MirSetupEnumVariant adt variant discr variantIdx svs) =
649649
MirSetupEnumVariant adt variant discr variantIdx <$>
650650
mapM goSetupValue svs
651-
goSetupEnum sv@(MirSetupEnumSymbolic _) =
651+
goSetupEnum sv@(MirSetupEnumSymbolic _ _ _) =
652652
return sv
653653

654654
goSetupSlice (MirSetupSliceRaw ref len) =
@@ -749,7 +749,7 @@ regToSetup bak p eval shp rv = go shp rv
749749
refSV <- go refShp refRV
750750
lenSV <- go lenShp lenRV
751751
pure $ MS.SetupSlice $ MirSetupSliceRaw refSV lenSV
752-
go (EnumShape _ _ _ _) _ =
752+
go (EnumShape _ _ _ _ _) _ =
753753
error "Enums not currently supported in overrides"
754754
go (FnPtrShape _ _ _) _ =
755755
error "Function pointers not currently supported in overrides"

crucible-mir-comp/src/Mir/Compositional/Clobber.hs

+2-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ clobberSymbolic sym loc nameStr shp rv = go shp rv
6262
", but got Any wrapping " ++ show tpr
6363
where shpTpr = StructRepr $ fmapFC fieldShapeType flds
6464
go (TransparentShape _ shp) rv = go shp rv
65-
go (EnumShape _ _ _ _) _rv =
65+
go (EnumShape _ _ _ _ _) _rv =
6666
error "Enums not currently supported in overrides"
6767
go (FnPtrShape _ _ _) _rv =
6868
error "Function pointers not currently supported in overrides"
@@ -122,7 +122,7 @@ clobberImmutSymbolic sym loc nameStr shp rv = go shp rv
122122
ref' <- go refShp ref
123123
len' <- go lenShp len
124124
pure $ Ctx.Empty Ctx.:> RV ref' Ctx.:> RV len'
125-
go (EnumShape _ _ _ _) _rv =
125+
go (EnumShape _ _ _ _ _) _rv =
126126
error "Enums not currently supported in overrides"
127127
go (FnPtrShape _ _ _) _rv =
128128
error "Function pointers not currently supported in overrides"

crucible-mir-comp/src/Mir/Compositional/Override.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ setupToReg sym sc termSub regMap allocMap shp sv = go shp sv
544544
refRV <- go refShp refSV
545545
lenRV <- go lenShp lenSV
546546
pure $ Ctx.Empty Ctx.:> RV refRV Ctx.:> RV lenRV
547-
go (EnumShape _ _ _ _) _ =
547+
go (EnumShape _ _ _ _ _) _ =
548548
error "Enums not currently supported in overrides"
549549
go (FnPtrShape _ _ _) _ =
550550
error "Function pointers not currently supported in overrides"

crux-mir-comp/src/Mir/Cryptol.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ munge sym shp rv = do
337337
AnyValue tpr <$> goFields flds rvs
338338
| otherwise = error $ "munge: StructShape AnyValue with NYI TypeRepr " ++ show tpr
339339
go (TransparentShape _ shp) rv = go shp rv
340-
go (EnumShape _ _ _ _) _ =
340+
go (EnumShape _ _ _ _ _) _ =
341341
error "Enums not currently supported in overrides"
342342
go (FnPtrShape _ _ _) _ =
343343
error "Function pointers not currently supported in overrides"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
all: test.linked-mir.json
2+
3+
test.linked-mir.json: test.rs
4+
saw-rustc $<
5+
$(MAKE) remove-unused-build-artifacts
6+
7+
.PHONY: remove-unused-build-artifacts
8+
remove-unused-build-artifacts:
9+
rm -f test libtest.mir libtest.rlib
10+
11+
.PHONY: clean
12+
clean: remove-unused-build-artifacts
13+
rm -f test.linked-mir.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"fns":[{"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/b38ac280::f","return_ty":"ty::u32","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":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:13:7: 13:8","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Copy"}}}],"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":true,"mut":{"kind":"Not"},"name":"_2","ty":"ty::Tuple::e93222e871854c41"}},"bb1"],"from_hir_call":true,"func":{"data":{"rendered":{"kind":"zst"},"ty":"ty::FnDef::779a68152b60006a"},"kind":"Constant"},"kind":"Call","pos":"test.rs:13:5: 13:9"}},"blockid":"bb0"},{"block":{"data":[],"terminator":{"kind":"Return","pos":"test.rs:14:2: 14:2"}},"blockid":"bb1"}],"vars":[{"is_zst":true,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Tuple::e93222e871854c41"},{"is_zst":true,"mut":{"kind":"Not"},"name":"_2","ty":"ty::Tuple::e93222e871854c41"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}]},"name":"test/b38ac280::gg","return_ty":"ty::Tuple::e93222e871854c41","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":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}},"pos":"test.rs:9:7: 9:8","rhs":{"kind":"Use","usevar":{"data":{"data":[],"var":{"is_zst":false,"mut":{"kind":"Not"},"name":"_1","ty":"ty::Adt::3fa7c2d95c7fce06"}},"kind":"Copy"}}}],"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":"Not"},"name":"_2","ty":"ty::u32"}},"bb1"],"from_hir_call":true,"func":{"data":{"rendered":{"kind":"zst"},"ty":"ty::FnDef::946bbc4c46985e3c"},"kind":"Constant"},"kind":"Call","pos":"test.rs:9:5: 9:9"}},"blockid":"bb0"},{"block":{"data":[],"terminator":{"kind":"Return","pos":"test.rs:10:2: 10:2"}},"blockid":"bb1"}],"vars":[{"is_zst":true,"mut":{"kind":"Mut"},"name":"_0","ty":"ty::Tuple::e93222e871854c41"},{"is_zst":false,"mut":{"kind":"Not"},"name":"_2","ty":"ty::u32"},{"is_zst":false,"mut":{"kind":"Mut"},"name":"_3","ty":"ty::Adt::3fa7c2d95c7fce06"}]},"name":"test/b38ac280::g","return_ty":"ty::Tuple::e93222e871854c41","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"}]}],"statics":[],"vtables":[],"traits":[],"intrinsics":[{"inst":{"def_id":"test/b38ac280::f","kind":"Item","substs":[]},"name":"test/b38ac280::f"},{"inst":{"def_id":"test/b38ac280::gg","kind":"Item","substs":[]},"name":"test/b38ac280::gg"},{"inst":{"def_id":"test/b38ac280::g","kind":"Item","substs":[]},"name":"test/b38ac280::g"}],"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::isize","ty":{"intkind":{"kind":"Isize"},"kind":"Int"}},{"name":"ty::Tuple::e93222e871854c41","ty":{"kind":"Tuple","tys":[]}},{"name":"ty::FnDef::779a68152b60006a","ty":{"defid":"test/b38ac280::g","kind":"FnDef"}},{"name":"ty::FnDef::946bbc4c46985e3c","ty":{"defid":"test/b38ac280::f","kind":"FnDef"}}],"roots":["test/b38ac280::f","test/b38ac280::g","test/b38ac280::gg"]}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
pub fn f(x: Option<u32>) -> u32 {
2+
match x {
3+
Some(x) => x,
4+
None => 27,
5+
}
6+
}
7+
8+
pub fn g(x: Option<u32>) {
9+
f(x);
10+
}
11+
12+
pub fn gg(x: Option<u32>) {
13+
g(x);
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
enable_experimental;
2+
3+
m <- mir_load_module "test.linked-mir.json";
4+
5+
let option_u32_adt = mir_find_adt m "core::option::Option" [mir_u32];
6+
7+
let f_none_spec = do {
8+
let x = mir_enum_value option_u32_adt "None" [];
9+
10+
mir_execute_func [x];
11+
12+
mir_return (mir_term {{ 27 : [32] }});
13+
};
14+
15+
let f_some_spec = do {
16+
ret <- mir_fresh_var "ret" mir_u32;
17+
let x = mir_enum_value option_u32_adt "Some" [mir_term ret];
18+
19+
mir_execute_func [x];
20+
21+
mir_return (mir_term ret);
22+
};
23+
24+
let g_spec = do {
25+
x <- mir_fresh_expanded_value "x" (mir_adt option_u32_adt);
26+
27+
mir_execute_func [x];
28+
};
29+
30+
let gg_spec = do {
31+
xx <- mir_fresh_expanded_value "xx" (mir_adt option_u32_adt);
32+
33+
mir_execute_func [xx];
34+
};
35+
36+
f_none_ov <- mir_verify m "test::f" [] false f_none_spec z3;
37+
f_some_ov <- mir_verify m "test::f" [] false f_some_spec z3;
38+
39+
mir_verify m "test::g" [] false g_spec z3;
40+
g_ov <- mir_verify m "test::g" [f_none_ov, f_some_ov] false g_spec z3;
41+
42+
mir_verify m "test::gg" [] false gg_spec z3;
43+
// TODO RGS: Investigate why this doesn't work
44+
// mir_verify m "test::gg" [g_ov] false gg_spec z3;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
set -e
2+
3+
$SAW test.saw

src/SAWScript/Crucible/Common/MethodSpec.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ ppSetupValue setupval = case setupval of
267267
ppMirSetupEnum :: MirSetupEnum -> PP.Doc ann
268268
ppMirSetupEnum (MirSetupEnumVariant _defId variantName _discr _varIdx fields) =
269269
PP.pretty variantName PP.<+> ppSetupStructDefault fields
270-
ppMirSetupEnum (MirSetupEnumSymbolic _defId) =
270+
ppMirSetupEnum (MirSetupEnumSymbolic _defId _discr _variants) =
271271
PP.pretty "<symbolic enum>"
272272

273273
ppMirSetupSlice :: MirSetupSlice -> PP.Doc ann

0 commit comments

Comments
 (0)