diff --git a/Cpp2IL.Core/Analysis/Actions/ARM64/Arm64CallThrowHelperAction.cs b/Cpp2IL.Core/Analysis/Actions/ARM64/Arm64CallThrowHelperAction.cs index 86b4bd11..a902e651 100644 --- a/Cpp2IL.Core/Analysis/Actions/ARM64/Arm64CallThrowHelperAction.cs +++ b/Cpp2IL.Core/Analysis/Actions/ARM64/Arm64CallThrowHelperAction.cs @@ -29,7 +29,7 @@ public static bool IsThrowHelper(long pointer, int depth = 0) _checkedAddresses.Add(pointer); //This will only return up to the first branch, because it's an unmanaged function, but that's fine for these purposes - var funcBody = Utils.GetArm64MethodBodyAtVirtualAddress((ulong)pointer, false); + var funcBody = Utils.GetArm64MethodBodyAtVirtualAddress((ulong)pointer, false, 14); var registerPages = new Dictionary(); foreach (var arm64Instruction in funcBody.Where(i => i.Mnemonic is "adrp" && i.Details.Operands[0].Type == Arm64OperandType.Register)) diff --git a/Cpp2IL.Core/Analysis/AsmAnalyzerArmV8A.InstructionChecks.cs b/Cpp2IL.Core/Analysis/AsmAnalyzerArmV8A.InstructionChecks.cs index 4fe6349d..dc62b926 100644 --- a/Cpp2IL.Core/Analysis/AsmAnalyzerArmV8A.InstructionChecks.cs +++ b/Cpp2IL.Core/Analysis/AsmAnalyzerArmV8A.InstructionChecks.cs @@ -69,6 +69,11 @@ private void CheckForSingleOpInstruction(Arm64Instruction instruction) { Analysis.Actions.Add(new Arm64NewObjectAction(Analysis, instruction)); } + else if (LibCpp2IlMain.Binary!.ConcreteGenericImplementationsByAddress.ContainsKey(jumpTarget)) + { + //Call concrete generic function + Analysis.Actions.Add(new Arm64ManagedFunctionCallAction(Analysis, instruction)); + } else if (jumpTarget < Utils.GetAddressOfNextFunctionStart((ulong)instruction.Address) && jumpTarget > (ulong)instruction.Address) { //Jumping over an instruction, may need to expand function to include jumpTarget.