58 #include "ittnotify_config.h" 60 #if ITT_PLATFORM==ITT_PLATFORM_WIN 62 #pragma optimize("", off) 70 #include "jitprofiling.h" 72 static const char rcsid[] =
"\n@(#) $Revision: 234474 $\n";
74 #define DLL_ENVIRONMENT_VAR "VS_PROFILER" 76 #ifndef NEW_DLL_ENVIRONMENT_VAR 77 #if ITT_ARCH==ITT_ARCH_IA32 78 #define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER32" 80 #define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER64" 84 #if ITT_PLATFORM==ITT_PLATFORM_WIN 85 #define DEFAULT_DLLNAME "JitPI.dll" 86 HINSTANCE m_libHandle = NULL;
88 #define DEFAULT_DLLNAME "libJitPI.so" 89 void* m_libHandle = NULL;
93 #define ANDROID_JIT_AGENT_PATH "/data/intel/libittnotify.so" 96 typedef unsigned int(*TPInitialize)(void);
97 static TPInitialize FUNC_Initialize=NULL;
99 typedef unsigned int(*TPNotify)(
unsigned int,
void*);
100 static TPNotify FUNC_NotifyEvent=NULL;
102 static iJIT_IsProfilingActiveFlags executionMode = iJIT_NOTHING_RUNNING;
112 static int loadiJIT_Funcs(
void);
115 static int iJIT_DLL_is_missing = 0;
124 #if ITT_PLATFORM==ITT_PLATFORM_WIN 125 static DWORD threadLocalStorageHandle = 0;
127 static pthread_key_t threadLocalStorageHandle = (pthread_key_t)0;
130 #define INIT_TOP_Stack 10000 134 unsigned int TopStack;
135 unsigned int CurrentStack;
151 ITT_EXTERN_C
int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type,
void *EventSpecificData)
176 if (!FUNC_NotifyEvent)
178 if (iJIT_DLL_is_missing)
182 if (!loadiJIT_Funcs())
191 if ((event_type == iJVM_EVENT_TYPE_ENTER_NIDS || event_type == iJVM_EVENT_TYPE_LEAVE_NIDS) &&
192 (executionMode != iJIT_CALLGRAPH_ON))
200 if (event_type == iJVM_EVENT_TYPE_ENTER_NIDS)
202 #if ITT_PLATFORM==ITT_PLATFORM_WIN 216 threadStack->TopStack = INIT_TOP_Stack;
217 threadStack->CurrentStack = INIT_TOP_Stack;
218 #if ITT_PLATFORM==ITT_PLATFORM_WIN 219 TlsSetValue(threadLocalStorageHandle,(
void*)threadStack);
221 pthread_setspecific(threadLocalStorageHandle,(
void*)threadStack);
226 ((
piJIT_Method_NIDS) EventSpecificData)->stack_id = (threadStack->CurrentStack)--;
235 if (event_type == iJVM_EVENT_TYPE_LEAVE_NIDS)
237 #if ITT_PLATFORM==ITT_PLATFORM_WIN 253 ((
piJIT_Method_NIDS) EventSpecificData)->stack_id = ++(threadStack->CurrentStack) + 1;
259 if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED)
266 ReturnValue = (
int)FUNC_NotifyEvent(event_type, EventSpecificData);
271 ITT_EXTERN_C
void JITAPI iJIT_RegisterCallbackEx(
void *userdata, iJIT_ModeChangedEx NewModeCallBackFuncEx)
274 if (iJIT_DLL_is_missing || !loadiJIT_Funcs())
276 NewModeCallBackFuncEx(userdata, iJIT_NO_NOTIFICATIONS);
286 ITT_EXTERN_C iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive()
288 if (!iJIT_DLL_is_missing)
293 return executionMode;
300 static int loadiJIT_Funcs()
302 static int bDllWasLoaded = 0;
303 char *dllName = (
char*)rcsid;
304 #if ITT_PLATFORM==ITT_PLATFORM_WIN 305 DWORD dNameLength = 0;
314 iJIT_DLL_is_missing = 1;
315 FUNC_NotifyEvent = NULL;
319 #if ITT_PLATFORM==ITT_PLATFORM_WIN 320 FreeLibrary(m_libHandle);
322 dlclose(m_libHandle);
328 #if ITT_PLATFORM==ITT_PLATFORM_WIN 329 dNameLength = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, NULL, 0);
333 dllName = (
char*)malloc(
sizeof(
char) * (dNameLength + 1));
334 envret = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, dllName, dNameLength);
338 m_libHandle = LoadLibraryExA(dllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
343 dNameLength = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, NULL, 0);
347 dllName = (
char*)malloc(
sizeof(
char) * (dNameLength + 1));
348 envret = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, dllName, dNameLength);
352 m_libHandle = LoadLibraryA(dllName);
358 dllName = getenv(NEW_DLL_ENVIRONMENT_VAR);
360 dllName = getenv(DLL_ENVIRONMENT_VAR);
364 dllName = ANDROID_JIT_AGENT_PATH;
369 m_libHandle = dlopen(dllName, RTLD_LAZY);
375 #if ITT_PLATFORM==ITT_PLATFORM_WIN 376 m_libHandle = LoadLibraryA(DEFAULT_DLLNAME);
378 m_libHandle = dlopen(DEFAULT_DLLNAME, RTLD_LAZY);
385 iJIT_DLL_is_missing = 1;
388 #if ITT_PLATFORM==ITT_PLATFORM_WIN 389 FUNC_NotifyEvent = (TPNotify)GetProcAddress(m_libHandle,
"NotifyEvent");
391 FUNC_NotifyEvent =
reinterpret_cast<TPNotify
>(
reinterpret_cast<intptr_t
>(dlsym(m_libHandle,
"NotifyEvent")));
393 if (!FUNC_NotifyEvent)
395 FUNC_Initialize = NULL;
399 #if ITT_PLATFORM==ITT_PLATFORM_WIN 400 FUNC_Initialize = (TPInitialize)GetProcAddress(m_libHandle,
"Initialize");
402 FUNC_Initialize =
reinterpret_cast<TPInitialize
>(
reinterpret_cast<intptr_t
>(dlsym(m_libHandle,
"Initialize")));
404 if (!FUNC_Initialize)
406 FUNC_NotifyEvent = NULL;
410 executionMode = (iJIT_IsProfilingActiveFlags)FUNC_Initialize();
411 if (executionMode != iJIT_SAMPLING_ON)
412 executionMode = iJIT_SAMPLING_ON;
415 iJIT_DLL_is_missing = 0;
421 if ( executionMode == iJIT_CALLGRAPH_ON )
424 if (!threadLocalStorageHandle)
425 #if ITT_PLATFORM==ITT_PLATFORM_WIN 426 threadLocalStorageHandle = TlsAlloc();
428 pthread_key_create(&threadLocalStorageHandle, NULL);
439 ITT_EXTERN_C
void JITAPI FinalizeThread()
441 if (threadLocalStorageHandle)
443 #if ITT_PLATFORM==ITT_PLATFORM_WIN 452 #if ITT_PLATFORM==ITT_PLATFORM_WIN 453 TlsSetValue (threadLocalStorageHandle, threadStack);
455 pthread_setspecific(threadLocalStorageHandle, threadStack);
465 ITT_EXTERN_C
void JITAPI FinalizeProcess()
469 #if ITT_PLATFORM==ITT_PLATFORM_WIN 470 FreeLibrary(m_libHandle);
472 dlclose(m_libHandle);
477 if (threadLocalStorageHandle)
478 #if ITT_PLATFORM==ITT_PLATFORM_WIN 479 TlsFree (threadLocalStorageHandle);
481 pthread_key_delete(threadLocalStorageHandle);
490 ITT_EXTERN_C
unsigned int JITAPI iJIT_GetNewMethodID()
492 static unsigned int methodID = 0x100000;