44ad5de52dd8738b85da2495e3b254ef4b32f3b2
[platform/upstream/dotnet/runtime.git] / src / coreclr / src / zap / zapinfo.h
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 //
5 // ZapInfo.h
6 //
7
8 //
9 // JIT-EE interface for zapping
10 // 
11 // ======================================================================================
12
13 #ifndef __ZAPINFO_H__
14 #define __ZAPINFO_H__
15
16 #include "zapcode.h"
17
18 class ZapInfo;
19 struct InlineContext;
20
21 // The compiled code often implicitly needs fixups for various subtle reasons.
22 // We only emit explict fixups while compiling the method, while collecting
23 // implicit fixups in the LoadTable. At the end of compiling, we expect
24 // many of the LoadTable entries to be subsumed by the explicit entries
25 // and will not need to be emitted.
26 // This is also used to detect duplicate explicit fixups for the same type.
27
28 template <typename HandleType>
29 class LoadTable
30 {
31 private:
32     ZapImage            *m_pModule;
33
34     struct LoadEntry
35     {
36         HandleType              handle;
37         int                     order;      // -1 = fixed
38     };
39
40     static int __cdecl LoadEntryCmp(const void* a_, const void* b_)
41     {
42         return ((LoadEntry*)a_)->order - ((LoadEntry*)b_)->order;
43     }
44
45     class LoadEntryTraits : public NoRemoveSHashTraits< DefaultSHashTraits<LoadEntry> >
46     {
47     public:
48         typedef typename NoRemoveSHashTraits<DefaultSHashTraits<LoadEntry> >::count_t count_t;
49         typedef typename NoRemoveSHashTraits<DefaultSHashTraits<LoadEntry> >::element_t element_t;
50         typedef HandleType key_t;
51
52         static key_t GetKey(element_t e)
53         {
54             LIMITED_METHOD_CONTRACT;
55             return e.handle;
56         }
57         static BOOL Equals(key_t k1, key_t k2)
58         {
59             LIMITED_METHOD_CONTRACT;
60             return k1 == k2;
61         }
62         static count_t Hash(key_t k)
63         {
64             LIMITED_METHOD_CONTRACT;
65             return (count_t)(size_t)k;
66         }
67
68         static const element_t Null() { LIMITED_METHOD_CONTRACT; LoadEntry e; e.handle = NULL; e.order = 0; return e; }
69         static bool IsNull(const element_t &e) { LIMITED_METHOD_CONTRACT; return (e.handle == NULL); }
70     };
71
72     typedef SHash<LoadEntryTraits> LoadEntryHashTable;
73
74     LoadEntryHashTable      m_entries;
75
76 public:
77     LoadTable(ZapImage *pModule)
78       : m_pModule(pModule)
79     {
80     }
81
82     // fixed=TRUE if the caller can guarantee that type will be fixed up because
83     // of some implicit fixup. In this case, we track 'handle' only to avoid
84     // duplicates and will not actually emit an explicit fixup for 'handle'
85     //
86     // fixed=FALSE if the caller needs an explicit fixup. We will emit an
87     // explicit fixup for 'handle' if there are no other implicit fixups.
88
89     void Load(HandleType handle, BOOL fixed)
90     {
91         CONTRACTL
92         {
93             THROWS;
94             GC_NOTRIGGER;
95         }
96         CONTRACTL_END;
97
98         const LoadEntry *result = m_entries.LookupPtr(handle);
99
100         if (result != NULL)
101         {
102             if (fixed)
103                 ((LoadEntry*)result)->order = -1;
104             return;
105         }
106
107         LoadEntry   newEntry;
108
109         newEntry.handle = handle;
110         newEntry.order = fixed ? -1 : m_entries.GetCount();
111
112         m_entries.Add(newEntry);
113     }
114
115     void EmitLoadFixups(CORINFO_METHOD_HANDLE currentMethodHandle, ZapInfo * pZapInfo);
116 };
117
118 // Declare some specializations of EmitLoadFixups().
119 template<> void LoadTable<CORINFO_CLASS_HANDLE>::EmitLoadFixups(CORINFO_METHOD_HANDLE currentMethodHandle, ZapInfo * pZapInfo);
120 template<> void LoadTable<CORINFO_METHOD_HANDLE>::EmitLoadFixups(CORINFO_METHOD_HANDLE currentMethodHandle, ZapInfo * pZapInfo);
121
122
123 class ZapInfo
124     : public ICorJitInfo
125 {
126     friend class ZapImage;
127
128     // Owning ZapImage
129     ZapImage * m_pImage;
130
131     Zapper * m_zapper;
132     ICorDynamicInfo * m_pEEJitInfo;
133     ICorCompileInfo * m_pEECompileInfo;
134
135     // Current method being compiled; it is non-nil only for
136     // method defs whose IL is in this module and (for generic code)
137     // have <object> instantiation. It is also nil for IL_STUBs.
138     mdMethodDef                 m_currentMethodToken;
139     CORINFO_METHOD_HANDLE       m_currentMethodHandle;
140     CORINFO_METHOD_INFO         m_currentMethodInfo;
141
142     // m_currentMethodModule==m_hModule except for generic types/methods
143     // defined in another assembly but instantiated in the current assembly.
144     CORINFO_MODULE_HANDLE       m_currentMethodModule;
145
146     unsigned                    m_currentMethodProfilingDataFlags;
147
148     // Debug information reported by the JIT compiler for the current method
149     ICorDebugInfo::NativeVarInfo *m_pNativeVarInfo;
150     ULONG32                     m_iNativeVarInfo;
151     ICorDebugInfo::OffsetMapping *m_pOffsetMapping;
152     ULONG32                     m_iOffsetMapping;
153
154     BYTE *                      m_pGCInfo;
155     SIZE_T                      m_cbGCInfo;
156
157
158     ZapBlobWithRelocs *         m_pCode;
159     ZapBlobWithRelocs *         m_pColdCode;
160     ZapBlobWithRelocs *         m_pROData;
161
162 #ifdef WIN64EXCEPTIONS
163     // Unwind info of the main method body. It will get merged with GC info.
164     BYTE *                      m_pMainUnwindInfo;
165     ULONG                       m_cbMainUnwindInfo;
166
167     ZapUnwindInfo *             m_pUnwindInfo;
168     ZapUnwindInfo *             m_pUnwindInfoFragments;
169 #if defined(_TARGET_AMD64_)
170     ZapUnwindInfo *             m_pChainedColdUnwindInfo;
171 #endif
172 #endif // WIN64EXCEPTIONS
173
174     ZapExceptionInfo *          m_pExceptionInfo;
175
176     ZapBlobWithRelocs *         m_pProfileData;
177
178     ZapImport *                 m_pProfilingHandle;
179
180     struct CodeRelocation : ZapReloc
181     {
182         ZapBlobWithRelocs * m_pNode;
183     };
184
185     SArray<CodeRelocation>   m_CodeRelocations;
186
187     static int __cdecl CompareCodeRelocation(const void * a, const void * b);
188
189     struct ImportEntry
190     {
191         ZapImport * pImport;
192         bool fConditional; // Conditional imports are emitted only if they are actually referenced by the code.
193     };
194
195     class ImportTraits : public NoRemoveSHashTraits< DefaultSHashTraits<ImportEntry> >
196     {
197     public:
198         typedef ZapImport * key_t;
199
200         static key_t GetKey(element_t e)
201         { 
202             LIMITED_METHOD_CONTRACT;
203             return e.pImport;
204         }
205         static BOOL Equals(key_t k1, key_t k2) 
206         { 
207             LIMITED_METHOD_CONTRACT;
208             return k1 == k2;
209         }
210         static count_t Hash(key_t k) 
211         {
212             LIMITED_METHOD_CONTRACT;
213             return (count_t)(size_t)k;
214         }
215
216         static const element_t Null() { LIMITED_METHOD_CONTRACT; ImportEntry e; e.pImport = NULL; return e; }
217         static bool IsNull(const element_t &e) { LIMITED_METHOD_CONTRACT; return e.pImport == NULL; }
218     };
219
220     SHash<ImportTraits>         m_ImportSet;
221     SArray<ZapImport *>         m_Imports;
222
223     InlineSString<128>          m_currentMethodName;
224
225     // Cache to reduce the number of entries in CORCOMPILE_LOAD_TABLE if it
226     // is implied by some other fixup type
227     LoadTable<CORINFO_CLASS_HANDLE>  m_ClassLoadTable;
228     LoadTable<CORINFO_METHOD_HANDLE> m_MethodLoadTable;
229
230     CORJIT_FLAGS m_jitFlags;
231
232     void InitMethodName();
233
234     CORJIT_FLAGS ComputeJitFlags(CORINFO_METHOD_HANDLE handle);
235
236     ZapDebugInfo * EmitDebugInfo();
237     ZapGCInfo * EmitGCInfo();
238     ZapImport ** EmitFixupList();
239
240     void PublishCompiledMethod();
241
242     void EmitCodeRelocations();
243
244     void ProcessReferences();
245
246     BOOL CurrentMethodHasProfileData();
247
248     void embedGenericSignature(CORINFO_LOOKUP * pLookup);
249
250     PVOID embedDirectCall(CORINFO_METHOD_HANDLE ftn, 
251                           CORINFO_ACCESS_FLAGS accessFlags,
252                           BOOL fAllowThunk);
253
254 public:
255     ZapInfo(ZapImage * pImage, mdMethodDef md, CORINFO_METHOD_HANDLE handle, CORINFO_MODULE_HANDLE module, unsigned methodProfilingDataFlags);
256     ~ZapInfo();
257
258 #ifdef ALLOW_SXS_JIT_NGEN
259     void ResetForJitRetry();
260 #endif // ALLOW_SXS_JIT_NGEN
261
262     void CompileMethod();
263
264     void AppendImport(ZapImport * pImport);
265     void AppendConditionalImport(ZapImport * pImport);
266
267     ULONG GetNumFixups();
268
269     // ICorJitInfo
270
271     IEEMemoryManager* getMemoryManager();
272
273     virtual void allocMem (
274             ULONG               hotCodeSize,    /* IN */
275             ULONG               coldCodeSize,   /* IN */
276             ULONG               roDataSize,     /* IN */
277             ULONG               xcptnsCount,    /* IN */
278             CorJitAllocMemFlag  flag,           /* IN */
279             void **             hotCodeBlock,   /* OUT */
280             void **             coldCodeBlock,  /* OUT */
281             void **             roDataBlock     /* OUT */
282             );
283
284     void    reserveUnwindInfo(
285             BOOL isFunclet,               /* IN */
286             BOOL isColdCode,              /* IN */
287             ULONG unwindSize              /* IN */
288             );
289
290     void    allocUnwindInfo (
291             BYTE * pHotCode,              /* IN */
292             BYTE * pColdCode,             /* IN */
293             ULONG  startOffset,           /* IN */
294             ULONG  endOffset,             /* IN */
295             ULONG  unwindSize,            /* IN */
296             BYTE * pUnwindBlock,          /* IN */
297             CorJitFuncKind funcKind       /* IN */
298             );
299
300     void * allocGCInfo(size_t size);
301     void yieldExecution();
302     void setEHcount(unsigned cEH);
303     void setEHinfo(unsigned EHnumber, const CORINFO_EH_CLAUSE *clause);
304
305     int  canHandleException(struct _EXCEPTION_POINTERS *pExceptionPointers);
306     BOOL logMsg(unsigned level,  const char *fmt, va_list args);
307     int  doAssert(const char* szFile, int iLine, const char* szExpr);
308     void reportFatalError(CorJitResult result);
309
310     HRESULT allocBBProfileBuffer (
311             ULONG cBlock,
312             ICorJitInfo::ProfileBuffer ** ppBlock);
313
314     HRESULT getBBProfileData (
315             CORINFO_METHOD_HANDLE ftnHnd,
316             ULONG * size,
317             ICorJitInfo::ProfileBuffer ** profileBuffer,
318             ULONG * numRuns);
319
320     DWORD getJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes);
321
322     bool runWithErrorTrap(void (*function)(void*), void* param);
323
324     // ICorDynamicInfo
325
326     DWORD getThreadTLSIndex(void **ppIndirection);
327     const void * getInlinedCallFrameVptr(void **ppIndirection);
328     LONG * getAddrOfCaptureThreadGlobal(void **ppIndirection);
329
330     // get slow lazy string literal helper to use (CORINFO_HELP_STRCNS*). 
331     // Returns CORINFO_HELP_UNDEF if lazy string literal helper cannot be used.
332     CorInfoHelpFunc getLazyStringLiteralHelper(CORINFO_MODULE_HANDLE handle);
333
334     CORINFO_MODULE_HANDLE
335       embedModuleHandle(CORINFO_MODULE_HANDLE handle,
336                         void **ppIndirection);
337     CORINFO_CLASS_HANDLE
338       embedClassHandle(CORINFO_CLASS_HANDLE handle,
339                        void **ppIndirection);
340     CORINFO_FIELD_HANDLE
341       embedFieldHandle(CORINFO_FIELD_HANDLE handle,
342                        void **ppIndirection);
343     CORINFO_METHOD_HANDLE
344       embedMethodHandle(CORINFO_METHOD_HANDLE handle,
345                         void **ppIndirection);
346     void
347       embedGenericHandle(CORINFO_RESOLVED_TOKEN * pResolvedToken,
348                          BOOL                     fEmbedParent,
349                          CORINFO_GENERICHANDLE_RESULT *pResult);
350
351     CORINFO_LOOKUP_KIND
352         getLocationOfThisType(CORINFO_METHOD_HANDLE context);
353
354
355
356     void * getHelperFtn (CorInfoHelpFunc   ftnNum,
357                                   void**            ppIndirection);
358
359     void* getTailCallCopyArgsThunk (
360                       CORINFO_SIG_INFO       *pSig,
361                       CorInfoHelperTailCallSpecialHandling flags);
362
363     void getFunctionEntryPoint(
364                       CORINFO_METHOD_HANDLE   ftn,                 /* IN  */
365                       CORINFO_CONST_LOOKUP *  pResult,             /* OUT */
366                       CORINFO_ACCESS_FLAGS    accessFlags = CORINFO_ACCESS_ANY);
367
368     void getFunctionFixedEntryPoint(
369                       CORINFO_METHOD_HANDLE   ftn,
370                       CORINFO_CONST_LOOKUP *  pResult);
371
372
373     void * getMethodSync(CORINFO_METHOD_HANDLE ftn,
374                          void **ppIndirection);
375     void * getPInvokeUnmanagedTarget(CORINFO_METHOD_HANDLE method,
376                                      void **ppIndirection);
377     void * getAddressOfPInvokeFixup(CORINFO_METHOD_HANDLE method,
378                                     void **ppIndirection);
379     void getAddressOfPInvokeTarget(CORINFO_METHOD_HANDLE method,
380                                    CORINFO_CONST_LOOKUP *pLookup);
381     CORINFO_JUST_MY_CODE_HANDLE getJustMyCodeHandle(
382                         CORINFO_METHOD_HANDLE method,
383                         CORINFO_JUST_MY_CODE_HANDLE **ppIndirection);
384
385     ZapImport * GetProfilingHandleImport();
386
387     void GetProfilingHandle(
388                     BOOL                      *pbHookFunction,
389                     void                     **pProfilerHandle,
390                     BOOL                      *pbIndirectedHandles
391                     );
392
393     void getCallInfo(
394                         // Token info
395                         CORINFO_RESOLVED_TOKEN * pResolvedToken,
396                         //Generics info
397                         CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken,
398                         //Security info
399                         CORINFO_METHOD_HANDLE   callerHandle,
400                         //Jit info
401                         CORINFO_CALLINFO_FLAGS  flags,
402                         //out params
403                         CORINFO_CALL_INFO       *pResult);
404
405     BOOL canAccessFamily(CORINFO_METHOD_HANDLE hCaller,
406                                    CORINFO_CLASS_HANDLE hInstanceType);
407
408
409     BOOL isRIDClassDomainID(CORINFO_CLASS_HANDLE cls);
410
411     unsigned getClassDomainID(CORINFO_CLASS_HANDLE cls,
412                                         void **ppIndirection);
413
414     void * getFieldAddress(CORINFO_FIELD_HANDLE field,
415                                     void **ppIndirection);
416     DWORD getFieldThreadLocalStoreID (CORINFO_FIELD_HANDLE field,
417                                                 void **ppIndirection);
418     CORINFO_VARARGS_HANDLE getVarArgsHandle(CORINFO_SIG_INFO *sig,
419                                                       void **ppIndirection);
420     bool canGetVarArgsHandle(CORINFO_SIG_INFO *sig);
421
422     InfoAccessType constructStringLiteral(CORINFO_MODULE_HANDLE module,
423                                             unsigned metaTok, void **ppIndirection);
424
425     InfoAccessType emptyStringLiteral(void **ppIndirection);
426
427     void setOverride(ICorDynamicInfo *pOverride, CORINFO_METHOD_HANDLE currentMethod);
428
429     void addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo);
430
431     void recordCallSite(ULONG instrOffset, CORINFO_SIG_INFO *callSig, CORINFO_METHOD_HANDLE methodHandle);
432
433     // Relocations
434
435     void recordRelocation(void *location, void *target,
436                                     WORD fRelocType, WORD slotNum, INT32 addlDelta);
437
438     WORD getRelocTypeHint(void * target);
439
440     void getModuleNativeEntryPointRange(void** pStart, void** pEnd);
441
442     DWORD getExpectedTargetArchitecture();
443
444     // ICorJitInfo delegate ctor optimization
445     CORINFO_METHOD_HANDLE GetDelegateCtor(
446                             CORINFO_METHOD_HANDLE   methHnd,
447                             CORINFO_CLASS_HANDLE    clsHnd,
448                             CORINFO_METHOD_HANDLE   targetMethodHnd,
449                             DelegateCtorArgs *      pCtorData);
450
451     void MethodCompileComplete(
452                 CORINFO_METHOD_HANDLE methHnd);
453
454     // ICorStaticInfo
455
456     void getEEInfo(CORINFO_EE_INFO *pEEInfoOut);
457
458     LPCWSTR getJitTimeLogFilename();
459
460     // ICorArgInfo
461
462     CORINFO_ARG_LIST_HANDLE getArgNext(CORINFO_ARG_LIST_HANDLE args);
463     CorInfoTypeWithMod getArgType(CORINFO_SIG_INFO* sig,
464                                      CORINFO_ARG_LIST_HANDLE args,
465                                      CORINFO_CLASS_HANDLE *vcTypeRet);
466     CORINFO_CLASS_HANDLE getArgClass(CORINFO_SIG_INFO* sig,
467                                                CORINFO_ARG_LIST_HANDLE args);
468     CorInfoType getHFAType(CORINFO_CLASS_HANDLE hClass);
469
470     // ICorDebugInfo
471
472     void getBoundaries(CORINFO_METHOD_HANDLE ftn, unsigned int *cILOffsets,
473                        DWORD **pILOffsets, ICorDebugInfo::BoundaryTypes *implicitBoundaries);
474     void setBoundaries(CORINFO_METHOD_HANDLE ftn, ULONG32 cMap,
475                        ICorDebugInfo::OffsetMapping *pMap);
476     void getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars,
477                  ICorDebugInfo::ILVarInfo **vars, bool *extendOthers);
478     void setVars(CORINFO_METHOD_HANDLE ftn, ULONG32 cVars,
479                  ICorDebugInfo::NativeVarInfo*vars);
480     void * allocateArray(ULONG cBytes);
481     void freeArray(void *array);
482
483     // ICorFieldInfo
484
485     const char* getFieldName(CORINFO_FIELD_HANDLE ftn, const char **moduleName);
486     CORINFO_CLASS_HANDLE getFieldClass(CORINFO_FIELD_HANDLE field);
487
488     CorInfoType getFieldType(CORINFO_FIELD_HANDLE field,
489                                        CORINFO_CLASS_HANDLE *structType,
490                                        CORINFO_CLASS_HANDLE memberParent);
491
492     unsigned getFieldOffset(CORINFO_FIELD_HANDLE field);
493
494     bool isWriteBarrierHelperRequired(
495                         CORINFO_FIELD_HANDLE    field);
496
497     void getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken,
498                        CORINFO_METHOD_HANDLE  callerHandle,
499                        CORINFO_ACCESS_FLAGS   flags,
500                        CORINFO_FIELD_INFO    *pResult);
501
502     bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd);
503
504     // ICorClassInfo
505
506     CorInfoType asCorInfoType(CORINFO_CLASS_HANDLE cls);
507     const char* getClassName(CORINFO_CLASS_HANDLE cls);
508     const char* getHelperName(CorInfoHelpFunc ftnNum);
509     int appendClassName(__deref_inout_ecount(*pnBufLen) WCHAR** ppBuf, int* pnBufLen,
510                                   CORINFO_CLASS_HANDLE    cls,
511                                   BOOL fNamespace,
512                                   BOOL fFullInst,
513                                   BOOL fAssembly);
514     BOOL isValueClass(CORINFO_CLASS_HANDLE clsHnd);
515     BOOL canInlineTypeCheckWithObjectVTable(CORINFO_CLASS_HANDLE clsHnd);
516     DWORD getClassAttribs(CORINFO_CLASS_HANDLE cls);
517     BOOL isStructRequiringStackAllocRetBuf(CORINFO_CLASS_HANDLE cls);
518     CORINFO_MODULE_HANDLE getClassModule(CORINFO_CLASS_HANDLE cls);
519     CORINFO_ASSEMBLY_HANDLE getModuleAssembly(CORINFO_MODULE_HANDLE mod);
520     const char* getAssemblyName(CORINFO_ASSEMBLY_HANDLE assem);
521     void* LongLifetimeMalloc(size_t sz);
522     void LongLifetimeFree(void* obj);
523     size_t getClassModuleIdForStatics(CORINFO_CLASS_HANDLE cls, CORINFO_MODULE_HANDLE *pModule, void **ppIndirection);
524
525     unsigned getClassSize(CORINFO_CLASS_HANDLE cls);
526     unsigned getClassAlignmentRequirement(CORINFO_CLASS_HANDLE cls, BOOL fDoubleAlignHint);
527
528     CORINFO_FIELD_HANDLE getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num);
529
530     mdMethodDef getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod);
531     BOOL checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, BOOL fOptional);
532
533     unsigned getClassGClayout(CORINFO_CLASS_HANDLE cls, BYTE *gcPtrs);
534
535     bool getSystemVAmd64PassStructInRegisterDescriptor(
536         /*IN*/  CORINFO_CLASS_HANDLE _structHnd,
537         /*OUT*/ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr);
538
539     unsigned getClassNumInstanceFields(CORINFO_CLASS_HANDLE cls);
540
541     CorInfoHelpFunc getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle);
542     CorInfoHelpFunc getCastingHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, bool fThrowing);
543     CorInfoHelpFunc getNewArrHelper(CORINFO_CLASS_HANDLE arrayCls);
544     CorInfoHelpFunc getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd);
545     CorInfoHelpFunc getSecurityPrologHelper(CORINFO_METHOD_HANDLE ftn);
546     CORINFO_CLASS_HANDLE getTypeForBox(CORINFO_CLASS_HANDLE  cls);
547     CorInfoHelpFunc getBoxHelper(CORINFO_CLASS_HANDLE cls);
548     CorInfoHelpFunc getUnBoxHelper(CORINFO_CLASS_HANDLE cls);
549
550     bool getReadyToRunHelper(
551             CORINFO_RESOLVED_TOKEN *        pResolvedToken,
552             CORINFO_LOOKUP_KIND *           pGenericLookupKind,
553             CorInfoHelpFunc                 id,
554             CORINFO_CONST_LOOKUP *          pLookup
555             );
556
557     void getReadyToRunDelegateCtorHelper(
558             CORINFO_RESOLVED_TOKEN * pTargetMethod,
559             CORINFO_CLASS_HANDLE     delegateType,
560             CORINFO_LOOKUP *   pLookup
561             );
562
563     CorInfoInitClassResult initClass(
564             CORINFO_FIELD_HANDLE    field,
565             CORINFO_METHOD_HANDLE   method,
566             CORINFO_CONTEXT_HANDLE  context,
567             BOOL                    speculative = FALSE);
568
569     void classMustBeLoadedBeforeCodeIsRun(CORINFO_CLASS_HANDLE cls);
570     void methodMustBeLoadedBeforeCodeIsRun(CORINFO_METHOD_HANDLE meth);
571     CORINFO_METHOD_HANDLE mapMethodDeclToMethodImpl(CORINFO_METHOD_HANDLE methHnd);
572     CORINFO_CLASS_HANDLE getBuiltinClass(CorInfoClassId classId);
573     CorInfoType getTypeForPrimitiveValueClass(CORINFO_CLASS_HANDLE cls);
574     BOOL canCast(CORINFO_CLASS_HANDLE child, CORINFO_CLASS_HANDLE parent);
575     BOOL areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
576     CORINFO_CLASS_HANDLE mergeClasses(CORINFO_CLASS_HANDLE cls1,
577                                 CORINFO_CLASS_HANDLE cls2);
578     BOOL shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope);
579     CORINFO_CLASS_HANDLE getParentType(CORINFO_CLASS_HANDLE  cls);
580     CorInfoType getChildType (CORINFO_CLASS_HANDLE       clsHnd,
581                               CORINFO_CLASS_HANDLE       *clsRet);
582     BOOL satisfiesClassConstraints(CORINFO_CLASS_HANDLE cls);
583
584     BOOL     isSDArray   (CORINFO_CLASS_HANDLE  cls);
585     unsigned getArrayRank(CORINFO_CLASS_HANDLE  cls);
586     void * getArrayInitializationData(CORINFO_FIELD_HANDLE field, DWORD size);
587     CorInfoIsAccessAllowedResult canAccessClass(CORINFO_RESOLVED_TOKEN * pResolvedToken,
588                                                 CORINFO_METHOD_HANDLE   callerHandle,
589                                                 CORINFO_HELPER_DESC    *throwHelper);
590
591     // ICorModuleInfo
592
593     void resolveToken(CORINFO_RESOLVED_TOKEN * pResolvedToken);
594     bool tryResolveToken(CORINFO_RESOLVED_TOKEN * pResolvedToken);
595
596     void findSig(CORINFO_MODULE_HANDLE module, unsigned sigTOK,
597                  CORINFO_CONTEXT_HANDLE context,
598                  CORINFO_SIG_INFO *sig);
599     void findCallSiteSig(CORINFO_MODULE_HANDLE module,
600                                    unsigned methTOK,
601                                    CORINFO_CONTEXT_HANDLE context,
602                                    CORINFO_SIG_INFO *sig);
603     CORINFO_CLASS_HANDLE getTokenTypeAsHandle(CORINFO_RESOLVED_TOKEN * pResolvedToken);
604     size_t findNameOfToken(CORINFO_MODULE_HANDLE module,
605                            unsigned metaTOK,
606                            __out_ecount (FQNameCapacity) char * szFQName,
607                            size_t FQNameCapacity);
608     CorInfoCanSkipVerificationResult canSkipVerification (CORINFO_MODULE_HANDLE module);
609     BOOL isValidToken(CORINFO_MODULE_HANDLE module,
610                       unsigned metaTOK);
611     BOOL isValidStringRef(CORINFO_MODULE_HANDLE module,
612                           unsigned metaTOK);
613
614
615     // ICorMethodInfo
616
617     const char* getMethodName(CORINFO_METHOD_HANDLE ftn,
618                                         const char **moduleName);
619     unsigned getMethodHash(CORINFO_METHOD_HANDLE ftn);
620     DWORD getMethodAttribs(CORINFO_METHOD_HANDLE ftn);
621     void setMethodAttribs(CORINFO_METHOD_HANDLE ftn, CorInfoMethodRuntimeFlags attribs);
622
623     void getMethodSig(CORINFO_METHOD_HANDLE ftn, CORINFO_SIG_INFO *sig, CORINFO_CLASS_HANDLE memberParent);
624
625     bool getMethodInfo(CORINFO_METHOD_HANDLE ftn,
626                        CORINFO_METHOD_INFO* info);
627
628     CorInfoInline canInline(CORINFO_METHOD_HANDLE caller,
629                             CORINFO_METHOD_HANDLE callee,
630                             DWORD*                pRestrictions);
631
632     void reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd,
633                                  CORINFO_METHOD_HANDLE inlineeHnd,
634                                  CorInfoInline inlineResult,
635                                  const char * reason);
636
637     CorInfoInstantiationVerification isInstantiationOfVerifiedGeneric(
638             CORINFO_METHOD_HANDLE   method);
639
640     void initConstraintsForVerification(CORINFO_METHOD_HANDLE method,
641                                         BOOL *pfHasCircularClassConstraints,
642                                         BOOL *pfHasCircularMethodConstraints);
643
644     bool canTailCall(CORINFO_METHOD_HANDLE caller,
645                      CORINFO_METHOD_HANDLE declaredCallee,
646                      CORINFO_METHOD_HANDLE exactCallee,
647                      bool fIsTailPrefix);
648
649     void reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd,
650                                  CORINFO_METHOD_HANDLE calleeHnd,
651                                  bool fIsTailPrefix,
652                                  CorInfoTailCall tailCallResult,
653                                  const char * reason);
654
655     CorInfoCanSkipVerificationResult canSkipMethodVerification (
656             CORINFO_METHOD_HANDLE   callerHnd);
657     
658     void getEHinfo(CORINFO_METHOD_HANDLE ftn,
659                              unsigned EHnumber, CORINFO_EH_CLAUSE* clause);
660     CORINFO_CLASS_HANDLE getMethodClass(CORINFO_METHOD_HANDLE method);
661     CORINFO_MODULE_HANDLE getMethodModule(CORINFO_METHOD_HANDLE method);
662
663     void getMethodVTableOffset(CORINFO_METHOD_HANDLE method,
664                                unsigned * pOffsetOfIndirection,
665                                unsigned * pOffsetAfterIndirection);
666
667     CORINFO_METHOD_HANDLE resolveVirtualMethod(
668         CORINFO_METHOD_HANDLE virtualMethod,
669         CORINFO_CLASS_HANDLE implementingClass,
670         CORINFO_CONTEXT_HANDLE ownerType
671         );
672
673     void expandRawHandleIntrinsic(
674         CORINFO_RESOLVED_TOKEN *        pResolvedToken,
675         CORINFO_GENERICHANDLE_RESULT *  pResult);
676
677     CorInfoIntrinsics getIntrinsicID(CORINFO_METHOD_HANDLE method,
678                                      bool * pMustExpand = NULL);
679     bool isInSIMDModule(CORINFO_CLASS_HANDLE classHnd);
680     CorInfoUnmanagedCallConv getUnmanagedCallConv(CORINFO_METHOD_HANDLE method);
681     BOOL pInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SIG_INFO* sig);
682     LPVOID GetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig,
683                                        void ** ppIndirecton);
684     bool canGetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig);
685     BOOL satisfiesMethodConstraints(CORINFO_CLASS_HANDLE parent,
686                                               CORINFO_METHOD_HANDLE method);
687
688     BOOL isCompatibleDelegate(CORINFO_CLASS_HANDLE objCls,
689                               CORINFO_CLASS_HANDLE methodParentCls,
690                               CORINFO_METHOD_HANDLE method,
691                               CORINFO_CLASS_HANDLE delegateCls,
692                               BOOL* pfIsOpenDelegate);
693
694     void getGSCookie(GSCookie * pCookieVal, 
695                      GSCookie** ppCookieVal);
696     // ICorErrorInfo
697
698     HRESULT GetErrorHRESULT(struct _EXCEPTION_POINTERS *pExceptionPointers);
699     ULONG GetErrorMessage(__in_ecount(bufferLength) LPWSTR buffer, ULONG bufferLength);
700     int FilterException(struct _EXCEPTION_POINTERS *pExceptionPointers);
701     void HandleException(struct _EXCEPTION_POINTERS *pExceptionPointers);
702     void ThrowExceptionForJitResult(HRESULT result);
703     void ThrowExceptionForHelper(const CORINFO_HELPER_DESC * throwHelper);
704 };
705
706 #endif // __ZAPINFO_H__