-
Notifications
You must be signed in to change notification settings - Fork 65
Description
Issue
The assertion detecting logic in PMIDriver (
Lines 214 to 267 in 945715f
| if (idx == -1) | |
| { | |
| //File.WriteAllText(pi.assemblyName + ".prepall", szOutput); | |
| idx = szOutput.IndexOf("]): Assertion failed '"); | |
| if (idx != -1) | |
| { | |
| temp.assert = true; | |
| //Assert failure(PID 440 [0x000001b8], Thread: 3220 [0xc94]): Assertion failed 'genActualType(tree->gtType) == TYP_INT || genActualType(tree->gtType) == TYP_I_IMPL || genActualType(tree->gtType) == TYP_REF || tree->gtType == TYP_BYREF' in 'ELP.Program:Main(ref):int' | |
| //File: c:\dd\arm_1\src\ndp\clr\src\jit\il\codegen.cpp, Line: 945 Image: | |
| int idx2 = szOutput.IndexOf("Image:", idx); | |
| string szTemp = szOutput.Substring(idx, idx2 - idx); | |
| //]): Assertion failed 'genActualType(tree->gtType) == TYP_INT || genActualType(tree->gtType) == TYP_I_IMPL || genActualType(tree->gtType) == TYP_REF || tree->gtType == TYP_BYREF' in 'ELP.Program:Main(ref):int' | |
| //File: c:\dd\arm_1\src\ndp\clr\src\jit\il\codegen.cpp, Line: 945 Image: | |
| string[] szTemp2 = szTemp.Split('\''); | |
| temp.errorMessage = szTemp2[1]; | |
| temp.errorDetail = szTemp2[3]; | |
| temp.assemblyName = pi.assemblyName; | |
| } | |
| else | |
| { | |
| idx = szOutput.IndexOf("Assert failure(PID "); | |
| if (idx != -1) | |
| { | |
| temp.assert = true; | |
| //Assert failure(PID 12020 [0x00002ef4], Thread: 13276 [0x33dc]): (entry == NULL) || (entry == GetSlot(numGenericArgs,i)) || IsCompilationProcess() | |
| //CLR! Dictionary::PrepopulateDictionary + 0x135 (0x603435b8) | |
| //CLR! MethodCallGraphPreparer::PrepareMethods + 0x24B (0x602e7e45) | |
| //CLR! MethodCallGraphPreparer::Run + 0x45E (0x602e7308) | |
| //CLR! PrepareMethodDesc + 0x11B (0x602e9559) | |
| //CLR! ReflectionInvocation::PrepareMethod + 0x596 (0x60494ac0) | |
| //MSCORLIB.NI! <no symbol> + 0x0 (0x5e4aff9d) | |
| //<no module>! <no symbol> + 0x0 (0x005821b7) | |
| //CLR! CallDescrWorkerInternal + 0x34 (0x5fddcb2d) | |
| //CLR! CallDescrWorker + 0xD5 (0x600da980) | |
| //CLR! CallDescrWorkerWithHandler + 0x1B9 (0x600daba1) | |
| // File: c:\clr2\src\ndp\clr\src\vm\genericdict.cpp, Line: 933 Image: | |
| //c:\pmi\pmi.exe | |
| idx = szOutput.IndexOf("]): ", idx); | |
| int idx2 = szOutput.IndexOf("\r\n", idx); | |
| string szTemp = szOutput.Substring(idx + 4, idx2 - idx - 4); | |
| //(entry == NULL) || (entry == GetSlot(numGenericArgs,i)) || IsCompilationProcess() | |
| temp.errorMessage = szTemp; | |
| //temp.errorDetail = szTemp2[3]; | |
| temp.assemblyName = pi.assemblyName; | |
| } | |
| else | |
| { | |
| Console.WriteLine("Failed PREPALL on {0}", pi.assemblyName); | |
| temp.errorMessage = "General error, no assert seen."; | |
| } | |
| } | |
| } |
Additionally, due to other changes in the JIT, assertions are never logged in the default scenario.
Repro
- Clone dotnet/runtime
- Build the repo in all required configurations
- Clone dotnet/jitutils
- Build the repo using
.\bootstrap.cmd - In the dotnet/runtime root, run
jit-diff.bat diff --diff --pmi
Observe that the command fails due to dotnet/runtime#51728. However, System.Private.Corelib.err reports: General error, no assert seen.
Analysis
assertAbort (https://github.com/dotnet/runtime/blob/main/src/coreclr/jit/error.cpp#L277-L323) currently fails to log anything because COMPlus_JitFuncInfoLogFile is not set and because the default CoreCLR.dll (VM) for the PMI diffs is release which means CEEInfo::doAssert does not actually print anything: https://github.com/dotnet/runtime/blob/main/src/coreclr/vm/jitinterface.cpp#L10897-L10925
Additionally, even if the assertions are printed, they currently resemble:
Encoding:GetCharsWithFallback(long,int,long,int,int,int):int:this - Assertion failed (C:\Users\tagoo\Source\repos\runtime_base\src\coreclr\jit\emitxarch.cpp:11739 - ((regMask & emitThisGCrefRegs) && (ins == INS_add)) || ((regMask & emitThisByrefRegs) && (ins == INS_add || ins == INS_sub))) during Emit code
While the PMIDriver is currently looking for ]): Assertion failed ' and Assert failure(PID , neither of which are used by this failure path.