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.
9 // JIT-EE interface for zapping
11 // ======================================================================================
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.
28 template <typename HandleType>
37 int order; // -1 = fixed
40 static int __cdecl LoadEntryCmp(const void* a_, const void* b_)
42 return ((LoadEntry*)a_)->order - ((LoadEntry*)b_)->order;
45 class LoadEntryTraits : public NoRemoveSHashTraits< DefaultSHashTraits<LoadEntry> >
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;
52 static key_t GetKey(element_t e)
54 LIMITED_METHOD_CONTRACT;
57 static BOOL Equals(key_t k1, key_t k2)
59 LIMITED_METHOD_CONTRACT;
62 static count_t Hash(key_t k)
64 LIMITED_METHOD_CONTRACT;
65 return (count_t)(size_t)k;
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); }
72 typedef SHash<LoadEntryTraits> LoadEntryHashTable;
74 LoadEntryHashTable m_entries;
77 LoadTable(ZapImage *pModule)
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'
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.
89 void Load(HandleType handle, BOOL fixed)
98 const LoadEntry *result = m_entries.LookupPtr(handle);
103 ((LoadEntry*)result)->order = -1;
109 newEntry.handle = handle;
110 newEntry.order = fixed ? -1 : m_entries.GetCount();
112 m_entries.Add(newEntry);
115 void EmitLoadFixups(CORINFO_METHOD_HANDLE currentMethodHandle, ZapInfo * pZapInfo);
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);
126 friend class ZapImage;
132 ICorDynamicInfo * m_pEEJitInfo;
133 ICorCompileInfo * m_pEECompileInfo;
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;
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;
146 unsigned m_currentMethodProfilingDataFlags;
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;
158 ZapBlobWithRelocs * m_pCode;
159 ZapBlobWithRelocs * m_pColdCode;
160 ZapBlobWithRelocs * m_pROData;
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;
167 ZapUnwindInfo * m_pUnwindInfo;
168 ZapUnwindInfo * m_pUnwindInfoFragments;
169 #if defined(_TARGET_AMD64_)
170 ZapUnwindInfo * m_pChainedColdUnwindInfo;
172 #endif // WIN64EXCEPTIONS
174 ZapExceptionInfo * m_pExceptionInfo;
176 ZapBlobWithRelocs * m_pProfileData;
178 ZapImport * m_pProfilingHandle;
180 struct CodeRelocation : ZapReloc
182 ZapBlobWithRelocs * m_pNode;
185 SArray<CodeRelocation> m_CodeRelocations;
187 static int __cdecl CompareCodeRelocation(const void * a, const void * b);
192 bool fConditional; // Conditional imports are emitted only if they are actually referenced by the code.
195 class ImportTraits : public NoRemoveSHashTraits< DefaultSHashTraits<ImportEntry> >
198 typedef ZapImport * key_t;
200 static key_t GetKey(element_t e)
202 LIMITED_METHOD_CONTRACT;
205 static BOOL Equals(key_t k1, key_t k2)
207 LIMITED_METHOD_CONTRACT;
210 static count_t Hash(key_t k)
212 LIMITED_METHOD_CONTRACT;
213 return (count_t)(size_t)k;
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; }
220 SHash<ImportTraits> m_ImportSet;
221 SArray<ZapImport *> m_Imports;
223 InlineSString<128> m_currentMethodName;
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;
230 CORJIT_FLAGS m_jitFlags;
232 void InitMethodName();
234 CORJIT_FLAGS ComputeJitFlags(CORINFO_METHOD_HANDLE handle);
236 ZapDebugInfo * EmitDebugInfo();
237 ZapGCInfo * EmitGCInfo();
238 ZapImport ** EmitFixupList();
240 void PublishCompiledMethod();
242 void EmitCodeRelocations();
244 void ProcessReferences();
246 BOOL CurrentMethodHasProfileData();
248 void embedGenericSignature(CORINFO_LOOKUP * pLookup);
250 PVOID embedDirectCall(CORINFO_METHOD_HANDLE ftn,
251 CORINFO_ACCESS_FLAGS accessFlags,
255 ZapInfo(ZapImage * pImage, mdMethodDef md, CORINFO_METHOD_HANDLE handle, CORINFO_MODULE_HANDLE module, unsigned methodProfilingDataFlags);
258 #ifdef ALLOW_SXS_JIT_NGEN
259 void ResetForJitRetry();
260 #endif // ALLOW_SXS_JIT_NGEN
262 void CompileMethod();
264 void AppendImport(ZapImport * pImport);
265 void AppendConditionalImport(ZapImport * pImport);
267 ULONG GetNumFixups();
271 IEEMemoryManager* getMemoryManager();
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 */
284 void reserveUnwindInfo(
285 BOOL isFunclet, /* IN */
286 BOOL isColdCode, /* IN */
287 ULONG unwindSize /* IN */
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 */
300 void * allocGCInfo(size_t size);
301 void yieldExecution();
302 void setEHcount(unsigned cEH);
303 void setEHinfo(unsigned EHnumber, const CORINFO_EH_CLAUSE *clause);
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);
310 HRESULT allocBBProfileBuffer (
312 ICorJitInfo::ProfileBuffer ** ppBlock);
314 HRESULT getBBProfileData (
315 CORINFO_METHOD_HANDLE ftnHnd,
317 ICorJitInfo::ProfileBuffer ** profileBuffer,
320 DWORD getJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes);
322 bool runWithErrorTrap(void (*function)(void*), void* param);
326 DWORD getThreadTLSIndex(void **ppIndirection);
327 const void * getInlinedCallFrameVptr(void **ppIndirection);
328 LONG * getAddrOfCaptureThreadGlobal(void **ppIndirection);
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);
334 CORINFO_MODULE_HANDLE
335 embedModuleHandle(CORINFO_MODULE_HANDLE handle,
336 void **ppIndirection);
338 embedClassHandle(CORINFO_CLASS_HANDLE handle,
339 void **ppIndirection);
341 embedFieldHandle(CORINFO_FIELD_HANDLE handle,
342 void **ppIndirection);
343 CORINFO_METHOD_HANDLE
344 embedMethodHandle(CORINFO_METHOD_HANDLE handle,
345 void **ppIndirection);
347 embedGenericHandle(CORINFO_RESOLVED_TOKEN * pResolvedToken,
349 CORINFO_GENERICHANDLE_RESULT *pResult);
352 getLocationOfThisType(CORINFO_METHOD_HANDLE context);
356 void * getHelperFtn (CorInfoHelpFunc ftnNum,
357 void** ppIndirection);
359 void* getTailCallCopyArgsThunk (
360 CORINFO_SIG_INFO *pSig,
361 CorInfoHelperTailCallSpecialHandling flags);
363 void getFunctionEntryPoint(
364 CORINFO_METHOD_HANDLE ftn, /* IN */
365 CORINFO_CONST_LOOKUP * pResult, /* OUT */
366 CORINFO_ACCESS_FLAGS accessFlags = CORINFO_ACCESS_ANY);
368 void getFunctionFixedEntryPoint(
369 CORINFO_METHOD_HANDLE ftn,
370 CORINFO_CONST_LOOKUP * pResult);
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);
385 ZapImport * GetProfilingHandleImport();
387 void GetProfilingHandle(
388 BOOL *pbHookFunction,
389 void **pProfilerHandle,
390 BOOL *pbIndirectedHandles
395 CORINFO_RESOLVED_TOKEN * pResolvedToken,
397 CORINFO_RESOLVED_TOKEN * pConstrainedResolvedToken,
399 CORINFO_METHOD_HANDLE callerHandle,
401 CORINFO_CALLINFO_FLAGS flags,
403 CORINFO_CALL_INFO *pResult);
405 BOOL canAccessFamily(CORINFO_METHOD_HANDLE hCaller,
406 CORINFO_CLASS_HANDLE hInstanceType);
409 BOOL isRIDClassDomainID(CORINFO_CLASS_HANDLE cls);
411 unsigned getClassDomainID(CORINFO_CLASS_HANDLE cls,
412 void **ppIndirection);
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);
422 InfoAccessType constructStringLiteral(CORINFO_MODULE_HANDLE module,
423 unsigned metaTok, void **ppIndirection);
425 InfoAccessType emptyStringLiteral(void **ppIndirection);
427 void setOverride(ICorDynamicInfo *pOverride, CORINFO_METHOD_HANDLE currentMethod);
429 void addActiveDependency(CORINFO_MODULE_HANDLE moduleFrom, CORINFO_MODULE_HANDLE moduleTo);
431 void recordCallSite(ULONG instrOffset, CORINFO_SIG_INFO *callSig, CORINFO_METHOD_HANDLE methodHandle);
435 void recordRelocation(void *location, void *target,
436 WORD fRelocType, WORD slotNum, INT32 addlDelta);
438 WORD getRelocTypeHint(void * target);
440 void getModuleNativeEntryPointRange(void** pStart, void** pEnd);
442 DWORD getExpectedTargetArchitecture();
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);
451 void MethodCompileComplete(
452 CORINFO_METHOD_HANDLE methHnd);
456 void getEEInfo(CORINFO_EE_INFO *pEEInfoOut);
458 LPCWSTR getJitTimeLogFilename();
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);
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);
485 const char* getFieldName(CORINFO_FIELD_HANDLE ftn, const char **moduleName);
486 CORINFO_CLASS_HANDLE getFieldClass(CORINFO_FIELD_HANDLE field);
488 CorInfoType getFieldType(CORINFO_FIELD_HANDLE field,
489 CORINFO_CLASS_HANDLE *structType,
490 CORINFO_CLASS_HANDLE memberParent);
492 unsigned getFieldOffset(CORINFO_FIELD_HANDLE field);
494 bool isWriteBarrierHelperRequired(
495 CORINFO_FIELD_HANDLE field);
497 void getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken,
498 CORINFO_METHOD_HANDLE callerHandle,
499 CORINFO_ACCESS_FLAGS flags,
500 CORINFO_FIELD_INFO *pResult);
502 bool isFieldStatic(CORINFO_FIELD_HANDLE fldHnd);
506 CorInfoType asCorInfoType(CORINFO_CLASS_HANDLE cls);
507 const char* getClassName(CORINFO_CLASS_HANDLE cls);
508 const char* getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const char** namespaceName);
509 CORINFO_CLASS_HANDLE getTypeInstantiationArgument(CORINFO_CLASS_HANDLE cls, unsigned index);
510 const char* getHelperName(CorInfoHelpFunc ftnNum);
511 int appendClassName(__deref_inout_ecount(*pnBufLen) WCHAR** ppBuf, int* pnBufLen,
512 CORINFO_CLASS_HANDLE cls,
516 BOOL isValueClass(CORINFO_CLASS_HANDLE clsHnd);
517 BOOL canInlineTypeCheckWithObjectVTable(CORINFO_CLASS_HANDLE clsHnd);
518 DWORD getClassAttribs(CORINFO_CLASS_HANDLE cls);
519 BOOL isStructRequiringStackAllocRetBuf(CORINFO_CLASS_HANDLE cls);
520 CORINFO_MODULE_HANDLE getClassModule(CORINFO_CLASS_HANDLE cls);
521 CORINFO_ASSEMBLY_HANDLE getModuleAssembly(CORINFO_MODULE_HANDLE mod);
522 const char* getAssemblyName(CORINFO_ASSEMBLY_HANDLE assem);
523 void* LongLifetimeMalloc(size_t sz);
524 void LongLifetimeFree(void* obj);
525 size_t getClassModuleIdForStatics(CORINFO_CLASS_HANDLE cls, CORINFO_MODULE_HANDLE *pModule, void **ppIndirection);
527 unsigned getClassSize(CORINFO_CLASS_HANDLE cls);
528 unsigned getClassAlignmentRequirement(CORINFO_CLASS_HANDLE cls, BOOL fDoubleAlignHint);
530 CORINFO_FIELD_HANDLE getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num);
532 mdMethodDef getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod);
533 BOOL checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, LPCSTR modifier, BOOL fOptional);
535 unsigned getClassGClayout(CORINFO_CLASS_HANDLE cls, BYTE *gcPtrs);
537 bool getSystemVAmd64PassStructInRegisterDescriptor(
538 /*IN*/ CORINFO_CLASS_HANDLE _structHnd,
539 /*OUT*/ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr);
541 unsigned getClassNumInstanceFields(CORINFO_CLASS_HANDLE cls);
543 CorInfoHelpFunc getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle);
544 CorInfoHelpFunc getCastingHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, bool fThrowing);
545 CorInfoHelpFunc getNewArrHelper(CORINFO_CLASS_HANDLE arrayCls);
546 CorInfoHelpFunc getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd);
547 CorInfoHelpFunc getSecurityPrologHelper(CORINFO_METHOD_HANDLE ftn);
548 CORINFO_CLASS_HANDLE getTypeForBox(CORINFO_CLASS_HANDLE cls);
549 CorInfoHelpFunc getBoxHelper(CORINFO_CLASS_HANDLE cls);
550 CorInfoHelpFunc getUnBoxHelper(CORINFO_CLASS_HANDLE cls);
552 bool getReadyToRunHelper(
553 CORINFO_RESOLVED_TOKEN * pResolvedToken,
554 CORINFO_LOOKUP_KIND * pGenericLookupKind,
556 CORINFO_CONST_LOOKUP * pLookup
559 void getReadyToRunDelegateCtorHelper(
560 CORINFO_RESOLVED_TOKEN * pTargetMethod,
561 CORINFO_CLASS_HANDLE delegateType,
562 CORINFO_LOOKUP * pLookup
565 CorInfoInitClassResult initClass(
566 CORINFO_FIELD_HANDLE field,
567 CORINFO_METHOD_HANDLE method,
568 CORINFO_CONTEXT_HANDLE context,
569 BOOL speculative = FALSE);
571 void classMustBeLoadedBeforeCodeIsRun(CORINFO_CLASS_HANDLE cls);
572 void methodMustBeLoadedBeforeCodeIsRun(CORINFO_METHOD_HANDLE meth);
573 CORINFO_METHOD_HANDLE mapMethodDeclToMethodImpl(CORINFO_METHOD_HANDLE methHnd);
574 CORINFO_CLASS_HANDLE getBuiltinClass(CorInfoClassId classId);
575 CorInfoType getTypeForPrimitiveValueClass(CORINFO_CLASS_HANDLE cls);
576 CorInfoType getTypeForPrimitiveNumericClass(CORINFO_CLASS_HANDLE cls);
577 BOOL canCast(CORINFO_CLASS_HANDLE child, CORINFO_CLASS_HANDLE parent);
578 BOOL areTypesEquivalent(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
579 TypeCompareState compareTypesForCast(CORINFO_CLASS_HANDLE fromClass, CORINFO_CLASS_HANDLE toClass);
580 TypeCompareState compareTypesForEquality(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2);
582 CORINFO_CLASS_HANDLE mergeClasses(CORINFO_CLASS_HANDLE cls1,
583 CORINFO_CLASS_HANDLE cls2);
584 BOOL shouldEnforceCallvirtRestriction(CORINFO_MODULE_HANDLE scope);
585 CORINFO_CLASS_HANDLE getParentType(CORINFO_CLASS_HANDLE cls);
586 CorInfoType getChildType (CORINFO_CLASS_HANDLE clsHnd,
587 CORINFO_CLASS_HANDLE *clsRet);
588 BOOL satisfiesClassConstraints(CORINFO_CLASS_HANDLE cls);
590 BOOL isSDArray (CORINFO_CLASS_HANDLE cls);
591 unsigned getArrayRank(CORINFO_CLASS_HANDLE cls);
592 void * getArrayInitializationData(CORINFO_FIELD_HANDLE field, DWORD size);
593 CorInfoIsAccessAllowedResult canAccessClass(CORINFO_RESOLVED_TOKEN * pResolvedToken,
594 CORINFO_METHOD_HANDLE callerHandle,
595 CORINFO_HELPER_DESC *throwHelper);
599 void resolveToken(CORINFO_RESOLVED_TOKEN * pResolvedToken);
600 bool tryResolveToken(CORINFO_RESOLVED_TOKEN * pResolvedToken);
602 void findSig(CORINFO_MODULE_HANDLE module, unsigned sigTOK,
603 CORINFO_CONTEXT_HANDLE context,
604 CORINFO_SIG_INFO *sig);
605 void findCallSiteSig(CORINFO_MODULE_HANDLE module,
607 CORINFO_CONTEXT_HANDLE context,
608 CORINFO_SIG_INFO *sig);
609 CORINFO_CLASS_HANDLE getTokenTypeAsHandle(CORINFO_RESOLVED_TOKEN * pResolvedToken);
610 size_t findNameOfToken(CORINFO_MODULE_HANDLE module,
612 __out_ecount (FQNameCapacity) char * szFQName,
613 size_t FQNameCapacity);
614 CorInfoCanSkipVerificationResult canSkipVerification (CORINFO_MODULE_HANDLE module);
615 BOOL isValidToken(CORINFO_MODULE_HANDLE module,
617 BOOL isValidStringRef(CORINFO_MODULE_HANDLE module,
623 const char* getMethodName(CORINFO_METHOD_HANDLE ftn,
624 const char **moduleName);
625 const char* getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftn,
626 const char **className,
627 const char **namespaceName);
629 unsigned getMethodHash(CORINFO_METHOD_HANDLE ftn);
630 DWORD getMethodAttribs(CORINFO_METHOD_HANDLE ftn);
631 void setMethodAttribs(CORINFO_METHOD_HANDLE ftn, CorInfoMethodRuntimeFlags attribs);
633 void getMethodSig(CORINFO_METHOD_HANDLE ftn, CORINFO_SIG_INFO *sig, CORINFO_CLASS_HANDLE memberParent);
635 bool getMethodInfo(CORINFO_METHOD_HANDLE ftn,
636 CORINFO_METHOD_INFO* info);
638 CorInfoInline canInline(CORINFO_METHOD_HANDLE caller,
639 CORINFO_METHOD_HANDLE callee,
640 DWORD* pRestrictions);
642 void reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd,
643 CORINFO_METHOD_HANDLE inlineeHnd,
644 CorInfoInline inlineResult,
645 const char * reason);
647 CorInfoInstantiationVerification isInstantiationOfVerifiedGeneric(
648 CORINFO_METHOD_HANDLE method);
650 void initConstraintsForVerification(CORINFO_METHOD_HANDLE method,
651 BOOL *pfHasCircularClassConstraints,
652 BOOL *pfHasCircularMethodConstraints);
654 bool canTailCall(CORINFO_METHOD_HANDLE caller,
655 CORINFO_METHOD_HANDLE declaredCallee,
656 CORINFO_METHOD_HANDLE exactCallee,
659 void reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd,
660 CORINFO_METHOD_HANDLE calleeHnd,
662 CorInfoTailCall tailCallResult,
663 const char * reason);
665 CorInfoCanSkipVerificationResult canSkipMethodVerification (
666 CORINFO_METHOD_HANDLE callerHnd);
668 void getEHinfo(CORINFO_METHOD_HANDLE ftn,
669 unsigned EHnumber, CORINFO_EH_CLAUSE* clause);
670 CORINFO_CLASS_HANDLE getMethodClass(CORINFO_METHOD_HANDLE method);
671 CORINFO_MODULE_HANDLE getMethodModule(CORINFO_METHOD_HANDLE method);
673 void getMethodVTableOffset(CORINFO_METHOD_HANDLE method,
674 unsigned * pOffsetOfIndirection,
675 unsigned * pOffsetAfterIndirection,
678 CORINFO_METHOD_HANDLE resolveVirtualMethod(
679 CORINFO_METHOD_HANDLE virtualMethod,
680 CORINFO_CLASS_HANDLE implementingClass,
681 CORINFO_CONTEXT_HANDLE ownerType);
683 CORINFO_METHOD_HANDLE getUnboxedEntry(
684 CORINFO_METHOD_HANDLE ftn,
685 bool* requiresInstMethodTableArg);
687 CORINFO_CLASS_HANDLE getDefaultEqualityComparerClass(
688 CORINFO_CLASS_HANDLE elemType);
690 void expandRawHandleIntrinsic(
691 CORINFO_RESOLVED_TOKEN * pResolvedToken,
692 CORINFO_GENERICHANDLE_RESULT * pResult);
694 CorInfoIntrinsics getIntrinsicID(CORINFO_METHOD_HANDLE method,
695 bool * pMustExpand = NULL);
696 bool isInSIMDModule(CORINFO_CLASS_HANDLE classHnd);
697 CorInfoUnmanagedCallConv getUnmanagedCallConv(CORINFO_METHOD_HANDLE method);
698 BOOL pInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SIG_INFO* sig);
699 LPVOID GetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig,
700 void ** ppIndirecton);
701 bool canGetCookieForPInvokeCalliSig(CORINFO_SIG_INFO* szMetaSig);
702 BOOL satisfiesMethodConstraints(CORINFO_CLASS_HANDLE parent,
703 CORINFO_METHOD_HANDLE method);
705 BOOL isCompatibleDelegate(CORINFO_CLASS_HANDLE objCls,
706 CORINFO_CLASS_HANDLE methodParentCls,
707 CORINFO_METHOD_HANDLE method,
708 CORINFO_CLASS_HANDLE delegateCls,
709 BOOL* pfIsOpenDelegate);
711 void getGSCookie(GSCookie * pCookieVal,
712 GSCookie** ppCookieVal);
715 HRESULT GetErrorHRESULT(struct _EXCEPTION_POINTERS *pExceptionPointers);
716 ULONG GetErrorMessage(__in_ecount(bufferLength) LPWSTR buffer, ULONG bufferLength);
717 int FilterException(struct _EXCEPTION_POINTERS *pExceptionPointers);
718 void HandleException(struct _EXCEPTION_POINTERS *pExceptionPointers);
719 void ThrowExceptionForJitResult(HRESULT result);
720 void ThrowExceptionForHelper(const CORINFO_HELPER_DESC * throwHelper);
723 #endif // __ZAPINFO_H__