summaryrefslogtreecommitdiff
path: root/src/vm/ilstubresolver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/ilstubresolver.h')
-rw-r--r--src/vm/ilstubresolver.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/vm/ilstubresolver.h b/src/vm/ilstubresolver.h
new file mode 100644
index 0000000000..b100931107
--- /dev/null
+++ b/src/vm/ilstubresolver.h
@@ -0,0 +1,125 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// File: ILStubResolver.h
+//
+
+//
+
+
+#ifndef __ILSTUBRESOLVER_H__
+#define __ILSTUBRESOLVER_H__
+
+#include "stubgen.h"
+class ILStubResolver : DynamicResolver
+{
+ friend class ILStubCache;
+ friend class ILStubLinker;
+
+public:
+
+ // -----------------------------------
+ // DynamicResolver interface methods
+ // -----------------------------------
+
+ void FreeCompileTimeState();
+ void GetJitContext(SecurityControlFlags* pSecurityControlFlags,
+ TypeHandle* pTypeOwner);
+ ChunkAllocator* GetJitMetaHeap();
+
+ BYTE* GetCodeInfo(unsigned* pCodeSize, unsigned* pStackSize, CorInfoOptions* pOptions, unsigned* pEHSize);
+ SigPointer GetLocalSig();
+
+ OBJECTHANDLE ConstructStringLiteral(mdToken metaTok);
+ BOOL IsValidStringRef(mdToken metaTok);
+ void ResolveToken(mdToken token, TypeHandle * pTH, MethodDesc ** ppMD, FieldDesc ** ppFD);
+ SigPointer ResolveSignature(mdToken token);
+ SigPointer ResolveSignatureForVarArg(mdToken token);
+ void GetEHInfo(unsigned EHnumber, CORINFO_EH_CLAUSE* clause);
+
+ static LPCUTF8 GetStubClassName(MethodDesc* pMD);
+ LPCUTF8 GetStubMethodName();
+
+ MethodDesc* GetDynamicMethod() { LIMITED_METHOD_CONTRACT; return m_pStubMD; }
+
+ // -----------------------------------
+ // ILStubResolver-specific methods
+ // -----------------------------------
+ bool IsNativeToCLRInteropStub();
+ MethodDesc* GetStubMethodDesc();
+ MethodDesc* GetStubTargetMethodDesc();
+ void SetStubTargetMethodDesc(MethodDesc* pStubTargetMD);
+ void SetStubTargetMethodSig(PCCOR_SIGNATURE pStubTargetMethodSig, DWORD cbStubTargetSigLength);
+ void SetStubMethodDesc(MethodDesc* pStubMD);
+
+ COR_ILMETHOD_DECODER * AllocGeneratedIL(size_t cbCode, DWORD cbLocalSig, UINT maxStack);
+ COR_ILMETHOD_DECODER * GetILHeader();
+ COR_ILMETHOD_SECT_EH* AllocEHSect(size_t nClauses);
+
+ bool IsCompiled();
+ bool IsILGenerated();
+
+ ILStubResolver();
+
+ void SetTokenLookupMap(TokenLookupMap* pMap);
+
+ void SetJitFlags(DWORD dwJitFlags);
+ DWORD GetJitFlags();
+
+ static void StubGenFailed(ILStubResolver* pResolver);
+
+protected:
+ enum ILStubType
+ {
+ Unassigned = 0,
+ CLRToNativeInteropStub,
+ CLRToCOMInteropStub,
+ CLRToWinRTInteropStub,
+ NativeToCLRInteropStub,
+ COMToCLRInteropStub,
+ WinRTToCLRInteropStub,
+#ifdef FEATURE_ARRAYSTUB_AS_IL
+ ArrayOpStub,
+#endif
+#ifdef FEATURE_STUBS_AS_IL
+ SecureDelegateStub,
+ MulticastDelegateStub,
+ UnboxingILStub,
+ InstantiatingStub,
+#endif
+ };
+
+ enum CompileTimeStatePtrSpecialValues
+ {
+ ILNotYetGenerated = NULL,
+ ILGeneratedAndFreed = 1,
+ };
+
+ void ClearCompileTimeState(CompileTimeStatePtrSpecialValues newState);
+ void SetStubType(ILStubType stubType);
+
+ //
+ // This stuff is only needed during JIT
+ //
+ struct CompileTimeState
+ {
+ COR_ILMETHOD_DECODER m_ILHeader;
+ COR_ILMETHOD_SECT_EH * m_pEHSect;
+ SigPointer m_StubTargetMethodSig;
+ TokenLookupMap m_tokenLookupMap;
+ };
+ typedef DPTR(struct CompileTimeState) PTR_CompileTimeState;
+
+ PTR_CompileTimeState m_pCompileTimeState;
+
+ PTR_MethodDesc m_pStubMD;
+ PTR_MethodDesc m_pStubTargetMD;
+ ILStubType m_type;
+ DWORD m_dwJitFlags;
+};
+
+typedef Holder<ILStubResolver*, DoNothing<ILStubResolver*>, ILStubResolver::StubGenFailed, NULL> ILStubGenHolder;
+
+
+#endif // __ILSTUBRESOLVER_H__