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