Line data Source code
1 : /* <copyright>
2 : This file is provided under a dual BSD/GPLv2 license. When using or
3 : redistributing this file, you may do so under either license.
4 :
5 : GPL LICENSE SUMMARY
6 :
7 : Copyright (c) 2005-2014 Intel Corporation. All rights reserved.
8 :
9 : This program is free software; you can redistribute it and/or modify
10 : it under the terms of version 2 of the GNU General Public License as
11 : published by the Free Software Foundation.
12 :
13 : This program is distributed in the hope that it will be useful, but
14 : WITHOUT ANY WARRANTY; without even the implied warranty of
15 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 : General Public License for more details.
17 :
18 : You should have received a copy of the GNU General Public License
19 : along with this program; if not, write to the Free Software
20 : Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21 : The full GNU General Public License is included in this distribution
22 : in the file called LICENSE.GPL.
23 :
24 : Contact Information:
25 : http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
26 :
27 : BSD LICENSE
28 :
29 : Copyright (c) 2005-2014 Intel Corporation. All rights reserved.
30 : All rights reserved.
31 :
32 : Redistribution and use in source and binary forms, with or without
33 : modification, are permitted provided that the following conditions
34 : are met:
35 :
36 : * Redistributions of source code must retain the above copyright
37 : notice, this list of conditions and the following disclaimer.
38 : * Redistributions in binary form must reproduce the above copyright
39 : notice, this list of conditions and the following disclaimer in
40 : the documentation and/or other materials provided with the
41 : distribution.
42 : * Neither the name of Intel Corporation nor the names of its
43 : contributors may be used to endorse or promote products derived
44 : from this software without specific prior written permission.
45 :
46 : THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
47 : "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
48 : LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
49 : A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
50 : OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
51 : SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
52 : LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
53 : DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
54 : THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
55 : (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
56 : OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 : </copyright> */
58 :
59 : #include "vtune/ittnotify_config.h"
60 :
61 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
62 : #include <windows.h>
63 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
64 : #if ITT_PLATFORM != ITT_PLATFORM_MAC && ITT_PLATFORM != ITT_PLATFORM_FREEBSD
65 : #include <malloc.h>
66 : #endif
67 : #include <stdlib.h>
68 :
69 : #include "vtune/jitprofiling.h"
70 :
71 : static const char rcsid[] = "\n@(#) $Revision: 471937 $\n";
72 :
73 : #define DLL_ENVIRONMENT_VAR "VS_PROFILER"
74 :
75 : #ifndef NEW_DLL_ENVIRONMENT_VAR
76 : #if ITT_ARCH==ITT_ARCH_IA32
77 : #define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER32"
78 : #else
79 : #define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER64"
80 : #endif
81 : #endif /* NEW_DLL_ENVIRONMENT_VAR */
82 :
83 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
84 : #define DEFAULT_DLLNAME "JitPI.dll"
85 : HINSTANCE m_libHandle = NULL;
86 : #elif ITT_PLATFORM==ITT_PLATFORM_MAC
87 : #define DEFAULT_DLLNAME "libJitPI.dylib"
88 : void* m_libHandle = NULL;
89 : #else
90 : #define DEFAULT_DLLNAME "libJitPI.so"
91 : void* m_libHandle = NULL;
92 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
93 :
94 : /* default location of JIT profiling agent on Android */
95 : #define ANDROID_JIT_AGENT_PATH "/data/intel/libittnotify.so"
96 :
97 : /* the function pointers */
98 : typedef unsigned int(JITAPI *TPInitialize)(void);
99 : static TPInitialize FUNC_Initialize=NULL;
100 :
101 : typedef unsigned int(JITAPI *TPNotify)(unsigned int, void*);
102 : static TPNotify FUNC_NotifyEvent=NULL;
103 :
104 : static iJIT_IsProfilingActiveFlags executionMode = iJIT_NOTHING_RUNNING;
105 :
106 : /* end collector dll part. */
107 :
108 : /* loadiJIT_Funcs() : this function is called just in the beginning
109 : * and is responsible to load the functions from BistroJavaCollector.dll
110 : * result:
111 : * on success: the functions loads, iJIT_DLL_is_missing=0, return value = 1
112 : * on failure: the functions are NULL, iJIT_DLL_is_missing=1, return value = 0
113 : */
114 : int loadiJIT_Funcs(void);
115 :
116 : /* global representing whether the collector can't be loaded */
117 : static int iJIT_DLL_is_missing = 0;
118 :
119 : ITT_EXTERN_C int JITAPI
120 0 : iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData)
121 : {
122 0 : int ReturnValue = 0;
123 :
124 : /* initialization part - the collector has not been loaded yet. */
125 0 : if (!FUNC_NotifyEvent)
126 : {
127 0 : if (iJIT_DLL_is_missing)
128 0 : return 0;
129 :
130 0 : if (!loadiJIT_Funcs())
131 0 : return 0;
132 : }
133 :
134 0 : if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED ||
135 : event_type == iJVM_EVENT_TYPE_METHOD_UPDATE)
136 : {
137 0 : if (((piJIT_Method_Load)EventSpecificData)->method_id == 0)
138 0 : return 0;
139 : }
140 0 : else if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2)
141 : {
142 0 : if (((piJIT_Method_Load_V2)EventSpecificData)->method_id == 0)
143 0 : return 0;
144 : }
145 0 : else if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3)
146 : {
147 0 : if (((piJIT_Method_Load_V3)EventSpecificData)->method_id == 0)
148 0 : return 0;
149 : }
150 0 : else if (event_type == iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED)
151 : {
152 0 : if (((piJIT_Method_Inline_Load)EventSpecificData)->method_id == 0 ||
153 0 : ((piJIT_Method_Inline_Load)EventSpecificData)->parent_method_id == 0)
154 0 : return 0;
155 : }
156 :
157 0 : ReturnValue = (int)FUNC_NotifyEvent(event_type, EventSpecificData);
158 :
159 0 : return ReturnValue;
160 : }
161 :
162 0 : ITT_EXTERN_C iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive()
163 : {
164 0 : if (!iJIT_DLL_is_missing)
165 : {
166 0 : loadiJIT_Funcs();
167 : }
168 :
169 0 : return executionMode;
170 : }
171 :
172 : /* This function loads the collector dll and the relevant functions.
173 : * on success: all functions load, iJIT_DLL_is_missing = 0, return value = 1
174 : * on failure: all functions are NULL, iJIT_DLL_is_missing = 1, return value = 0
175 : */
176 3 : int loadiJIT_Funcs()
177 : {
178 : static int bDllWasLoaded = 0;
179 3 : char *dllName = (char*)rcsid; /* !! Just to avoid unused code elimination */
180 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
181 : DWORD dNameLength = 0;
182 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
183 :
184 3 : if(bDllWasLoaded)
185 : {
186 : /* dll was already loaded, no need to do it for the second time */
187 0 : return 1;
188 : }
189 :
190 : /* Assumes that the DLL will not be found */
191 3 : iJIT_DLL_is_missing = 1;
192 3 : FUNC_NotifyEvent = NULL;
193 :
194 3 : if (m_libHandle)
195 : {
196 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
197 : FreeLibrary(m_libHandle);
198 : #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
199 0 : dlclose(m_libHandle);
200 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
201 0 : m_libHandle = NULL;
202 : }
203 :
204 : /* Try to get the dll name from the environment */
205 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
206 : dNameLength = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, NULL, 0);
207 : if (dNameLength)
208 : {
209 : DWORD envret = 0;
210 : dllName = (char*)malloc(sizeof(char) * (dNameLength + 1));
211 : if(dllName != NULL)
212 : {
213 : envret = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR,
214 : dllName, dNameLength);
215 : if (envret)
216 : {
217 : /* Try to load the dll from the PATH... */
218 : m_libHandle = LoadLibraryExA(dllName,
219 : NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
220 : }
221 : free(dllName);
222 : }
223 : } else {
224 : /* Try to use old VS_PROFILER variable */
225 : dNameLength = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, NULL, 0);
226 : if (dNameLength)
227 : {
228 : DWORD envret = 0;
229 : dllName = (char*)malloc(sizeof(char) * (dNameLength + 1));
230 : if(dllName != NULL)
231 : {
232 : envret = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR,
233 : dllName, dNameLength);
234 : if (envret)
235 : {
236 : /* Try to load the dll from the PATH... */
237 : m_libHandle = LoadLibraryA(dllName);
238 : }
239 : free(dllName);
240 : }
241 : }
242 : }
243 : #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
244 3 : dllName = getenv(NEW_DLL_ENVIRONMENT_VAR);
245 3 : if (!dllName)
246 3 : dllName = getenv(DLL_ENVIRONMENT_VAR);
247 : #if defined(__ANDROID__) || defined(ANDROID)
248 : if (!dllName)
249 : dllName = ANDROID_JIT_AGENT_PATH;
250 : #endif
251 3 : if (dllName)
252 : {
253 : /* Try to load the dll from the PATH... */
254 0 : m_libHandle = dlopen(dllName, RTLD_LAZY);
255 : }
256 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
257 :
258 3 : if (!m_libHandle)
259 : {
260 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
261 : m_libHandle = LoadLibraryA(DEFAULT_DLLNAME);
262 : #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
263 3 : m_libHandle = dlopen(DEFAULT_DLLNAME, RTLD_LAZY);
264 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
265 : }
266 :
267 : /* if the dll wasn't loaded - exit. */
268 3 : if (!m_libHandle)
269 : {
270 3 : iJIT_DLL_is_missing = 1; /* don't try to initialize
271 : * JIT agent the second time
272 : */
273 3 : return 0;
274 : }
275 :
276 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
277 : FUNC_NotifyEvent = (TPNotify)GetProcAddress(m_libHandle, "NotifyEvent");
278 : #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
279 0 : FUNC_NotifyEvent = (TPNotify)dlsym(m_libHandle, "NotifyEvent");
280 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
281 0 : if (!FUNC_NotifyEvent)
282 : {
283 0 : FUNC_Initialize = NULL;
284 0 : return 0;
285 : }
286 :
287 : #if ITT_PLATFORM==ITT_PLATFORM_WIN
288 : FUNC_Initialize = (TPInitialize)GetProcAddress(m_libHandle, "Initialize");
289 : #else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
290 0 : FUNC_Initialize = (TPInitialize)dlsym(m_libHandle, "Initialize");
291 : #endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
292 0 : if (!FUNC_Initialize)
293 : {
294 0 : FUNC_NotifyEvent = NULL;
295 0 : return 0;
296 : }
297 :
298 0 : executionMode = (iJIT_IsProfilingActiveFlags)FUNC_Initialize();
299 :
300 0 : bDllWasLoaded = 1;
301 0 : iJIT_DLL_is_missing = 0; /* DLL is ok. */
302 :
303 0 : return 1;
304 : }
305 :
306 24857 : ITT_EXTERN_C unsigned int JITAPI iJIT_GetNewMethodID()
307 : {
308 : static unsigned int methodID = 1;
309 :
310 24857 : if (methodID == 0)
311 0 : return 0; /* ERROR : this is not a valid value */
312 :
313 24857 : return methodID++;
314 : }
|