1e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* 2e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org This file is provided under a dual BSD/GPLv2 license. When using or 3e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org redistributing this file, you may do so under either license. 4e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 5e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GPL LICENSE SUMMARY 6e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 7e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Copyright(c) 2005-2012 Intel Corporation. All rights reserved. 8e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 9e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org This program is free software; you can redistribute it and/or modify 10e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org it under the terms of version 2 of the GNU General Public License as 11e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org published by the Free Software Foundation. 12e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 13e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org This program is distributed in the hope that it will be useful, but 14e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org WITHOUT ANY WARRANTY; without even the implied warranty of 15e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org General Public License for more details. 17e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 18e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org You should have received a copy of the GNU General Public License 19e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org along with this program; if not, write to the Free Software 20e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org The full GNU General Public License is included in this distribution 22e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org in the file called LICENSE.GPL. 23e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 24e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Contact Information: 25e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/ 26e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 27e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org BSD LICENSE 28e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 29e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Copyright(c) 2005-2012 Intel Corporation. All rights reserved. 30e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org All rights reserved. 31e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 32e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Redistribution and use in source and binary forms, with or without 33e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org modification, are permitted provided that the following conditions 34e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org are met: 35e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 36e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * Redistributions of source code must retain the above copyright 37e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org notice, this list of conditions and the following disclaimer. 38e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * Redistributions in binary form must reproduce the above copyright 39e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org notice, this list of conditions and the following disclaimer in 40e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org the documentation and/or other materials provided with the 41e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org distribution. 42e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org * Neither the name of Intel Corporation nor the names of its 43e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org contributors may be used to endorse or promote products derived 44e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org from this software without specific prior written permission. 45e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 46e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 47e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 48e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 49e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 50e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 51e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 52e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 53e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 54e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 55e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 56e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 57e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 58e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include "ittnotify_config.h" 59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <windows.h> 62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#pragma optimize("", off) 63e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 64e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <pthread.h> 65e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <dlfcn.h> 66e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 67e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <malloc.h> 68e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <stdlib.h> 69e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 70e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include "jitprofiling.h" 71e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 72e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic const char rcsid[] = "\n@(#) $Revision: 234474 $\n"; 73e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 74e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define DLL_ENVIRONMENT_VAR "VS_PROFILER" 75e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 76e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifndef NEW_DLL_ENVIRONMENT_VAR 77e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_ARCH==ITT_ARCH_IA32 78e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER32" 79e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else 80e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER64" 81e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 82e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* NEW_DLL_ENVIRONMENT_VAR */ 83e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 84e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 85e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define DEFAULT_DLLNAME "JitPI.dll" 86e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgHINSTANCE m_libHandle = NULL; 87e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 88e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define DEFAULT_DLLNAME "libJitPI.so" 89e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid* m_libHandle = NULL; 90e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 91e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 92e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* default location of JIT profiling agent on Android */ 93e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define ANDROID_JIT_AGENT_PATH "/data/intel/libittnotify.so" 94e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 95e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* the function pointers */ 96e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtypedef unsigned int(*TPInitialize)(void); 97e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic TPInitialize FUNC_Initialize=NULL; 98e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 99e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtypedef unsigned int(*TPNotify)(unsigned int, void*); 100e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic TPNotify FUNC_NotifyEvent=NULL; 101e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 102e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic iJIT_IsProfilingActiveFlags executionMode = iJIT_NOTHING_RUNNING; 103e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 104e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* end collector dll part. */ 105e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1065c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org/* loadiJIT_Funcs() : this function is called just in the beginning and is responsible 107e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** to load the functions from BistroJavaCollector.dll 108e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** result: 109e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** on success: the functions loads, iJIT_DLL_is_missing=0, return value = 1. 110e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** on failure: the functions are NULL, iJIT_DLL_is_missing=1, return value = 0. 1115c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org*/ 112e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic int loadiJIT_Funcs(void); 113e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 114e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* global representing whether the BistroJavaCollector can't be loaded */ 115e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic int iJIT_DLL_is_missing = 0; 116e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* Virtual stack - the struct is used as a virtual stack for each thread. 118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** Every thread initializes with a stack of size INIT_TOP_STACK. 119e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** Every method entry decreases from the current stack point, 120e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** and when a thread stack reaches its top of stack (return from the global function), 121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** the top of stack and the current stack increase. Notice that when returning from a function 122e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** the stack pointer is the address of the function return. 123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 124e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 125e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic DWORD threadLocalStorageHandle = 0; 126e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 127e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic pthread_key_t threadLocalStorageHandle = (pthread_key_t)0; 128e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 129e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 130e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define INIT_TOP_Stack 10000 131e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1325c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.orgtypedef struct 133e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org unsigned int TopStack; 135e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org unsigned int CurrentStack; 136e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} ThreadStack, *pThreadStack; 137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* end of virtual stack. */ 139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 140e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* 141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** The function for reporting virtual-machine related events to VTune. 1425c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org** Note: when reporting iJVM_EVENT_TYPE_ENTER_NIDS, there is no need to fill in the stack_id 143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** field in the iJIT_Method_NIDS structure, as VTune fills it. 1445c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org** 145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** The return value in iJVM_EVENT_TYPE_ENTER_NIDS && iJVM_EVENT_TYPE_LEAVE_NIDS events 146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** will be 0 in case of failure. 147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** in iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED event it will be -1 if EventSpecificData == 0 148e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** otherwise it will be 0. 149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 151e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgITT_EXTERN_C int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData) 152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org int ReturnValue; 154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /******************************************************************************* 1565c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ** This section is for debugging outside of VTune. 157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** It creates the environment variables that indicates call graph mode. 158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** If running outside of VTune remove the remark. 159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** 160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 161e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static int firstTime = 1; 162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org char DoCallGraph[12] = "DoCallGraph"; 163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (firstTime) 164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 165e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org firstTime = 0; 166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org SetEnvironmentVariable( "BISTRO_COLLECTORS_DO_CALLGRAPH", DoCallGraph); 167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** end of section. 170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org *******************************************************************************/ 171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* initialization part - the functions have not been loaded yet. This part 1735c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ** will load the functions, and check if we are in Call Graph mode. 174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** (for special treatment). 175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */ 1765c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!FUNC_NotifyEvent) 177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 1785c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (iJIT_DLL_is_missing) 179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // load the Function from the DLL 1825c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!loadiJIT_Funcs()) 183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* Call Graph initialization. */ 186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 1885c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org /* If the event is method entry/exit, check that in the current mode 189e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** VTune is allowed to receive it 190e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */ 191e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ((event_type == iJVM_EVENT_TYPE_ENTER_NIDS || event_type == iJVM_EVENT_TYPE_LEAVE_NIDS) && 192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (executionMode != iJIT_CALLGRAPH_ON)) 193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* This section is performed when method enter event occurs. 1975c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ** It updates the virtual stack, or creates it if this is the first 198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** method entry in the thread. The stack pointer is decreased. 199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */ 200e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (event_type == iJVM_EVENT_TYPE_ENTER_NIDS) 201e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 202e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pThreadStack threadStack = (pThreadStack)TlsGetValue (threadLocalStorageHandle); 204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pThreadStack threadStack = (pThreadStack)pthread_getspecific(threadLocalStorageHandle); 206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // check for use of reserved method IDs 209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ( ((piJIT_Method_NIDS) EventSpecificData)->method_id <= 999 ) 210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!threadStack) 213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // initialize the stack. 215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org threadStack = (pThreadStack) calloc (sizeof(ThreadStack), 1); 216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org threadStack->TopStack = INIT_TOP_Stack; 217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org threadStack->CurrentStack = INIT_TOP_Stack; 218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org TlsSetValue(threadLocalStorageHandle,(void*)threadStack); 220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pthread_setspecific(threadLocalStorageHandle,(void*)threadStack); 222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // decrease the stack. 226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ((piJIT_Method_NIDS) EventSpecificData)->stack_id = (threadStack->CurrentStack)--; 227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* This section is performed when method leave event occurs 230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** It updates the virtual stack. 231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** Increases the stack pointer. 232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** If the stack pointer reached the top (left the global function) 233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** increase the pointer and the top pointer. 234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */ 235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (event_type == iJVM_EVENT_TYPE_LEAVE_NIDS) 236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 237e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 238e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pThreadStack threadStack = (pThreadStack)TlsGetValue (threadLocalStorageHandle); 239e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 240e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pThreadStack threadStack = (pThreadStack)pthread_getspecific(threadLocalStorageHandle); 241e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 243e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // check for use of reserved method IDs 244e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ( ((piJIT_Method_NIDS) EventSpecificData)->method_id <= 999 ) 245e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 246e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 247e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!threadStack) 248e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* Error: first report in this thread is method exit */ 250e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org exit (1); 251e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ((piJIT_Method_NIDS) EventSpecificData)->stack_id = ++(threadStack->CurrentStack) + 1; 254e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 255e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (((piJIT_Method_NIDS) EventSpecificData)->stack_id > threadStack->TopStack) 256e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ((piJIT_Method_NIDS) EventSpecificData)->stack_id = (unsigned int)-1; 257e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 258e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 259e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED) 260e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 261e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // check for use of reserved method IDs 262e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ( ((piJIT_Method_Load) EventSpecificData)->method_id <= 999 ) 263e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 265e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 2665c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org ReturnValue = (int)FUNC_NotifyEvent(event_type, EventSpecificData); 267e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return ReturnValue; 269e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 270e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgITT_EXTERN_C void JITAPI iJIT_RegisterCallbackEx(void *userdata, iJIT_ModeChangedEx NewModeCallBackFuncEx) // The new mode call back routine 272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // is it already missing... or the load of functions from the DLL failed 274e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (iJIT_DLL_is_missing || !loadiJIT_Funcs()) 275e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org NewModeCallBackFuncEx(userdata, iJIT_NO_NOTIFICATIONS); // then do not bother with notifications 277e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* Error: could not load JIT functions. */ 278e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return; 279e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 280e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // nothing to do with the callback 281e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 282e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 283e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* 284e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** This function allows the user to query in which mode, if at all, VTune is running 285e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 286e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgITT_EXTERN_C iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive() 287e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 288e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!iJIT_DLL_is_missing) 289e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 290e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org loadiJIT_Funcs(); 291e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 292e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 293e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return executionMode; 294e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 295e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <stdio.h> 296e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* this function loads the collector dll (BistroJavaCollector) and the relevant functions. 297e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** on success: all functions load, iJIT_DLL_is_missing = 0, return value = 1. 298e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** on failure: all functions are NULL, iJIT_DLL_is_missing = 1, return value = 0. 2995c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org*/ 300e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic int loadiJIT_Funcs() 301e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 302e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static int bDllWasLoaded = 0; 303e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org char *dllName = (char*)rcsid; // !!! Just to avoid unused code elimination !!! 304e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 305e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DWORD dNameLength = 0; 306e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 307e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 308e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if(bDllWasLoaded) 309e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org {// dll was already loaded, no need to do it for the second time 310e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 1; 311e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 312e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 313e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Assumes that the DLL will not be found 314e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org iJIT_DLL_is_missing = 1; 315e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_NotifyEvent = NULL; 316e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 3175c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (m_libHandle) 318e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 319e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 320e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FreeLibrary(m_libHandle); 321e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 322e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dlclose(m_libHandle); 323e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 324e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = NULL; 325e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 326e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 327e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // try to get the dll name from the environment 328e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 329e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dNameLength = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, NULL, 0); 330e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (dNameLength) 331e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 332e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DWORD envret = 0; 333e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dllName = (char*)malloc(sizeof(char) * (dNameLength + 1)); 334e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org envret = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, dllName, dNameLength); 335e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (envret) 336e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 337e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Try to load the dll from the PATH... 338e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = LoadLibraryExA(dllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 339e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 340e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org free(dllName); 341e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } else { 342e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Try to use old VS_PROFILER variable 343e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dNameLength = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, NULL, 0); 344e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (dNameLength) 345e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 346e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org DWORD envret = 0; 347e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dllName = (char*)malloc(sizeof(char) * (dNameLength + 1)); 348e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org envret = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, dllName, dNameLength); 349e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (envret) 350e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 351e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Try to load the dll from the PATH... 352e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = LoadLibraryA(dllName); 353e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 354e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org free(dllName); 355e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 356e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 357e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 358e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dllName = getenv(NEW_DLL_ENVIRONMENT_VAR); 359e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!dllName) { 360e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dllName = getenv(DLL_ENVIRONMENT_VAR); 361e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 362e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef ANDROID 363e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!dllName) 364e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dllName = ANDROID_JIT_AGENT_PATH; 365e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 366e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (dllName) 367e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 368e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Try to load the dll from the PATH... 369e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = dlopen(dllName, RTLD_LAZY); 370e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 371e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 372e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 373e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!m_libHandle) 374e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 375e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 376e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = LoadLibraryA(DEFAULT_DLLNAME); 377e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 378e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = dlopen(DEFAULT_DLLNAME, RTLD_LAZY); 379e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 380e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 381e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 382e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // if the dll wasn't loaded - exit. 383e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!m_libHandle) 384e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 385e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org iJIT_DLL_is_missing = 1; // don't try to initialize JIT agent the second time 386e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 387e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 388e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 389e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_NotifyEvent = (TPNotify)GetProcAddress(m_libHandle, "NotifyEvent"); 390e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 391e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_NotifyEvent = reinterpret_cast<TPNotify>(reinterpret_cast<intptr_t>(dlsym(m_libHandle, "NotifyEvent"))); 392e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 3935c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!FUNC_NotifyEvent) 394e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 395e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_Initialize = NULL; 396e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 397e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 398e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 399e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 400e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_Initialize = (TPInitialize)GetProcAddress(m_libHandle, "Initialize"); 401e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 402e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_Initialize = reinterpret_cast<TPInitialize>(reinterpret_cast<intptr_t>(dlsym(m_libHandle, "Initialize"))); 403e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 4045c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (!FUNC_Initialize) 405e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 406e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FUNC_NotifyEvent = NULL; 407e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; 408e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 409e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 410e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org executionMode = (iJIT_IsProfilingActiveFlags)FUNC_Initialize(); 411e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (executionMode != iJIT_SAMPLING_ON) 412e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org executionMode = iJIT_SAMPLING_ON; 413e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 414e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org bDllWasLoaded = 1; 415e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org iJIT_DLL_is_missing = 0; // DLL is ok. 416e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 417e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /* 418e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** Call Graph mode: init the thread local storage 419e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org ** (need to store the virtual stack there). 420e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org */ 421e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ( executionMode == iJIT_CALLGRAPH_ON ) 422e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 423e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Allocate a thread local storage slot for the thread "stack" 424e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (!threadLocalStorageHandle) 425e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 426e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org threadLocalStorageHandle = TlsAlloc(); 427e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 428e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pthread_key_create(&threadLocalStorageHandle, NULL); 429e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 430e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 431e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 432e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 1; 433e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 434e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 435e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* 4365c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org** This function should be called by the user whenever a thread ends, to free the thread 437e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** "virtual stack" storage 438e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 439e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgITT_EXTERN_C void JITAPI FinalizeThread() 440e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 441e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (threadLocalStorageHandle) 442e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 443e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 444e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pThreadStack threadStack = (pThreadStack)TlsGetValue (threadLocalStorageHandle); 445e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 446e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pThreadStack threadStack = (pThreadStack)pthread_getspecific(threadLocalStorageHandle); 447e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 448e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (threadStack) 449e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 450e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org free (threadStack); 451e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org threadStack = NULL; 452e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 453e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org TlsSetValue (threadLocalStorageHandle, threadStack); 454e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 455e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pthread_setspecific(threadLocalStorageHandle, threadStack); 456e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 457e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 458e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 459e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 461e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* 462e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** This function should be called by the user when the process ends, to free the local 463e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** storage index 464e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 465e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgITT_EXTERN_C void JITAPI FinalizeProcess() 466e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 4675c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org if (m_libHandle) 468e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org { 469e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 470e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org FreeLibrary(m_libHandle); 471e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 472e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org dlclose(m_libHandle); 473e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 474e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org m_libHandle = NULL; 475e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 476e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 477e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (threadLocalStorageHandle) 478e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#if ITT_PLATFORM==ITT_PLATFORM_WIN 479e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org TlsFree (threadLocalStorageHandle); 480e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 481e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pthread_key_delete(threadLocalStorageHandle); 482e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */ 483e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 484e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 485e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org/* 486e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** This function should be called by the user for any method once. 4875c88bc39690cc94affe78cf5777eb8180c4af8a4machenbach@chromium.org** The function will return a unique method ID, the user should maintain the ID for each 488e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org** method 489e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org*/ 490e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgITT_EXTERN_C unsigned int JITAPI iJIT_GetNewMethodID() 491e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org{ 492e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static unsigned int methodID = 0x100000; 493e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 494e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (methodID == 0) 495e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0; // ERROR : this is not a valid value 496e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 497e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return methodID++; 498e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 499e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 500