summaryrefslogtreecommitdiff
path: root/Source/ModelViewer/VccProvider.cs
diff options
context:
space:
mode:
authorGravatar MichalMoskal <unknown>2011-01-04 23:41:22 +0000
committerGravatar MichalMoskal <unknown>2011-01-04 23:41:22 +0000
commit03f19d75f825b2752c5fc0729e09b1af074d1558 (patch)
tree5f5813c5070fb63d653be28687df34f104000ca9 /Source/ModelViewer/VccProvider.cs
parent94e15825296c9f932f71ad42beaa9e79ab9bb09d (diff)
Display casted pointers
Diffstat (limited to 'Source/ModelViewer/VccProvider.cs')
-rw-r--r--Source/ModelViewer/VccProvider.cs30
1 files changed, 26 insertions, 4 deletions
diff --git a/Source/ModelViewer/VccProvider.cs b/Source/ModelViewer/VccProvider.cs
index eb57146b..216d27d5 100644
--- a/Source/ModelViewer/VccProvider.cs
+++ b/Source/ModelViewer/VccProvider.cs
@@ -610,7 +610,7 @@ namespace Microsoft.Boogie.ModelViewer.Vcc
return skolems;
}
- private Model.Element PtrTo(Model.Element tp)
+ private Model.Element GuessPtrTo(Model.Element tp)
{
var p = f_ptr_to.TryEval(tp);
if (p != null) return p;
@@ -621,6 +621,15 @@ namespace Microsoft.Boogie.ModelViewer.Vcc
return f_ptr_to.TryEval(tp);
}
+ private Model.Element PtrTo(Model.Element tp, Model.Func f_ptr_to)
+ {
+ var p = f_ptr_to.TryEval(tp);
+ if (p != null) return p;
+ var nm = model.MkFunc("*" + f_ptr_to.Name + "_" + TypeName(tp), 0).GetConstant();
+ f_ptr_to.AddApp(nm, tp);
+ return f_ptr_to.TryEval(tp);
+ }
+
private bool IsArrayField(Model.Element ptr)
{
return ptr != null && f_idx.TryEval(ptr, model.TryMkElement("0")) != null;
@@ -632,7 +641,7 @@ namespace Microsoft.Boogie.ModelViewer.Vcc
Model.FuncTuple tpl;
if (addrOf != null) {
- result.Add(new FieldNode(state, new EdgeName("&"), addrOf, PtrTo(tp)));
+ result.Add(new FieldNode(state, new EdgeName("&"), addrOf, GuessPtrTo(tp)));
}
var kind = GetKind(tp, out tpl);
@@ -692,8 +701,9 @@ namespace Microsoft.Boogie.ModelViewer.Vcc
AddSpecialField(state, elt, result, "\\root", f_roots);
AddSpecialField(state, elt, result, "\\timestamp", f_timestamps);
- if (viewOpts.ViewLevel >= 1) {
+ if (viewOpts.ViewLevel >= 1 && elt != null) {
AddPtrType(state, elt, result);
+ AddCasts(state, elt, result);
}
} else if (kind == DataKind.Map) {
@@ -748,6 +758,18 @@ namespace Microsoft.Boogie.ModelViewer.Vcc
return result;
}
+ private void AddCasts(StateNode state, Model.Element elt, List<ElementNode> result)
+ {
+ foreach (var app in f_phys_ptr_cast.AppsWithArg(0, elt)) {
+ if (app.Result != elt)
+ result.Add(new MapletNode(state, new EdgeName(this, "(" + TypeName(app.Args[1]) + "*)..."), app.Result, PtrTo(app.Args[1], f_ptr_to)));
+ }
+ foreach (var app in f_spec_ptr_cast.AppsWithArg(0, elt)) {
+ if (app.Result != elt)
+ result.Add(new MapletNode(state, new EdgeName(this, "(" + TypeName(app.Args[1]) + "^)..."), app.Result, PtrTo(app.Args[1], f_spec_ptr_to)));
+ }
+ }
+
private FieldNode BuildFieldNode(StateNode state, Model.Element ptr, Model.Element field, Model.Element val, Model.Element addr)
{
var ftp = f_field_type.TryEval(field);
@@ -757,7 +779,7 @@ namespace Microsoft.Boogie.ModelViewer.Vcc
if (IsArrayField(ptr)) {
val = addr;
addr = null;
- ftp = PtrTo(ftp);
+ ftp = GuessPtrTo(ftp);
}
var nm = ConstantFieldName(field);