Exemplo n.º 1
0
        private void BuildUsedToDeclMap( )
        {
            UsedToDeclMap.Clear( );
            foreach (var used in GVarsUsed)
            {
                foreach (var v in GVarsDecl)
                {
                    if (Regex.IsMatch(used, $"^{v.Name}(_[0123456789]+)?$"))
                    {
                        UsedToDeclMap[used] = v;
                    }
                }
                if (!UsedToDeclMap.ContainsKey(used))
                {
                    var v = new GVar( )
                    {
                        Name = used,
                        Type = "void *"
                    };
                    GVarsDecl.Add(v);
                    UsedToDeclMap[used] = v;
                }
            }

            foreach (var v in GVarsDecl)
            {
                UsedToDeclMap[v.Name] = v;
            }
        }
Exemplo n.º 2
0
        public void Rename(string oldName, string newName)
        {
            Blocks.ForEach(b => b.Rename(oldName, newName));

            if (GVarsDecl.Count(v => v.Name == oldName) != 0)
            {
                GVarsDecl.Where(v => v.Name == oldName).FirstOrDefault( ).Name =
                    UsedToDeclMap.ContainsKey(newName) ? UsedToDeclMap[newName].Name : newName;
            }
            GVarsDecl = new HashSet <GVar> (GVarsDecl);

            if (GVarsUsed.Remove(oldName))
            {
                GVarsUsed.Add(newName);
                if (UsedToDeclMap.ContainsKey(oldName))
                {
                    UsedToDeclMap[newName] = UsedToDeclMap[oldName];
                    UsedToDeclMap.Remove(oldName);
                }
            }
        }
Exemplo n.º 3
0
        private void PreProcess(GFunction gFunc)
        {
            for (int times = 0; times != Iterations; ++times)
            {
                var varMap = GetVarMap(gFunc)
                             .ToDictionary(x => x.Key.Name, x => x.Value.Select(y => y.Name).ToList( ));
                var revVarMap = varMap
                                .GroupBy(x => string.Join(", ", x.Value.OrderBy(v => v)))
                                .Where(x => x.Count( ) > 1)
                                .ToDictionary(x => x.Key, x => x.Select(y => y.Key).ToList( ));

                var lhsVars = this.GStatements.SelectMany(b => b.Vars).Distinct( ).ToList( );
                var rhsVars = gFunc.GStatements.SelectMany(b => b.Vars).Distinct( ).ToList( );

                foreach (var rhsVar in lhsVars)
                {
                    if (!UsedToDeclMap.ContainsKey(rhsVar))
                    {
                        continue;
                    }
                    this.Rename(rhsVar, UsedToDeclMap[rhsVar].Name);
                }
                foreach (var rhsVar in rhsVars)
                {
                    if (!gFunc.UsedToDeclMap.ContainsKey(rhsVar))
                    {
                        continue;
                    }
                    gFunc.Rename(rhsVar, gFunc.UsedToDeclMap[rhsVar].Name);
                }

                foreach (var pair in varMap)
                {
                    if (revVarMap.ContainsKey(pair.Value.First( )))
                    {
                        this.Rename(pair.Key, pair.Value.First( ));
                    }
                    else
                    {
                        foreach (var v in pair.Value)
                        {
                            gFunc.Rename(v, pair.Key);
                        }
                    }
                }

                gFunc.GetVarsUsed( );
                gFunc.BuildUsedToDeclMap( );
                gFunc.BuildDUC( );
                this.GetVarsUsed( );
                this.BuildUsedToDeclMap( );
                this.BuildDUC( );

                if (DumpIntermediateGimple)
                {
                    var lhsFileName = Path.GetFileNameWithoutExtension(FileName);
                    var rhsFileName = Path.GetFileNameWithoutExtension(gFunc.FileName);
                    DumpGimple($"{Folder}\\{lhsFileName}_{rhsFileName}_pass_{times + 1}.GIMPLE");
                    gFunc.DumpGimple($"{gFunc.Folder}\\{rhsFileName}_{lhsFileName}_pass_{times + 1}.GIMPLE");
                }
            }
        }