예제 #1
0
        private void AddNoninterferenceCheckers()
        {
            if (CommandLineOptions.Clo.TrustNoninterference)
            {
                return;
            }
            foreach (var proc in civlTypeChecker.procToYieldInvariant.Keys)
            {
                var yieldInvariant = civlTypeChecker.procToYieldInvariant[proc];
                if (layerNum == yieldInvariant.LayerNum)
                {
                    noninterferenceCheckerDecls.AddRange(
                        NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker,
                                                                             layerNum, new Dictionary <Absy, Absy>(), proc, new List <Variable>()));
                }
            }

            foreach (var impl in absyMap.Keys.OfType <Implementation>())
            {
                var yieldingProc = GetYieldingProc(impl);
                noninterferenceCheckerDecls.AddRange(
                    NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker, layerNum,
                                                                         absyMap, impl, impl.LocVars));
                if (yieldingProc is MoverProc && yieldingProc.upperLayer == layerNum)
                {
                    continue;
                }
                noninterferenceCheckerDecls.AddRange(
                    NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker,
                                                                         layerNum, new Dictionary <Absy, Absy>(), impl.Proc, new List <Variable>()));
            }
        }
        private void TransformImpl(Implementation originalImpl, Implementation impl)
        {
            // initialize globalSnapshotInstrumentation
            globalSnapshotInstrumentation = new GlobalSnapshotInstrumentation(civlTypeChecker);

            // initialize refinementInstrumentation
            YieldingProc yieldingProc = civlTypeChecker.procToYieldingProc[originalImpl.Proc];

            if (yieldingProc.upperLayer == this.layerNum)
            {
                if (yieldingProc is ActionProc)
                {
                    refinementInstrumentation = new ActionRefinementInstrumentation(
                        civlTypeChecker,
                        impl,
                        originalImpl,
                        globalSnapshotInstrumentation.OldGlobalMap);
                }
                else
                {
                    refinementInstrumentation = new SkipRefinementInstrumentation(
                        civlTypeChecker,
                        yieldingProc,
                        globalSnapshotInstrumentation.OldGlobalMap);
                }
            }
            else
            {
                refinementInstrumentation = new RefinementInstrumentation();
            }

            var allYieldPredicates = CollectYields(impl);

            // initialize noninterferenceInstrumentation
            if (CommandLineOptions.Clo.TrustNonInterference)
            {
                noninterferenceInstrumentation = new NoneNoninterferenceInstrumentation();
            }
            else
            {
                noninterferenceCheckerDecls.AddRange(
                    NoninterferenceChecker.CreateNoninterferenceCheckers(civlTypeChecker, linearTypeChecker, layerNum, absyMap, impl, allYieldPredicates));
                noninterferenceInstrumentation = new SomeNoninterferenceInstrumentation(
                    civlTypeChecker,
                    linearTypeChecker,
                    linearPermissionInstrumentation,
                    globalSnapshotInstrumentation.OldGlobalMap,
                    wrapperNoninterferenceCheckerProc);
            }

            DesugarConcurrency(impl, allYieldPredicates);

            impl.LocVars.AddRange(globalSnapshotInstrumentation.NewLocalVars);
            impl.LocVars.AddRange(refinementInstrumentation.NewLocalVars);
            impl.LocVars.AddRange(noninterferenceInstrumentation.NewLocalVars);
        }