Beispiel #1
0
        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));
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
            }
        }