diff options
Diffstat (limited to 'src/gcdump/i386/gcdumpx86.cpp')
-rw-r--r-- | src/gcdump/i386/gcdumpx86.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/gcdump/i386/gcdumpx86.cpp b/src/gcdump/i386/gcdumpx86.cpp index 70334dee65..23e6c6834b 100644 --- a/src/gcdump/i386/gcdumpx86.cpp +++ b/src/gcdump/i386/gcdumpx86.cpp @@ -9,7 +9,9 @@ #ifdef _TARGET_X86_ /*****************************************************************************/ +#ifndef FEATURE_PAL #include "utilcode.h" // For _ASSERTE() +#endif //!FEATURE_PAL #include "gcdump.h" @@ -60,12 +62,13 @@ const char * CalleeSavedRegName(unsigned reg) /*****************************************************************************/ -unsigned GCDump::DumpInfoHdr (PTR_CBYTE table, +unsigned GCDump::DumpInfoHdr (PTR_CBYTE gcInfoBlock, InfoHdr* header, unsigned * methodSize, bool verifyGCTables) { unsigned count; + PTR_CBYTE table = gcInfoBlock; PTR_CBYTE tableStart = table; PTR_CBYTE bp = table; @@ -76,7 +79,7 @@ unsigned GCDump::DumpInfoHdr (PTR_CBYTE table, table += decodeUnsigned(table, methodSize); - table = decodeHeader(table, header); + table = decodeHeader(table, gcInfoVersion, header); BOOL hasArgTabOffset = FALSE; if (header->untrackedCnt == HAS_UNTRACKED) @@ -107,6 +110,12 @@ unsigned GCDump::DumpInfoHdr (PTR_CBYTE table, header->syncEndOffset = count; } + if (header->revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET) + { + table += decodeUnsigned(table, &count); + header->revPInvokeOffset = count; + } + // // First print out all the basic information // @@ -931,12 +940,12 @@ DONE_REGTAB: /*****************************************************************************/ -void GCDump::DumpPtrsInFrame(PTR_CBYTE infoBlock, +void GCDump::DumpPtrsInFrame(PTR_CBYTE gcInfoBlock, PTR_CBYTE codeBlock, unsigned offs, bool verifyGCTables) { - PTR_CBYTE table = infoBlock; + PTR_CBYTE table = gcInfoBlock; size_t methodSize; size_t stackSize; @@ -963,7 +972,7 @@ void GCDump::DumpPtrsInFrame(PTR_CBYTE infoBlock, // Typically only uses one-byte to store everything. // InfoHdr header; - table = decodeHeader(table, &header); + table = decodeHeader(table, gcInfoVersion, &header); if (header.untrackedCnt == HAS_UNTRACKED) { @@ -994,6 +1003,13 @@ void GCDump::DumpPtrsInFrame(PTR_CBYTE infoBlock, header.syncEndOffset = offset; _ASSERTE(offset != INVALID_SYNC_OFFSET); } + if (header.revPInvokeOffset == HAS_REV_PINVOKE_FRAME_OFFSET) + { + unsigned offset; + table += decodeUnsigned(table, &offset); + header.revPInvokeOffset = offset; + _ASSERTE(offset != INVALID_REV_PINVOKE_OFFSET); + } prologSize = header.prologSize; epilogSize = header.epilogSize; |