Exemple #1
0
        public static void AnalyseMemoryRegionsWithPairInformation(AnalysisContext ac, EntryPoint ep)
        {
            var             memRegions = new List <Variable>();
            var             epVars     = SharedStateAnalyser.GetMemoryRegions(ep);
            List <Variable> otherEpVars;

            foreach (var pair in DeviceDriver.EntryPointPairs.FindAll(val =>
                                                                      val.EntryPoint1.Name.Equals(ep.Name) || val.EntryPoint2.Name.Equals(ep.Name)))
            {
                if (!pair.EntryPoint1.Name.Equals(ep.Name))
                {
                    otherEpVars = SharedStateAnalyser.GetMemoryRegions(pair.EntryPoint1);
                }
                else if (!pair.EntryPoint2.Name.Equals(ep.Name))
                {
                    otherEpVars = SharedStateAnalyser.GetMemoryRegions(pair.EntryPoint2);
                }
                else
                {
                    otherEpVars = epVars;
                }

                foreach (var v in epVars)
                {
                    if (otherEpVars.Any(val => val.Name.Equals(v.Name)) && !memRegions.Contains(v))
                    {
                        memRegions.Add(v);
                    }
                }
            }

            SharedStateAnalyser.EntryPointMemoryRegions[ep] = memRegions;
        }
Exemple #2
0
 public static void AnalyseMemoryRegions(AnalysisContext ac, EntryPoint ep)
 {
     if (SharedStateAnalyser.EntryPointMemoryRegions.ContainsKey(ep))
     {
         return;
     }
     SharedStateAnalyser.EntryPointMemoryRegions.Add(ep, new List <Variable>());
     SharedStateAnalyser.AnalyseMemoryRegions(ac, ep, ac.GetImplementation(ep.Name));
 }
Exemple #3
0
        public static void RemoveNonPairMemoryRegions(AnalysisContext ac, EntryPoint ep1, EntryPoint ep2)
        {
            var pairMemRegs = SharedStateAnalyser.GetPairMemoryRegions(ep1, ep2);

            foreach (var mr in ac.TopLevelDeclarations.OfType <GlobalVariable>().Where(val =>
                                                                                       val.Name.StartsWith("$M.")).ToList())
            {
                if (pairMemRegs.Any(val => val.Name.Equals(mr.Name)))
                {
                    continue;
                }
                ac.TopLevelDeclarations.Remove(mr);
            }
        }
Exemple #4
0
        private static void AnalyseMemoryRegionsInAssign(AnalysisContext ac, EntryPoint ep, AssignCmd cmd)
        {
            foreach (var rhs in cmd.Rhss)
            {
                if (!(rhs is IdentifierExpr))
                {
                    continue;
                }
                var impl = ac.GetImplementation((rhs as IdentifierExpr).Name);

                if (impl != null && Utilities.ShouldAccessFunction(impl.Name))
                {
                    SharedStateAnalyser.AnalyseMemoryRegions(ac, ep, impl);
                }
            }
        }
Exemple #5
0
        public static List <Variable> GetPairMemoryRegions(EntryPoint ep1, EntryPoint ep2)
        {
            var result = new List <Variable>();

            result.AddRange(SharedStateAnalyser.GetMemoryRegions(ep1));

            foreach (var mr in SharedStateAnalyser.GetMemoryRegions(ep2))
            {
                if (result.Any(val => val.Name.Equals(mr.Name)))
                {
                    continue;
                }
                result.Add(mr);
            }

            return(result);
        }
Exemple #6
0
        private static void AnalyseMemoryRegionsInCall(AnalysisContext ac, EntryPoint ep, CallCmd cmd)
        {
            var impl = ac.GetImplementation(cmd.callee);

            if (impl != null && Utilities.ShouldAccessFunction(impl.Name))
            {
                SharedStateAnalyser.AnalyseMemoryRegions(ac, ep, impl);
            }

            foreach (var expr in cmd.Ins)
            {
                if (!(expr is IdentifierExpr))
                {
                    continue;
                }
                impl = ac.GetImplementation((expr as IdentifierExpr).Name);

                if (impl != null && Utilities.ShouldAccessFunction(impl.Name))
                {
                    SharedStateAnalyser.AnalyseMemoryRegions(ac, ep, impl);
                }
            }
        }
