diff options
Diffstat (limited to 'src/inc/gcinfodumper.h')
-rw-r--r-- | src/inc/gcinfodumper.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/inc/gcinfodumper.h b/src/inc/gcinfodumper.h new file mode 100644 index 0000000000..ff9be165f0 --- /dev/null +++ b/src/inc/gcinfodumper.h @@ -0,0 +1,118 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#ifndef __GCINFODUMPER_H__ +#define __GCINFODUMPER_H__ + +#include "gcinfotypes.h" +#include "gcinfodecoder.h" + + +// +// This class dumps the contents of the gc encodings, providing outputs +// similar to the inputs to GcInfoEncoder. This uses the same GcInfoDecoder +// functions that the EE uses (vs. decoding the bits directly). +// +class GcInfoDumper +{ +public: + + GcInfoDumper (PTR_CBYTE pbGCInfo); + ~GcInfoDumper (); + + // Returns TRUE to stop decoding. + typedef BOOL InterruptibleStateChangeProc ( + UINT32 CodeOffset, + BOOL fInterruptible, + PVOID pvData); + + // Returns TRUE to stop decoding. + typedef BOOL OnSafePointProc ( + UINT32 CodeOffset, + PVOID pvData); + + // Returns TRUE to stop decoding. + typedef BOOL RegisterStateChangeProc ( + UINT32 CodeOffset, + UINT32 RegisterNumber, + GcSlotFlags Flags, + GcSlotState NewState, + PVOID pvData); + + // Returns TRUE to stop decoding. + typedef BOOL StackSlotStateChangeProc ( + UINT32 CodeOffset, + GcSlotFlags flags, + GcStackSlotBase BaseRegister, + SSIZE_T StackOffset, + GcSlotState NewState, + PVOID pvData); + + enum EnumerateStateChangesResults + { + SUCCESS = 0, + OUT_OF_MEMORY, + REPORTED_REGISTER_IN_CALLERS_FRAME, + REPORTED_FRAME_POINTER, + REPORTED_INVALID_BASE_REGISTER, + REPORTED_INVALID_POINTER, + DECODER_FAILED, + }; + + // Returns TRUE if successful. FALSE if out of memory, invalid data, etc. + EnumerateStateChangesResults EnumerateStateChanges ( + InterruptibleStateChangeProc *pfnInterruptibleStateChange, + RegisterStateChangeProc *pfnRegisterStateChange, + StackSlotStateChangeProc *pfnStackSlotStateChange, + OnSafePointProc *pfnSafePointFunc, + PVOID pvData); + + size_t GetGCInfoSize(); + +private: + + struct LivePointerRecord + { + OBJECTREF *ppObject; + DWORD flags; + LivePointerRecord *pNext; + UINT marked; + }; + + PTR_CBYTE m_pbGCInfo; + UINT32 m_StackBaseRegister; + UINT32 m_SizeOfEditAndContinuePreservedArea; + LivePointerRecord *m_pRecords; + RegisterStateChangeProc *m_pfnRegisterStateChange; + StackSlotStateChangeProc *m_pfnStackSlotStateChange; + PVOID m_pvCallbackData; + EnumerateStateChangesResults m_Error; + size_t m_gcInfoSize; + + static void LivePointerCallback ( + LPVOID hCallback, // callback data + OBJECTREF* pObject, // address of obect-reference we are reporting + DWORD flags // is this a pinned and/or interior pointer + DAC_ARG(DacSlotLocation loc)); // the location the pointer came from + + static void FreePointerRecords (LivePointerRecord *pRecords); + + // Return TRUE if callback requested to stop decoding. + BOOL ReportPointerRecord ( + UINT32 CodeOffset, + BOOL fLive, + REGDISPLAY *pRD, + LivePointerRecord *pRecord); + + // Return TRUE if callback requested to stop decoding. + BOOL ReportPointerDifferences ( + UINT32 offset, + REGDISPLAY *pRD, + LivePointerRecord *pPrevState); +}; + + +#endif // !__GCINFODUMPER_H__ + |