Intel VTune integration for V8/d8
In this patch, we added the JIT code event handler for Vtune. Most of the code is in the folder src/third_party/vtune. Two APIs are added in include/v8.h to get the requirement info from V8. We add the v8_enable_vtunejit parameter for GYP to enable these Vtune code compilation. vTune::InitilizeVtuneForV8() is invoked in the embedder of V8 to make sure it's invokded if vtune support is enabled. Review URL: https://codereview.chromium.org/11574031 Patch from Chunyang Dai <chunyang.dai@intel.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14253 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
5206b08451
commit
f5b660ac97
8
Makefile
8
Makefile
@ -83,6 +83,10 @@ endif
|
||||
ifeq ($(gdbjit), on)
|
||||
GYPFLAGS += -Dv8_enable_gdbjit=1
|
||||
endif
|
||||
# vtunejit=on
|
||||
ifeq ($(vtunejit), on)
|
||||
GYPFLAGS += -Dv8_enable_vtunejit=1
|
||||
endif
|
||||
# vfp2=off
|
||||
ifeq ($(vfp2), off)
|
||||
GYPFLAGS += -Dv8_can_use_vfp2_instructions=false
|
||||
@ -155,6 +159,10 @@ GYPFILES = build/all.gyp build/common.gypi build/standalone.gypi \
|
||||
preparser/preparser.gyp samples/samples.gyp src/d8.gyp \
|
||||
test/cctest/cctest.gyp tools/gyp/v8.gyp
|
||||
|
||||
# If vtunejit=on, the v8vtune.gyp will be appended.
|
||||
ifeq ($(vtunejit), on)
|
||||
GYPFILES += src/third_party/vtune/v8vtune.gyp
|
||||
endif
|
||||
# Generates all combinations of ARCHES and MODES, e.g. "ia32.release".
|
||||
BUILDS = $(foreach mode,$(MODES),$(addsuffix .$(mode),$(ARCHES)))
|
||||
ANDROID_BUILDS = $(foreach mode,$(MODES), \
|
||||
|
11
include/v8.h
11
include/v8.h
@ -788,6 +788,17 @@ class V8EXPORT Script {
|
||||
* debugger API.
|
||||
*/
|
||||
void SetData(Handle<String> data);
|
||||
|
||||
/**
|
||||
* Returns the name value of one Script.
|
||||
*/
|
||||
Handle<Value> GetScriptName();
|
||||
|
||||
/**
|
||||
* Returns zero based line number of the code_pos location in the script.
|
||||
* -1 will be returned if no information available.
|
||||
*/
|
||||
int GetLineNumber(int code_pos);
|
||||
};
|
||||
|
||||
|
||||
|
28
src/api.cc
28
src/api.cc
@ -1852,6 +1852,34 @@ Local<Value> Script::Id() {
|
||||
}
|
||||
|
||||
|
||||
int Script::GetLineNumber(int code_pos) {
|
||||
i::Isolate* isolate = i::Isolate::Current();
|
||||
ON_BAILOUT(isolate, "v8::Script::GetLineNumber()", return -1);
|
||||
LOG_API(isolate, "Script::GetLineNumber");
|
||||
i::Handle<i::Object> obj = Utils::OpenHandle(this);
|
||||
if (obj->IsScript()) {
|
||||
i::Handle<i::Script> script = i::Handle<i::Script>(i::Script::cast(*obj));
|
||||
return i::GetScriptLineNumber(script, code_pos);
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Handle<Value> Script::GetScriptName() {
|
||||
i::Isolate* isolate = i::Isolate::Current();
|
||||
ON_BAILOUT(isolate, "v8::Script::GetName()", return Handle<String>());
|
||||
LOG_API(isolate, "Script::GetName");
|
||||
i::Handle<i::Object> obj = Utils::OpenHandle(this);
|
||||
if (obj->IsScript()) {
|
||||
i::Object* name = i::Script::cast(*obj)->name();
|
||||
return Utils::ToLocal(i::Handle<i::Object>(name, isolate));
|
||||
} else {
|
||||
return Handle<String>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Script::SetData(v8::Handle<String> data) {
|
||||
i::Isolate* isolate = i::Isolate::Current();
|
||||
ON_BAILOUT(isolate, "v8::Script::SetData()", return);
|
||||
|
@ -45,6 +45,10 @@
|
||||
#include "../include/v8-testing.h"
|
||||
#endif // V8_SHARED
|
||||
|
||||
#ifdef ENABLE_VTUNE_JIT_INTERFACE
|
||||
#include "third_party/vtune/v8-vtune.h"
|
||||
#endif
|
||||
|
||||
#include "d8.h"
|
||||
|
||||
#ifndef V8_SHARED
|
||||
@ -1926,6 +1930,9 @@ int Shell::Main(int argc, char* argv[]) {
|
||||
DumbLineEditor dumb_line_editor(isolate);
|
||||
{
|
||||
Initialize(isolate);
|
||||
#ifdef ENABLE_VTUNE_JIT_INTERFACE
|
||||
vTune::InitilizeVtuneForV8();
|
||||
#endif
|
||||
Symbols symbols(isolate);
|
||||
InitializeDebugger(isolate);
|
||||
|
||||
|
@ -29,6 +29,8 @@
|
||||
'includes': ['../build/common.gypi'],
|
||||
'variables': {
|
||||
'console%': '',
|
||||
# Enable support for Intel VTune. Supported on ia32/x64 only
|
||||
'v8_enable_vtunejit%': 0,
|
||||
},
|
||||
'targets': [
|
||||
{
|
||||
@ -70,6 +72,11 @@
|
||||
}],
|
||||
],
|
||||
}],
|
||||
['v8_enable_vtunejit==1', {
|
||||
'dependencies': [
|
||||
'../src/third_party/vtune/v8vtune.gyp:v8_vtune',
|
||||
],
|
||||
}],
|
||||
],
|
||||
},
|
||||
{
|
||||
|
484
src/third_party/vtune/ittnotify_config.h
vendored
Normal file
484
src/third_party/vtune/ittnotify_config.h
vendored
Normal file
@ -0,0 +1,484 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef _ITTNOTIFY_CONFIG_H_
|
||||
#define _ITTNOTIFY_CONFIG_H_
|
||||
|
||||
/** @cond exclude_from_documentation */
|
||||
#ifndef ITT_OS_WIN
|
||||
# define ITT_OS_WIN 1
|
||||
#endif /* ITT_OS_WIN */
|
||||
|
||||
#ifndef ITT_OS_LINUX
|
||||
# define ITT_OS_LINUX 2
|
||||
#endif /* ITT_OS_LINUX */
|
||||
|
||||
#ifndef ITT_OS_MAC
|
||||
# define ITT_OS_MAC 3
|
||||
#endif /* ITT_OS_MAC */
|
||||
|
||||
#ifndef ITT_OS
|
||||
# if defined WIN32 || defined _WIN32
|
||||
# define ITT_OS ITT_OS_WIN
|
||||
# elif defined( __APPLE__ ) && defined( __MACH__ )
|
||||
# define ITT_OS ITT_OS_MAC
|
||||
# else
|
||||
# define ITT_OS ITT_OS_LINUX
|
||||
# endif
|
||||
#endif /* ITT_OS */
|
||||
|
||||
#ifndef ITT_PLATFORM_WIN
|
||||
# define ITT_PLATFORM_WIN 1
|
||||
#endif /* ITT_PLATFORM_WIN */
|
||||
|
||||
#ifndef ITT_PLATFORM_POSIX
|
||||
# define ITT_PLATFORM_POSIX 2
|
||||
#endif /* ITT_PLATFORM_POSIX */
|
||||
|
||||
#ifndef ITT_PLATFORM
|
||||
# if ITT_OS==ITT_OS_WIN
|
||||
# define ITT_PLATFORM ITT_PLATFORM_WIN
|
||||
# else
|
||||
# define ITT_PLATFORM ITT_PLATFORM_POSIX
|
||||
# endif /* _WIN32 */
|
||||
#endif /* ITT_PLATFORM */
|
||||
|
||||
#if defined(_UNICODE) && !defined(UNICODE)
|
||||
#define UNICODE
|
||||
#endif
|
||||
|
||||
#include <stddef.h>
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
#include <tchar.h>
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#include <stdint.h>
|
||||
#if defined(UNICODE) || defined(_UNICODE)
|
||||
#include <wchar.h>
|
||||
#endif /* UNICODE || _UNICODE */
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
#ifndef CDECL
|
||||
# if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
# define CDECL __cdecl
|
||||
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
|
||||
# define CDECL /* not actual on x86_64 platform */
|
||||
# else /* _M_X64 || _M_AMD64 || __x86_64__ */
|
||||
# define CDECL __attribute__ ((cdecl))
|
||||
# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
|
||||
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#endif /* CDECL */
|
||||
|
||||
#ifndef STDCALL
|
||||
# if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
# define STDCALL __stdcall
|
||||
# else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
|
||||
# define STDCALL /* not supported on x86_64 platform */
|
||||
# else /* _M_X64 || _M_AMD64 || __x86_64__ */
|
||||
# define STDCALL __attribute__ ((stdcall))
|
||||
# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
|
||||
# endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#endif /* STDCALL */
|
||||
|
||||
#define ITTAPI CDECL
|
||||
#define LIBITTAPI CDECL
|
||||
|
||||
/* TODO: Temporary for compatibility! */
|
||||
#define ITTAPI_CALL CDECL
|
||||
#define LIBITTAPI_CALL CDECL
|
||||
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
/* use __forceinline (VC++ specific) */
|
||||
#define ITT_INLINE __forceinline
|
||||
#define ITT_INLINE_ATTRIBUTE /* nothing */
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
/*
|
||||
* Generally, functions are not inlined unless optimization is specified.
|
||||
* For functions declared inline, this attribute inlines the function even
|
||||
* if no optimization level was specified.
|
||||
*/
|
||||
#ifdef __STRICT_ANSI__
|
||||
#define ITT_INLINE static
|
||||
#else /* __STRICT_ANSI__ */
|
||||
#define ITT_INLINE static inline
|
||||
#endif /* __STRICT_ANSI__ */
|
||||
#define ITT_INLINE_ATTRIBUTE __attribute__ ((always_inline))
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
/** @endcond */
|
||||
|
||||
#ifndef ITT_ARCH_IA32
|
||||
# define ITT_ARCH_IA32 1
|
||||
#endif /* ITT_ARCH_IA32 */
|
||||
|
||||
#ifndef ITT_ARCH_IA32E
|
||||
# define ITT_ARCH_IA32E 2
|
||||
#endif /* ITT_ARCH_IA32E */
|
||||
|
||||
#ifndef ITT_ARCH_IA64
|
||||
# define ITT_ARCH_IA64 3
|
||||
#endif /* ITT_ARCH_IA64 */
|
||||
|
||||
#ifndef ITT_ARCH
|
||||
# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
|
||||
# define ITT_ARCH ITT_ARCH_IA32E
|
||||
# elif defined _M_IA64 || defined __ia64
|
||||
# define ITT_ARCH ITT_ARCH_IA64
|
||||
# else
|
||||
# define ITT_ARCH ITT_ARCH_IA32
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
# define ITT_EXTERN_C extern "C"
|
||||
#else
|
||||
# define ITT_EXTERN_C /* nothing */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define ITT_TO_STR_AUX(x) #x
|
||||
#define ITT_TO_STR(x) ITT_TO_STR_AUX(x)
|
||||
|
||||
#define __ITT_BUILD_ASSERT(expr, suffix) do { static char __itt_build_check_##suffix[(expr) ? 1 : -1]; __itt_build_check_##suffix[0] = 0; } while(0)
|
||||
#define _ITT_BUILD_ASSERT(expr, suffix) __ITT_BUILD_ASSERT((expr), suffix)
|
||||
#define ITT_BUILD_ASSERT(expr) _ITT_BUILD_ASSERT((expr), __LINE__)
|
||||
|
||||
#define ITT_MAGIC { 0xED, 0xAB, 0xAB, 0xEC, 0x0D, 0xEE, 0xDA, 0x30 }
|
||||
|
||||
/* Replace with snapshot date YYYYMMDD for promotion build. */
|
||||
#define API_VERSION_BUILD 20111111
|
||||
|
||||
#ifndef API_VERSION_NUM
|
||||
#define API_VERSION_NUM 0.0.0
|
||||
#endif /* API_VERSION_NUM */
|
||||
|
||||
#define API_VERSION "ITT-API-Version " ITT_TO_STR(API_VERSION_NUM) " (" ITT_TO_STR(API_VERSION_BUILD) ")"
|
||||
|
||||
/* OS communication functions */
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
#include <windows.h>
|
||||
typedef HMODULE lib_t;
|
||||
typedef DWORD TIDT;
|
||||
typedef CRITICAL_SECTION mutex_t;
|
||||
#define MUTEX_INITIALIZER { 0 }
|
||||
#define strong_alias(name, aliasname) /* empty for Windows */
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#include <dlfcn.h>
|
||||
#if defined(UNICODE) || defined(_UNICODE)
|
||||
#include <wchar.h>
|
||||
#endif /* UNICODE */
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE 1 /* need for PTHREAD_MUTEX_RECURSIVE */
|
||||
#endif /* _GNU_SOURCE */
|
||||
#include <pthread.h>
|
||||
typedef void* lib_t;
|
||||
typedef pthread_t TIDT;
|
||||
typedef pthread_mutex_t mutex_t;
|
||||
#define MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
#define _strong_alias(name, aliasname) extern __typeof (name) aliasname __attribute__ ((alias (#name)));
|
||||
#define strong_alias(name, aliasname) _strong_alias(name, aliasname)
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
#define __itt_get_proc(lib, name) GetProcAddress(lib, name)
|
||||
#define __itt_mutex_init(mutex) InitializeCriticalSection(mutex)
|
||||
#define __itt_mutex_lock(mutex) EnterCriticalSection(mutex)
|
||||
#define __itt_mutex_unlock(mutex) LeaveCriticalSection(mutex)
|
||||
#define __itt_load_lib(name) LoadLibraryA(name)
|
||||
#define __itt_unload_lib(handle) FreeLibrary(handle)
|
||||
#define __itt_system_error() (int)GetLastError()
|
||||
#define __itt_fstrcmp(s1, s2) lstrcmpA(s1, s2)
|
||||
#define __itt_fstrlen(s) lstrlenA(s)
|
||||
#define __itt_fstrcpyn(s1, s2, l) lstrcpynA(s1, s2, l)
|
||||
#define __itt_fstrdup(s) _strdup(s)
|
||||
#define __itt_thread_id() GetCurrentThreadId()
|
||||
#define __itt_thread_yield() SwitchToThread()
|
||||
#ifndef ITT_SIMPLE_INIT
|
||||
ITT_INLINE int __itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
|
||||
ITT_INLINE int __itt_interlocked_increment(volatile long* ptr)
|
||||
{
|
||||
return InterlockedIncrement(ptr);
|
||||
}
|
||||
#endif /* ITT_SIMPLE_INIT */
|
||||
#else /* ITT_PLATFORM!=ITT_PLATFORM_WIN */
|
||||
#define __itt_get_proc(lib, name) dlsym(lib, name)
|
||||
#define __itt_mutex_init(mutex) \
|
||||
{ \
|
||||
pthread_mutexattr_t mutex_attr; \
|
||||
int error_code = pthread_mutexattr_init(&mutex_attr); \
|
||||
if (error_code) \
|
||||
__itt_report_error(__itt_error_system, "pthread_mutexattr_init", error_code); \
|
||||
error_code = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE); \
|
||||
if (error_code) \
|
||||
__itt_report_error(__itt_error_system, "pthread_mutexattr_settype", error_code); \
|
||||
error_code = pthread_mutex_init(mutex, &mutex_attr); \
|
||||
if (error_code) \
|
||||
__itt_report_error(__itt_error_system, "pthread_mutex_init", error_code); \
|
||||
error_code = pthread_mutexattr_destroy(&mutex_attr); \
|
||||
if (error_code) \
|
||||
__itt_report_error(__itt_error_system, "pthread_mutexattr_destroy", error_code); \
|
||||
}
|
||||
#define __itt_mutex_lock(mutex) pthread_mutex_lock(mutex)
|
||||
#define __itt_mutex_unlock(mutex) pthread_mutex_unlock(mutex)
|
||||
#define __itt_load_lib(name) dlopen(name, RTLD_LAZY)
|
||||
#define __itt_unload_lib(handle) dlclose(handle)
|
||||
#define __itt_system_error() errno
|
||||
#define __itt_fstrcmp(s1, s2) strcmp(s1, s2)
|
||||
#define __itt_fstrlen(s) strlen(s)
|
||||
#define __itt_fstrcpyn(s1, s2, l) strncpy(s1, s2, l)
|
||||
#define __itt_fstrdup(s) strdup(s)
|
||||
#define __itt_thread_id() pthread_self()
|
||||
#define __itt_thread_yield() sched_yield()
|
||||
#if ITT_ARCH==ITT_ARCH_IA64
|
||||
#ifdef __INTEL_COMPILER
|
||||
#define __TBB_machine_fetchadd4(addr, val) __fetchadd4_acq((void *)addr, val)
|
||||
#else /* __INTEL_COMPILER */
|
||||
/* TODO: Add Support for not Intel compilers for IA64 */
|
||||
#endif /* __INTEL_COMPILER */
|
||||
#else /* ITT_ARCH!=ITT_ARCH_IA64 */
|
||||
/*ITT_INLINE int __TBB_machine_fetchadd4(volatile void* ptr, long addend) ITT_INLINE_ATTRIBUTE;
|
||||
ITT_INLINE int __TBB_machine_fetchadd4(volatile void* ptr, long addend)
|
||||
{
|
||||
int result;
|
||||
__asm__ __volatile__("lock\nxaddl %0,%1"
|
||||
: "=r"(result),"=m"(*(long*)ptr)
|
||||
: "0"(addend), "m"(*(long*)ptr)
|
||||
: "memory");
|
||||
return result;
|
||||
}
|
||||
*/
|
||||
#endif /* ITT_ARCH==ITT_ARCH_IA64 */
|
||||
#ifndef ITT_SIMPLE_INIT
|
||||
/*ITT_INLINE int __itt_interlocked_increment(volatile long* ptr) ITT_INLINE_ATTRIBUTE;
|
||||
ITT_INLINE int __itt_interlocked_increment(volatile long* ptr)
|
||||
{
|
||||
return __TBB_machine_fetchadd4(ptr, 1) + 1;
|
||||
}
|
||||
*/
|
||||
#endif /* ITT_SIMPLE_INIT */
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
typedef enum {
|
||||
__itt_collection_normal = 0,
|
||||
__itt_collection_paused = 1
|
||||
} __itt_collection_state;
|
||||
|
||||
typedef enum {
|
||||
__itt_thread_normal = 0,
|
||||
__itt_thread_ignored = 1
|
||||
} __itt_thread_state;
|
||||
|
||||
#pragma pack(push, 8)
|
||||
|
||||
typedef struct ___itt_thread_info
|
||||
{
|
||||
const char* nameA; /*!< Copy of original name in ASCII. */
|
||||
#if defined(UNICODE) || defined(_UNICODE)
|
||||
const wchar_t* nameW; /*!< Copy of original name in UNICODE. */
|
||||
#else /* UNICODE || _UNICODE */
|
||||
void* nameW;
|
||||
#endif /* UNICODE || _UNICODE */
|
||||
TIDT tid;
|
||||
__itt_thread_state state; /*!< Thread state (paused or normal) */
|
||||
int extra1; /*!< Reserved to the runtime */
|
||||
void* extra2; /*!< Reserved to the runtime */
|
||||
struct ___itt_thread_info* next;
|
||||
} __itt_thread_info;
|
||||
|
||||
#include "ittnotify_types.h" /* For __itt_group_id definition */
|
||||
|
||||
typedef struct ___itt_api_info_20101001
|
||||
{
|
||||
const char* name;
|
||||
void** func_ptr;
|
||||
void* init_func;
|
||||
__itt_group_id group;
|
||||
} __itt_api_info_20101001;
|
||||
|
||||
typedef struct ___itt_api_info
|
||||
{
|
||||
const char* name;
|
||||
void** func_ptr;
|
||||
void* init_func;
|
||||
void* null_func;
|
||||
__itt_group_id group;
|
||||
} __itt_api_info;
|
||||
|
||||
struct ___itt_domain;
|
||||
struct ___itt_string_handle;
|
||||
|
||||
typedef struct ___itt_global
|
||||
{
|
||||
unsigned char magic[8];
|
||||
unsigned long version_major;
|
||||
unsigned long version_minor;
|
||||
unsigned long version_build;
|
||||
volatile long api_initialized;
|
||||
volatile long mutex_initialized;
|
||||
volatile long atomic_counter;
|
||||
mutex_t mutex;
|
||||
lib_t lib;
|
||||
void* error_handler;
|
||||
const char** dll_path_ptr;
|
||||
__itt_api_info* api_list_ptr;
|
||||
struct ___itt_global* next;
|
||||
/* Joinable structures below */
|
||||
__itt_thread_info* thread_list;
|
||||
struct ___itt_domain* domain_list;
|
||||
struct ___itt_string_handle* string_list;
|
||||
__itt_collection_state state;
|
||||
} __itt_global;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#define NEW_THREAD_INFO_W(gptr,h,h_tail,t,s,n) { \
|
||||
h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
|
||||
if (h != NULL) { \
|
||||
h->tid = t; \
|
||||
h->nameA = NULL; \
|
||||
h->nameW = n ? _wcsdup(n) : NULL; \
|
||||
h->state = s; \
|
||||
h->extra1 = 0; /* reserved */ \
|
||||
h->extra2 = NULL; /* reserved */ \
|
||||
h->next = NULL; \
|
||||
if (h_tail == NULL) \
|
||||
(gptr)->thread_list = h; \
|
||||
else \
|
||||
h_tail->next = h; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define NEW_THREAD_INFO_A(gptr,h,h_tail,t,s,n) { \
|
||||
h = (__itt_thread_info*)malloc(sizeof(__itt_thread_info)); \
|
||||
if (h != NULL) { \
|
||||
h->tid = t; \
|
||||
h->nameA = n ? __itt_fstrdup(n) : NULL; \
|
||||
h->nameW = NULL; \
|
||||
h->state = s; \
|
||||
h->extra1 = 0; /* reserved */ \
|
||||
h->extra2 = NULL; /* reserved */ \
|
||||
h->next = NULL; \
|
||||
if (h_tail == NULL) \
|
||||
(gptr)->thread_list = h; \
|
||||
else \
|
||||
h_tail->next = h; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define NEW_DOMAIN_W(gptr,h,h_tail,name) { \
|
||||
h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
|
||||
if (h != NULL) { \
|
||||
h->flags = 0; /* domain is disabled by default */ \
|
||||
h->nameA = NULL; \
|
||||
h->nameW = name ? _wcsdup(name) : NULL; \
|
||||
h->extra1 = 0; /* reserved */ \
|
||||
h->extra2 = NULL; /* reserved */ \
|
||||
h->next = NULL; \
|
||||
if (h_tail == NULL) \
|
||||
(gptr)->domain_list = h; \
|
||||
else \
|
||||
h_tail->next = h; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define NEW_DOMAIN_A(gptr,h,h_tail,name) { \
|
||||
h = (__itt_domain*)malloc(sizeof(__itt_domain)); \
|
||||
if (h != NULL) { \
|
||||
h->flags = 0; /* domain is disabled by default */ \
|
||||
h->nameA = name ? __itt_fstrdup(name) : NULL; \
|
||||
h->nameW = NULL; \
|
||||
h->extra1 = 0; /* reserved */ \
|
||||
h->extra2 = NULL; /* reserved */ \
|
||||
h->next = NULL; \
|
||||
if (h_tail == NULL) \
|
||||
(gptr)->domain_list = h; \
|
||||
else \
|
||||
h_tail->next = h; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define NEW_STRING_HANDLE_W(gptr,h,h_tail,name) { \
|
||||
h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
|
||||
if (h != NULL) { \
|
||||
h->strA = NULL; \
|
||||
h->strW = name ? _wcsdup(name) : NULL; \
|
||||
h->extra1 = 0; /* reserved */ \
|
||||
h->extra2 = NULL; /* reserved */ \
|
||||
h->next = NULL; \
|
||||
if (h_tail == NULL) \
|
||||
(gptr)->string_list = h; \
|
||||
else \
|
||||
h_tail->next = h; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define NEW_STRING_HANDLE_A(gptr,h,h_tail,name) { \
|
||||
h = (__itt_string_handle*)malloc(sizeof(__itt_string_handle)); \
|
||||
if (h != NULL) { \
|
||||
h->strA = name ? __itt_fstrdup(name) : NULL; \
|
||||
h->strW = NULL; \
|
||||
h->extra1 = 0; /* reserved */ \
|
||||
h->extra2 = NULL; /* reserved */ \
|
||||
h->next = NULL; \
|
||||
if (h_tail == NULL) \
|
||||
(gptr)->string_list = h; \
|
||||
else \
|
||||
h_tail->next = h; \
|
||||
} \
|
||||
}
|
||||
|
||||
#endif /* _ITTNOTIFY_CONFIG_H_ */
|
||||
|
113
src/third_party/vtune/ittnotify_types.h
vendored
Normal file
113
src/third_party/vtune/ittnotify_types.h
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef _ITTNOTIFY_TYPES_H_
|
||||
#define _ITTNOTIFY_TYPES_H_
|
||||
|
||||
typedef enum ___itt_group_id
|
||||
{
|
||||
__itt_group_none = 0,
|
||||
__itt_group_legacy = 1<<0,
|
||||
__itt_group_control = 1<<1,
|
||||
__itt_group_thread = 1<<2,
|
||||
__itt_group_mark = 1<<3,
|
||||
__itt_group_sync = 1<<4,
|
||||
__itt_group_fsync = 1<<5,
|
||||
__itt_group_jit = 1<<6,
|
||||
__itt_group_model = 1<<7,
|
||||
__itt_group_splitter_min = 1<<7,
|
||||
__itt_group_counter = 1<<8,
|
||||
__itt_group_frame = 1<<9,
|
||||
__itt_group_stitch = 1<<10,
|
||||
__itt_group_heap = 1<<11,
|
||||
__itt_group_splitter_max = 1<<12,
|
||||
__itt_group_structure = 1<<12,
|
||||
__itt_group_suppress = 1<<13,
|
||||
__itt_group_all = -1
|
||||
} __itt_group_id;
|
||||
|
||||
#pragma pack(push, 8)
|
||||
|
||||
typedef struct ___itt_group_list
|
||||
{
|
||||
__itt_group_id id;
|
||||
const char* name;
|
||||
} __itt_group_list;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
#define ITT_GROUP_LIST(varname) \
|
||||
static __itt_group_list varname[] = { \
|
||||
{ __itt_group_all, "all" }, \
|
||||
{ __itt_group_control, "control" }, \
|
||||
{ __itt_group_thread, "thread" }, \
|
||||
{ __itt_group_mark, "mark" }, \
|
||||
{ __itt_group_sync, "sync" }, \
|
||||
{ __itt_group_fsync, "fsync" }, \
|
||||
{ __itt_group_jit, "jit" }, \
|
||||
{ __itt_group_model, "model" }, \
|
||||
{ __itt_group_counter, "counter" }, \
|
||||
{ __itt_group_frame, "frame" }, \
|
||||
{ __itt_group_stitch, "stitch" }, \
|
||||
{ __itt_group_heap, "heap" }, \
|
||||
{ __itt_group_structure, "structure" }, \
|
||||
{ __itt_group_suppress, "suppress" }, \
|
||||
{ __itt_group_none, NULL } \
|
||||
}
|
||||
|
||||
#endif /* _ITTNOTIFY_TYPES_H_ */
|
||||
|
499
src/third_party/vtune/jitprofiling.cc
vendored
Normal file
499
src/third_party/vtune/jitprofiling.cc
vendored
Normal file
@ -0,0 +1,499 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include "ittnotify_config.h"
|
||||
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
#include <windows.h>
|
||||
#pragma optimize("", off)
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#include <pthread.h>
|
||||
#include <dlfcn.h>
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "jitprofiling.h"
|
||||
|
||||
static const char rcsid[] = "\n@(#) $Revision: 234474 $\n";
|
||||
|
||||
#define DLL_ENVIRONMENT_VAR "VS_PROFILER"
|
||||
|
||||
#ifndef NEW_DLL_ENVIRONMENT_VAR
|
||||
#if ITT_ARCH==ITT_ARCH_IA32
|
||||
#define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER32"
|
||||
#else
|
||||
#define NEW_DLL_ENVIRONMENT_VAR "INTEL_JIT_PROFILER64"
|
||||
#endif
|
||||
#endif /* NEW_DLL_ENVIRONMENT_VAR */
|
||||
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
#define DEFAULT_DLLNAME "JitPI.dll"
|
||||
HINSTANCE m_libHandle = NULL;
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
#define DEFAULT_DLLNAME "libJitPI.so"
|
||||
void* m_libHandle = NULL;
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
/* default location of JIT profiling agent on Android */
|
||||
#define ANDROID_JIT_AGENT_PATH "/data/intel/libittnotify.so"
|
||||
|
||||
/* the function pointers */
|
||||
typedef unsigned int(*TPInitialize)(void);
|
||||
static TPInitialize FUNC_Initialize=NULL;
|
||||
|
||||
typedef unsigned int(*TPNotify)(unsigned int, void*);
|
||||
static TPNotify FUNC_NotifyEvent=NULL;
|
||||
|
||||
static iJIT_IsProfilingActiveFlags executionMode = iJIT_NOTHING_RUNNING;
|
||||
|
||||
/* end collector dll part. */
|
||||
|
||||
/* loadiJIT_Funcs() : this function is called just in the beginning and is responsible
|
||||
** to load the functions from BistroJavaCollector.dll
|
||||
** result:
|
||||
** on success: the functions loads, iJIT_DLL_is_missing=0, return value = 1.
|
||||
** on failure: the functions are NULL, iJIT_DLL_is_missing=1, return value = 0.
|
||||
*/
|
||||
static int loadiJIT_Funcs(void);
|
||||
|
||||
/* global representing whether the BistroJavaCollector can't be loaded */
|
||||
static int iJIT_DLL_is_missing = 0;
|
||||
|
||||
/* Virtual stack - the struct is used as a virtual stack for each thread.
|
||||
** Every thread initializes with a stack of size INIT_TOP_STACK.
|
||||
** Every method entry decreases from the current stack point,
|
||||
** and when a thread stack reaches its top of stack (return from the global function),
|
||||
** the top of stack and the current stack increase. Notice that when returning from a function
|
||||
** the stack pointer is the address of the function return.
|
||||
*/
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
static DWORD threadLocalStorageHandle = 0;
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
static pthread_key_t threadLocalStorageHandle = (pthread_key_t)0;
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
#define INIT_TOP_Stack 10000
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int TopStack;
|
||||
unsigned int CurrentStack;
|
||||
} ThreadStack, *pThreadStack;
|
||||
|
||||
/* end of virtual stack. */
|
||||
|
||||
/*
|
||||
** The function for reporting virtual-machine related events to VTune.
|
||||
** Note: when reporting iJVM_EVENT_TYPE_ENTER_NIDS, there is no need to fill in the stack_id
|
||||
** field in the iJIT_Method_NIDS structure, as VTune fills it.
|
||||
**
|
||||
** The return value in iJVM_EVENT_TYPE_ENTER_NIDS && iJVM_EVENT_TYPE_LEAVE_NIDS events
|
||||
** will be 0 in case of failure.
|
||||
** in iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED event it will be -1 if EventSpecificData == 0
|
||||
** otherwise it will be 0.
|
||||
*/
|
||||
|
||||
ITT_EXTERN_C int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData)
|
||||
{
|
||||
int ReturnValue;
|
||||
|
||||
/*******************************************************************************
|
||||
** This section is for debugging outside of VTune.
|
||||
** It creates the environment variables that indicates call graph mode.
|
||||
** If running outside of VTune remove the remark.
|
||||
**
|
||||
|
||||
static int firstTime = 1;
|
||||
char DoCallGraph[12] = "DoCallGraph";
|
||||
if (firstTime)
|
||||
{
|
||||
firstTime = 0;
|
||||
SetEnvironmentVariable( "BISTRO_COLLECTORS_DO_CALLGRAPH", DoCallGraph);
|
||||
}
|
||||
|
||||
** end of section.
|
||||
*******************************************************************************/
|
||||
|
||||
/* initialization part - the functions have not been loaded yet. This part
|
||||
** will load the functions, and check if we are in Call Graph mode.
|
||||
** (for special treatment).
|
||||
*/
|
||||
if (!FUNC_NotifyEvent)
|
||||
{
|
||||
if (iJIT_DLL_is_missing)
|
||||
return 0;
|
||||
|
||||
// load the Function from the DLL
|
||||
if (!loadiJIT_Funcs())
|
||||
return 0;
|
||||
|
||||
/* Call Graph initialization. */
|
||||
}
|
||||
|
||||
/* If the event is method entry/exit, check that in the current mode
|
||||
** VTune is allowed to receive it
|
||||
*/
|
||||
if ((event_type == iJVM_EVENT_TYPE_ENTER_NIDS || event_type == iJVM_EVENT_TYPE_LEAVE_NIDS) &&
|
||||
(executionMode != iJIT_CALLGRAPH_ON))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/* This section is performed when method enter event occurs.
|
||||
** It updates the virtual stack, or creates it if this is the first
|
||||
** method entry in the thread. The stack pointer is decreased.
|
||||
*/
|
||||
if (event_type == iJVM_EVENT_TYPE_ENTER_NIDS)
|
||||
{
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
pThreadStack threadStack = (pThreadStack)TlsGetValue (threadLocalStorageHandle);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pThreadStack threadStack = (pThreadStack)pthread_getspecific(threadLocalStorageHandle);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
// check for use of reserved method IDs
|
||||
if ( ((piJIT_Method_NIDS) EventSpecificData)->method_id <= 999 )
|
||||
return 0;
|
||||
|
||||
if (!threadStack)
|
||||
{
|
||||
// initialize the stack.
|
||||
threadStack = (pThreadStack) calloc (sizeof(ThreadStack), 1);
|
||||
threadStack->TopStack = INIT_TOP_Stack;
|
||||
threadStack->CurrentStack = INIT_TOP_Stack;
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
TlsSetValue(threadLocalStorageHandle,(void*)threadStack);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pthread_setspecific(threadLocalStorageHandle,(void*)threadStack);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
}
|
||||
|
||||
// decrease the stack.
|
||||
((piJIT_Method_NIDS) EventSpecificData)->stack_id = (threadStack->CurrentStack)--;
|
||||
}
|
||||
|
||||
/* This section is performed when method leave event occurs
|
||||
** It updates the virtual stack.
|
||||
** Increases the stack pointer.
|
||||
** If the stack pointer reached the top (left the global function)
|
||||
** increase the pointer and the top pointer.
|
||||
*/
|
||||
if (event_type == iJVM_EVENT_TYPE_LEAVE_NIDS)
|
||||
{
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
pThreadStack threadStack = (pThreadStack)TlsGetValue (threadLocalStorageHandle);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pThreadStack threadStack = (pThreadStack)pthread_getspecific(threadLocalStorageHandle);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
// check for use of reserved method IDs
|
||||
if ( ((piJIT_Method_NIDS) EventSpecificData)->method_id <= 999 )
|
||||
return 0;
|
||||
|
||||
if (!threadStack)
|
||||
{
|
||||
/* Error: first report in this thread is method exit */
|
||||
exit (1);
|
||||
}
|
||||
|
||||
((piJIT_Method_NIDS) EventSpecificData)->stack_id = ++(threadStack->CurrentStack) + 1;
|
||||
|
||||
if (((piJIT_Method_NIDS) EventSpecificData)->stack_id > threadStack->TopStack)
|
||||
((piJIT_Method_NIDS) EventSpecificData)->stack_id = (unsigned int)-1;
|
||||
}
|
||||
|
||||
if (event_type == iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED)
|
||||
{
|
||||
// check for use of reserved method IDs
|
||||
if ( ((piJIT_Method_Load) EventSpecificData)->method_id <= 999 )
|
||||
return 0;
|
||||
}
|
||||
|
||||
ReturnValue = (int)FUNC_NotifyEvent(event_type, EventSpecificData);
|
||||
|
||||
return ReturnValue;
|
||||
}
|
||||
|
||||
ITT_EXTERN_C void JITAPI iJIT_RegisterCallbackEx(void *userdata, iJIT_ModeChangedEx NewModeCallBackFuncEx) // The new mode call back routine
|
||||
{
|
||||
// is it already missing... or the load of functions from the DLL failed
|
||||
if (iJIT_DLL_is_missing || !loadiJIT_Funcs())
|
||||
{
|
||||
NewModeCallBackFuncEx(userdata, iJIT_NO_NOTIFICATIONS); // then do not bother with notifications
|
||||
/* Error: could not load JIT functions. */
|
||||
return;
|
||||
}
|
||||
// nothing to do with the callback
|
||||
}
|
||||
|
||||
/*
|
||||
** This function allows the user to query in which mode, if at all, VTune is running
|
||||
*/
|
||||
ITT_EXTERN_C iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive()
|
||||
{
|
||||
if (!iJIT_DLL_is_missing)
|
||||
{
|
||||
loadiJIT_Funcs();
|
||||
}
|
||||
|
||||
return executionMode;
|
||||
}
|
||||
#include <stdio.h>
|
||||
/* this function loads the collector dll (BistroJavaCollector) and the relevant functions.
|
||||
** on success: all functions load, iJIT_DLL_is_missing = 0, return value = 1.
|
||||
** on failure: all functions are NULL, iJIT_DLL_is_missing = 1, return value = 0.
|
||||
*/
|
||||
static int loadiJIT_Funcs()
|
||||
{
|
||||
static int bDllWasLoaded = 0;
|
||||
char *dllName = (char*)rcsid; // !!! Just to avoid unused code elimination !!!
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
DWORD dNameLength = 0;
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
if(bDllWasLoaded)
|
||||
{// dll was already loaded, no need to do it for the second time
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Assumes that the DLL will not be found
|
||||
iJIT_DLL_is_missing = 1;
|
||||
FUNC_NotifyEvent = NULL;
|
||||
|
||||
if (m_libHandle)
|
||||
{
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
FreeLibrary(m_libHandle);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
dlclose(m_libHandle);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
m_libHandle = NULL;
|
||||
}
|
||||
|
||||
// try to get the dll name from the environment
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
dNameLength = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, NULL, 0);
|
||||
if (dNameLength)
|
||||
{
|
||||
DWORD envret = 0;
|
||||
dllName = (char*)malloc(sizeof(char) * (dNameLength + 1));
|
||||
envret = GetEnvironmentVariableA(NEW_DLL_ENVIRONMENT_VAR, dllName, dNameLength);
|
||||
if (envret)
|
||||
{
|
||||
// Try to load the dll from the PATH...
|
||||
m_libHandle = LoadLibraryExA(dllName, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
|
||||
}
|
||||
free(dllName);
|
||||
} else {
|
||||
// Try to use old VS_PROFILER variable
|
||||
dNameLength = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, NULL, 0);
|
||||
if (dNameLength)
|
||||
{
|
||||
DWORD envret = 0;
|
||||
dllName = (char*)malloc(sizeof(char) * (dNameLength + 1));
|
||||
envret = GetEnvironmentVariableA(DLL_ENVIRONMENT_VAR, dllName, dNameLength);
|
||||
if (envret)
|
||||
{
|
||||
// Try to load the dll from the PATH...
|
||||
m_libHandle = LoadLibraryA(dllName);
|
||||
}
|
||||
free(dllName);
|
||||
}
|
||||
}
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
dllName = getenv(NEW_DLL_ENVIRONMENT_VAR);
|
||||
if (!dllName) {
|
||||
dllName = getenv(DLL_ENVIRONMENT_VAR);
|
||||
}
|
||||
#ifdef ANDROID
|
||||
if (!dllName)
|
||||
dllName = ANDROID_JIT_AGENT_PATH;
|
||||
#endif
|
||||
if (dllName)
|
||||
{
|
||||
// Try to load the dll from the PATH...
|
||||
m_libHandle = dlopen(dllName, RTLD_LAZY);
|
||||
}
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
|
||||
if (!m_libHandle)
|
||||
{
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
m_libHandle = LoadLibraryA(DEFAULT_DLLNAME);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
m_libHandle = dlopen(DEFAULT_DLLNAME, RTLD_LAZY);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
}
|
||||
|
||||
// if the dll wasn't loaded - exit.
|
||||
if (!m_libHandle)
|
||||
{
|
||||
iJIT_DLL_is_missing = 1; // don't try to initialize JIT agent the second time
|
||||
return 0;
|
||||
}
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
FUNC_NotifyEvent = (TPNotify)GetProcAddress(m_libHandle, "NotifyEvent");
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
FUNC_NotifyEvent = reinterpret_cast<TPNotify>(reinterpret_cast<intptr_t>(dlsym(m_libHandle, "NotifyEvent")));
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
if (!FUNC_NotifyEvent)
|
||||
{
|
||||
FUNC_Initialize = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
FUNC_Initialize = (TPInitialize)GetProcAddress(m_libHandle, "Initialize");
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
FUNC_Initialize = reinterpret_cast<TPInitialize>(reinterpret_cast<intptr_t>(dlsym(m_libHandle, "Initialize")));
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
if (!FUNC_Initialize)
|
||||
{
|
||||
FUNC_NotifyEvent = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
executionMode = (iJIT_IsProfilingActiveFlags)FUNC_Initialize();
|
||||
if (executionMode != iJIT_SAMPLING_ON)
|
||||
executionMode = iJIT_SAMPLING_ON;
|
||||
|
||||
bDllWasLoaded = 1;
|
||||
iJIT_DLL_is_missing = 0; // DLL is ok.
|
||||
|
||||
/*
|
||||
** Call Graph mode: init the thread local storage
|
||||
** (need to store the virtual stack there).
|
||||
*/
|
||||
if ( executionMode == iJIT_CALLGRAPH_ON )
|
||||
{
|
||||
// Allocate a thread local storage slot for the thread "stack"
|
||||
if (!threadLocalStorageHandle)
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
threadLocalStorageHandle = TlsAlloc();
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pthread_key_create(&threadLocalStorageHandle, NULL);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
** This function should be called by the user whenever a thread ends, to free the thread
|
||||
** "virtual stack" storage
|
||||
*/
|
||||
ITT_EXTERN_C void JITAPI FinalizeThread()
|
||||
{
|
||||
if (threadLocalStorageHandle)
|
||||
{
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
pThreadStack threadStack = (pThreadStack)TlsGetValue (threadLocalStorageHandle);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pThreadStack threadStack = (pThreadStack)pthread_getspecific(threadLocalStorageHandle);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
if (threadStack)
|
||||
{
|
||||
free (threadStack);
|
||||
threadStack = NULL;
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
TlsSetValue (threadLocalStorageHandle, threadStack);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pthread_setspecific(threadLocalStorageHandle, threadStack);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** This function should be called by the user when the process ends, to free the local
|
||||
** storage index
|
||||
*/
|
||||
ITT_EXTERN_C void JITAPI FinalizeProcess()
|
||||
{
|
||||
if (m_libHandle)
|
||||
{
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
FreeLibrary(m_libHandle);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
dlclose(m_libHandle);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
m_libHandle = NULL;
|
||||
}
|
||||
|
||||
if (threadLocalStorageHandle)
|
||||
#if ITT_PLATFORM==ITT_PLATFORM_WIN
|
||||
TlsFree (threadLocalStorageHandle);
|
||||
#else /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
pthread_key_delete(threadLocalStorageHandle);
|
||||
#endif /* ITT_PLATFORM==ITT_PLATFORM_WIN */
|
||||
}
|
||||
|
||||
/*
|
||||
** This function should be called by the user for any method once.
|
||||
** The function will return a unique method ID, the user should maintain the ID for each
|
||||
** method
|
||||
*/
|
||||
ITT_EXTERN_C unsigned int JITAPI iJIT_GetNewMethodID()
|
||||
{
|
||||
static unsigned int methodID = 0x100000;
|
||||
|
||||
if (methodID == 0)
|
||||
return 0; // ERROR : this is not a valid value
|
||||
|
||||
return methodID++;
|
||||
}
|
||||
|
298
src/third_party/vtune/jitprofiling.h
vendored
Normal file
298
src/third_party/vtune/jitprofiling.h
vendored
Normal file
@ -0,0 +1,298 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright (c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright (c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef __JITPROFILING_H__
|
||||
#define __JITPROFILING_H__
|
||||
|
||||
/*
|
||||
* Various constants used by functions
|
||||
*/
|
||||
|
||||
/* event notification */
|
||||
typedef enum iJIT_jvm_event
|
||||
{
|
||||
|
||||
/* shutdown */
|
||||
|
||||
/*
|
||||
* Program exiting EventSpecificData NA
|
||||
*/
|
||||
iJVM_EVENT_TYPE_SHUTDOWN = 2,
|
||||
|
||||
/* JIT profiling */
|
||||
|
||||
/*
|
||||
* issued after method code jitted into memory but before code is executed
|
||||
* EventSpecificData is an iJIT_Method_Load
|
||||
*/
|
||||
iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED=13,
|
||||
|
||||
/* issued before unload. Method code will no longer be executed, but code
|
||||
* and info are still in memory. The VTune profiler may capture method
|
||||
* code only at this point EventSpecificData is iJIT_Method_Id
|
||||
*/
|
||||
iJVM_EVENT_TYPE_METHOD_UNLOAD_START,
|
||||
|
||||
/* Method Profiling */
|
||||
|
||||
/* method name, Id and stack is supplied
|
||||
* issued when a method is about to be entered EventSpecificData is
|
||||
* iJIT_Method_NIDS
|
||||
*/
|
||||
iJVM_EVENT_TYPE_ENTER_NIDS = 19,
|
||||
|
||||
/* method name, Id and stack is supplied
|
||||
* issued when a method is about to be left EventSpecificData is
|
||||
* iJIT_Method_NIDS
|
||||
*/
|
||||
iJVM_EVENT_TYPE_LEAVE_NIDS
|
||||
} iJIT_JVM_EVENT;
|
||||
|
||||
typedef enum _iJIT_ModeFlags
|
||||
{
|
||||
/* No need to Notify VTune, since VTune is not running */
|
||||
iJIT_NO_NOTIFICATIONS = 0x0000,
|
||||
|
||||
/* when turned on the jit must call
|
||||
* iJIT_NotifyEvent
|
||||
* (
|
||||
* iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED,
|
||||
* )
|
||||
* for all the method already jitted
|
||||
*/
|
||||
iJIT_BE_NOTIFY_ON_LOAD = 0x0001,
|
||||
|
||||
/* when turned on the jit must call
|
||||
* iJIT_NotifyEvent
|
||||
* (
|
||||
* iJVM_EVENT_TYPE_METHOD_UNLOAD_FINISHED,
|
||||
* ) for all the method that are unloaded
|
||||
*/
|
||||
iJIT_BE_NOTIFY_ON_UNLOAD = 0x0002,
|
||||
|
||||
/* when turned on the jit must instrument all
|
||||
* the currently jited code with calls on
|
||||
* method entries
|
||||
*/
|
||||
iJIT_BE_NOTIFY_ON_METHOD_ENTRY = 0x0004,
|
||||
|
||||
/* when turned on the jit must instrument all
|
||||
* the currently jited code with calls
|
||||
* on method exit
|
||||
*/
|
||||
iJIT_BE_NOTIFY_ON_METHOD_EXIT = 0x0008
|
||||
|
||||
} iJIT_ModeFlags;
|
||||
|
||||
|
||||
/* Flags used by iJIT_IsProfilingActive() */
|
||||
typedef enum _iJIT_IsProfilingActiveFlags
|
||||
{
|
||||
/* No profiler is running. Currently not used */
|
||||
iJIT_NOTHING_RUNNING = 0x0000,
|
||||
|
||||
/* Sampling is running. This is the default value
|
||||
* returned by iJIT_IsProfilingActive()
|
||||
*/
|
||||
iJIT_SAMPLING_ON = 0x0001,
|
||||
|
||||
/* Call Graph is running */
|
||||
iJIT_CALLGRAPH_ON = 0x0002
|
||||
|
||||
} iJIT_IsProfilingActiveFlags;
|
||||
|
||||
/* Enumerator for the environment of methods*/
|
||||
typedef enum _iJDEnvironmentType
|
||||
{
|
||||
iJDE_JittingAPI = 2
|
||||
} iJDEnvironmentType;
|
||||
|
||||
/**********************************
|
||||
* Data structures for the events *
|
||||
**********************************/
|
||||
|
||||
/* structure for the events:
|
||||
* iJVM_EVENT_TYPE_METHOD_UNLOAD_START
|
||||
*/
|
||||
|
||||
typedef struct _iJIT_Method_Id
|
||||
{
|
||||
/* Id of the method (same as the one passed in
|
||||
* the iJIT_Method_Load struct
|
||||
*/
|
||||
unsigned int method_id;
|
||||
|
||||
} *piJIT_Method_Id, iJIT_Method_Id;
|
||||
|
||||
|
||||
/* structure for the events:
|
||||
* iJVM_EVENT_TYPE_ENTER_NIDS,
|
||||
* iJVM_EVENT_TYPE_LEAVE_NIDS,
|
||||
* iJVM_EVENT_TYPE_EXCEPTION_OCCURRED_NIDS
|
||||
*/
|
||||
|
||||
typedef struct _iJIT_Method_NIDS
|
||||
{
|
||||
/* unique method ID */
|
||||
unsigned int method_id;
|
||||
|
||||
/* NOTE: no need to fill this field, it's filled by VTune */
|
||||
unsigned int stack_id;
|
||||
|
||||
/* method name (just the method, without the class) */
|
||||
char* method_name;
|
||||
} *piJIT_Method_NIDS, iJIT_Method_NIDS;
|
||||
|
||||
/* structures for the events:
|
||||
* iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED
|
||||
*/
|
||||
|
||||
typedef struct _LineNumberInfo
|
||||
{
|
||||
/* x86 Offset from the begining of the method*/
|
||||
unsigned int Offset;
|
||||
|
||||
/* source line number from the begining of the source file */
|
||||
unsigned int LineNumber;
|
||||
|
||||
} *pLineNumberInfo, LineNumberInfo;
|
||||
|
||||
typedef struct _iJIT_Method_Load
|
||||
{
|
||||
/* unique method ID - can be any unique value, (except 0 - 999) */
|
||||
unsigned int method_id;
|
||||
|
||||
/* method name (can be with or without the class and signature, in any case
|
||||
* the class name will be added to it)
|
||||
*/
|
||||
char* method_name;
|
||||
|
||||
/* virtual address of that method - This determines the method range for the
|
||||
* iJVM_EVENT_TYPE_ENTER/LEAVE_METHOD_ADDR events
|
||||
*/
|
||||
void* method_load_address;
|
||||
|
||||
/* Size in memory - Must be exact */
|
||||
unsigned int method_size;
|
||||
|
||||
/* Line Table size in number of entries - Zero if none */
|
||||
unsigned int line_number_size;
|
||||
|
||||
/* Pointer to the begining of the line numbers info array */
|
||||
pLineNumberInfo line_number_table;
|
||||
|
||||
/* unique class ID */
|
||||
unsigned int class_id;
|
||||
|
||||
/* class file name */
|
||||
char* class_file_name;
|
||||
|
||||
/* source file name */
|
||||
char* source_file_name;
|
||||
|
||||
/* bits supplied by the user for saving in the JIT file */
|
||||
void* user_data;
|
||||
|
||||
/* the size of the user data buffer */
|
||||
unsigned int user_data_size;
|
||||
|
||||
/* NOTE: no need to fill this field, it's filled by VTune */
|
||||
iJDEnvironmentType env;
|
||||
|
||||
} *piJIT_Method_Load, iJIT_Method_Load;
|
||||
|
||||
/* API Functions */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef CDECL
|
||||
# if defined WIN32 || defined _WIN32
|
||||
# define CDECL __cdecl
|
||||
# else /* defined WIN32 || defined _WIN32 */
|
||||
# if defined _M_X64 || defined _M_AMD64 || defined __x86_64__
|
||||
# define CDECL /* not actual on x86_64 platform */
|
||||
# else /* _M_X64 || _M_AMD64 || __x86_64__ */
|
||||
# define CDECL __attribute__ ((cdecl))
|
||||
# endif /* _M_X64 || _M_AMD64 || __x86_64__ */
|
||||
# endif /* defined WIN32 || defined _WIN32 */
|
||||
#endif /* CDECL */
|
||||
|
||||
#define JITAPI CDECL
|
||||
|
||||
/* called when the settings are changed with new settings */
|
||||
typedef void (*iJIT_ModeChangedEx)(void *UserData, iJIT_ModeFlags Flags);
|
||||
|
||||
int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData);
|
||||
|
||||
/* The new mode call back routine */
|
||||
void JITAPI iJIT_RegisterCallbackEx(void *userdata,
|
||||
iJIT_ModeChangedEx NewModeCallBackFuncEx);
|
||||
|
||||
iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive(void);
|
||||
|
||||
void JITAPI FinalizeThread(void);
|
||||
|
||||
void JITAPI FinalizeProcess(void);
|
||||
|
||||
unsigned int JITAPI iJIT_GetNewMethodID(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __JITPROFILING_H__ */
|
69
src/third_party/vtune/v8-vtune.h
vendored
Normal file
69
src/third_party/vtune/v8-vtune.h
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef V8_VTUNE_H_
|
||||
#define V8_VTUNE_H_
|
||||
|
||||
namespace vTune {
|
||||
|
||||
void InitilizeVtuneForV8();
|
||||
|
||||
} // namespace vTune
|
||||
|
||||
|
||||
#endif // V8_VTUNE_H_
|
||||
|
56
src/third_party/vtune/v8vtune.gyp
vendored
Normal file
56
src/third_party/vtune/v8vtune.gyp
vendored
Normal file
@ -0,0 +1,56 @@
|
||||
# Copyright 2012 the V8 project authors. All rights reserved.
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
{
|
||||
'includes': ['../../../build/common.gypi'],
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'v8_vtune',
|
||||
'type': 'static_library',
|
||||
'dependencies': [
|
||||
'../../../tools/gyp/v8.gyp:v8',
|
||||
],
|
||||
'sources': [
|
||||
'ittnotify_config.h',
|
||||
'ittnotify_types.h',
|
||||
'jitprofiling.cc',
|
||||
'jitprofiling.h',
|
||||
'v8-vtune.h',
|
||||
'vtune-jit.cc',
|
||||
'vtune-jit.h',
|
||||
],
|
||||
'direct_dependent_settings': {
|
||||
'defines': ['ENABLE_VTUNE_JIT_INTERFACE',],
|
||||
'conditions': [
|
||||
['OS != "win"', {
|
||||
'libraries': ['-ldl',],
|
||||
}],
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
}
|
279
src/third_party/vtune/vtune-jit.cc
vendored
Normal file
279
src/third_party/vtune/vtune-jit.cc
vendored
Normal file
@ -0,0 +1,279 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#include <string.h>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <hash_map>
|
||||
using namespace std;
|
||||
#else
|
||||
// To avoid GCC 4.4 compilation warning about hash_map being deprecated.
|
||||
#define OLD_DEPRECATED __DEPRECATED
|
||||
#undef __DEPRECATED
|
||||
#include <ext/hash_map>
|
||||
#define __DEPRECATED OLD_DEPRECATED
|
||||
using namespace __gnu_cxx;
|
||||
#endif
|
||||
|
||||
#include <list>
|
||||
|
||||
#include "v8-vtune.h"
|
||||
#include "vtune-jit.h"
|
||||
|
||||
namespace vTune {
|
||||
namespace internal {
|
||||
|
||||
|
||||
// This class is used to record the JITted code position info for JIT
|
||||
// code profiling.
|
||||
class JITCodeLineInfo {
|
||||
public:
|
||||
JITCodeLineInfo() { }
|
||||
|
||||
void SetPosition(intptr_t pc, int pos) {
|
||||
AddCodeLineInfo(LineNumInfo(pc, pos));
|
||||
}
|
||||
|
||||
struct LineNumInfo {
|
||||
LineNumInfo(intptr_t pc, int pos)
|
||||
: pc_(pc), pos_(pos) { }
|
||||
|
||||
intptr_t pc_;
|
||||
int pos_;
|
||||
};
|
||||
|
||||
std::list<LineNumInfo>* GetLineNumInfo() {
|
||||
return &line_num_info_;
|
||||
}
|
||||
|
||||
private:
|
||||
void AddCodeLineInfo(const LineNumInfo& line_info) {
|
||||
line_num_info_.push_back(line_info);
|
||||
}
|
||||
std::list<LineNumInfo> line_num_info_;
|
||||
};
|
||||
|
||||
struct SameCodeObjects {
|
||||
bool operator () (void* key1, void* key2) const {
|
||||
return key1 == key2;
|
||||
}
|
||||
};
|
||||
|
||||
struct HashForCodeObject {
|
||||
uint32_t operator () (void* code) const {
|
||||
static const uintptr_t kGoldenRatio = 2654435761u;
|
||||
uintptr_t hash = reinterpret_cast<uintptr_t>(code);
|
||||
return static_cast<uint32_t>(hash * kGoldenRatio);
|
||||
}
|
||||
};
|
||||
|
||||
#ifdef WIN32
|
||||
typedef hash_map<void*, void*> JitInfoMap;
|
||||
#else
|
||||
typedef hash_map<void*, void*, HashForCodeObject, SameCodeObjects> JitInfoMap;
|
||||
#endif
|
||||
|
||||
static JitInfoMap* GetEntries() {
|
||||
static JitInfoMap* entries;
|
||||
if (entries == NULL) {
|
||||
entries = new JitInfoMap();
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
static bool IsLineInfoTagged(void* ptr) {
|
||||
return 0 != (reinterpret_cast<intptr_t>(ptr));
|
||||
}
|
||||
|
||||
static JITCodeLineInfo* UntagLineInfo(void* ptr) {
|
||||
return reinterpret_cast<JITCodeLineInfo*>(
|
||||
reinterpret_cast<intptr_t>(ptr));
|
||||
}
|
||||
|
||||
// The parameter str is a mixed pattern which contains the
|
||||
// function name and some other info. It comes from all the
|
||||
// Logger::CodeCreateEvent(...) function. This funtion get the
|
||||
// pure function name from the input parameter.
|
||||
static char* GetFunctionNameFromMixedName(const char* str, int length) {
|
||||
int index = 0;
|
||||
int count = 0;
|
||||
char* start_ptr = NULL;
|
||||
|
||||
while (str[index++] != ':' && (index < length)) {}
|
||||
|
||||
if (str[index] == '*' || str[index] == '~' ) index++;
|
||||
if (index >= length) return NULL;
|
||||
|
||||
start_ptr = const_cast<char*>(str + index);
|
||||
|
||||
while (index < length && str[index++] != ' ') {
|
||||
count++;
|
||||
}
|
||||
|
||||
char* result = new char[count + 1];
|
||||
memcpy(result, start_ptr, count);
|
||||
result[count] = '\0';
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// The JitCodeEventHandler for Vtune.
|
||||
void VTUNEJITInterface::event_handler(const v8::JitCodeEvent* event) {
|
||||
if (VTUNERUNNING && event != NULL) {
|
||||
switch (event->type) {
|
||||
case v8::JitCodeEvent::CODE_ADDED: {
|
||||
char* temp_file_name = NULL;
|
||||
char* temp_method_name =
|
||||
GetFunctionNameFromMixedName(event->name.str,
|
||||
static_cast<int>(event->name.len));
|
||||
iJIT_Method_Load jmethod;
|
||||
memset(&jmethod, 0, sizeof jmethod);
|
||||
jmethod.method_id = iJIT_GetNewMethodID();
|
||||
jmethod.method_load_address = event->code_start;
|
||||
jmethod.method_size = static_cast<unsigned int>(event->code_len);
|
||||
jmethod.method_name = temp_method_name;
|
||||
|
||||
Handle<Script> script = event->script;
|
||||
|
||||
if (*script != NULL) {
|
||||
// Get the source file name and set it to jmethod.source_file_name
|
||||
if ((*script->GetScriptName())->IsString()) {
|
||||
Handle<String> script_name =
|
||||
Handle<String>(String::Cast(*script->GetScriptName()));
|
||||
temp_file_name = new char[script_name->Length() + 1];
|
||||
script_name->WriteAscii(temp_file_name);
|
||||
jmethod.source_file_name = temp_file_name;
|
||||
}
|
||||
|
||||
JitInfoMap::iterator entry =
|
||||
GetEntries()->find(event->code_start);
|
||||
if (entry != GetEntries()->end() && IsLineInfoTagged(entry->first)) {
|
||||
JITCodeLineInfo* line_info = UntagLineInfo(entry->second);
|
||||
// Get the line_num_info and set it to jmethod.line_number_table
|
||||
std::list<JITCodeLineInfo::LineNumInfo>* vtunelineinfo =
|
||||
line_info->GetLineNumInfo();
|
||||
|
||||
jmethod.line_number_size = (unsigned int)vtunelineinfo->size();
|
||||
jmethod.line_number_table =
|
||||
reinterpret_cast<LineNumberInfo*>(
|
||||
malloc(sizeof(LineNumberInfo)*jmethod.line_number_size));
|
||||
|
||||
std::list<JITCodeLineInfo::LineNumInfo>::iterator Iter;
|
||||
int index = 0;
|
||||
for (Iter = vtunelineinfo->begin();
|
||||
Iter != vtunelineinfo->end();
|
||||
Iter++) {
|
||||
jmethod.line_number_table[index].Offset =
|
||||
static_cast<unsigned int>(Iter->pc_);
|
||||
jmethod.line_number_table[index++].LineNumber =
|
||||
script->GetLineNumber(Iter->pos_)+1;
|
||||
}
|
||||
GetEntries()->erase(event->code_start);
|
||||
}
|
||||
}
|
||||
|
||||
iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED,
|
||||
reinterpret_cast<void*>(&jmethod));
|
||||
if (temp_method_name)
|
||||
delete []temp_method_name;
|
||||
if (temp_file_name)
|
||||
delete []temp_file_name;
|
||||
break;
|
||||
}
|
||||
// TODO(chunyang.dai@intel.com): code_move will be supported.
|
||||
case v8::JitCodeEvent::CODE_MOVED:
|
||||
break;
|
||||
// Currently the CODE_REMOVED event is not issued.
|
||||
case v8::JitCodeEvent::CODE_REMOVED:
|
||||
break;
|
||||
case v8::JitCodeEvent::CODE_ADD_LINE_POS_INFO: {
|
||||
JITCodeLineInfo* line_info =
|
||||
reinterpret_cast<JITCodeLineInfo*>(event->user_data);
|
||||
if (line_info != NULL) {
|
||||
line_info->SetPosition(static_cast<intptr_t>(event->line_info.offset),
|
||||
static_cast<int>(event->line_info.pos));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case v8::JitCodeEvent::CODE_START_LINE_INFO_RECORDING: {
|
||||
v8::JitCodeEvent* temp_event = const_cast<v8::JitCodeEvent*>(event);
|
||||
temp_event->user_data = new JITCodeLineInfo();
|
||||
break;
|
||||
}
|
||||
case v8::JitCodeEvent::CODE_END_LINE_INFO_RECORDING: {
|
||||
GetEntries()->insert(std::pair <void*, void*>(event->code_start, event->user_data));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
void InitilizeVtuneForV8() {
|
||||
if (v8::V8::Initialize()) {
|
||||
v8::V8::SetFlagsFromString("--nocompact_code_space",
|
||||
(int)strlen("--nocompact_code_space"));
|
||||
v8::V8::SetJitCodeEventHandler(v8::kJitCodeEventDefault,
|
||||
vTune::internal::VTUNEJITInterface::event_handler);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace vTune
|
82
src/third_party/vtune/vtune-jit.h
vendored
Normal file
82
src/third_party/vtune/vtune-jit.h
vendored
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
redistributing this file, you may do so under either license.
|
||||
|
||||
GPL LICENSE SUMMARY
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 2 of the GNU General Public License as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
The full GNU General Public License is included in this distribution
|
||||
in the file called LICENSE.GPL.
|
||||
|
||||
Contact Information:
|
||||
http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
|
||||
|
||||
BSD LICENSE
|
||||
|
||||
Copyright(c) 2005-2012 Intel Corporation. All rights reserved.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Intel Corporation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef VTUNE_VTUNE_JIT_H_
|
||||
#define VTUNE_VTUNE_JIT_H_
|
||||
|
||||
#include "jitprofiling.h"
|
||||
#include "../../../include/v8.h"
|
||||
|
||||
#define VTUNERUNNING (iJIT_IsProfilingActive() == iJIT_SAMPLING_ON)
|
||||
|
||||
namespace vTune {
|
||||
namespace internal {
|
||||
using namespace v8;
|
||||
class VTUNEJITInterface {
|
||||
public:
|
||||
static void event_handler(const v8::JitCodeEvent* event);
|
||||
|
||||
private:
|
||||
//static Mutex* vtunemutex_;
|
||||
};
|
||||
|
||||
|
||||
} } // namespace vTune::internal
|
||||
|
||||
|
||||
#endif // VTUNE_VTUNE_JIT_H_
|
||||
|
Loading…
Reference in New Issue
Block a user