mirror of
https://github.com/AssetRipper/Cpp2IL.git
synced 2026-11-13 12:41:25 -10:00
75 lines
2.8 KiB
C#
75 lines
2.8 KiB
C#
using System.Collections.Generic;
|
|
using Cpp2IL.Core.Graphs;
|
|
using Cpp2IL.Core.ISIL;
|
|
|
|
namespace Cpp2IL.Core.Tests.Graphing;
|
|
|
|
public class BasicGraph
|
|
{
|
|
ISILControlFlowGraph graph;
|
|
|
|
[SetUp]
|
|
public void Setup()
|
|
{
|
|
var instructions = new List<Instruction>();
|
|
void Add(int index, OpCode opCode, params object[] operands) => instructions.Add(new Instruction(index, opCode, Ops(operands)));
|
|
|
|
Add(00, OpCode.ShiftStack, -40);
|
|
Add(01, OpCode.CheckEqual, new Register(null, "zf"), new Register(null, "test1"), new Register(null, "test2"));
|
|
Add(02, OpCode.Not, new Register(null, "zf"), new Register(null, "zf"));
|
|
Add(03, OpCode.ConditionalJump, 7, new Register(null, "zf"));
|
|
Add(04, OpCode.Move, new Register(null, "test3"), 0);
|
|
Add(05, OpCode.Call, 0xDEADBEEF);
|
|
Add(06, OpCode.Move, new Register(null, "test4"), 0);
|
|
Add(07, OpCode.Move, new Register(null, "test5"), 0);
|
|
Add(08, OpCode.CheckEqual, new Register(null, "zf"), new Register(null, "test1"), new Register(null, "test2"));
|
|
Add(09, OpCode.ConditionalJump, 14, new Register(null, "zf"));
|
|
Add(10, OpCode.CheckEqual, new Register(null, "zf"), new Register(null, "test1"), new Register(null, "test2"));
|
|
Add(11, OpCode.Not, new Register(null, "zf"), new Register(null, "zf"));
|
|
Add(12, OpCode.ConditionalJump, 14, new Register(null, "zf"));
|
|
Add(13, OpCode.Call, 0xDEADBEEF);
|
|
Add(14, OpCode.Move, new Register(null, "test4"), 0);
|
|
Add(15, OpCode.Move, new Register(null, "test5"), 0);
|
|
Add(16, OpCode.ShiftStack, 40);
|
|
Add(17, OpCode.Call, 0xDEADBEEF);
|
|
|
|
foreach (var instruction in instructions)
|
|
{
|
|
if (instruction.OpCode != OpCode.Jump && instruction.OpCode != OpCode.ConditionalJump)
|
|
continue;
|
|
instruction.SetOperand(0, instructions[(int)((Immediate)instruction.Operands[0]).Value]);
|
|
}
|
|
|
|
graph = new ISILControlFlowGraph(instructions);
|
|
}
|
|
|
|
[Test]
|
|
public void VerifyNumberOfBlocks()
|
|
{
|
|
Assert.That(graph.Blocks.Count == 9);
|
|
}
|
|
|
|
[Test]
|
|
public void VerifyBlockEdges()
|
|
{
|
|
foreach (var block in graph.Blocks)
|
|
{
|
|
switch (block.BlockType)
|
|
{
|
|
case BlockType.Entry:
|
|
Assert.That(block.Predecessors.Count == 0);
|
|
Assert.That(block.Successors.Count > 0);
|
|
break;
|
|
case BlockType.Exit:
|
|
Assert.That(block.Successors.Count == 0);
|
|
Assert.That(block.Predecessors.Count > 0);
|
|
break;
|
|
default:
|
|
Assert.That(block.Successors.Count >= 1);
|
|
Assert.That(block.Predecessors.Count >= 1);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|