Remove superfluous 'const' qualifier from trivial return types (#20652)
[platform/upstream/coreclr.git] / src / zap / zapwrapper.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 // ZapWrapper.h
6 //
7
8 //
9 // ZapNode that wraps EE datastructure for zapping
10 // 
11 // ======================================================================================
12
13 #ifndef __ZAPWRAPPER_H__
14 #define __ZAPWRAPPER_H__
15
16 //
17 // When generating compiled code for IL, the compiler will need to embed
18 // handles, which are pointers to various data structures. The data
19 // structures may either not exist, or we may not have some information
20 // we need for optimal code gen.
21 //
22 // In such cases, we use placeholders. Compiled code embed pointers
23 // to placeholders, which then have rich information about the
24 // referenced data structure.
25 //
26 // Once information is finally available for the exact code required,
27 // ZapWrapper::Resolve makes the place holder to point to the intended target.
28 //
29
30 class ZapWrapper : public ZapNode
31 {
32     PVOID m_handle;
33
34 public:
35     ZapWrapper(PVOID handle)
36         : m_handle(handle)
37     {
38     }
39
40     ZapWrapper()
41     {
42     }
43
44     void SetHandle(PVOID handle)
45     {
46         _ASSERTE(m_handle == NULL);
47         _ASSERTE(handle != NULL);
48         m_handle = handle;
49     }
50
51     PVOID GetHandle()
52     {
53         return m_handle;
54     }
55
56     virtual ZapNode * GetBase()
57     {
58         return this;
59     }
60
61     virtual void Resolve(ZapImage * pImage)
62     {
63     }
64 };
65
66 class ZapWrapperTable
67 {
68     class WrapperTraits : public NoRemoveSHashTraits< DefaultSHashTraits<ZapWrapper *> >
69     {
70     public:
71         typedef PVOID key_t;
72
73         static key_t GetKey(element_t e)
74         { 
75             LIMITED_METHOD_CONTRACT;
76             return e->GetHandle();
77         }
78         static BOOL Equals(key_t k1, key_t k2) 
79         { 
80             LIMITED_METHOD_CONTRACT;
81             return k1 == k2;
82         }
83         static count_t Hash(key_t k) 
84         {
85             LIMITED_METHOD_CONTRACT;
86             return (count_t)(size_t)k;
87         }
88
89         static element_t Null() { LIMITED_METHOD_CONTRACT; return NULL; }
90         static bool IsNull(const element_t &e) { LIMITED_METHOD_CONTRACT; return e == NULL; }
91     };
92
93     typedef SHash< WrapperTraits > WrapperTable;
94
95     WrapperTable m_entries;
96     ZapImage * m_pImage;
97
98     //
99     // Helper for inserting actual implementations of placeholders into hashtable
100     //
101     template < typename impl, ZapNodeType type >
102     ZapNode * GetPlaceHolder(PVOID handle)
103     {
104         ZapWrapper * pPlaceHolder = m_entries.Lookup(handle);
105
106         if (pPlaceHolder != NULL)
107         {
108             _ASSERTE(pPlaceHolder->GetType() == type);
109             return pPlaceHolder;
110         }
111
112         pPlaceHolder = new (m_pImage->GetHeap()) impl();
113         _ASSERTE(pPlaceHolder->GetType() == type);
114         pPlaceHolder->SetHandle(handle);
115         m_entries.Add(pPlaceHolder);
116         return pPlaceHolder;
117     }
118
119 public:
120     ZapWrapperTable(ZapImage * pImage)
121         : m_pImage(pImage)
122     {
123     }
124
125     void Preallocate(COUNT_T cbILImage)
126     {
127         PREALLOCATE_HASHTABLE(ZapWrapperTable::m_entries, 0.0013, cbILImage);
128     }
129
130     ZapNode * GetMethodHandle(CORINFO_METHOD_HANDLE handle);
131     ZapNode * GetClassHandle(CORINFO_CLASS_HANDLE handle);
132     ZapNode * GetFieldHandle(CORINFO_FIELD_HANDLE handle);
133     ZapNode * GetAddrOfPInvokeFixup(CORINFO_METHOD_HANDLE handle);
134     ZapNode * GetGenericHandle(CORINFO_GENERIC_HANDLE handle);
135     ZapNode * GetModuleIDHandle(CORINFO_MODULE_HANDLE handle);
136
137     ZapNode * GetStub(void * pStub);
138
139     void Resolve();
140 };
141
142 #endif // __ZAPWRAPPER_H__