diff --git a/ARMeilleure/Decoders/Decoder.cs b/ARMeilleure/Decoders/Decoder.cs index 2311e9e96..8eb2a99d6 100644 --- a/ARMeilleure/Decoders/Decoder.cs +++ b/ARMeilleure/Decoders/Decoder.cs @@ -10,6 +10,11 @@ namespace ARMeilleure.Decoders { static class Decoder { + // We define a limit on the number of instructions that a function may have, + // this prevents functions being potentially too large, which would + // take too long to compile and use too much memory. + private const int MaxInstsPerFunction = 5000; + private delegate object MakeOp(InstDescriptor inst, ulong address, int opCode); private static ConcurrentDictionary _opActivators; @@ -36,10 +41,17 @@ namespace ARMeilleure.Decoders Dictionary visited = new Dictionary(); + int opsCount = 0; + Block GetBlock(ulong blkAddress) { if (!visited.TryGetValue(blkAddress, out Block block)) { + if (opsCount > MaxInstsPerFunction) + { + return null; + } + block = new Block(blkAddress); workQueue.Enqueue(block); @@ -92,6 +104,8 @@ namespace ARMeilleure.Decoders FillBlock(memory, mode, currBlock, limitAddress); + opsCount += currBlock.OpCodes.Count; + if (currBlock.OpCodes.Count != 0) { // Set child blocks. "Branch" is the block the branch instruction