diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index a0ccb4400f0758..841b6a98bd7557 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -392,7 +392,7 @@ private void PublishCode() _methodCodeNode.InitializeEHInfo(ehInfo); _methodCodeNode.InitializeDebugLocInfos(_debugLocInfos); - _methodCodeNode.InitializeDebugVarInfos(_debugVarInfos); + _methodCodeNode.InitializeDebugVarInfos(_debugVarInfos, _compilation.TypeSystemContext.Target); #if READYTORUN _methodCodeNode.InitializeInliningInfo(_inlinedMethods.ToArray()); diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/DebugInfoTableNode.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/DebugInfoTableNode.cs index fd628b637a17f9..24f5409a318f90 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/DebugInfoTableNode.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/DebugInfoTableNode.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using Internal.JitInterface; @@ -149,11 +150,13 @@ public static byte[] CreateBoundsBlobForMethod(OffsetMapping[] offsetMapping) return writer.ToArray(); } - public static byte[] CreateVarBlobForMethod(NativeVarInfo[] varInfos) + public static byte[] CreateVarBlobForMethod(NativeVarInfo[] varInfos, TargetDetails target) { if (varInfos == null || varInfos.Length == 0) return null; + bool isX86 = target.Architecture == TargetArchitecture.X86; + NibbleWriter writer = new NibbleWriter(); writer.WriteUInt((uint)varInfos.Length); @@ -177,7 +180,7 @@ public static byte[] CreateVarBlobForMethod(NativeVarInfo[] varInfos) case VarLocType.VLT_STK: case VarLocType.VLT_STK_BYREF: writer.WriteUInt((uint)nativeVarInfo.varLoc.B); - writer.WriteInt(nativeVarInfo.varLoc.C); + WriteEncodedStackOffset(writer, nativeVarInfo.varLoc.C, assume4ByteAligned : isX86); break; case VarLocType.VLT_REG_REG: writer.WriteUInt((uint)nativeVarInfo.varLoc.B); @@ -186,16 +189,16 @@ public static byte[] CreateVarBlobForMethod(NativeVarInfo[] varInfos) case VarLocType.VLT_REG_STK: writer.WriteUInt((uint)nativeVarInfo.varLoc.B); writer.WriteUInt((uint)nativeVarInfo.varLoc.C); - writer.WriteInt(nativeVarInfo.varLoc.D); + WriteEncodedStackOffset(writer, nativeVarInfo.varLoc.D, assume4ByteAligned : isX86); break; case VarLocType.VLT_STK_REG: - writer.WriteInt(nativeVarInfo.varLoc.B); + WriteEncodedStackOffset(writer, nativeVarInfo.varLoc.B, assume4ByteAligned : isX86); writer.WriteUInt((uint)nativeVarInfo.varLoc.C); writer.WriteUInt((uint)nativeVarInfo.varLoc.D); break; case VarLocType.VLT_STK2: writer.WriteUInt((uint)nativeVarInfo.varLoc.B); - writer.WriteInt(nativeVarInfo.varLoc.C); + WriteEncodedStackOffset(writer, nativeVarInfo.varLoc.C, assume4ByteAligned : isX86); break; case VarLocType.VLT_FPSTK: writer.WriteUInt((uint)nativeVarInfo.varLoc.B); @@ -206,6 +209,19 @@ public static byte[] CreateVarBlobForMethod(NativeVarInfo[] varInfos) default: throw new BadImageFormatException("Unexpected var loc type"); } + + static void WriteEncodedStackOffset(NibbleWriter _writer, int offset, bool assume4ByteAligned) + { + if (assume4ByteAligned) + { + Debug.Assert(offset % 4 == 0); + _writer.WriteInt(offset / 4); + } + else + { + _writer.WriteInt(offset); + } + } } return writer.ToArray(); diff --git a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodWithGCInfo.cs b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodWithGCInfo.cs index 9dc2907900a4a5..720cce1b60b4b7 100644 --- a/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodWithGCInfo.cs +++ b/src/coreclr/tools/aot/ILCompiler.ReadyToRun/Compiler/DependencyAnalysis/ReadyToRun/MethodWithGCInfo.cs @@ -296,12 +296,12 @@ public void InitializeDebugLocInfos(OffsetMapping[] debugLocInfos) _debugLocInfos = DebugInfoTableNode.CreateBoundsBlobForMethod(debugLocInfos); } - public void InitializeDebugVarInfos(NativeVarInfo[] debugVarInfos) + public void InitializeDebugVarInfos(NativeVarInfo[] debugVarInfos, TargetDetails target) { Debug.Assert(_debugVarInfos == null); // Process the debug info from JIT format to R2R format immediately as it is large // and not used in the rest of the process except to emit. - _debugVarInfos = DebugInfoTableNode.CreateVarBlobForMethod(debugVarInfos); + _debugVarInfos = DebugInfoTableNode.CreateVarBlobForMethod(debugVarInfos, target); } public void InitializeDebugEHClauseInfos(DebugEHClauseInfo[] debugEHClauseInfos)