Beispiel #1
0
        /// <summary>
        /// Runs a pair instrumentation pass.
        /// </summary>
        public void Run()
        {
            if (WhoopCommandLineOptions.Get().MeasurePassExecutionTime)
            {
                this.Timer = new ExecutionTimer();
                this.Timer.Start();
            }

            PairCheckingRegion region = new PairCheckingRegion(this.AC, this.EP1, this.EP2);

            AnalysisContext.RegisterPairEntryPointAnalysisContext(region, this.EP1, this.EP2);

            if (this.EP1.IsInit || this.EP2.IsInit)
            {
                this.CreateDeviceStructConstant();
            }

            this.AC.TopLevelDeclarations.Add(region.Procedure());
            this.AC.TopLevelDeclarations.Add(region.Implementation());
            this.AC.ResContext.AddProcedure(region.Procedure());

            if (WhoopCommandLineOptions.Get().MeasurePassExecutionTime)
            {
                this.Timer.Stop();
                Console.WriteLine(" |  |------ [PairInstrumentation] {0}", this.Timer.Result());
            }
        }
Beispiel #2
0
 internal static void RegisterPairEntryPointAnalysisContext(PairCheckingRegion region,
                                                            EntryPoint ep1, EntryPoint ep2)
 {
     if (AnalysisContext.PairRegistry.ContainsKey(region))
     {
         AnalysisContext.PairRegistry[region] = new Tuple <EntryPoint, EntryPoint>(ep1, ep2);
     }
     else
     {
         AnalysisContext.PairRegistry.Add(region, new Tuple <EntryPoint, EntryPoint>(ep1, ep2));
     }
 }
        private void UpdateInParamMap(Dictionary <string, Dictionary <Variable, int> > inParamMap,
                                      EntryPoint ep, PairCheckingRegion pairRegion)
        {
            var ac     = AnalysisContext.GetAnalysisContext(ep);
            var region = ac.InstrumentationRegions.Find(val => val.Implementation().Name.Equals(ep.Name));

            foreach (var resource in region.GetResourceAccesses())
            {
                if (!inParamMap.ContainsKey(resource.Key))
                {
                    inParamMap.Add(resource.Key, new Dictionary <Variable, int>());
                }

                foreach (var access in resource.Value)
                {
                    Expr a = null;
                    if (!pairRegion.TryGetMatchedAccess(ep, access, out a))
                    {
                        continue;
                    }

                    IdentifierExpr id  = null;
                    var            num = 0;

                    if (a is NAryExpr)
                    {
                        id  = (a as NAryExpr).Args[0] as IdentifierExpr;
                        num = ((a as NAryExpr).Args[1] as LiteralExpr).asBigNum.ToInt;
                    }
                    else if (a is IdentifierExpr)
                    {
                        id = a as IdentifierExpr;
                    }

                    var inParam = pairRegion.Procedure().InParams.Find(val => val.Name.Equals(id.Name));
                    if (inParam == null)
                    {
                        continue;
                    }

                    if (!inParamMap[resource.Key].ContainsKey(inParam))
                    {
                        inParamMap[resource.Key].Add(inParam, num);
                    }
                    else if (inParamMap[resource.Key][inParam] < num)
                    {
                        inParamMap[resource.Key][inParam] = num;
                    }
                }
            }
        }