feb81ed8c056e80b27d3a8ca7152fe1d034fe36b
[platform/upstream/coreclr.git] / src / vm / eetoprofinterfaceimpl.inl
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 // EEToProfInterfaceImpl.inl
6 // 
7
8 //
9 // Inline implementation of portions of the code that wraps calling into 
10 // the profiler's implementation of ICorProfilerCallback*
11 //
12
13 // ======================================================================================
14
15 #ifndef __EETOPROFINTERFACEIMPL_INL__
16 #define __EETOPROFINTERFACEIMPL_INL__
17
18 #include "profilepriv.h"
19 #include "profilepriv.inl"
20 #include "simplerwlock.hpp"
21
22 // ----------------------------------------------------------------------------
23 // EEToProfInterfaceImpl::IsCallback3Supported
24 // 
25 // Description:
26 //     Returns BOOL indicating whether the profiler implements
27 //     ICorProfilerCallback3.
28 //
29
30 inline BOOL EEToProfInterfaceImpl::IsCallback3Supported()
31 {
32     LIMITED_METHOD_CONTRACT;
33     return (m_pCallback3 != NULL);
34 }
35
36 // ----------------------------------------------------------------------------
37 // EEToProfInterfaceImpl::IsCallback4Supported
38 // 
39 // Description:
40 //     Returns BOOL indicating whether the profiler implements
41 //     ICorProfilerCallback4.
42 //
43
44 inline BOOL EEToProfInterfaceImpl::IsCallback4Supported()
45 {
46     LIMITED_METHOD_CONTRACT;
47     return (m_pCallback4 != NULL);
48 }
49
50 inline BOOL EEToProfInterfaceImpl::IsCallback5Supported()
51 {
52     LIMITED_METHOD_CONTRACT;
53     return (m_pCallback5 != NULL);
54 }
55
56 inline BOOL EEToProfInterfaceImpl::IsCallback6Supported()
57 {
58     LIMITED_METHOD_CONTRACT;
59     return (m_pCallback6 != NULL);
60 }
61
62 inline BOOL EEToProfInterfaceImpl::IsCallback7Supported()
63 {
64     LIMITED_METHOD_CONTRACT;
65     return (m_pCallback7 != NULL);
66 }
67
68 inline BOOL EEToProfInterfaceImpl::IsCallback8Supported()
69 {
70     LIMITED_METHOD_CONTRACT;
71     return (m_pCallback8 != NULL);
72 }
73
74 inline FunctionIDMapper * EEToProfInterfaceImpl::GetFunctionIDMapper()
75 {
76     LIMITED_METHOD_CONTRACT;
77     return m_pProfilersFuncIDMapper;
78 }
79
80 inline FunctionIDMapper2 * EEToProfInterfaceImpl::GetFunctionIDMapper2()
81 {
82     LIMITED_METHOD_CONTRACT;
83     return m_pProfilersFuncIDMapper2;
84 }
85
86 inline void EEToProfInterfaceImpl::SetFunctionIDMapper(FunctionIDMapper * pFunc)
87 {
88     LIMITED_METHOD_CONTRACT;
89     m_pProfilersFuncIDMapper = pFunc;
90 }
91
92 inline void EEToProfInterfaceImpl::SetFunctionIDMapper2(FunctionIDMapper2 * pFunc, void * clientData)
93 {
94     LIMITED_METHOD_CONTRACT;
95     m_pProfilersFuncIDMapper2 = pFunc;
96     m_pProfilersFuncIDMapper2ClientData = clientData;
97 }
98
99 inline BOOL EEToProfInterfaceImpl::IsLoadedViaAttach()
100 {
101     LIMITED_METHOD_CONTRACT;
102     return m_fLoadedViaAttach;
103 }
104
105 inline void EEToProfInterfaceImpl::SetUnrevertiblyModifiedILFlag()
106 {
107     LIMITED_METHOD_CONTRACT;
108     m_fUnrevertiblyModifiedIL = TRUE;
109 }
110
111 inline FunctionEnter * EEToProfInterfaceImpl::GetEnterHook()
112 {
113     LIMITED_METHOD_CONTRACT;
114     return m_pEnter;
115 }
116
117 inline FunctionLeave * EEToProfInterfaceImpl::GetLeaveHook()
118 {
119     LIMITED_METHOD_CONTRACT;
120     return m_pLeave;
121 }
122
123 inline FunctionTailcall * EEToProfInterfaceImpl::GetTailcallHook()
124 {
125     LIMITED_METHOD_CONTRACT;
126     return m_pTailcall;
127 }
128
129 inline FunctionEnter2 * EEToProfInterfaceImpl::GetEnter2Hook()
130 {
131     LIMITED_METHOD_CONTRACT;
132     return m_pEnter2;
133 }
134
135 inline FunctionLeave2 * EEToProfInterfaceImpl::GetLeave2Hook()
136 {
137     LIMITED_METHOD_CONTRACT;
138     return m_pLeave2;
139 }
140
141 inline FunctionTailcall2 * EEToProfInterfaceImpl::GetTailcall2Hook()
142 {
143     LIMITED_METHOD_CONTRACT;
144     return m_pTailcall2;
145 }
146
147 inline FunctionEnter3 * EEToProfInterfaceImpl::GetEnter3Hook()
148 {
149     LIMITED_METHOD_CONTRACT;
150     return m_pEnter3;
151 }
152
153 inline FunctionLeave3 * EEToProfInterfaceImpl::GetLeave3Hook()
154 {
155     LIMITED_METHOD_CONTRACT;
156     return m_pLeave3;
157 }
158
159 inline FunctionTailcall3 * EEToProfInterfaceImpl::GetTailcall3Hook()
160 {
161     LIMITED_METHOD_CONTRACT;
162     return m_pTailcall3;
163 }
164
165 inline FunctionEnter3WithInfo * EEToProfInterfaceImpl::GetEnter3WithInfoHook()
166 {
167     LIMITED_METHOD_CONTRACT;
168     return m_pEnter3WithInfo;
169 }
170
171 inline FunctionLeave3WithInfo * EEToProfInterfaceImpl::GetLeave3WithInfoHook()
172 {
173     LIMITED_METHOD_CONTRACT;
174     return m_pLeave3WithInfo;
175 }
176
177 inline FunctionTailcall3WithInfo * EEToProfInterfaceImpl::GetTailcall3WithInfoHook()
178 {
179     LIMITED_METHOD_CONTRACT;
180     return m_pTailcall3WithInfo;
181 }
182
183 inline BOOL EEToProfInterfaceImpl::IsClientIDToFunctionIDMappingEnabled()
184 {
185     LIMITED_METHOD_CONTRACT;
186     return m_fIsClientIDToFunctionIDMappingEnabled;
187 }
188
189 //---------------------------------------------------------------------------------------
190 //
191 // Lookup the clientID for a given functionID
192 //
193 // Arguments:
194 //     functionID
195 //
196 // Return Value:
197 //     If found a match, return clientID; Otherwise return NULL.
198 //
199 inline UINT_PTR EEToProfInterfaceImpl::LookupClientIDFromCache(FunctionID functionID)
200 {
201     CONTRACTL
202     {
203         SO_NOT_MAINLINE;
204         NOTHROW;
205         GC_NOTRIGGER;
206         MODE_COOPERATIVE;
207     } CONTRACTL_END;
208
209     _ASSERTE(functionID != NULL);
210
211     SimpleReadLockHolder readLockHolder(m_pFunctionIDHashTableRWLock);
212     const FunctionIDAndClientID * entry = m_pFunctionIDHashTable->LookupPtr(functionID); 
213
214     // entry can be NULL when OOM happens.
215     if (entry != NULL)
216     {
217         return entry->clientID;
218     }
219     else
220     {
221         return NULL;
222     }
223 }
224
225 //---------------------------------------------------------------------------------------
226 //
227 // Returns whether the profiler chose options that require the JIT to compile with the
228 // CORINFO_GENERICS_CTXT_KEEP_ALIVE flag.
229 //
230 // Return Value:
231 //    Nonzero iff the JIT should compile with CORINFO_GENERICS_CTXT_KEEP_ALIVE.
232 //
233
234 inline BOOL EEToProfInterfaceImpl::RequiresGenericsContextForEnterLeave()
235 {
236     CONTRACTL
237     {
238         NOTHROW;
239         GC_NOTRIGGER;
240         CANNOT_TAKE_LOCK;
241     }
242     CONTRACTL_END;
243
244     return 
245         CORProfilerPresent() &&
246         ((g_profControlBlock.dwEventMask & COR_PRF_ENABLE_FRAME_INFO) != 0) &&
247         (
248             (m_pEnter2            != NULL) || 
249             (m_pLeave2            != NULL) || 
250             (m_pTailcall2         != NULL) ||
251             (m_pEnter3WithInfo    != NULL) || 
252             (m_pLeave3WithInfo    != NULL) || 
253             (m_pTailcall3WithInfo != NULL)
254         );
255 }
256
257 inline BOOL EEToProfInterfaceImpl::HasTimedOutWaitingForConcurrentGC()
258 {
259     LIMITED_METHOD_CONTRACT;
260     return m_bHasTimedOutWaitingForConcurrentGC;
261 }
262
263 #endif // __EETOPROFINTERFACEIMPL_INL__
264