@@ -785,7 +785,7 @@ Other `Value`s are not expected to have pointer `Metadata` as per their types.
785
785
786
786
``` k
787
787
rule <k> rvalueRef(_REGION, KIND, place(local(I), PROJS) #as PLACE)
788
- => #mkRef(PLACE, #mutabilityOf(KIND), #metadata(tyOfLocal({LOCALS[I]}:>TypedLocal), PROJS, TYPEMAP))
788
+ => #mkRef(PLACE, #mutabilityOf(KIND), #metadata(tyOfLocal({LOCALS[I]}:>TypedLocal), PROJS, TYPEMAP), LOCALS )
789
789
...
790
790
</k>
791
791
<locals> LOCALS </locals>
@@ -794,14 +794,14 @@ Other `Value`s are not expected to have pointer `Metadata` as per their types.
794
794
andBool isTypedValue(LOCALS[I])
795
795
[preserves-definedness] // valid list indexing checked, #metadata should only use static information
796
796
797
- syntax Evaluation ::= #mkRef ( Place , Mutability, Metadata)
798
- | #mkDynSizeRef ( Place , Mutability , Evaluation ) [strict(3 )]
797
+ syntax Evaluation ::= #mkRef ( Place , Mutability, Metadata, List )
798
+ | #mkDynSizeRef ( Place , Mutability , List , Evaluation ) [strict(4 )]
799
799
800
- rule <k> #mkRef(PLACE, MUT, dynamicSize(_)) => #mkDynSizeRef(PLACE, MUT, operandCopy(PLACE)) ... </k>
801
- rule <k> #mkRef(PLACE, MUT, META ) => Reference(0, PLACE, MUT, META) ... </k> [priority(60)]
800
+ rule <k> #mkRef( PLACE , MUT, dynamicSize(_), LOCALS ) => #mkDynSizeRef(PLACE, MUT, LOCALS, operandCopy(PLACE)) ... </k>
801
+ rule <k> #mkRef(place(LOCAL, PROJS), MUT, META , LOCALS ) => Reference(0, place(LOCAL, #resolveProjs(PROJS, LOCALS)), MUT, META) ... </k> [priority(60)]
802
802
803
803
// with dynamic metadata (reading the value)
804
- rule <k> #mkDynSizeRef(PLACE, MUT, VAL:Value) => Reference(0, PLACE , MUT, metadataFor(VAL)) ... </k>
804
+ rule <k> #mkDynSizeRef(place(LOCAL, PROJS), MUT, LOCALS, VAL:Value) => Reference(0, place(LOCAL, #resolveProjs(PROJS, LOCALS)) , MUT, metadataFor(VAL)) ... </k>
805
805
806
806
syntax Metadata ::= metadataFor ( Value ) [function, total]
807
807
// --------------------------------------------------------
@@ -813,6 +813,18 @@ Other `Value`s are not expected to have pointer `Metadata` as per their types.
813
813
rule #mutabilityOf(borrowKindShared) => mutabilityNot
814
814
rule #mutabilityOf(borrowKindFake(_)) => mutabilityNot // Shallow fake borrow disallowed in late stages
815
815
rule #mutabilityOf(borrowKindMut(_)) => mutabilityMut // all mutable kinds behave equally for us
816
+
817
+ // turns Index(LOCAL) projections into ConstantIndex(Int)
818
+ syntax ProjectionElems ::= #resolveProjs ( ProjectionElems , List ) [function, total]
819
+ // ----------------------------------------------------------------------------------
820
+ rule #resolveProjs( .ProjectionElems , _LOCALS) => .ProjectionElems
821
+ rule #resolveProjs( projectionElemIndex(local(I)) REST, LOCALS ) => projectionElemConstantIndex(#expectUsize(getValue(LOCALS,I)), 0, false) #resolveProjs(REST, LOCALS)
822
+ requires 0 <=Int I
823
+ andBool I <Int size(LOCALS)
824
+ andBool isTypedValue(LOCALS[I])
825
+ andBool isInt(#expectUsize(getValue(LOCALS,I)))
826
+ [preserves-definedness]
827
+ rule #resolveProjs( OTHER:ProjectionElem REST, LOCALS ) => OTHER #resolveProjs(REST, LOCALS) [owise]
816
828
```
817
829
818
830
A ` CopyForDeref ` ` RValue ` has the semantics of a simple ` Use(operandCopy(...)) ` ,
@@ -831,7 +843,7 @@ The operation typically creates a pointer with empty metadata.
831
843
``` k
832
844
rule <k> rvalueAddressOf(MUT, place(local(I), PROJS) #as PLACE)
833
845
=>
834
- #mkPtr(PLACE, MUT, #metadata(tyOfLocal({LOCALS[I]}:>TypedLocal), PROJS, TYPEMAP))
846
+ #mkPtr(PLACE, MUT, #metadata(tyOfLocal({LOCALS[I]}:>TypedLocal), PROJS, TYPEMAP), LOCALS )
835
847
// we should use #alignOf to emulate the address
836
848
...
837
849
</k>
@@ -841,14 +853,23 @@ The operation typically creates a pointer with empty metadata.
841
853
andBool isTypedValue(LOCALS[I])
842
854
[preserves-definedness] // valid list indexing checked, #metadata should only use static information
843
855
844
- syntax Evaluation ::= #mkPtr ( Place , Mutability , Metadata )
845
- | #mkDynLengthPtr ( Place , Mutability, Evaluation ) [strict(3 )]
856
+ syntax Evaluation ::= #mkPtr ( Place , Mutability , Metadata , List )
857
+ | #mkDynLengthPtr ( Place , Mutability , List , Evaluation ) [strict(4 )]
846
858
847
- rule #mkPtr(PLACE, MUT, dynamicSize(_)) => #mkDynLengthPtr(PLACE, MUT, operandCopy(PLACE))
859
+ rule <k> #mkPtr( PLACE , MUT, dynamicSize(_), LOCALS)
860
+ => #mkDynLengthPtr(PLACE, MUT, LOCALS, operandCopy(PLACE))
861
+ ...
862
+ </k>
848
863
849
- rule #mkPtr(PLACE, MUT, META) => PtrLocal(0, PLACE, MUT, ptrEmulation(META)) [priority(60)]
864
+ rule <k> #mkPtr(place(LOCAL, PROJS), MUT, META , LOCALS)
865
+ => PtrLocal(0, place(LOCAL, #resolveProjs(PROJS, LOCALS)), MUT, ptrEmulation(META))
866
+ ...
867
+ </k> [priority(60)]
850
868
851
- rule #mkDynLengthPtr(PLACE, MUT, Range(ELEMS)) => PtrLocal(0, PLACE, MUT, ptrEmulation(dynamicSize(size(ELEMS))))
869
+ rule <k> #mkDynLengthPtr(place(LOCAL, PROJS), MUT, LOCALS, Range(ELEMS))
870
+ => PtrLocal(0, place(LOCAL, #resolveProjs(PROJS, LOCALS)), MUT, ptrEmulation(dynamicSize(size(ELEMS))))
871
+ ...
872
+ </k>
852
873
```
853
874
854
875
In practice, the ` AddressOf ` can often be found applied to references that get dereferenced first,
0 commit comments