private void BuildWebOf() { this.webOf = new Dictionary<Identifier, Web>(); foreach (SsaIdentifier sid in ssaIds) { Web w = new Web(); w.Add(sid); webOf[sid.Identifier] = w; webs.Add(w); } }
public void DeciWeb() { Build(new DiamondMock().Procedure); DeclarationInserter deci = new DeclarationInserter(ssaIds, doms); Web web = new Web(); SsaIdentifier r_1 = ssaIds.Where(s => s.Identifier.Name == "r_1").Single(); SsaIdentifier r_3 = ssaIds.Where(s => s.Identifier.Name == "r_3").Single(); SsaIdentifier r_4 = ssaIds.Where(s => s.Identifier.Name == "r_4").Single(); web.Add(r_1); web.Add(r_3); web.Add(r_4); deci.InsertDeclaration(web); Assert.AreEqual("word32 r_1", proc.ControlGraph.Blocks[2].Statements[0].Instruction.ToString()); }
public void InsertDeclaration(Web web) { var blocks = new HashSet<Block>(); foreach (SsaIdentifier sid in web.Members) { if (sid.DefStatement != null) { if (sid.DefStatement.Instruction is DefInstruction) return; blocks.Add(sid.DefStatement.Block); foreach (Statement u in sid.Uses) { blocks.Add(u.Block); } } } Block dominator = doms.CommonDominator(blocks); if (dominator != null) { foreach (SsaIdentifier sid in web.Members) { if (sid.DefStatement != null && sid.DefStatement.Block == dominator) { Assignment ass = sid.DefStatement.Instruction as Assignment; if (ass != null && ass.Dst == sid.Identifier) { sid.DefStatement.Instruction = new Declaration(web.Identifier, ass.Src); } else { int idx = dominator.Statements.IndexOf(sid.DefStatement); dominator.Statements.Insert( idx, sid.DefStatement.LinearAddress, new Declaration(web.Identifier, null)); } return; } } dominator.Statements.Insert(0, 0, new Declaration(web.Identifier, null)); } }
private void Merge(Web a, Web b) { Web c = new Web(); foreach (SsaIdentifier sid in a.Members) { c.Add(sid); webOf[sid.Identifier] = c; foreach (Statement u in a.Uses) if (!c.Uses.Contains(u)) c.Uses.Add(u); } foreach (SsaIdentifier sid in b.Members) { c.Add(sid); webOf[sid.Identifier] = c; foreach (Statement u in b.Uses) if (!c.Uses.Contains(u)) c.Uses.Add(u); } webs.Remove(a); webs.Remove(b); webs.Add(c); }