diff --git a/src/coreclr/inc/gcdecoder.cpp b/src/coreclr/inc/gcdecoder.cpp index 26001f588944e5..541011b5f709cb 100644 --- a/src/coreclr/inc/gcdecoder.cpp +++ b/src/coreclr/inc/gcdecoder.cpp @@ -197,7 +197,7 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, UINT32 version, InfoHdr* header header->syncStartOffset ^= HAS_SYNC_OFFSET; break; case FLIP_REV_PINVOKE_FRAME: - header->revPInvokeOffset = INVALID_REV_PINVOKE_OFFSET ? HAS_REV_PINVOKE_FRAME_OFFSET : INVALID_REV_PINVOKE_OFFSET; + header->revPInvokeOffset ^= (INVALID_REV_PINVOKE_OFFSET ^ HAS_REV_PINVOKE_FRAME_OFFSET); break; case NEXT_OPCODE: diff --git a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/x86/InfoHdr.cs b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/x86/InfoHdr.cs index 7852ebf962db60..b18706b7661dc2 100644 --- a/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/x86/InfoHdr.cs +++ b/src/coreclr/tools/aot/ILCompiler.Reflection.ReadyToRun/x86/InfoHdr.cs @@ -14,6 +14,7 @@ public struct InfoHdrSmall { private const uint INVALID_GS_COOKIE_OFFSET = 0; private const uint INVALID_SYNC_OFFSET = 0; + private const uint INVALID_REV_PINVOKE_OFFSET = 0xFFFFFFFF; public uint PrologSize { get; set; } public uint EpilogSize { get; set; } @@ -82,7 +83,7 @@ public InfoHdrSmall(uint prologSize, uint epilogSize, byte epilogCount, byte epi GsCookieOffset = 0; SyncStartOffset = 0; SyncEndOffset = 0; - RevPInvokeOffset = 0; + RevPInvokeOffset = INVALID_REV_PINVOKE_OFFSET; NoGCRegionCnt = 0; HasArgTabOffset = false; @@ -163,7 +164,8 @@ public class InfoHdrDecoder { private const uint HAS_UNTRACKED = 0xFFFFFFFF; private const uint HAS_GS_COOKIE_OFFSET = 0xFFFFFFFF; private const uint HAS_SYNC_OFFSET = 0xFFFFFFFF; - private const uint HAS_REV_PINVOKE_FRAME_OFFSET = 0xFFFFFFFF; + private const uint INVALID_REV_PINVOKE_OFFSET = 0xFFFFFFFF; + private const uint HAS_REV_PINVOKE_FRAME_OFFSET = 0xFFFFFFFE; private const uint HAS_NOGCREGIONS = 0xFFFFFFFF; private const uint YES = HAS_VARPTR; @@ -278,7 +280,7 @@ public static InfoHdrSmall DecodeHeader(byte[] image, ref int offset, int codeLe header.SyncStartOffset ^= HAS_SYNC_OFFSET; break; case (byte)InfoHdrAdjust.FLIP_REV_PINVOKE_FRAME: - header.RevPInvokeOffset ^= HAS_REV_PINVOKE_FRAME_OFFSET; + header.RevPInvokeOffset ^= (INVALID_REV_PINVOKE_OFFSET ^ HAS_REV_PINVOKE_FRAME_OFFSET); break; case (byte)InfoHdrAdjust.NEXT_OPCODE: