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; }
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)); }
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); } }
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); } } }
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); }
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); } } }
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); } }