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