// // Copyright (c) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. // //---------------------------------------------------------- // CompileResult.h - CompileResult contains the stuff generated by a compilation //---------------------------------------------------------- #ifndef _CompileResult #define _CompileResult #include "runtimedetails.h" #include "lightweightmap.h" class CompileResult { public: #pragma pack(push, 1) struct Agnostic_RecordRelocation { DWORDLONG location; DWORDLONG target; DWORD fRelocType; DWORD slotNum; DWORD addlDelta; }; struct Capture_AllocMemDetails { ULONG hotCodeSize; ULONG coldCodeSize; ULONG roDataSize; ULONG xcptnsCount; CorJitAllocMemFlag flag; void *hotCodeBlock; void *coldCodeBlock; void *roDataBlock; }; struct allocGCInfoDetails { size_t size; void* retval; }; struct Agnostic_AddressMap { DWORDLONG Address; DWORD size; }; struct Agnostic_AllocGCInfo { DWORDLONG size; DWORD retval_offset; }; struct Agnostic_AllocMemDetails { DWORD hotCodeSize; DWORD coldCodeSize; DWORD roDataSize; DWORD xcptnsCount; DWORD flag; DWORD hotCodeBlock_offset; DWORD coldCodeBlock_offset; DWORD roDataBlock_offset; DWORDLONG hotCodeBlock; DWORDLONG coldCodeBlock; DWORDLONG roDataBlock; }; struct Agnostic_AllocUnwindInfo { DWORDLONG pHotCode; DWORDLONG pColdCode; DWORD startOffset; DWORD endOffset; DWORD unwindSize; DWORD pUnwindBlock_index; DWORD funcKind; }; struct Agnostic_CompileMethodResults { DWORDLONG nativeEntry; DWORD nativeSizeOfCode; DWORD CorJitResult; }; struct Agnostic_ReportInliningDecision { DWORDLONG inlinerHnd; DWORDLONG inlineeHnd; DWORD inlineResult; DWORD reason_offset; }; struct Agnostic_ReportTailCallDecision { DWORDLONG callerHnd; DWORDLONG calleeHnd; DWORD fIsTailPrefix; DWORD tailCallResult; DWORD reason_index; }; struct Agnostic_ReserveUnwindInfo { DWORD isFunclet; DWORD isColdCode; DWORD unwindSize; }; struct Agnostic_SetBoundaries { DWORDLONG ftn; DWORD cMap; DWORD pMap_offset; }; struct Agnostic_SetVars { DWORDLONG ftn; DWORD cVars; DWORD vars_offset; }; struct Agnostic_CORINFO_EH_CLAUSE2 { DWORD Flags; DWORD TryOffset; DWORD TryLength; DWORD HandlerOffset; DWORD HandlerLength; DWORD ClassToken; //one view of symetric union }; struct Agnostic_AllocBBProfileBuffer { DWORD count; DWORD profileBuffer_index; DWORD result; }; struct Agnostic_CORINFO_SIG_INFO2 { DWORD callConv; DWORDLONG retTypeClass; DWORDLONG retTypeSigClass; DWORD retType; DWORD flags; DWORD numArgs; DWORD sigInst_classInstCount; DWORD sigInst_classInst_Index; DWORD sigInst_methInstCount; DWORD sigInst_methInst_Index; DWORDLONG args; DWORD pSig; DWORD cbSig; DWORDLONG scope; DWORD token; }; struct Agnostic_RecordCallSite { Agnostic_CORINFO_SIG_INFO2 callSig; DWORDLONG methodHandle; }; #pragma pack(pop) CompileResult(); ~CompileResult(); bool IsEmpty(); void AddCall(const char *name); unsigned int CallLog_GetCount(); bool CallLog_Contains(const char *str); void dmpCallLog(DWORD key, DWORD value); void dumpToConsole(); HANDLE getCodeHeap(); void recAssert(const char *buff); void dmpAssertLog(DWORD key, DWORD value); const char *repAssert(); void recAllocMem(ULONG hotCodeSize, ULONG coldCodeSize, ULONG roDataSize, ULONG xcptnsCount, CorJitAllocMemFlag flag, void **hotCodeBlock, void **coldCodeBlock, void **roDataBlock); void recAllocMemCapture(); void dmpAllocMem(DWORD key, const Agnostic_AllocMemDetails& value); void repAllocMem(ULONG *hotCodeSize, ULONG *coldCodeSize, ULONG *roDataSize, ULONG *xcptnsCount, CorJitAllocMemFlag *flag, unsigned char **hotCodeBlock, unsigned char **coldCodeBlock, unsigned char **roDataBlock, void **orig_hotCodeBlock, void **orig_coldCodeBlock, void **orig_roDataBlock); void recSetBoundaries(CORINFO_METHOD_HANDLE ftn, ULONG32 cMap, ICorDebugInfo::OffsetMapping *pMap); void dmpSetBoundaries(DWORD key, const Agnostic_SetBoundaries& value); bool repSetBoundaries(CORINFO_METHOD_HANDLE *ftn, ULONG32 *cMap, ICorDebugInfo::OffsetMapping **pMap); void recSetVars(CORINFO_METHOD_HANDLE ftn, ULONG32 cVars, ICorDebugInfo::NativeVarInfo *vars); void dmpSetVars(DWORD key, const Agnostic_SetVars& value); bool repSetVars(CORINFO_METHOD_HANDLE *ftn, ULONG32 *cVars, ICorDebugInfo::NativeVarInfo **vars); void recAllocGCInfo(size_t size, void *retval); void recAllocGCInfoCapture(); void dmpAllocGCInfo(DWORD key, const Agnostic_AllocGCInfo& value); void repAllocGCInfo(size_t *size, void **retval); void recCompileMethod(BYTE **nativeEntry, ULONG *nativeSizeOfCode, CorJitResult result); void dmpCompileMethod(DWORD key, const Agnostic_CompileMethodResults& value); void repCompileMethod(BYTE **nativeEntry, ULONG *nativeSizeOfCode, CorJitResult *result); void recMessageLog(const char* fmt, ...); void dmpMessageLog(DWORD key, DWORD value); void recClassMustBeLoadedBeforeCodeIsRun(CORINFO_CLASS_HANDLE cls); void dmpClassMustBeLoadedBeforeCodeIsRun(DWORD key, DWORDLONG value); void recReportInliningDecision(CORINFO_METHOD_HANDLE inlinerHnd, CORINFO_METHOD_HANDLE inlineeHnd, CorInfoInline inlineResult, const char * reason); void dmpReportInliningDecision(DWORD key, const Agnostic_ReportInliningDecision& value); CorInfoInline repReportInliningDecision(CORINFO_METHOD_HANDLE inlinerHnd, CORINFO_METHOD_HANDLE inlineeHnd); void recSetEHcount(unsigned cEH); void dmpSetEHcount(DWORD key, DWORD value); ULONG repSetEHcount(); void recSetEHinfo(unsigned EHnumber, const CORINFO_EH_CLAUSE *clause); void dmpSetEHinfo(DWORD key, const Agnostic_CORINFO_EH_CLAUSE2& value); void repSetEHinfo(unsigned EHnumber, ULONG *flags, ULONG *tryOffset, ULONG *tryLength, ULONG *handlerOffset, ULONG *handlerLength, ULONG *classToken); void recSetMethodAttribs (CORINFO_METHOD_HANDLE ftn, CorInfoMethodRuntimeFlags attribs); void dmpSetMethodAttribs(DWORDLONG key, DWORD value); CorInfoMethodRuntimeFlags repSetMethodAttribs (CORINFO_METHOD_HANDLE ftn); void recMethodMustBeLoadedBeforeCodeIsRun(CORINFO_METHOD_HANDLE method); void dmpMethodMustBeLoadedBeforeCodeIsRun(DWORD key, DWORDLONG value); void recReportTailCallDecision(CORINFO_METHOD_HANDLE callerHnd, CORINFO_METHOD_HANDLE calleeHnd, bool fIsTailPrefix, CorInfoTailCall tailCallResult, const char * reason); void dmpReportTailCallDecision(DWORD key, const Agnostic_ReportTailCallDecision& value); void recReportFatalError(CorJitResult result); void dmpReportFatalError(DWORD key, DWORD value); void recRecordRelocation(void *location, void *target, WORD fRelocType, WORD slotNum, INT32 addlDelta); void dmpRecordRelocation(DWORD key, const Agnostic_RecordRelocation& value); void repRecordRelocation(void *location, void *target, WORD fRelocType, WORD slotNum, INT32 addlDelta); void applyRelocs(unsigned char *block1, ULONG blocksize1, void *originalAddr); void recProcessName(const char* name); void dmpProcessName(DWORD key, DWORD value); const char *repProcessName(); void recAddressMap(void *original_address, void *replay_address, unsigned int size); void dmpAddressMap(DWORDLONG key, const Agnostic_AddressMap& value); void* repAddressMap(void *replay_address); void *searchAddressMap(void *replay_address); void recReserveUnwindInfo(BOOL isFunclet, BOOL isColdCode, ULONG unwindSize); void dmpReserveUnwindInfo(DWORD key, const Agnostic_ReserveUnwindInfo& value); void recAllocUnwindInfo(BYTE *pHotCode, BYTE *pColdCode, ULONG startOffset, ULONG endOffset, ULONG unwindSize, BYTE *pUnwindBlock, CorJitFuncKind funcKind); void dmpAllocUnwindInfo(DWORD key, const Agnostic_AllocUnwindInfo& value); void recAllocBBProfileBuffer(ULONG count, ICorJitInfo::ProfileBuffer **profileBuffer, HRESULT result); void dmpAllocBBProfileBuffer(DWORD key, const Agnostic_AllocBBProfileBuffer& value); HRESULT repAllocBBProfileBuffer(ULONG count, ICorJitInfo::ProfileBuffer **profileBuffer); void recRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO *callSig, CORINFO_METHOD_HANDLE methodHandle); void dmpRecordCallSite(DWORD key, const Agnostic_RecordCallSite& value); void repRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO *callSig, CORINFO_METHOD_HANDLE methodHandle); bool fndRecordCallSiteSigInfo(ULONG instrOffset, CORINFO_SIG_INFO *pCallSig); bool fndRecordCallSiteMethodHandle(ULONG instrOffset, CORINFO_METHOD_HANDLE *pMethodHandle); DOUBLE secondsToCompile; ULONGLONG clockCyclesToCompile; #define LWM(map,key,value) LightWeightMap* map; #define DENSELWM(map,value) DenseLightWeightMap* map; #include "crlwmlist.h" //not persisted to disk. public: LightWeightMap *CallTargetTypes; private: HANDLE codeHeap; Capture_AllocMemDetails allocMemDets; allocGCInfoDetails allocGCInfoDets; }; #endif