1//
2// Copyright (c) Microsoft. All rights reserved.
3// Licensed under the MIT license. See LICENSE file in the project root for full license information.
4//
5
6//----------------------------------------------------------
7// MethodContext.h - Primary structure to store all the EE-JIT details required to replay creation of a method
8// CompileResult contains the stuff generated by a compilation
9//----------------------------------------------------------
10#ifndef _MethodContext
11#define _MethodContext
12
13#include "runtimedetails.h"
14#include "compileresult.h"
15#include "lightweightmap.h"
16#include "errorhandling.h"
17
18#define METHOD_IDENTITY_INFO_SIZE 0x10000 // We assume that the METHOD_IDENTITY_INFO_SIZE will not exceed 64KB
19
20#define MD5_HASH_BYTE_SIZE 16 // MD5 is 128-bit, so we need 16 bytes to store it
21#define MD5_HASH_BUFFER_SIZE 33 // MD5 is 128-bit, so we need 32 chars + 1 char to store null-terminator
22
23class MethodContext
24{
25public:
26#pragma pack(push, 1)
27 struct Agnostic_CORINFO_SIG_INFO
28 {
29 DWORD callConv;
30 DWORDLONG retTypeClass;
31 DWORDLONG retTypeSigClass;
32 DWORD retType;
33 DWORD flags;
34 DWORD numArgs;
35 DWORD sigInst_classInstCount;
36 DWORD sigInst_classInst_Index;
37 DWORD sigInst_methInstCount;
38 DWORD sigInst_methInst_Index;
39 DWORDLONG args;
40 DWORD pSig_Index;
41 DWORD cbSig;
42 DWORDLONG scope;
43 DWORD token;
44 };
45 struct Agnostic_CORINFO_METHOD_INFO
46 {
47 DWORDLONG ftn;
48 DWORDLONG scope;
49 DWORD ILCode_offset;
50 DWORD ILCodeSize;
51 DWORD maxStack;
52 DWORD EHcount;
53 DWORD options;
54 DWORD regionKind;
55 Agnostic_CORINFO_SIG_INFO args;
56 Agnostic_CORINFO_SIG_INFO locals;
57 };
58 struct Agnostic_CompileMethod
59 {
60 Agnostic_CORINFO_METHOD_INFO info;
61 DWORD flags;
62 };
63 struct Agnostic_InitClass
64 {
65 DWORDLONG field;
66 DWORDLONG method;
67 DWORDLONG context;
68 DWORD speculative;
69 };
70 struct DLDL
71 {
72 DWORDLONG A;
73 DWORDLONG B;
74 };
75 struct Agnostic_CanInline
76 {
77 DWORD Restrictions;
78 DWORD result;
79 DWORD exceptionCode;
80 };
81 struct Agnostic_GetClassGClayout
82 {
83 DWORD gcPtrs_Index;
84 DWORD len;
85 DWORD valCount;
86 };
87 struct DLD
88 {
89 DWORDLONG A;
90 DWORD B;
91 };
92 struct DLDD
93 {
94 DWORDLONG A;
95 DWORD B;
96 DWORD C;
97 };
98 struct Agnostic_CORINFO_METHODNAME_TOKENin
99 {
100 DWORDLONG ftn;
101 DWORD className;
102 DWORD namespaceName;
103 DWORD enclosingClassName;
104 };
105 struct Agnostic_CORINFO_METHODNAME_TOKENout
106 {
107 DWORD methodName;
108 DWORD className;
109 DWORD namespaceName;
110 DWORD enclosingClassName;
111 };
112 struct Agnostic_CORINFO_RESOLVED_TOKENin
113 {
114 DWORDLONG tokenContext;
115 DWORDLONG tokenScope;
116 DWORD token;
117 DWORD tokenType;
118 };
119 struct Agnostic_CORINFO_RESOLVED_TOKENout
120 {
121 DWORDLONG hClass;
122 DWORDLONG hMethod;
123 DWORDLONG hField;
124 DWORD pTypeSpec_Index;
125 DWORD cbTypeSpec;
126 DWORD pMethodSpec_Index;
127 DWORD cbMethodSpec;
128 };
129 struct GetArgTypeValue
130 {
131 DWORD flags;
132 DWORD numArgs;
133 DWORD sigInst_classInstCount;
134 DWORD sigInst_classInst_Index;
135 DWORD sigInst_methInstCount;
136 DWORD sigInst_methInst_Index;
137 DWORDLONG scope;
138 DWORDLONG args;
139 };
140 struct GetArgClassValue
141 {
142 DWORD sigInst_classInstCount;
143 DWORD sigInst_classInst_Index;
144 DWORD sigInst_methInstCount;
145 DWORD sigInst_methInst_Index;
146 DWORDLONG scope;
147 DWORDLONG args;
148 };
149 struct Agnostic_GetBoundaries
150 {
151 DWORD cILOffsets;
152 DWORD pILOffset_offset;
153 DWORD implicitBoundaries;
154 };
155 struct Agnostic_CORINFO_EE_INFO
156 {
157 struct Agnostic_InlinedCallFrameInfo
158 {
159 DWORD size;
160 DWORD offsetOfGSCookie;
161 DWORD offsetOfFrameVptr;
162 DWORD offsetOfFrameLink;
163 DWORD offsetOfCallSiteSP;
164 DWORD offsetOfCalleeSavedFP;
165 DWORD offsetOfCallTarget;
166 DWORD offsetOfReturnAddress;
167 } inlinedCallFrameInfo;
168 DWORD offsetOfThreadFrame;
169 DWORD offsetOfGCState;
170 DWORD offsetOfDelegateInstance;
171 DWORD offsetOfDelegateFirstTarget;
172 DWORD offsetOfSecureDelegateIndirectCell;
173 DWORD offsetOfTransparentProxyRP;
174 DWORD offsetOfRealProxyServer;
175 DWORD offsetOfObjArrayData;
176 DWORD sizeOfReversePInvokeFrame;
177 DWORD osPageSize;
178 DWORD maxUncheckedOffsetForNullObject;
179 DWORD targetAbi;
180 DWORD osType;
181 DWORD osMajor;
182 DWORD osMinor;
183 DWORD osBuild;
184 };
185 struct Agnostic_GetFieldAddress
186 {
187 DWORDLONG ppIndirection;
188 DWORDLONG fieldAddress;
189 DWORD fieldValue;
190 };
191 struct Agnostic_GetStaticFieldCurrentClass
192 {
193 DWORDLONG classHandle;
194 bool isSpeculative;
195 };
196 struct Agnostic_CORINFO_RESOLVED_TOKEN
197 {
198 Agnostic_CORINFO_RESOLVED_TOKENin inValue;
199
200 Agnostic_CORINFO_RESOLVED_TOKENout outValue;
201 };
202 struct Agnostic_GetFieldInfo
203 {
204 Agnostic_CORINFO_RESOLVED_TOKEN ResolvedToken;
205 DWORDLONG callerHandle;
206 DWORD flags;
207 };
208 struct Agnostic_CORINFO_HELPER_ARG
209 {
210 DWORDLONG constant; // one view of a large union of ptr size
211 DWORD argType;
212 };
213 struct Agnostic_CORINFO_HELPER_DESC
214 {
215 DWORD helperNum;
216 DWORD numArgs;
217 Agnostic_CORINFO_HELPER_ARG args[CORINFO_ACCESS_ALLOWED_MAX_ARGS];
218 };
219 struct Agnostic_CORINFO_CONST_LOOKUP
220 {
221 DWORD accessType;
222 DWORDLONG handle; // actually a union of two pointer sized things
223 };
224 struct Agnostic_CORINFO_LOOKUP_KIND
225 {
226 DWORD needsRuntimeLookup;
227 DWORD runtimeLookupKind;
228 WORD runtimeLookupFlags;
229 };
230 struct Agnostic_CORINFO_RUNTIME_LOOKUP
231 {
232 DWORDLONG signature;
233 DWORD helper;
234 DWORD indirections;
235 DWORD testForNull;
236 DWORD testForFixup;
237 DWORDLONG offsets[CORINFO_MAXINDIRECTIONS];
238 DWORD indirectFirstOffset;
239 DWORD indirectSecondOffset;
240 };
241 struct Agnostic_CORINFO_LOOKUP
242 {
243 Agnostic_CORINFO_LOOKUP_KIND lookupKind;
244 Agnostic_CORINFO_RUNTIME_LOOKUP runtimeLookup; // This and constLookup actually a union, but with different
245 // layouts.. :-| copy the right one based on lookupKinds value
246 Agnostic_CORINFO_CONST_LOOKUP constLookup;
247 };
248 struct Agnostic_CORINFO_FIELD_INFO
249 {
250 DWORD fieldAccessor;
251 DWORD fieldFlags;
252 DWORD helper;
253 DWORD offset;
254 DWORD fieldType;
255 DWORDLONG structType;
256 DWORD accessAllowed;
257 Agnostic_CORINFO_HELPER_DESC accessCalloutHelper;
258 Agnostic_CORINFO_CONST_LOOKUP fieldLookup;
259 };
260 struct DD
261 {
262 DWORD A;
263 DWORD B;
264 };
265 struct DDD
266 {
267 DWORD A;
268 DWORD B;
269 DWORD C;
270 };
271 struct Agnostic_CanTailCall
272 {
273 DWORDLONG callerHnd;
274 DWORDLONG declaredCalleeHnd;
275 DWORDLONG exactCalleeHnd;
276 WORD fIsTailPrefix;
277 };
278 struct Agnostic_Environment
279 {
280 DWORD name_index;
281 ;
282 DWORD val_index;
283 };
284 struct Agnostic_GetCallInfo
285 {
286 Agnostic_CORINFO_RESOLVED_TOKEN ResolvedToken;
287 Agnostic_CORINFO_RESOLVED_TOKEN ConstrainedResolvedToken;
288 DWORDLONG callerHandle;
289 DWORD flags;
290 };
291
292 struct Agnostic_CORINFO_CALL_INFO
293 {
294 DWORDLONG hMethod;
295 DWORD methodFlags;
296 DWORD classFlags;
297 Agnostic_CORINFO_SIG_INFO sig;
298 DWORD verMethodFlags;
299 Agnostic_CORINFO_SIG_INFO verSig;
300 DWORD accessAllowed;
301 Agnostic_CORINFO_HELPER_DESC callsiteCalloutHelper;
302 DWORD thisTransform;
303 DWORD kind;
304 DWORD nullInstanceCheck;
305 DWORDLONG contextHandle;
306 DWORD exactContextNeedsRuntimeLookup;
307 Agnostic_CORINFO_LOOKUP stubLookup; // first view of union. others are matching or subordinate
308 Agnostic_CORINFO_CONST_LOOKUP instParamLookup;
309 DWORD secureDelegateInvoke;
310 DWORD exceptionCode;
311 };
312 struct Agnostic_GetMethodInfo
313 {
314 Agnostic_CORINFO_METHOD_INFO info;
315 bool result;
316 DWORD exceptionCode;
317 };
318 struct Agnostic_FindSig
319 {
320 DWORDLONG module;
321 DWORD sigTOK;
322 DWORDLONG context;
323 };
324 struct PInvokeMarshalingRequiredValue
325 {
326 DWORDLONG method;
327 DWORD pSig_Index;
328 DWORD cbSig;
329 DWORDLONG scope;
330 };
331 struct Agnostic_CORINFO_EH_CLAUSE
332 {
333 DWORD Flags;
334 DWORD TryOffset;
335 DWORD TryLength;
336 DWORD HandlerOffset;
337 DWORD HandlerLength;
338 DWORD ClassToken; // first view of a two dword union
339 };
340 struct Agnostic_GetVars
341 {
342 DWORD cVars;
343 DWORD vars_offset;
344 DWORD extendOthers;
345 };
346 struct Agnostic_CanAccessClassIn
347 {
348 Agnostic_CORINFO_RESOLVED_TOKEN ResolvedToken;
349 DWORDLONG callerHandle;
350 };
351 struct Agnostic_CanAccessClassOut
352 {
353 Agnostic_CORINFO_HELPER_DESC AccessHelper;
354 DWORD result;
355 };
356 struct Agnostic_AppendClassName
357 {
358 DWORDLONG classHandle;
359 DWORD fNamespace;
360 DWORD fFullInst;
361 DWORD fAssembly;
362 };
363 struct Agnostic_CheckMethodModifier
364 {
365 DWORDLONG hMethod;
366 DWORD modifier;
367 DWORD fOptional;
368 };
369 struct Agnostic_EmbedGenericHandle
370 {
371 Agnostic_CORINFO_RESOLVED_TOKEN ResolvedToken;
372 DWORD fEmbedParent;
373 };
374 struct Agnostic_CORINFO_GENERICHANDLE_RESULT
375 {
376
377 Agnostic_CORINFO_LOOKUP lookup;
378 DWORDLONG compileTimeHandle;
379 DWORD handleType;
380 };
381 struct Agnostic_GetDelegateCtorIn
382 {
383 DWORDLONG methHnd;
384 DWORDLONG clsHnd;
385 DWORDLONG targetMethodHnd;
386 };
387 struct Agnostic_DelegateCtorArgs
388 {
389 DWORDLONG pMethod;
390 DWORDLONG pArg3;
391 DWORDLONG pArg4;
392 DWORDLONG pArg5;
393 };
394 struct Agnostic_GetDelegateCtorOut
395 {
396 Agnostic_DelegateCtorArgs CtorData;
397 DWORDLONG result;
398 };
399 struct Agnostic_FindCallSiteSig
400 {
401 DWORDLONG module;
402 DWORD methTok;
403 DWORDLONG context;
404 };
405 struct Agnostic_GetNewHelper
406 {
407 DWORDLONG hClass;
408 DWORDLONG callerHandle;
409 };
410 struct Agnostic_GetCastingHelper
411 {
412 DWORDLONG hClass;
413 DWORD fThrowing;
414 };
415 struct Agnostic_GetClassModuleIdForStatics
416 {
417 DWORDLONG Module;
418 DWORDLONG pIndirection;
419 DWORDLONG result;
420 };
421 struct Agnostic_IsCompatibleDelegate
422 {
423 DWORDLONG objCls;
424 DWORDLONG methodParentCls;
425 DWORDLONG method;
426 DWORDLONG delegateCls;
427 };
428 struct Agnostic_GetBBProfileData
429 {
430 DWORD count;
431 DWORD profileBuffer_index;
432 DWORD numRuns;
433 DWORD result;
434 };
435 struct Agnostic_GetProfilingHandle
436 {
437 DWORD bHookFunction;
438 DWORDLONG ProfilerHandle;
439 DWORD bIndirectedHandles;
440 };
441 struct Agnostic_GetTailCallCopyArgsThunk
442 {
443 Agnostic_CORINFO_SIG_INFO Sig;
444 DWORD flags;
445 };
446 struct Agnostic_GetArgClass_Value
447 {
448 DWORDLONG result;
449 DWORD exceptionCode;
450 };
451 struct Agnostic_GetArgType_Value
452 {
453 DWORDLONG vcTypeRet;
454 DWORD result;
455 DWORD exceptionCode;
456 };
457
458 // Agnostic_ConfigIntInfo combines as a single key the name
459 // and defaultValue of a integer config query.
460 // Note: nameIndex is treated as a DWORD index to the name string.
461 struct Agnostic_ConfigIntInfo
462 {
463 DWORD nameIndex;
464 DWORD defaultValue;
465 };
466
467 // SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR
468 struct Agnostic_GetSystemVAmd64PassStructInRegisterDescriptor
469 {
470 DWORD passedInRegisters; // Whether the struct is passable/passed (this includes struct returning) in registers.
471 DWORD eightByteCount; // Number of eightbytes for this struct.
472 DWORD eightByteClassifications[CLR_SYSTEMV_MAX_EIGHTBYTES_COUNT_TO_PASS_IN_REGISTERS]; // The eightbytes type
473 // classification.
474 DWORD eightByteSizes[CLR_SYSTEMV_MAX_EIGHTBYTES_COUNT_TO_PASS_IN_REGISTERS]; // The size of the eightbytes (an
475 // eightbyte could include padding.
476 // This represents the no padding
477 // size of the eightbyte).
478 DWORD eightByteOffsets[CLR_SYSTEMV_MAX_EIGHTBYTES_COUNT_TO_PASS_IN_REGISTERS]; // The start offset of the
479 // eightbytes (in bytes).
480 DWORD result;
481 };
482
483 struct Agnostic_ResolveVirtualMethod
484 {
485 DWORDLONG virtualMethod;
486 DWORDLONG implementingClass;
487 DWORDLONG ownerType;
488 };
489
490 struct ResolveTokenValue
491 {
492 Agnostic_CORINFO_RESOLVED_TOKENout tokenOut;
493 DWORD exceptionCode;
494 };
495
496 struct TryResolveTokenValue
497 {
498 Agnostic_CORINFO_RESOLVED_TOKENout tokenOut;
499 DWORD success;
500 };
501
502 struct GetTokenTypeAsHandleValue
503 {
504 DWORDLONG hMethod;
505 DWORDLONG hField;
506 };
507
508 struct GetVarArgsHandleValue
509 {
510 DWORD cbSig;
511 DWORD pSig_Index;
512 DWORDLONG scope;
513 DWORD token;
514 };
515
516 struct CanGetVarArgsHandleValue
517 {
518 DWORDLONG scope;
519 DWORD token;
520 };
521
522 struct GetCookieForPInvokeCalliSigValue
523 {
524 DWORD cbSig;
525 DWORD pSig_Index;
526 DWORDLONG scope;
527 DWORD token;
528 };
529
530 struct CanGetCookieForPInvokeCalliSigValue
531 {
532 DWORDLONG scope;
533 DWORD token;
534 };
535
536 struct GetReadyToRunHelper_TOKENin
537 {
538 Agnostic_CORINFO_RESOLVED_TOKEN ResolvedToken;
539 Agnostic_CORINFO_LOOKUP_KIND GenericLookupKind;
540 DWORD id;
541 };
542
543 struct GetReadyToRunHelper_TOKENout
544 {
545 Agnostic_CORINFO_CONST_LOOKUP Lookup;
546 bool result;
547 };
548
549 struct GetReadyToRunDelegateCtorHelper_TOKENIn
550 {
551 Agnostic_CORINFO_RESOLVED_TOKEN TargetMethod;
552 DWORDLONG delegateType;
553 };
554
555#pragma pack(pop)
556
557 MethodContext();
558
559private:
560 MethodContext(HANDLE hFile);
561 MethodContext(unsigned char* buff, unsigned int totalLen);
562
563 void MethodInitHelper(unsigned char* buff, unsigned int totalLen);
564 void MethodInitHelperFile(HANDLE hFile);
565
566 bool Initialize(int loadedCount, unsigned char* buff, DWORD size);
567 bool Initialize(int loadedCount, HANDLE hFile);
568
569 int dumpMD5HashToBuffer(BYTE* pBuffer, int bufLen, char* buff, int len);
570
571public:
572 static bool Initialize(int loadedCount, unsigned char* buff, DWORD size, /* OUT */ MethodContext** ppmc);
573 static bool Initialize(int loadedCount, HANDLE hFile, /* OUT */ MethodContext** ppmc);
574 ~MethodContext();
575 void Destroy();
576
577 bool Equal(MethodContext* other);
578 unsigned int saveToFile(HANDLE hFile);
579 unsigned int calculateFileSize();
580 unsigned int calculateRawFileSize();
581 void dumpToConsole(int mcNumber = -1); // if mcNumber is not -1, display the method context number before the dumped
582 // info
583 int dumpStatToBuffer(char* buff, int len);
584 static int dumpStatTitleToBuffer(char* buff, int len);
585 int methodSize;
586
587 int dumpMethodIdentityInfoToBuffer(char* buff, int len);
588 int dumpMethodMD5HashToBuffer(char* buff, int len);
589
590 void recGlobalContext(const MethodContext& other);
591
592 void dmpEnvironment(DWORD key, const Agnostic_Environment& value);
593
594 void recCompileMethod(CORINFO_METHOD_INFO* info, unsigned flags);
595 void dmpCompileMethod(DWORD key, const Agnostic_CompileMethod& value);
596 void repCompileMethod(CORINFO_METHOD_INFO* info, unsigned* flags);
597
598 void recGetMethodClass(CORINFO_METHOD_HANDLE methodHandle, CORINFO_CLASS_HANDLE classHandle);
599 void dmpGetMethodClass(DWORDLONG key, DWORDLONG value);
600 CORINFO_CLASS_HANDLE repGetMethodClass(CORINFO_METHOD_HANDLE methodHandle);
601
602 void recGetClassAttribs(CORINFO_CLASS_HANDLE classHandle, DWORD attribs);
603 void dmpGetClassAttribs(DWORDLONG key, DWORD value);
604 DWORD repGetClassAttribs(CORINFO_CLASS_HANDLE classHandle);
605
606 void recGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle, DWORD attribs);
607 void dmpGetMethodAttribs(DWORDLONG key, DWORD value);
608 DWORD repGetMethodAttribs(CORINFO_METHOD_HANDLE methodHandle);
609
610 void recGetVars(CORINFO_METHOD_HANDLE ftn, ULONG32* cVars, ICorDebugInfo::ILVarInfo** vars, bool* extendOthers);
611 void dmpGetVars(DWORDLONG key, const Agnostic_GetVars& value);
612 void repGetVars(CORINFO_METHOD_HANDLE ftn, ULONG32* cVars, ICorDebugInfo::ILVarInfo** vars, bool* extendOthers);
613
614 void recGetBoundaries(CORINFO_METHOD_HANDLE ftn,
615 unsigned int* cILOffsets,
616 DWORD** pILOffsets,
617 ICorDebugInfo::BoundaryTypes* implictBoundaries);
618 void dmpGetBoundaries(DWORDLONG key, const Agnostic_GetBoundaries& value);
619 void repGetBoundaries(CORINFO_METHOD_HANDLE ftn,
620 unsigned int* cILOffsets,
621 DWORD** pILOffsets,
622 ICorDebugInfo::BoundaryTypes* implictBoundaries);
623
624 void recInitClass(CORINFO_FIELD_HANDLE field,
625 CORINFO_METHOD_HANDLE method,
626 CORINFO_CONTEXT_HANDLE context,
627 BOOL speculative,
628 CorInfoInitClassResult result);
629 void dmpInitClass(const Agnostic_InitClass& key, DWORD value);
630 CorInfoInitClassResult repInitClass(CORINFO_FIELD_HANDLE field,
631 CORINFO_METHOD_HANDLE method,
632 CORINFO_CONTEXT_HANDLE context,
633 BOOL speculative);
634
635 void recGetMethodName(CORINFO_METHOD_HANDLE ftn, char* methodname, const char** moduleName);
636 void dmpGetMethodName(DLD key, DD value);
637 const char* repGetMethodName(CORINFO_METHOD_HANDLE ftn, const char** moduleName);
638
639 void recGetMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftn,
640 char* methodname,
641 const char** moduleName,
642 const char** namespaceName,
643 const char** enclosingClassName);
644 void dmpGetMethodNameFromMetadata(Agnostic_CORINFO_METHODNAME_TOKENin key, Agnostic_CORINFO_METHODNAME_TOKENout value);
645 const char* repGetMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftn,
646 const char** className,
647 const char** namespaceName,
648 const char** enclosingClassName);
649
650 void recGetJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes, DWORD result);
651 void dmpGetJitFlags(DWORD key, DD value);
652 DWORD repGetJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes);
653
654 void recGetJitTimeLogFilename(LPCWSTR tempFileName);
655 void dmpGetJitTimeLogFilename(DWORD key, DWORD value);
656 LPCWSTR repGetJitTimeLogFilename();
657
658 void recCanInline(CORINFO_METHOD_HANDLE callerHnd,
659 CORINFO_METHOD_HANDLE calleeHnd,
660 DWORD* pRestrictions,
661 CorInfoInline response,
662 DWORD exceptionCode);
663 void dmpCanInline(DLDL key, const Agnostic_CanInline& value);
664 CorInfoInline repCanInline(CORINFO_METHOD_HANDLE callerHnd,
665 CORINFO_METHOD_HANDLE calleeHnd,
666 DWORD* pRestrictions,
667 DWORD* exceptionCode);
668
669 void recResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken, DWORD exceptionCode);
670 void dmpResolveToken(const Agnostic_CORINFO_RESOLVED_TOKENin& key, const ResolveTokenValue& value);
671 void repResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken, DWORD* exceptionCode);
672
673 void recTryResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool success);
674 void dmpTryResolveToken(const Agnostic_CORINFO_RESOLVED_TOKENin& key, const TryResolveTokenValue& value);
675 bool repTryResolveToken(CORINFO_RESOLVED_TOKEN* pResolvedToken);
676
677 void recGetCallInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken,
678 CORINFO_RESOLVED_TOKEN* pConstrainedResolvedToken,
679 CORINFO_METHOD_HANDLE callerHandle,
680 CORINFO_CALLINFO_FLAGS flags,
681 CORINFO_CALL_INFO* pResult,
682 DWORD exceptionCode);
683 void dmpGetCallInfo(const Agnostic_GetCallInfo& key, const Agnostic_CORINFO_CALL_INFO& value);
684 void repGetCallInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken,
685 CORINFO_RESOLVED_TOKEN* pConstrainedResolvedToken,
686 CORINFO_METHOD_HANDLE callerHandle,
687 CORINFO_CALLINFO_FLAGS flags,
688 CORINFO_CALL_INFO* pResult,
689 DWORD* exceptionCode);
690 void repGetCallInfoFromMethodHandle(CORINFO_METHOD_HANDLE methodHandle, CORINFO_CALL_INFO* pResult);
691
692 void recGetIntrinsicID(CORINFO_METHOD_HANDLE method, bool* pMustExpand, CorInfoIntrinsics result);
693 void dmpGetIntrinsicID(DWORDLONG key, DD value);
694 CorInfoIntrinsics repGetIntrinsicID(CORINFO_METHOD_HANDLE method, bool* pMustExpand);
695
696 void recGetUnmanagedCallConv(CORINFO_METHOD_HANDLE method, CorInfoUnmanagedCallConv result);
697 void dmpGetUnmanagedCallConv(DWORDLONG key, DWORD result);
698 CorInfoUnmanagedCallConv repGetUnmanagedCallConv(CORINFO_METHOD_HANDLE method);
699
700 void recIsInstantiationOfVerifiedGeneric(CORINFO_METHOD_HANDLE method, CorInfoInstantiationVerification result);
701 void dmpIsInstantiationOfVerifiedGeneric(DWORDLONG key, DWORD value);
702 CorInfoInstantiationVerification repIsInstantiationOfVerifiedGeneric(CORINFO_METHOD_HANDLE method);
703
704 void recAsCorInfoType(CORINFO_CLASS_HANDLE cls, CorInfoType result);
705 void dmpAsCorInfoType(DWORDLONG key, DWORD value);
706 CorInfoType repAsCorInfoType(CORINFO_CLASS_HANDLE cls);
707
708 void recIsValueClass(CORINFO_CLASS_HANDLE cls, BOOL result);
709 void dmpIsValueClass(DWORDLONG key, DWORD value);
710 BOOL repIsValueClass(CORINFO_CLASS_HANDLE cls);
711
712 void recIsStructRequiringStackAllocRetBuf(CORINFO_CLASS_HANDLE cls, BOOL result);
713 void dmpIsStructRequiringStackAllocRetBuf(DWORDLONG key, DWORD value);
714 BOOL repIsStructRequiringStackAllocRetBuf(CORINFO_CLASS_HANDLE cls);
715
716 void recGetClassSize(CORINFO_CLASS_HANDLE cls, unsigned result);
717 void dmpGetClassSize(DWORDLONG key, DWORD val);
718 unsigned repGetClassSize(CORINFO_CLASS_HANDLE cls);
719
720 void recGetHeapClassSize(CORINFO_CLASS_HANDLE cls, unsigned result);
721 void dmpGetHeapClassSize(DWORDLONG key, DWORD val);
722 unsigned repGetHeapClassSize(CORINFO_CLASS_HANDLE cls);
723
724 void recCanAllocateOnStack(CORINFO_CLASS_HANDLE cls, BOOL result);
725 void dmpCanAllocateOnStack(DWORDLONG key, DWORD val);
726 BOOL repCanAllocateOnStack(CORINFO_CLASS_HANDLE cls);
727
728 void recGetClassNumInstanceFields(CORINFO_CLASS_HANDLE cls, unsigned result);
729 void dmpGetClassNumInstanceFields(DWORDLONG key, DWORD value);
730 unsigned repGetClassNumInstanceFields(CORINFO_CLASS_HANDLE cls);
731
732 void recGetNewArrHelper(CORINFO_CLASS_HANDLE arrayCls, CorInfoHelpFunc result);
733 void dmpGetNewArrHelper(DWORDLONG key, DWORD value);
734 CorInfoHelpFunc repGetNewArrHelper(CORINFO_CLASS_HANDLE arrayCls);
735
736 void recGetSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd, CorInfoHelpFunc result);
737 void dmpGetSharedCCtorHelper(DWORDLONG key, DWORD value);
738 CorInfoHelpFunc repGetSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd);
739
740 void recGetSecurityPrologHelper(CORINFO_METHOD_HANDLE ftn, CorInfoHelpFunc result);
741 void dmpGetSecurityPrologHelper(DWORDLONG key, DWORD value);
742 CorInfoHelpFunc repGetSecurityPrologHelper(CORINFO_METHOD_HANDLE ftn);
743
744 void recGetTypeForBox(CORINFO_CLASS_HANDLE cls, CORINFO_CLASS_HANDLE result);
745 void dmpGetTypeForBox(DWORDLONG key, DWORDLONG value);
746 CORINFO_CLASS_HANDLE repGetTypeForBox(CORINFO_CLASS_HANDLE cls);
747
748 void recGetBoxHelper(CORINFO_CLASS_HANDLE cls, CorInfoHelpFunc result);
749 void dmpGetBoxHelper(DWORDLONG key, DWORD value);
750 CorInfoHelpFunc repGetBoxHelper(CORINFO_CLASS_HANDLE cls);
751
752 void recGetBuiltinClass(CorInfoClassId classId, CORINFO_CLASS_HANDLE result);
753 void dmpGetBuiltinClass(DWORD key, DWORDLONG value);
754 CORINFO_CLASS_HANDLE repGetBuiltinClass(CorInfoClassId classId);
755
756 void recGetTypeForPrimitiveValueClass(CORINFO_CLASS_HANDLE cls, CorInfoType result);
757 void dmpGetTypeForPrimitiveValueClass(DWORDLONG key, DWORD value);
758 CorInfoType repGetTypeForPrimitiveValueClass(CORINFO_CLASS_HANDLE cls);
759
760 void recGetTypeForPrimitiveNumericClass(CORINFO_CLASS_HANDLE cls, CorInfoType result);
761 void dmpGetTypeForPrimitiveNumericClass(DWORDLONG key, DWORD value);
762 CorInfoType repGetTypeForPrimitiveNumericClass(CORINFO_CLASS_HANDLE cls);
763
764 void recGetParentType(CORINFO_CLASS_HANDLE cls, CORINFO_CLASS_HANDLE result);
765 void dmpGetParentType(DWORDLONG key, DWORDLONG value);
766 CORINFO_CLASS_HANDLE repGetParentType(CORINFO_CLASS_HANDLE cls);
767
768 void recIsSDArray(CORINFO_CLASS_HANDLE cls, BOOL result);
769 void dmpIsSDArray(DWORDLONG key, DWORD value);
770 BOOL repIsSDArray(CORINFO_CLASS_HANDLE cls);
771
772 void recIsInSIMDModule(CORINFO_CLASS_HANDLE cls, BOOL result);
773 void dmpIsInSIMDModule(DWORDLONG key, DWORD value);
774 BOOL repIsInSIMDModule(CORINFO_CLASS_HANDLE cls);
775
776 void recGetFieldClass(CORINFO_FIELD_HANDLE field, CORINFO_CLASS_HANDLE result);
777 void dmpGetFieldClass(DWORDLONG key, DWORDLONG value);
778 CORINFO_CLASS_HANDLE repGetFieldClass(CORINFO_FIELD_HANDLE field);
779
780 void recGetFieldOffset(CORINFO_FIELD_HANDLE field, unsigned result);
781 void dmpGetFieldOffset(DWORDLONG key, DWORD value);
782 unsigned repGetFieldOffset(CORINFO_FIELD_HANDLE field);
783
784 void recGetLazyStringLiteralHelper(CORINFO_MODULE_HANDLE handle, CorInfoHelpFunc result);
785 void dmpGetLazyStringLiteralHelper(DWORDLONG key, DWORD value);
786 CorInfoHelpFunc repGetLazyStringLiteralHelper(CORINFO_MODULE_HANDLE handle);
787
788 void recGetUnBoxHelper(CORINFO_CLASS_HANDLE cls, CorInfoHelpFunc result);
789 void dmpGetUnBoxHelper(DWORDLONG key, DWORD value);
790 CorInfoHelpFunc repGetUnBoxHelper(CORINFO_CLASS_HANDLE cls);
791
792 void recGetReadyToRunHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
793 CORINFO_LOOKUP_KIND* pGenericLookupKind,
794 CorInfoHelpFunc id,
795 CORINFO_CONST_LOOKUP* pLookup,
796 bool result);
797 void dmpGetReadyToRunHelper(GetReadyToRunHelper_TOKENin key, GetReadyToRunHelper_TOKENout value);
798 bool repGetReadyToRunHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
799 CORINFO_LOOKUP_KIND* pGenericLookupKind,
800 CorInfoHelpFunc id,
801 CORINFO_CONST_LOOKUP* pLookup);
802
803 void recGetReadyToRunDelegateCtorHelper(CORINFO_RESOLVED_TOKEN* pTargetMethod,
804 CORINFO_CLASS_HANDLE delegateType,
805 CORINFO_LOOKUP* pLookup);
806 void dmpGetReadyToRunDelegateCtorHelper(GetReadyToRunDelegateCtorHelper_TOKENIn key,
807 Agnostic_CORINFO_LOOKUP pLookup);
808 void repGetReadyToRunDelegateCtorHelper(CORINFO_RESOLVED_TOKEN* pTargetMethod,
809 CORINFO_CLASS_HANDLE delegateType,
810 CORINFO_LOOKUP* pLookup);
811
812 void recGetHelperFtn(CorInfoHelpFunc ftnNum, void** ppIndirection, void* result);
813 void dmpGetHelperFtn(DWORD key, DLDL value);
814 void* repGetHelperFtn(CorInfoHelpFunc ftnNum, void** ppIndirection);
815 bool fndGetHelperFtn(void* functionAddress, CorInfoHelpFunc* pResult);
816
817 void recGetJustMyCodeHandle(CORINFO_METHOD_HANDLE method,
818 CORINFO_JUST_MY_CODE_HANDLE** ppIndirection,
819 CORINFO_JUST_MY_CODE_HANDLE result);
820 void dmpGetJustMyCodeHandle(DWORDLONG key, DLDL value);
821 CORINFO_JUST_MY_CODE_HANDLE repGetJustMyCodeHandle(CORINFO_METHOD_HANDLE method,
822 CORINFO_JUST_MY_CODE_HANDLE** ppIndirection);
823
824 void recGetFunctionEntryPoint(CORINFO_METHOD_HANDLE ftn,
825 CORINFO_CONST_LOOKUP* pResult,
826 CORINFO_ACCESS_FLAGS accessFlags);
827 void dmpGetFunctionEntryPoint(DLD key, DLD value);
828 void repGetFunctionEntryPoint(CORINFO_METHOD_HANDLE ftn,
829 CORINFO_CONST_LOOKUP* pResult,
830 CORINFO_ACCESS_FLAGS accessFlags);
831 bool fndGetFunctionEntryPoint(DLD value, CORINFO_METHOD_HANDLE* pResult);
832
833 void recConstructStringLiteral(CORINFO_MODULE_HANDLE module, mdToken metaTok, void* ppValue, InfoAccessType result);
834 void dmpConstructStringLiteral(DLD key, DLD value);
835 InfoAccessType repConstructStringLiteral(CORINFO_MODULE_HANDLE module, mdToken metaTok, void** ppValue);
836
837 void recConvertPInvokeCalliToCall(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool fMustConvert, bool result);
838 void dmpConvertPInvokeCalliToCall(DLD key, DWORDLONG value);
839 bool repConvertPInvokeCalliToCall(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool fMustConvert);
840
841 void recEmptyStringLiteral(void** ppValue, InfoAccessType result);
842 void dmpEmptyStringLiteral(DWORD key, DLD value);
843 InfoAccessType repEmptyStringLiteral(void** ppValue);
844
845 void recGetArgType(CORINFO_SIG_INFO* sig,
846 CORINFO_ARG_LIST_HANDLE args,
847 CORINFO_CLASS_HANDLE* vcTypeRet,
848 CorInfoTypeWithMod result,
849 DWORD exception);
850 void dmpGetArgType(const GetArgTypeValue& key, const Agnostic_GetArgType_Value& value);
851 CorInfoTypeWithMod repGetArgType(CORINFO_SIG_INFO* sig,
852 CORINFO_ARG_LIST_HANDLE args,
853 CORINFO_CLASS_HANDLE* vcTypeRet,
854 DWORD* exception);
855
856 void recGetArgNext(CORINFO_ARG_LIST_HANDLE args, CORINFO_ARG_LIST_HANDLE result);
857 void dmpGetArgNext(DWORDLONG key, DWORDLONG value);
858 CORINFO_ARG_LIST_HANDLE repGetArgNext(CORINFO_ARG_LIST_HANDLE args);
859
860 void recGetMethodSig(CORINFO_METHOD_HANDLE ftn, CORINFO_SIG_INFO* sig, CORINFO_CLASS_HANDLE memberParent);
861 void dmpGetMethodSig(DLDL key, const Agnostic_CORINFO_SIG_INFO& value);
862 void repGetMethodSig(CORINFO_METHOD_HANDLE ftn, CORINFO_SIG_INFO* sig, CORINFO_CLASS_HANDLE memberParent);
863
864 void recGetArgClass(CORINFO_SIG_INFO* sig,
865 CORINFO_ARG_LIST_HANDLE args,
866 CORINFO_CLASS_HANDLE result,
867 DWORD exceptionCode);
868 void dmpGetArgClass(const GetArgClassValue& key, const Agnostic_GetArgClass_Value& value);
869 CORINFO_CLASS_HANDLE repGetArgClass(CORINFO_SIG_INFO* sig, CORINFO_ARG_LIST_HANDLE args, DWORD* exceptionCode);
870
871 void recGetHFAType(CORINFO_CLASS_HANDLE clsHnd, CorInfoType result);
872 void dmpGetHFAType(DWORDLONG key, DWORD value);
873 CorInfoType repGetHFAType(CORINFO_CLASS_HANDLE clsHnd);
874
875 void recGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, bool result, DWORD exceptionCode);
876 void dmpGetMethodInfo(DWORDLONG key, const Agnostic_GetMethodInfo& value);
877 bool repGetMethodInfo(CORINFO_METHOD_HANDLE ftn, CORINFO_METHOD_INFO* info, DWORD* exceptionCode);
878
879 void recGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken,
880 CORINFO_METHOD_HANDLE callerHandle,
881 bool* pHasSideEffects,
882 CorInfoHelpFunc result);
883 void dmpGetNewHelper(const Agnostic_GetNewHelper& key, DD value);
884 CorInfoHelpFunc repGetNewHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool * pHasSideEffects);
885
886 void recEmbedGenericHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken,
887 BOOL fEmbedParent,
888 CORINFO_GENERICHANDLE_RESULT* pResult);
889 void dmpEmbedGenericHandle(const Agnostic_EmbedGenericHandle& key,
890 const Agnostic_CORINFO_GENERICHANDLE_RESULT& value);
891 void repEmbedGenericHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken,
892 BOOL fEmbedParent,
893 CORINFO_GENERICHANDLE_RESULT* pResult);
894
895 void recGetEHinfo(CORINFO_METHOD_HANDLE ftn, unsigned EHnumber, CORINFO_EH_CLAUSE* clause);
896 void dmpGetEHinfo(DLD key, const Agnostic_CORINFO_EH_CLAUSE& value);
897 void repGetEHinfo(CORINFO_METHOD_HANDLE ftn, unsigned EHnumber, CORINFO_EH_CLAUSE* clause);
898
899 void recGetMethodVTableOffset(CORINFO_METHOD_HANDLE method,
900 unsigned* offsetOfIndirection,
901 unsigned* offsetAfterIndirection,
902 bool* isRelative);
903 void dmpGetMethodVTableOffset(DWORDLONG key, DDD value);
904 void repGetMethodVTableOffset(CORINFO_METHOD_HANDLE method,
905 unsigned* offsetOfIndirection,
906 unsigned* offsetAfterIndirection,
907 bool* isRelative);
908
909 void recResolveVirtualMethod(CORINFO_METHOD_HANDLE virtMethod,
910 CORINFO_CLASS_HANDLE implClass,
911 CORINFO_CONTEXT_HANDLE ownerType,
912 CORINFO_METHOD_HANDLE result);
913 void dmpResolveVirtualMethod(const Agnostic_ResolveVirtualMethod& key, DWORDLONG value);
914 CORINFO_METHOD_HANDLE repResolveVirtualMethod(CORINFO_METHOD_HANDLE virtMethod,
915 CORINFO_CLASS_HANDLE implClass,
916 CORINFO_CONTEXT_HANDLE ownerType);
917
918 void recGetUnboxedEntry(CORINFO_METHOD_HANDLE ftn, bool* requiresInstMethodTableArg, CORINFO_METHOD_HANDLE result);
919 void dmpGetUnboxedEntry(DWORDLONG key, DLD value);
920 CORINFO_METHOD_HANDLE repGetUnboxedEntry(CORINFO_METHOD_HANDLE ftn, bool* requiresInstMethodTableArg);
921
922 void recGetDefaultEqualityComparerClass(CORINFO_CLASS_HANDLE cls, CORINFO_CLASS_HANDLE result);
923 void dmpGetDefaultEqualityComparerClass(DWORDLONG key, DWORDLONG value);
924 CORINFO_CLASS_HANDLE repGetDefaultEqualityComparerClass(CORINFO_CLASS_HANDLE cls);
925
926 void recGetTokenTypeAsHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken, CORINFO_CLASS_HANDLE result);
927 void dmpGetTokenTypeAsHandle(const GetTokenTypeAsHandleValue& key, DWORDLONG value);
928 CORINFO_CLASS_HANDLE repGetTokenTypeAsHandle(CORINFO_RESOLVED_TOKEN* pResolvedToken);
929
930 void recGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken,
931 CORINFO_METHOD_HANDLE callerHandle,
932 CORINFO_ACCESS_FLAGS flags,
933 CORINFO_FIELD_INFO* pResult);
934 void dmpGetFieldInfo(const Agnostic_GetFieldInfo& key, const Agnostic_CORINFO_FIELD_INFO& value);
935 void repGetFieldInfo(CORINFO_RESOLVED_TOKEN* pResolvedToken,
936 CORINFO_METHOD_HANDLE callerHandle,
937 CORINFO_ACCESS_FLAGS flags,
938 CORINFO_FIELD_INFO* pResult);
939
940 void recEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, void** ppIndirection, CORINFO_METHOD_HANDLE result);
941 void dmpEmbedMethodHandle(DWORDLONG key, DLDL value);
942 CORINFO_METHOD_HANDLE repEmbedMethodHandle(CORINFO_METHOD_HANDLE handle, void** ppIndirection);
943
944 void recGetFieldAddress(CORINFO_FIELD_HANDLE field, void** ppIndirection, void* result, CorInfoType cit);
945 void dmpGetFieldAddress(DWORDLONG key, const Agnostic_GetFieldAddress& value);
946 void* repGetFieldAddress(CORINFO_FIELD_HANDLE field, void** ppIndirection);
947
948 void recGetStaticFieldCurrentClass(CORINFO_FIELD_HANDLE field, bool isSpeculative, CORINFO_CLASS_HANDLE result);
949 void dmpGetStaticFieldCurrentClass(DWORDLONG key, const Agnostic_GetStaticFieldCurrentClass& value);
950 CORINFO_CLASS_HANDLE repGetStaticFieldCurrentClass(CORINFO_FIELD_HANDLE field, bool* pIsSpeculative);
951
952 void recGetClassGClayout(CORINFO_CLASS_HANDLE cls, BYTE* gcPtrs, unsigned len, unsigned result);
953 void dmpGetClassGClayout(DWORDLONG key, const Agnostic_GetClassGClayout& value);
954 unsigned repGetClassGClayout(CORINFO_CLASS_HANDLE cls, BYTE* gcPtrs);
955
956 void recGetClassAlignmentRequirement(CORINFO_CLASS_HANDLE cls, BOOL fDoubleAlignHint, unsigned result);
957 void dmpGetClassAlignmentRequirement(DLD key, DWORD value);
958 unsigned repGetClassAlignmentRequirement(CORINFO_CLASS_HANDLE cls, BOOL fDoubleAlignHint);
959
960 void recCanAccessClass(CORINFO_RESOLVED_TOKEN* pResolvedToken,
961 CORINFO_METHOD_HANDLE callerHandle,
962 CORINFO_HELPER_DESC* pAccessHelper,
963 CorInfoIsAccessAllowedResult result);
964 void dmpCanAccessClass(const Agnostic_CanAccessClassIn& key, const Agnostic_CanAccessClassOut& value);
965 CorInfoIsAccessAllowedResult repCanAccessClass(CORINFO_RESOLVED_TOKEN* pResolvedToken,
966 CORINFO_METHOD_HANDLE callerHandle,
967 CORINFO_HELPER_DESC* pAccessHelper);
968
969 void recGetCastingHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool fThrowing, CorInfoHelpFunc result);
970 void dmpGetCastingHelper(const Agnostic_GetCastingHelper& key, DWORD value);
971 CorInfoHelpFunc repGetCastingHelper(CORINFO_RESOLVED_TOKEN* pResolvedToken, bool fThrowing);
972
973 void recEmbedModuleHandle(CORINFO_MODULE_HANDLE handle, void** ppIndirection, CORINFO_MODULE_HANDLE result);
974 void dmpEmbedModuleHandle(DWORDLONG key, DLDL value);
975 CORINFO_MODULE_HANDLE repEmbedModuleHandle(CORINFO_MODULE_HANDLE handle, void** ppIndirection);
976
977 void recEmbedClassHandle(CORINFO_CLASS_HANDLE handle, void** ppIndirection, CORINFO_CLASS_HANDLE result);
978 void dmpEmbedClassHandle(DWORDLONG key, DLDL value);
979 CORINFO_CLASS_HANDLE repEmbedClassHandle(CORINFO_CLASS_HANDLE handle, void** ppIndirection);
980
981 void recPInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SIG_INFO* callSiteSig, BOOL result);
982 void dmpPInvokeMarshalingRequired(const PInvokeMarshalingRequiredValue& key, DWORD value);
983 BOOL repPInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SIG_INFO* callSiteSig);
984
985 void recFindSig(CORINFO_MODULE_HANDLE module,
986 unsigned sigTOK,
987 CORINFO_CONTEXT_HANDLE context,
988 CORINFO_SIG_INFO* sig);
989 void dmpFindSig(const Agnostic_FindSig& key, const Agnostic_CORINFO_SIG_INFO& value);
990 void repFindSig(CORINFO_MODULE_HANDLE module,
991 unsigned sigTOK,
992 CORINFO_CONTEXT_HANDLE context,
993 CORINFO_SIG_INFO* sig);
994
995 void recGetEEInfo(CORINFO_EE_INFO* pEEInfoOut);
996 void dmpGetEEInfo(DWORD key, const Agnostic_CORINFO_EE_INFO& value);
997 void repGetEEInfo(CORINFO_EE_INFO* pEEInfoOut);
998
999 void recGetGSCookie(GSCookie* pCookieVal, GSCookie** ppCookieVal);
1000 void dmpGetGSCookie(DWORD key, DLDL value);
1001 void repGetGSCookie(GSCookie* pCookieVal, GSCookie** ppCookieVal);
1002
1003 void recGetClassModuleIdForStatics(CORINFO_CLASS_HANDLE cls,
1004 CORINFO_MODULE_HANDLE* pModule,
1005 void** ppIndirection,
1006 size_t result);
1007 void dmpGetClassModuleIdForStatics(DWORDLONG key, const Agnostic_GetClassModuleIdForStatics& value);
1008 size_t repGetClassModuleIdForStatics(CORINFO_CLASS_HANDLE cls,
1009 CORINFO_MODULE_HANDLE* pModule,
1010 void** ppIndirection);
1011
1012 void recGetThreadTLSIndex(void** ppIndirection, DWORD result);
1013 void dmpGetThreadTLSIndex(DWORD key, DLD value);
1014 DWORD repGetThreadTLSIndex(void** ppIndirection);
1015
1016 void recGetInlinedCallFrameVptr(void** ppIndirection, const void* result);
1017 void dmpGetInlinedCallFrameVptr(DWORD key, DLDL value);
1018 const void* repGetInlinedCallFrameVptr(void** ppIndirection);
1019
1020 void recGetAddrOfCaptureThreadGlobal(void** ppIndirection, LONG* result);
1021 void dmpGetAddrOfCaptureThreadGlobal(DWORD key, DLDL value);
1022 LONG* repGetAddrOfCaptureThreadGlobal(void** ppIndirection);
1023
1024 void recGetClassDomainID(CORINFO_CLASS_HANDLE cls, void** ppIndirection, unsigned result);
1025 void dmpGetClassDomainID(DWORDLONG key, DLD value);
1026 unsigned repGetClassDomainID(CORINFO_CLASS_HANDLE cls, void** ppIndirection);
1027
1028 void recGetLocationOfThisType(CORINFO_METHOD_HANDLE context, CORINFO_LOOKUP_KIND* result);
1029 void dmpGetLocationOfThisType(DWORDLONG key, const Agnostic_CORINFO_LOOKUP_KIND& value);
1030 CORINFO_LOOKUP_KIND repGetLocationOfThisType(CORINFO_METHOD_HANDLE context);
1031
1032 void recGetDelegateCtor(CORINFO_METHOD_HANDLE methHnd,
1033 CORINFO_CLASS_HANDLE clsHnd,
1034 CORINFO_METHOD_HANDLE targetMethodHnd,
1035 DelegateCtorArgs* pCtorData,
1036 CORINFO_METHOD_HANDLE result);
1037 void dmpGetDelegateCtor(const Agnostic_GetDelegateCtorIn& key, const Agnostic_GetDelegateCtorOut& value);
1038 CORINFO_METHOD_HANDLE repGetDelegateCtor(CORINFO_METHOD_HANDLE methHnd,
1039 CORINFO_CLASS_HANDLE clsHnd,
1040 CORINFO_METHOD_HANDLE targetMethodHnd,
1041 DelegateCtorArgs* pCtorData);
1042
1043 void recGetFunctionFixedEntryPoint(CORINFO_METHOD_HANDLE ftn, CORINFO_CONST_LOOKUP* pResult);
1044 void dmpGetFunctionFixedEntryPoint(DWORDLONG key, const Agnostic_CORINFO_CONST_LOOKUP& value);
1045 void repGetFunctionFixedEntryPoint(CORINFO_METHOD_HANDLE ftn, CORINFO_CONST_LOOKUP* pResult);
1046
1047 void recGetFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num, CORINFO_FIELD_HANDLE result);
1048 void dmpGetFieldInClass(DLD key, DWORDLONG value);
1049 CORINFO_FIELD_HANDLE repGetFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num);
1050
1051 void recGetFieldType(CORINFO_FIELD_HANDLE field,
1052 CORINFO_CLASS_HANDLE* structType,
1053 CORINFO_CLASS_HANDLE memberParent,
1054 CorInfoType result);
1055 void dmpGetFieldType(DLDL key, DLD value);
1056 CorInfoType repGetFieldType(CORINFO_FIELD_HANDLE field,
1057 CORINFO_CLASS_HANDLE* structType,
1058 CORINFO_CLASS_HANDLE memberParent);
1059
1060 void recGetFieldName(CORINFO_FIELD_HANDLE ftn, const char** moduleName, const char* result);
1061 void dmpGetFieldName(DWORDLONG key, DD value);
1062 const char* repGetFieldName(CORINFO_FIELD_HANDLE ftn, const char** moduleName);
1063
1064 void recCanInlineTypeCheck(CORINFO_CLASS_HANDLE cls,
1065 CorInfoInlineTypeCheckSource source,
1066 CorInfoInlineTypeCheck result);
1067 void dmpCanInlineTypeCheck(DLD key, DWORD value);
1068 CorInfoInlineTypeCheck repCanInlineTypeCheck(CORINFO_CLASS_HANDLE cls, CorInfoInlineTypeCheckSource source);
1069 void recCanInlineTypeCheckWithObjectVTable(CORINFO_CLASS_HANDLE cls, BOOL result);
1070 void dmpCanInlineTypeCheckWithObjectVTable(DWORDLONG key, DWORD value);
1071 BOOL repCanInlineTypeCheckWithObjectVTable(CORINFO_CLASS_HANDLE cls);
1072
1073 void recSatisfiesMethodConstraints(CORINFO_CLASS_HANDLE parent, CORINFO_METHOD_HANDLE method, BOOL result);
1074 void dmpSatisfiesMethodConstraints(DLDL key, DWORD value);
1075 BOOL repSatisfiesMethodConstraints(CORINFO_CLASS_HANDLE parent, CORINFO_METHOD_HANDLE method);
1076
1077 void recInitConstraintsForVerification(CORINFO_METHOD_HANDLE method,
1078 BOOL* pfHasCircularClassConstraints,
1079 BOOL* pfHasCircularMethodConstraint);
1080 void dmpInitConstraintsForVerification(DWORDLONG key, DD value);
1081 void repInitConstraintsForVerification(CORINFO_METHOD_HANDLE method,
1082 BOOL* pfHasCircularClassConstraints,
1083 BOOL* pfHasCircularMethodConstraint);
1084
1085 void recIsValidStringRef(CORINFO_MODULE_HANDLE module, unsigned metaTOK, BOOL result);
1086 void dmpIsValidStringRef(DLD key, DWORD value);
1087 BOOL repIsValidStringRef(CORINFO_MODULE_HANDLE module, unsigned metaTOK);
1088
1089 void recGetHelperName(CorInfoHelpFunc funcNum, const char* result);
1090 void dmpGetHelperName(DWORD key, DWORD value);
1091 const char* repGetHelperName(CorInfoHelpFunc funcNum);
1092
1093 void recCanCast(CORINFO_CLASS_HANDLE child, CORINFO_CLASS_HANDLE parent, BOOL result);
1094 void dmpCanCast(DLDL key, DWORD value);
1095 BOOL repCanCast(CORINFO_CLASS_HANDLE child, CORINFO_CLASS_HANDLE parent);
1096
1097 void recGetChildType(CORINFO_CLASS_HANDLE clsHnd, CORINFO_CLASS_HANDLE* clsRet, CorInfoType result);
1098 void dmpGetChildType(DWORDLONG key, DLD value);
1099 CorInfoType repGetChildType(CORINFO_CLASS_HANDLE clsHnd, CORINFO_CLASS_HANDLE* clsRet);
1100
1101 void recGetArrayInitializationData(CORINFO_FIELD_HANDLE field, DWORD size, void* result);
1102 void dmpGetArrayInitializationData(DLD key, DWORDLONG value);
1103 void* repGetArrayInitializationData(CORINFO_FIELD_HANDLE field, DWORD size);
1104
1105 void recFilterException(struct _EXCEPTION_POINTERS* pExceptionPointers, int result);
1106 void dmpFilterException(DWORD key, DWORD value);
1107 int repFilterException(struct _EXCEPTION_POINTERS* pExceptionPointers);
1108
1109 void recHandleException(struct _EXCEPTION_POINTERS* pExceptionPointers);
1110 void dmpHandleException(DWORD key, DWORD value);
1111
1112 void recGetAddressOfPInvokeFixup(CORINFO_METHOD_HANDLE method, void** ppIndirection, void* result);
1113 void dmpGetAddressOfPInvokeFixup(DWORDLONG key, DLDL value);
1114 void* repGetAddressOfPInvokeFixup(CORINFO_METHOD_HANDLE method, void** ppIndirection);
1115
1116 void recGetAddressOfPInvokeTarget(CORINFO_METHOD_HANDLE method, CORINFO_CONST_LOOKUP* pLookup);
1117 void dmpGetAddressOfPInvokeTarget(DWORDLONG key, DLD value);
1118 void repGetAddressOfPInvokeTarget(CORINFO_METHOD_HANDLE method, CORINFO_CONST_LOOKUP* pLookup);
1119
1120 void recSatisfiesClassConstraints(CORINFO_CLASS_HANDLE cls, BOOL result);
1121 void dmpSatisfiesClassConstraints(DWORDLONG key, DWORD value);
1122 BOOL repSatisfiesClassConstraints(CORINFO_CLASS_HANDLE cls);
1123
1124 void recGetMethodHash(CORINFO_METHOD_HANDLE ftn, unsigned result);
1125 void dmpGetMethodHash(DWORDLONG key, DWORD value);
1126 unsigned repGetMethodHash(CORINFO_METHOD_HANDLE ftn);
1127
1128 void recCanTailCall(CORINFO_METHOD_HANDLE callerHnd,
1129 CORINFO_METHOD_HANDLE declaredCalleeHnd,
1130 CORINFO_METHOD_HANDLE exactCalleeHnd,
1131 bool fIsTailPrefix,
1132 bool result);
1133 void dmpCanTailCall(const Agnostic_CanTailCall& key, DWORD value);
1134 bool repCanTailCall(CORINFO_METHOD_HANDLE callerHnd,
1135 CORINFO_METHOD_HANDLE declaredCalleeHnd,
1136 CORINFO_METHOD_HANDLE exactCalleeHnd,
1137 bool fIsTailPrefix);
1138
1139 void recIsCompatibleDelegate(CORINFO_CLASS_HANDLE objCls,
1140 CORINFO_CLASS_HANDLE methodParentCls,
1141 CORINFO_METHOD_HANDLE method,
1142 CORINFO_CLASS_HANDLE delegateCls,
1143 BOOL* pfIsOpenDelegate,
1144 BOOL result);
1145 void dmpIsCompatibleDelegate(const Agnostic_IsCompatibleDelegate& key, DD value);
1146 BOOL repIsCompatibleDelegate(CORINFO_CLASS_HANDLE objCls,
1147 CORINFO_CLASS_HANDLE methodParentCls,
1148 CORINFO_METHOD_HANDLE method,
1149 CORINFO_CLASS_HANDLE delegateCls,
1150 BOOL* pfIsOpenDelegate);
1151
1152 void recIsDelegateCreationAllowed(CORINFO_CLASS_HANDLE delegateHnd, CORINFO_METHOD_HANDLE calleeHnd, BOOL result);
1153 void dmpIsDelegateCreationAllowed(DLDL key, DWORD value);
1154 BOOL repIsDelegateCreationAllowed(CORINFO_CLASS_HANDLE delegateHnd, CORINFO_METHOD_HANDLE calleeHnd);
1155
1156 void recCanSkipMethodVerification(CORINFO_METHOD_HANDLE ftnHandle,
1157 BOOL skip,
1158 CorInfoCanSkipVerificationResult result);
1159 void dmpCanSkipMethodVerification(DLD key, DWORD value);
1160 CorInfoCanSkipVerificationResult repCanSkipMethodVerification(CORINFO_METHOD_HANDLE ftnHandle, BOOL skip);
1161
1162 void recFindCallSiteSig(CORINFO_MODULE_HANDLE module,
1163 unsigned methTOK,
1164 CORINFO_CONTEXT_HANDLE context,
1165 CORINFO_SIG_INFO* sig);
1166 void dmpFindCallSiteSig(const Agnostic_FindCallSiteSig& key, const Agnostic_CORINFO_SIG_INFO& value);
1167 void repFindCallSiteSig(CORINFO_MODULE_HANDLE module,
1168 unsigned methTOK,
1169 CORINFO_CONTEXT_HANDLE context,
1170 CORINFO_SIG_INFO* sig);
1171
1172 void recShouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope, BOOL result);
1173 void dmpShouldEnforceCallvirtRestriction(DWORDLONG key, DWORD value);
1174 BOOL repShouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope);
1175
1176 void recGetMethodSync(CORINFO_METHOD_HANDLE ftn, void** ppIndirection, void* result);
1177 void dmpGetMethodSync(DWORDLONG key, DLDL value);
1178 void* repGetMethodSync(CORINFO_METHOD_HANDLE ftn, void** ppIndirection);
1179
1180 void recGetVarArgsHandle(CORINFO_SIG_INFO* pSig, void** ppIndirection, CORINFO_VARARGS_HANDLE result);
1181 void dmpGetVarArgsHandle(const GetVarArgsHandleValue& key, DLDL value);
1182 CORINFO_VARARGS_HANDLE repGetVarArgsHandle(CORINFO_SIG_INFO* pSig, void** ppIndirection);
1183
1184 void recCanGetVarArgsHandle(CORINFO_SIG_INFO* pSig, bool result);
1185 void dmpCanGetVarArgsHandle(const CanGetVarArgsHandleValue& key, DWORD value);
1186 bool repCanGetVarArgsHandle(CORINFO_SIG_INFO* pSig);
1187
1188 void recGetFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE field, void** ppIndirection, DWORD result);
1189 void dmpGetFieldThreadLocalStoreID(DWORDLONG key, DLD value);
1190 DWORD repGetFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE field, void** ppIndirection);
1191
1192 void recGetBBProfileData(CORINFO_METHOD_HANDLE ftnHnd,
1193 ULONG* count,
1194 ICorJitInfo::ProfileBuffer** profileBuffer,
1195 ULONG* numRuns,
1196 HRESULT result);
1197 void dmpGetBBProfileData(DWORDLONG key, const Agnostic_GetBBProfileData& value);
1198 HRESULT repGetBBProfileData(CORINFO_METHOD_HANDLE ftnHnd,
1199 ULONG* count,
1200 ICorJitInfo::ProfileBuffer** profileBuffer,
1201 ULONG* numRuns);
1202
1203 void recMergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, CORINFO_CLASS_HANDLE result);
1204 void dmpMergeClasses(DLDL key, DWORDLONG value);
1205 CORINFO_CLASS_HANDLE repMergeClasses(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
1206
1207 void recGetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig, void** ppIndirection, LPVOID result);
1208 void dmpGetCookieForPInvokeCalliSig(const GetCookieForPInvokeCalliSigValue& key, DLDL value);
1209 LPVOID repGetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig, void** ppIndirection);
1210
1211 void recCanGetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig, bool result);
1212 void dmpCanGetCookieForPInvokeCalliSig(const CanGetCookieForPInvokeCalliSigValue& key, DWORD value);
1213 bool repCanGetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig);
1214
1215 void recCanAccessFamily(CORINFO_METHOD_HANDLE hCaller, CORINFO_CLASS_HANDLE hInstanceType, BOOL result);
1216 void dmpCanAccessFamily(DLDL key, DWORD value);
1217 BOOL repCanAccessFamily(CORINFO_METHOD_HANDLE hCaller, CORINFO_CLASS_HANDLE hInstanceType);
1218
1219 void recErrorList(const char* error);
1220 void dmpErrorList(DWORD key, DWORD value);
1221
1222 void recGetProfilingHandle(BOOL* pbHookFunction, void** pProfilerHandle, BOOL* pbIndirectedHandles);
1223 void dmpGetProfilingHandle(DWORD key, const Agnostic_GetProfilingHandle& value);
1224 void repGetProfilingHandle(BOOL* pbHookFunction, void** pProfilerHandle, BOOL* pbIndirectedHandles);
1225
1226 void recEmbedFieldHandle(CORINFO_FIELD_HANDLE handle, void** ppIndirection, CORINFO_FIELD_HANDLE result);
1227 void dmpEmbedFieldHandle(DWORDLONG key, DLDL value);
1228 CORINFO_FIELD_HANDLE repEmbedFieldHandle(CORINFO_FIELD_HANDLE handle, void** ppIndirection);
1229
1230 void recAreTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, BOOL result);
1231 void dmpAreTypesEquivalent(DLDL key, DWORD value);
1232 BOOL repAreTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
1233
1234 void recCompareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass, TypeCompareState result);
1235 void dmpCompareTypesForCast(DLDL key, DWORD value);
1236 TypeCompareState repCompareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass);
1237
1238 void recCompareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2, TypeCompareState result);
1239 void dmpCompareTypesForEquality(DLDL key, DWORD value);
1240 TypeCompareState repCompareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
1241
1242 void recFindNameOfToken(
1243 CORINFO_MODULE_HANDLE module, mdToken metaTOK, char* szFQName, size_t FQNameCapacity, size_t result);
1244 void dmpFindNameOfToken(DLD key, DLD value);
1245 size_t repFindNameOfToken(CORINFO_MODULE_HANDLE module, mdToken metaTOK, char* szFQName, size_t FQNameCapacity);
1246
1247 void recGetSystemVAmd64PassStructInRegisterDescriptor(
1248 CORINFO_CLASS_HANDLE structHnd,
1249 SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr,
1250 bool result);
1251 void dmpGetSystemVAmd64PassStructInRegisterDescriptor(
1252 DWORDLONG key, const Agnostic_GetSystemVAmd64PassStructInRegisterDescriptor& value);
1253 bool repGetSystemVAmd64PassStructInRegisterDescriptor(
1254 CORINFO_CLASS_HANDLE structHnd, SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr);
1255
1256 void recGetRelocTypeHint(void* target, WORD result);
1257 void dmpGetRelocTypeHint(DWORDLONG key, DWORD value);
1258 WORD repGetRelocTypeHint(void* target);
1259
1260 void recIsWriteBarrierHelperRequired(CORINFO_FIELD_HANDLE field, bool result);
1261 void dmpIsWriteBarrierHelperRequired(DWORDLONG key, DWORD value);
1262 bool repIsWriteBarrierHelperRequired(CORINFO_FIELD_HANDLE field);
1263
1264 void recIsValidToken(CORINFO_MODULE_HANDLE module, unsigned metaTOK, BOOL result);
1265 void dmpIsValidToken(DLD key, DWORD value);
1266 BOOL repIsValidToken(CORINFO_MODULE_HANDLE module, unsigned metaTOK);
1267
1268 void recGetClassName(CORINFO_CLASS_HANDLE cls, const char* result);
1269 void dmpGetClassName(DWORDLONG key, DWORD value);
1270 const char* repGetClassName(CORINFO_CLASS_HANDLE cls);
1271
1272 void recGetClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, char* className, const char** namespaceName);
1273 void dmpGetClassNameFromMetadata(DLD key, DD value);
1274 const char* repGetClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const char** namespaceName);
1275
1276 void recGetTypeInstantiationArgument(CORINFO_CLASS_HANDLE cls, CORINFO_CLASS_HANDLE result, unsigned index);
1277 void dmpGetTypeInstantiationArgument(DWORDLONG key, DWORDLONG value);
1278 CORINFO_CLASS_HANDLE repGetTypeInstantiationArgument(CORINFO_CLASS_HANDLE cls, unsigned index);
1279
1280 void recAppendClassName(
1281 CORINFO_CLASS_HANDLE cls, BOOL fNamespace, BOOL fFullInst, BOOL fAssembly, const WCHAR* result);
1282 void dmpAppendClassName(const Agnostic_AppendClassName& key, DWORD value);
1283 const WCHAR* repAppendClassName(CORINFO_CLASS_HANDLE cls, BOOL fNamespace, BOOL fFullInst, BOOL fAssembly);
1284
1285 void recGetTailCallCopyArgsThunk(CORINFO_SIG_INFO* pSig, CorInfoHelperTailCallSpecialHandling flags, void* result);
1286 void dmpGetTailCallCopyArgsThunk(const Agnostic_GetTailCallCopyArgsThunk& key, DWORDLONG value);
1287 void* repGetTailCallCopyArgsThunk(CORINFO_SIG_INFO* pSig, CorInfoHelperTailCallSpecialHandling flags);
1288
1289 void recGetMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod, mdMethodDef result);
1290 void dmpGetMethodDefFromMethod(DWORDLONG key, DWORD value);
1291 mdMethodDef repGetMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod);
1292
1293 void recCheckMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, BOOL fOptional, BOOL result);
1294 void dmpCheckMethodModifier(const Agnostic_CheckMethodModifier& key, DWORD value);
1295 BOOL repCheckMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, BOOL fOptional);
1296
1297 void recGetPInvokeUnmanagedTarget(CORINFO_METHOD_HANDLE method, void** ppIndirection, void* result);
1298 void dmpGetPInvokeUnmanagedTarget(DWORDLONG key, DLDL value);
1299 void* repGetPInvokeUnmanagedTarget(CORINFO_METHOD_HANDLE method, void** ppIndirection);
1300
1301 void recGetArrayRank(CORINFO_CLASS_HANDLE cls, unsigned result);
1302 void dmpGetArrayRank(DWORDLONG key, DWORD value);
1303 unsigned repGetArrayRank(CORINFO_CLASS_HANDLE cls);
1304
1305 void recIsFieldStatic(CORINFO_FIELD_HANDLE fhld, bool result);
1306 void dmpIsFieldStatic(DWORDLONG key, DWORD value);
1307 bool repIsFieldStatic(CORINFO_FIELD_HANDLE fhld);
1308
1309 void recGetIntConfigValue(const wchar_t* name, int defaultValue, int result);
1310 void dmpGetIntConfigValue(const Agnostic_ConfigIntInfo& key, int value);
1311 int repGetIntConfigValue(const wchar_t* name, int defaultValue);
1312
1313 void recGetStringConfigValue(const wchar_t* name, const wchar_t* result);
1314 void dmpGetStringConfigValue(DWORD nameIndex, DWORD result);
1315 const wchar_t* repGetStringConfigValue(const wchar_t* name);
1316
1317 struct Environment
1318 {
1319 Environment() : getIntConfigValue(nullptr), getStingConfigValue(nullptr)
1320 {
1321 }
1322
1323 LightWeightMap<MethodContext::Agnostic_ConfigIntInfo, DWORD>* getIntConfigValue;
1324 LightWeightMap<DWORD, DWORD>* getStingConfigValue;
1325 };
1326
1327 Environment cloneEnvironment();
1328
1329 bool WasEnvironmentChanged(const Environment& prevEnv);
1330
1331 CompileResult* cr;
1332 CompileResult* originalCR;
1333 int index;
1334
1335private:
1336 bool IsEnvironmentHeaderEqual(const Environment& prevEnv);
1337 bool IsEnvironmentContentEqual(const Environment& prevEnv);
1338
1339 template <typename key, typename value>
1340 static bool AreLWMHeadersEqual(LightWeightMap<key, value>* prev, LightWeightMap<key, value>* curr);
1341 static bool IsIntConfigContentEqual(LightWeightMap<Agnostic_ConfigIntInfo, DWORD>* prev,
1342 LightWeightMap<Agnostic_ConfigIntInfo, DWORD>* curr);
1343 static bool IsStringContentEqual(LightWeightMap<DWORD, DWORD>* prev, LightWeightMap<DWORD, DWORD>* curr);
1344
1345#define LWM(map, key, value) LightWeightMap<key, value>* map;
1346#define DENSELWM(map, value) DenseLightWeightMap<value>* map;
1347#include "lwmlist.h"
1348};
1349
1350// ********************* Please keep this up-to-date to ease adding more ***************
1351// Highest packet number: 173
1352// *************************************************************************************
1353enum mcPackets
1354{
1355 Packet_AppendClassName = 149, // Added 8/6/2014 - needed for SIMD
1356 Packet_AreTypesEquivalent = 1,
1357 Packet_AsCorInfoType = 2,
1358 Packet_CanAccessClass = 3,
1359 Packet_CanAccessFamily = 4,
1360 Packet_CanCast = 5,
1361 Retired8 = 6,
1362 Packet_GetLazyStringLiteralHelper = 147, // Added 12/20/2013 - as a replacement for CanEmbedModuleHandleForHelper
1363 Packet_CanGetCookieForPInvokeCalliSig = 7,
1364 Packet_CanGetVarArgsHandle = 8,
1365 Packet_CanInline = 9,
1366 Packet_CanInlineTypeCheck = 173, // Added 11/15/2018 as a replacement for CanInlineTypeCheckWithObjectVTable
1367 Packet_CanInlineTypeCheckWithObjectVTable = 10,
1368 Packet_CanSkipMethodVerification = 11,
1369 Packet_CanTailCall = 12,
1370 Retired4 = 13,
1371 Packet_CheckMethodModifier = 142, // retired as 13 on 2013/07/04
1372 Retired3 = 14,
1373 Retired5 = 141, // retired as 14 on 2013/07/03
1374 Packet_CompareTypesForCast = 163, // Added 10/4/17
1375 Packet_CompareTypesForEquality = 164, // Added 10/4/17
1376 Packet_CompileMethod = 143, // retired as 141 on 2013/07/09
1377 Packet_ConstructStringLiteral = 15,
1378 Packet_ConvertPInvokeCalliToCall = 169, // Added 4/29/18
1379 Packet_EmbedClassHandle = 16,
1380 Packet_EmbedFieldHandle = 17,
1381 Packet_EmbedGenericHandle = 18,
1382 Packet_EmbedMethodHandle = 19,
1383 Packet_EmbedModuleHandle = 20,
1384 Packet_EmptyStringLiteral = 21,
1385 Retired9 = 136,
1386 Packet_ErrorList = 22,
1387 Packet_FilterException = 134,
1388 Packet_FindCallSiteSig = 23,
1389 Retired7 = 24,
1390 Packet_FindNameOfToken = 145, // Added 7/19/2013 - adjusted members to proper types
1391 Packet_GetSystemVAmd64PassStructInRegisterDescriptor = 156, // Added 2/17/2016
1392 Packet_FindSig = 25,
1393 Packet_GetAddressOfPInvokeFixup = 26,
1394 Packet_GetAddressOfPInvokeTarget = 153, // Added 2/3/2016
1395 Packet_GetAddrOfCaptureThreadGlobal = 27,
1396 Retired1 = 28,
1397 Packet_GetArgClass = 139, // retired as 28 on 2013/07/03
1398 Packet_GetHFAType = 159,
1399 Packet_GetArgNext = 29,
1400 Retired2 = 30,
1401 Packet_GetArgType = 140, // retired as 30 on 2013/07/03
1402 Packet_GetArrayInitializationData = 31,
1403 Packet_GetArrayRank = 32,
1404 Packet_GetBBProfileData = 33,
1405 Packet_GetBoundaries = 34,
1406 Packet_GetBoxHelper = 35,
1407 Packet_GetBuiltinClass = 36,
1408 Packet_GetCallInfo = 37,
1409 Packet_GetCastingHelper = 38,
1410 Packet_GetChildType = 39,
1411 Packet_GetClassAlignmentRequirement = 40,
1412 Packet_GetClassAttribs = 41,
1413 Packet_GetClassDomainID = 42,
1414 Packet_GetClassGClayout = 43,
1415 Packet_GetClassModuleIdForStatics = 44,
1416 Packet_GetClassName = 45,
1417 Packet_GetClassNameFromMetadata = 166, // Added 12/4/17
1418 Packet_GetTypeInstantiationArgument = 167, // Added 12/4/17
1419 Packet_GetClassNumInstanceFields = 46,
1420 Packet_GetClassSize = 47,
1421 Packet_GetHeapClassSize = 170, // Added 10/5/2018
1422 Packet_CanAllocateOnStack = 171, // Added 10/5/2018
1423 Packet_GetIntConfigValue = 151, // Added 2/12/2015
1424 Packet_GetStringConfigValue = 152, // Added 2/12/2015
1425 Packet_GetCookieForPInvokeCalliSig = 48,
1426 Packet_GetDefaultEqualityComparerClass = 162, // Added 9/24/2017
1427 Packet_GetDelegateCtor = 49,
1428 Packet_GetEEInfo = 50,
1429 Packet_GetEHinfo = 51,
1430 Packet_GetFieldAddress = 52,
1431 Packet_GetStaticFieldCurrentClass = 172, // Added 11/7/2018
1432 Packet_GetFieldClass = 53,
1433 Packet_GetFieldInClass = 54,
1434 Packet_GetFieldInfo = 55,
1435 Packet_GetFieldName = 56,
1436 Packet_GetFieldOffset = 57,
1437 Packet_GetFieldThreadLocalStoreID = 58,
1438 Packet_GetFieldType = 59,
1439 Packet_GetFunctionEntryPoint = 60,
1440 Packet_GetFunctionFixedEntryPoint = 61,
1441 Packet_GetGSCookie = 62,
1442 Packet_GetHelperFtn = 63,
1443 Packet_GetHelperName = 64,
1444 Packet_GetInlinedCallFrameVptr = 65,
1445 Packet_GetIntrinsicID = 66,
1446 Packet_GetJitFlags = 154, // Added 2/3/2016
1447 Packet_GetJitTimeLogFilename = 67,
1448 Packet_GetJustMyCodeHandle = 68,
1449 Packet_GetLocationOfThisType = 69,
1450 Packet_GetMethodAttribs = 70,
1451 Packet_GetMethodClass = 71,
1452 Packet_GetMethodDefFromMethod = 72,
1453 Packet_GetMethodHash = 73,
1454 Packet_GetMethodInfo = 74,
1455 Packet_GetMethodName = 75,
1456 Packet_GetMethodNameFromMetadata = 161, // Added 9/6/17
1457 Packet_GetMethodSig = 76,
1458 Packet_GetMethodSync = 77,
1459 Packet_GetMethodVTableOffset = 78,
1460 Packet_GetNewArrHelper = 79,
1461 Packet_GetNewHelper = 80,
1462 Packet_GetParentType = 81,
1463 Packet_GetPInvokeUnmanagedTarget = 82,
1464 Packet_GetProfilingHandle = 83,
1465 Packet_GetRelocTypeHint = 84,
1466 Packet_GetSecurityPrologHelper = 85,
1467 Packet_GetSharedCCtorHelper = 86,
1468 Packet_GetTailCallCopyArgsThunk = 87,
1469 Packet_GetThreadTLSIndex = 88,
1470 Packet_GetTokenTypeAsHandle = 89,
1471 Packet_GetTypeForBox = 90,
1472 Packet_GetTypeForPrimitiveValueClass = 91,
1473 Packet_GetTypeForPrimitiveNumericClass = 168, // Added 12/7/2017
1474 Packet_GetUnboxedEntry = 165, // Added 10/26/17
1475 Packet_GetUnBoxHelper = 92,
1476 Packet_GetReadyToRunHelper = 150, // Added 10/10/2014
1477 Packet_GetReadyToRunDelegateCtorHelper = 157, // Added 3/30/2016
1478 Packet_GetUnmanagedCallConv = 94,
1479 Packet_GetVarArgsHandle = 95,
1480 Packet_GetVars = 96,
1481 Packet_HandleException = 135,
1482 Packet_InitClass = 97,
1483 Packet_InitConstraintsForVerification = 98,
1484 Packet_IsCompatibleDelegate = 99,
1485 Packet_IsDelegateCreationAllowed = 155,
1486 Packet_IsFieldStatic = 137, // Added 4/9/2013 - needed for 4.5.1
1487 Packet_IsInSIMDModule = 148, // Added 6/18/2014 - SIMD support
1488 Packet_IsInstantiationOfVerifiedGeneric = 100,
1489 Packet_IsSDArray = 101,
1490 Packet_IsStructRequiringStackAllocRetBuf = 102,
1491 Packet_IsValidStringRef = 103,
1492 Retired6 = 104,
1493 Packet_IsValidToken = 144, // Added 7/19/2013 - adjusted members to proper types
1494 Packet_IsValueClass = 105,
1495 Packet_IsWriteBarrierHelperRequired = 106,
1496 Packet_MergeClasses = 107,
1497 Packet_PInvokeMarshalingRequired = 108,
1498 Packet_ResolveToken = 109,
1499 Packet_ResolveVirtualMethod = 160, // Added 2/13/17
1500 Packet_TryResolveToken = 158, // Added 4/26/2016
1501 Packet_SatisfiesClassConstraints = 110,
1502 Packet_SatisfiesMethodConstraints = 111,
1503 Packet_ShouldEnforceCallvirtRestriction = 112,
1504
1505 PacketCR_AddressMap = 113,
1506 PacketCR_AllocBBProfileBuffer = 131,
1507 PacketCR_AllocGCInfo = 114,
1508 PacketCR_AllocMem = 115,
1509 PacketCR_AllocUnwindInfo = 132,
1510 PacketCR_AssertLog = 138, // Added 6/10/2013 - added to nicely support ilgen
1511 PacketCR_CallLog = 116,
1512 PacketCR_ClassMustBeLoadedBeforeCodeIsRun = 117,
1513 PacketCR_CompileMethod = 118,
1514 PacketCR_MessageLog = 119,
1515 PacketCR_MethodMustBeLoadedBeforeCodeIsRun = 120,
1516 PacketCR_ProcessName = 121,
1517 PacketCR_RecordRelocation = 122,
1518 PacketCR_ReportFatalError = 123,
1519 PacketCR_ReportInliningDecision = 124,
1520 PacketCR_ReportTailCallDecision = 125,
1521 PacketCR_ReserveUnwindInfo = 133,
1522 PacketCR_SetBoundaries = 126,
1523 PacketCR_SetEHcount = 127,
1524 PacketCR_SetEHinfo = 128,
1525 PacketCR_SetMethodAttribs = 129,
1526 PacketCR_SetVars = 130,
1527 PacketCR_RecordCallSite = 146, // Added 10/28/2013 - to support indirect calls
1528};
1529
1530#endif
1531