Make unwind info specific to amd64
authorAmy Yu <amycmyu@gmail.com>
Wed, 13 Jun 2018 22:19:21 +0000 (15:19 -0700)
committerAmy Yu <amycmyu@gmail.com>
Tue, 19 Jun 2018 23:38:28 +0000 (16:38 -0700)
Commit migrated from https://github.com/dotnet/coreclr/commit/eb72e95785c60242e05638066c4d04b457a3d2d8

src/coreclr/src/tools/r2rdump/Amd64UnwindInfo.cs [moved from src/coreclr/src/tools/r2rdump/UnwindInfo.cs with 82% similarity]
src/coreclr/src/tools/r2rdump/R2RDump.cs
src/coreclr/src/tools/r2rdump/R2RMethod.cs
src/coreclr/src/tools/r2rdump/R2RReader.cs

@@ -6,7 +6,7 @@ using System.Text;
 
 namespace R2RDump
 {
-    public enum UnwindOpCodes
+    public enum Amd64UnwindOpCodes
     {
         UWOP_PUSH_NONVOL = 0,
         UWOP_ALLOC_LARGE,
@@ -22,10 +22,10 @@ namespace R2RDump
         UWOP_SET_FPREG_LARGE,
     }
 
-    struct UnwindCode
+    struct Amd64UnwindCode
     {
         public byte CodeOffset { get; }
-        public UnwindOpCodes UnwindOp { get; } //4 bits
+        public Amd64UnwindOpCodes UnwindOp { get; } //4 bits
         public byte OpInfo { get; } //4 bits
 
         public byte OffsetLow { get; }
@@ -33,12 +33,12 @@ namespace R2RDump
 
         public uint FrameOffset { get; }
 
-        public UnwindCode(byte[] image, ref int offset)
+        public Amd64UnwindCode(byte[] image, ref int offset)
         {
             int off = offset;
             CodeOffset = NativeReader.ReadByte(image, ref off);
             byte op = NativeReader.ReadByte(image, ref off);
-            UnwindOp = (UnwindOpCodes)(op & 15);
+            UnwindOp = (Amd64UnwindOpCodes)(op & 15);
             OpInfo = (byte)(op >> 4);
 
             OffsetLow = CodeOffset;
@@ -48,7 +48,7 @@ namespace R2RDump
         }
     }
 
-    struct UnwindInfo
+    struct Amd64UnwindInfo : UnwindInfo
     {
         private const int _sizeofUnwindCode = 2;
         private const int _offsetofUnwindCode = 4;
@@ -57,13 +57,13 @@ namespace R2RDump
         public byte Flags { get; } //5 bits
         public byte SizeOfProlog { get; }
         public byte CountOfUnwindCodes { get; }
-        public Registers FrameRegister { get; } //4 bits
+        public Amd64Registers FrameRegister { get; } //4 bits
         public byte FrameOffset { get; } //4 bits
-        public UnwindCode[] UnwindCode { get; }
+        public Amd64UnwindCode[] UnwindCode { get; }
         public uint PersonalityRoutineRVA { get; }
         public int Size { get; }
 
-        public UnwindInfo(byte[] image, int offset)
+        public Amd64UnwindInfo(byte[] image, int offset)
         {
             byte versionAndFlags = NativeReader.ReadByte(image, ref offset);
             Version = (byte)(versionAndFlags & 7);
@@ -71,13 +71,13 @@ namespace R2RDump
             SizeOfProlog = NativeReader.ReadByte(image, ref offset);
             CountOfUnwindCodes = NativeReader.ReadByte(image, ref offset);
             byte frameRegisterAndOffset = NativeReader.ReadByte(image, ref offset);
-            FrameRegister = (Registers)(frameRegisterAndOffset & 15);
+            FrameRegister = (Amd64Registers)(frameRegisterAndOffset & 15);
             FrameOffset = (byte)(frameRegisterAndOffset >> 4);
 
-            UnwindCode = new UnwindCode[CountOfUnwindCodes];
+            UnwindCode = new Amd64UnwindCode[CountOfUnwindCodes];
             for (int i = 0; i < CountOfUnwindCodes; i++)
             {
-                UnwindCode[i] = new UnwindCode(image, ref offset);
+                UnwindCode[i] = new Amd64UnwindCode(image, ref offset);
             }
 
             PersonalityRoutineRVA = NativeReader.ReadUInt32(image, ref offset);
@@ -120,10 +120,10 @@ namespace R2RDump
 
             switch (UnwindCode[i].UnwindOp)
             {
-                case UnwindOpCodes.UWOP_PUSH_NONVOL:
-                    sb.AppendLine($"{tab2}OpInfo: {(Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
+                case Amd64UnwindOpCodes.UWOP_PUSH_NONVOL:
+                    sb.AppendLine($"{tab2}OpInfo: {(Amd64Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
                     break;
-                case UnwindOpCodes.UWOP_ALLOC_LARGE:
+                case Amd64UnwindOpCodes.UWOP_ALLOC_LARGE:
                     sb.Append($"{tab2}OpInfo: {UnwindCode[i].OpInfo} - ");
                     if (UnwindCode[i].OpInfo == 0)
                     {
@@ -146,14 +146,14 @@ namespace R2RDump
                         sb.AppendLine("Unknown");
                     }
                     break;
-                case UnwindOpCodes.UWOP_ALLOC_SMALL:
+                case Amd64UnwindOpCodes.UWOP_ALLOC_SMALL:
                     int opInfo = UnwindCode[i].OpInfo * 8 + 8;
                     sb.AppendLine($"{tab2}OpInfo: {UnwindCode[i].OpInfo} * 8 + 8 = {opInfo} = 0x{opInfo:X2}");
                     break;
-                case UnwindOpCodes.UWOP_SET_FPREG:
+                case Amd64UnwindOpCodes.UWOP_SET_FPREG:
                     sb.AppendLine($"{tab2}OpInfo: Unused({UnwindCode[i].OpInfo})");
                     break;
-                case UnwindOpCodes.UWOP_SET_FPREG_LARGE:
+                case Amd64UnwindOpCodes.UWOP_SET_FPREG_LARGE:
                     {
                         sb.AppendLine($"{tab2}OpInfo: Unused({UnwindCode[i].OpInfo})");
                         i++;
@@ -167,17 +167,17 @@ namespace R2RDump
                         }
                     }
                     break;
-                case UnwindOpCodes.UWOP_SAVE_NONVOL:
+                case Amd64UnwindOpCodes.UWOP_SAVE_NONVOL:
                     {
-                        sb.AppendLine($"{tab2}OpInfo: {(Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
+                        sb.AppendLine($"{tab2}OpInfo: {(Amd64Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
                         i++;
                         uint offset = UnwindCode[i].FrameOffset * 8;
                         sb.AppendLine($"{tab2}Scaled Offset: {UnwindCode[i].FrameOffset} * 8 = {offset} = 0x{offset:X5}");
                     }
                     break;
-                case UnwindOpCodes.UWOP_SAVE_NONVOL_FAR:
+                case Amd64UnwindOpCodes.UWOP_SAVE_NONVOL_FAR:
                     {
-                        sb.AppendLine($"{tab2}OpInfo: {(Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
+                        sb.AppendLine($"{tab2}OpInfo: {(Amd64Registers)UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
                         i++;
                         uint offset = UnwindCode[i].FrameOffset;
                         i++;
@@ -185,7 +185,7 @@ namespace R2RDump
                         sb.AppendLine($"{tab2}Unscaled Large Offset: 0x{offset:X8}");
                     }
                     break;
-                case UnwindOpCodes.UWOP_SAVE_XMM128:
+                case Amd64UnwindOpCodes.UWOP_SAVE_XMM128:
                     {
                         sb.AppendLine($"{tab2}OpInfo: XMM{UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
                         i++;
@@ -194,7 +194,7 @@ namespace R2RDump
                     }
                     break;
 
-                case UnwindOpCodes.UWOP_SAVE_XMM128_FAR:
+                case Amd64UnwindOpCodes.UWOP_SAVE_XMM128_FAR:
                     {
                         sb.AppendLine($"{tab2}OpInfo: XMM{UnwindCode[i].OpInfo}({UnwindCode[i].OpInfo})");
                         i++;
@@ -204,9 +204,9 @@ namespace R2RDump
                         sb.AppendLine($"{tab2}Unscaled Large Offset: 0x{offset:X8}");
                     }
                     break;
-                case UnwindOpCodes.UWOP_EPILOG:
-                case UnwindOpCodes.UWOP_SPARE_CODE:
-                case UnwindOpCodes.UWOP_PUSH_MACHFRAME:
+                case Amd64UnwindOpCodes.UWOP_EPILOG:
+                case Amd64UnwindOpCodes.UWOP_SPARE_CODE:
+                case Amd64UnwindOpCodes.UWOP_PUSH_MACHFRAME:
                 default:
                     sb.AppendLine($"{tab2}OpInfo: {UnwindCode[i].OpInfo}");
                     sb.AppendLine();
index ccc736a..2ed98c4 100644 (file)
@@ -203,7 +203,7 @@ namespace R2RDump
                 _writer.Write(rtf.UnwindInfo);
                 if (_raw)
                 {
-                    DumpBytes(r2r, rtf.UnwindRVA, (uint)rtf.UnwindInfo.Size);
+                    DumpBytes(r2r, rtf.UnwindRVA, (uint)((Amd64UnwindInfo)rtf.UnwindInfo).Size);
                 }
             }
             _writer.WriteLine();
index 78e90af..9577b81 100644 (file)
@@ -12,6 +12,11 @@ using System.Text;
 
 namespace R2RDump
 {
+    interface UnwindInfo
+    {
+
+    }
+
     class RuntimeFunction
     {
         /// <summary>
index eeced9e..45af77f 100644 (file)
@@ -251,10 +251,14 @@ namespace R2RDump
                     int unwindRva = NativeReader.ReadInt32(Image, ref curOffset);
                     int unwindOffset = GetOffset(unwindRva);
 
-                    UnwindInfo unwindInfo = new UnwindInfo(Image, unwindOffset);
-                    if (isEntryPoint[runtimeFunctionId])
+                    UnwindInfo unwindInfo = null;
+                    if (Machine == Machine.Amd64)
                     {
-                        gcInfo = new GcInfo(Image, unwindOffset + unwindInfo.Size, Machine, R2RHeader.MajorVersion);
+                        unwindInfo = new Amd64UnwindInfo(Image, unwindOffset);
+                        if (isEntryPoint[runtimeFunctionId])
+                        {
+                            gcInfo = new GcInfo(Image, unwindOffset + ((Amd64UnwindInfo)unwindInfo).Size, Machine, R2RHeader.MajorVersion);
+                        }
                     }
 
                     RuntimeFunction rtf = new RuntimeFunction(runtimeFunctionId, startRva, endRva, unwindRva, codeOffset, method, unwindInfo, gcInfo);