diff options
Diffstat (limited to 'src/vm/stubcache.h')
-rw-r--r-- | src/vm/stubcache.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/vm/stubcache.h b/src/vm/stubcache.h new file mode 100644 index 0000000000..781d46c8f5 --- /dev/null +++ b/src/vm/stubcache.h @@ -0,0 +1,139 @@ +// 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: stubcache.h +// + +// +// Base class for caching stubs. +// + + +#ifndef __mlcache_h__ +#define __mlcache_h__ + + +#include "vars.hpp" +#include "util.hpp" +#include "crst.h" + +class Stub; +class StubLinker; + +class StubCacheBase : private CClosedHashBase +{ +private: + //--------------------------------------------------------- + // Hash entry for CClosedHashBase. + //--------------------------------------------------------- + struct STUBHASHENTRY + { + // Values: + // NULL = free + // -1 = deleted + // other = used + Stub *m_pStub; + + // Offset where the RawStub begins (the RawStub can be + // preceded by native stub code.) + UINT16 m_offsetOfRawStub; + }; + + +public: + //--------------------------------------------------------- + // Constructor + //--------------------------------------------------------- + StubCacheBase(LoaderHeap *heap = 0); + + //--------------------------------------------------------- + // Destructor + //--------------------------------------------------------- + ~StubCacheBase(); + + //--------------------------------------------------------- + // Returns the equivalent hashed Stub, creating a new hash + // entry if necessary. If the latter, will call out to CompileStub. + // + // Throws on out of memory or other fatal error. + //--------------------------------------------------------- + Stub *Canonicalize(const BYTE *pRawStub); + +protected: + //--------------------------------------------------------- + // OVERRIDE. + // Compile a native (ASM) version of the stub. + // + // This method should compile into the provided stublinker (but + // not call the Link method.) + // + // It should return the chosen compilation mode. + // + // If the method fails for some reason, it should return + // INTERPRETED so that the EE can fall back on the already + // created ML code. + //--------------------------------------------------------- + virtual void CompileStub(const BYTE *pRawStub, + StubLinker *psl) = 0; + + //--------------------------------------------------------- + // OVERRIDE + // Tells the StubCacheBase the length of a stub. + //--------------------------------------------------------- + virtual UINT Length(const BYTE *pRawStub) = 0; + + //--------------------------------------------------------- + // OVERRIDE (OPTIONAL) + // Notifies the various derived classes that a new stub has been created + //--------------------------------------------------------- + virtual void AddStub(const BYTE* pRawStub, Stub* pNewStub); + + +private: + // *** OVERRIDES FOR CClosedHashBase ***/ + + //***************************************************************************** + // Hash is called with a pointer to an element in the table. You must override + // this method and provide a hash algorithm for your element type. + //***************************************************************************** + virtual unsigned int Hash( // The key value. + void const *pData); // Raw data to hash. + + //***************************************************************************** + // Compare is used in the typical memcmp way, 0 is eqaulity, -1/1 indicate + // direction of miscompare. In this system everything is always equal or not. + //***************************************************************************** + virtual unsigned int Compare( // 0, -1, or 1. + void const *pData, // Raw key data on lookup. + BYTE *pElement); // The element to compare data against. + + //***************************************************************************** + // Return true if the element is free to be used. + //***************************************************************************** + virtual ELEMENTSTATUS Status( // The status of the entry. + BYTE *pElement); // The element to check. + + //***************************************************************************** + // Sets the status of the given element. + //***************************************************************************** + virtual void SetStatus( + BYTE *pElement, // The element to set status for. + ELEMENTSTATUS eStatus); // New status. + + //***************************************************************************** + // Returns the internal key value for an element. + //***************************************************************************** + virtual void *GetKey( // The data to hash on. + BYTE *pElement); // The element to return data ptr for. + + + + +private: + Crst m_crst; + LoaderHeap* m_heap; +}; + + +#endif // __mlcache_h__ |