using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.IO;
using Internal.JitInterface;
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);
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);
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);
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();
_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)