Exemple #7
0
        private static void AnalyseMemoryRegions(AnalysisContext ac, EntryPoint ep, Implementation impl)
        {
            if (SharedStateAnalyser.AlreadyAnalyzedFunctions.Contains(impl))
            {
                return;
            }
            SharedStateAnalyser.AlreadyAnalyzedFunctions.Add(impl);

            List <Variable> vars = new List <Variable>();

            foreach (Block b in impl.Blocks)
            {
                foreach (var cmd in b.Cmds)
                {
                    if (cmd is CallCmd)
                    {
                        SharedStateAnalyser.AnalyseMemoryRegionsInCall(ac, ep, cmd as CallCmd);
                    }
                    else if (cmd is AssignCmd)
                    {
                        foreach (var lhs in (cmd as AssignCmd).Lhss.OfType <MapAssignLhs>())
                        {
                            if (!(lhs.DeepAssignedIdentifier.Name.StartsWith("$M.")) ||
                                !(lhs.Map is SimpleAssignLhs) || lhs.Indexes.Count != 1)
                            {
                                continue;
                            }

                            Variable v = ac.TopLevelDeclarations.OfType <GlobalVariable>().ToList().
                                         Find(val => val.Name.Equals(lhs.DeepAssignedIdentifier.Name));

                            if (!vars.Any(val => val.Name.Equals(v.Name)))
                            {
                                vars.Add(v);
                            }
                        }

                        foreach (var lhs in (cmd as AssignCmd).Lhss.OfType <SimpleAssignLhs>())
                        {
                            if (!(lhs.DeepAssignedIdentifier.Name.StartsWith("$M.")))
                            {
                                continue;
                            }

                            Variable v = ac.TopLevelDeclarations.OfType <GlobalVariable>().ToList().
                                         Find(val => val.Name.Equals(lhs.DeepAssignedIdentifier.Name));

                            if (!vars.Any(val => val.Name.Equals(v.Name)))
                            {
                                vars.Add(v);
                            }
                        }

                        foreach (var rhs in (cmd as AssignCmd).Rhss.OfType <NAryExpr>())
                        {
                            if (!(rhs.Fun is MapSelect) || rhs.Args.Count != 2 ||
                                !((rhs.Args[0] as IdentifierExpr).Name.StartsWith("$M.")))
                            {
                                continue;
                            }

                            Variable v = ac.TopLevelDeclarations.OfType <GlobalVariable>().ToList().
                                         Find(val => val.Name.Equals((rhs.Args[0] as IdentifierExpr).Name));

                            if (!vars.Any(val => val.Name.Equals(v.Name)))
                            {
                                vars.Add(v);
                            }
                        }

                        foreach (var rhs in (cmd as AssignCmd).Rhss.OfType <IdentifierExpr>())
                        {
                            if (!rhs.Name.StartsWith("$M."))
                            {
                                continue;
                            }

                            Variable v = ac.TopLevelDeclarations.OfType <GlobalVariable>().ToList().
                                         Find(val => val.Name.Equals(rhs.Name));

                            if (!vars.Any(val => val.Name.Equals(v.Name)))
                            {
                                vars.Add(v);
                            }
                        }

                        SharedStateAnalyser.AnalyseMemoryRegionsInAssign(ac, ep, cmd as AssignCmd);
                    }
                }
            }

            vars = vars.OrderBy(val => val.Name).ToList();
            SharedStateAnalyser.MemoryRegions.Add(impl, vars);

            foreach (var v in vars)
            {
                if (SharedStateAnalyser.EntryPointMemoryRegions[ep].Any(val => val.Name.Equals(v.Name)))
                {
                    continue;
                }
                SharedStateAnalyser.EntryPointMemoryRegions[ep].Add(v);
            }
        }