private void InstrumentProcedure(InstrumentationRegion region) { foreach (var ls in this.AC.CurrentLocksets) { if (this.ShouldSkipLockset(ls)) { continue; } region.Procedure().Modifies.Add(new IdentifierExpr(ls.Id.tok, ls.Id)); } List <Variable> vars = SharedStateAnalyser.GetMemoryRegions(DeviceDriver.GetEntryPoint(this.EP.Name)); foreach (var ls in this.AC.MemoryLocksets) { if (!vars.Any(val => val.Name.Equals(ls.TargetName))) { continue; } if (this.ShouldSkipLockset(ls)) { continue; } region.Procedure().Modifies.Add(new IdentifierExpr(ls.Id.tok, ls.Id)); } }
private void CreateImplementation(Implementation impl1, Implementation impl2) { Block call = new Block(Token.NoToken, "$logger", new List <Cmd>(), new GotoCmd(Token.NoToken, new List <string> { "$checker" })); if (this.EP1.Name.Equals(this.EP2.Name)) { this.CC1 = this.CreateCallCmd(impl1, impl2); call.Cmds.Add(this.CC1); } else { this.CC1 = this.CreateCallCmd(impl1, impl2); call.Cmds.Add(this.CC1); this.CC2 = this.CreateCallCmd(impl2, impl1, true); call.Cmds.Add(this.CC2); } this.RegionBlocks.Add(call); this.InternalImplementation = new Implementation(Token.NoToken, this.RegionName, new List <TypeVariable>(), this.CreateNewInParams(impl1, impl2), new List <Variable>(), new List <Variable>(), this.RegionBlocks); Block check = new Block(Token.NoToken, "$checker", new List <Cmd>(), new ReturnCmd(Token.NoToken)); foreach (var mr in SharedStateAnalyser.GetPairMemoryRegions( DeviceDriver.GetEntryPoint(impl1.Name), DeviceDriver.GetEntryPoint(impl2.Name))) { AssertCmd assert = this.CreateRaceCheckingAssertion(impl1, impl2, mr); if (assert == null) { continue; } check.Cmds.Add(this.CreateCaptureStateAssume(mr)); check.Cmds.Add(assert); } this.RegionBlocks.Add(check); this.InternalImplementation.Attributes = new QKeyValue(Token.NoToken, "checker", new List <object>(), null); }
private void CreateProcedure(Implementation impl1, Implementation impl2) { this.InternalImplementation.Proc = new Procedure(Token.NoToken, this.RegionName, new List <TypeVariable>(), this.CreateNewInParams(impl1, impl2), new List <Variable>(), new List <Requires>(), new List <IdentifierExpr>(), new List <Ensures>()); this.InternalImplementation.Proc.Attributes = new QKeyValue(Token.NoToken, "checker", new List <object>(), null); List <Variable> varsEp1 = SharedStateAnalyser.GetMemoryRegions(DeviceDriver.GetEntryPoint(impl1.Name)); List <Variable> varsEp2 = SharedStateAnalyser.GetMemoryRegions(DeviceDriver.GetEntryPoint(impl2.Name)); foreach (var ls in this.AC.CurrentLocksets) { var require = new Requires(false, Expr.Not(new IdentifierExpr(ls.Id.tok, new Duplicator().Visit(ls.Id.Clone()) as Variable))); this.InternalImplementation.Proc.Requires.Add(require); } foreach (var ls in this.AC.MemoryLocksets) { Requires require = null; if (!this.IsLockUsed(ls)) { require = new Requires(false, Expr.Not(new IdentifierExpr(ls.Id.tok, new Duplicator().Visit(ls.Id.Clone()) as Variable))); } else { require = new Requires(false, new IdentifierExpr(ls.Id.tok, new Duplicator().Visit(ls.Id.Clone()) as Variable)); } this.InternalImplementation.Proc.Requires.Add(require); } foreach (var acv in this.AC.GetWriteAccessCheckingVariables()) { var require = new Requires(false, Expr.Not(new IdentifierExpr(acv.tok, new Duplicator().Visit(acv.Clone()) as Variable))); this.InternalImplementation.Proc.Requires.Add(require); } foreach (var acv in this.AC.GetReadAccessCheckingVariables()) { var require = new Requires(false, Expr.Not(new IdentifierExpr(acv.tok, new Duplicator().Visit(acv.Clone()) as Variable))); this.InternalImplementation.Proc.Requires.Add(require); } foreach (var ie in this.AC.Checker.Proc.Modifies) { if (!ie.Name.Equals("$Alloc") && !ie.Name.Equals("$CurrAddr") && !varsEp1.Any(val => val.Name.Equals(ie.Name)) && !varsEp2.Any(val => val.Name.Equals(ie.Name))) { continue; } this.InternalImplementation.Proc.Modifies.Add(new Duplicator().Visit(ie.Clone()) as IdentifierExpr); } foreach (var ls in this.AC.CurrentLocksets) { if (!this.IsLockUsed(ls)) { continue; } this.InternalImplementation.Proc.Modifies.Add(new IdentifierExpr( ls.Id.tok, new Duplicator().Visit(ls.Id.Clone()) as Variable)); } foreach (var ls in this.AC.MemoryLocksets) { if (!this.IsLockUsed(ls)) { continue; } this.InternalImplementation.Proc.Modifies.Add(new IdentifierExpr( ls.Id.tok, new Duplicator().Visit(ls.Id.Clone()) as Variable)); } foreach (var acs in this.AC.GetWriteAccessCheckingVariables()) { var split = acs.Name.Split(new string[] { "_" }, StringSplitOptions.None); if (acs.Name.Contains(this.EP1.Name) && !this.EP1.HasWriteAccess.ContainsKey(split[1])) { continue; } if (acs.Name.Contains(this.EP2.Name) && !this.EP2.HasWriteAccess.ContainsKey(split[1])) { continue; } this.InternalImplementation.Proc.Modifies.Add(new IdentifierExpr( acs.tok, new Duplicator().Visit(acs.Clone()) as Variable)); } foreach (var acs in this.AC.GetReadAccessCheckingVariables()) { var split = acs.Name.Split(new string[] { "_" }, StringSplitOptions.None); if (acs.Name.Contains(this.EP1.Name) && !this.EP1.HasReadAccess.ContainsKey(split[1])) { continue; } if (acs.Name.Contains(this.EP2.Name) && !this.EP2.HasReadAccess.ContainsKey(split[1])) { continue; } this.InternalImplementation.Proc.Modifies.Add(new IdentifierExpr( acs.tok, new Duplicator().Visit(acs.Clone()) as Variable)); } }