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 <string.h> 59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef WIN32 61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <hash_map> 62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgusing namespace std; 63e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else 64e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// To avoid GCC 4.4 compilation warning about hash_map being deprecated. 65e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#define OLD_DEPRECATED __DEPRECATED 66e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#undef __DEPRECATED 67935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org#if defined (ANDROID) 68935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org#include <hash_map> 69935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.orgusing namespace std; 70935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org#else 71e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <ext/hash_map> 72e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgusing namespace __gnu_cxx; 73e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 74935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org#define __DEPRECATED OLD_DEPRECATED 75935781b3604caa053bf75ce6b1079d79a225e63fdanno@chromium.org#endif 76e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 77e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include <list> 78e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 79e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include "v8-vtune.h" 80e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#include "vtune-jit.h" 81e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 82e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgnamespace vTune { 83e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgnamespace internal { 84e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 85e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 86e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// This class is used to record the JITted code position info for JIT 87e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// code profiling. 88e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgclass JITCodeLineInfo { 89e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org public: 90e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JITCodeLineInfo() { } 91e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 92e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org void SetPosition(intptr_t pc, int pos) { 93e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org AddCodeLineInfo(LineNumInfo(pc, pos)); 94e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 95e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 96e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org struct LineNumInfo { 97e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org LineNumInfo(intptr_t pc, int pos) 98e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org : pc_(pc), pos_(pos) { } 99e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 100e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org intptr_t pc_; 101e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org int pos_; 102e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org }; 103e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 104e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org std::list<LineNumInfo>* GetLineNumInfo() { 105e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return &line_num_info_; 106e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 107e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 108e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org private: 109e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org void AddCodeLineInfo(const LineNumInfo& line_info) { 110e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org line_num_info_.push_back(line_info); 111e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 112e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org std::list<LineNumInfo> line_num_info_; 113e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}; 114e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 115e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstruct SameCodeObjects { 116e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org bool operator () (void* key1, void* key2) const { 117e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return key1 == key2; 118e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 119e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}; 120e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 121e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstruct HashForCodeObject { 122e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org uint32_t operator () (void* code) const { 123e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static const uintptr_t kGoldenRatio = 2654435761u; 124e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org uintptr_t hash = reinterpret_cast<uintptr_t>(code); 125e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return static_cast<uint32_t>(hash * kGoldenRatio); 126e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 127e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org}; 128e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 129e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#ifdef WIN32 130e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtypedef hash_map<void*, void*> JitInfoMap; 131e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#else 132e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgtypedef hash_map<void*, void*, HashForCodeObject, SameCodeObjects> JitInfoMap; 133e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org#endif 134e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 135e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic JitInfoMap* GetEntries() { 136e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static JitInfoMap* entries; 137e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (entries == NULL) { 138e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org entries = new JitInfoMap(); 139e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 140e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return entries; 141e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 142e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 143e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic bool IsLineInfoTagged(void* ptr) { 144e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return 0 != (reinterpret_cast<intptr_t>(ptr)); 145e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 146e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 147e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic JITCodeLineInfo* UntagLineInfo(void* ptr) { 148e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return reinterpret_cast<JITCodeLineInfo*>( 149e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org reinterpret_cast<intptr_t>(ptr)); 150e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 151e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 152e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// The parameter str is a mixed pattern which contains the 153e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// function name and some other info. It comes from all the 154e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// Logger::CodeCreateEvent(...) function. This funtion get the 155e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// pure function name from the input parameter. 156e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgstatic char* GetFunctionNameFromMixedName(const char* str, int length) { 157e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org int index = 0; 158e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org int count = 0; 159e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org char* start_ptr = NULL; 160e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 161e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org while (str[index++] != ':' && (index < length)) {} 162e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 163e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (str[index] == '*' || str[index] == '~' ) index++; 164e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (index >= length) return NULL; 165e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 166e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org start_ptr = const_cast<char*>(str + index); 167e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 168e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org while (index < length && str[index++] != ' ') { 169e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org count++; 170e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 171e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 172e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org char* result = new char[count + 1]; 173e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org memcpy(result, start_ptr, count); 174e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org result[count] = '\0'; 175e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 176e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return result; 177e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 178e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 179e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org// The JitCodeEventHandler for Vtune. 180e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid VTUNEJITInterface::event_handler(const v8::JitCodeEvent* event) { 181e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (VTUNERUNNING && event != NULL) { 182e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org switch (event->type) { 183e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case v8::JitCodeEvent::CODE_ADDED: { 184e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org char* temp_file_name = NULL; 185e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org char* temp_method_name = 186e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GetFunctionNameFromMixedName(event->name.str, 187e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static_cast<int>(event->name.len)); 188e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org iJIT_Method_Load jmethod; 189e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org memset(&jmethod, 0, sizeof jmethod); 190e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.method_id = iJIT_GetNewMethodID(); 191e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.method_load_address = event->code_start; 192e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.method_size = static_cast<unsigned int>(event->code_len); 193e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.method_name = temp_method_name; 194e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 195e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Handle<Script> script = event->script; 196e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 197e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (*script != NULL) { 198e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Get the source file name and set it to jmethod.source_file_name 199e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ((*script->GetScriptName())->IsString()) { 2001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<String> script_name = script->GetScriptName()->ToString(); 20157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org temp_file_name = new char[script_name->Utf8Length() + 1]; 20257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org script_name->WriteUtf8(temp_file_name); 203e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.source_file_name = temp_file_name; 204e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 205e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 206e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JitInfoMap::iterator entry = 207e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GetEntries()->find(event->code_start); 208e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (entry != GetEntries()->end() && IsLineInfoTagged(entry->first)) { 209e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JITCodeLineInfo* line_info = UntagLineInfo(entry->second); 210e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Get the line_num_info and set it to jmethod.line_number_table 211e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org std::list<JITCodeLineInfo::LineNumInfo>* vtunelineinfo = 212e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org line_info->GetLineNumInfo(); 213e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 214e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.line_number_size = (unsigned int)vtunelineinfo->size(); 215e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.line_number_table = 216e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org reinterpret_cast<LineNumberInfo*>( 217e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org malloc(sizeof(LineNumberInfo)*jmethod.line_number_size)); 218e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org std::list<JITCodeLineInfo::LineNumInfo>::iterator Iter; 220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org int index = 0; 221e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org for (Iter = vtunelineinfo->begin(); 222e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Iter != vtunelineinfo->end(); 223e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Iter++) { 224e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.line_number_table[index].Offset = 225e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static_cast<unsigned int>(Iter->pc_); 226e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org jmethod.line_number_table[index++].LineNumber = 227e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org script->GetLineNumber(Iter->pos_)+1; 228e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 229e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GetEntries()->erase(event->code_start); 230e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 231e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 232e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 233e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, 234e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org reinterpret_cast<void*>(&jmethod)); 235e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (temp_method_name) 236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org delete []temp_method_name; 237e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (temp_file_name) 238e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org delete []temp_file_name; 239e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 240e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 241e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // TODO(chunyang.dai@intel.com): code_move will be supported. 242e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case v8::JitCodeEvent::CODE_MOVED: 243e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 244e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // Currently the CODE_REMOVED event is not issued. 245e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case v8::JitCodeEvent::CODE_REMOVED: 246e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 247e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case v8::JitCodeEvent::CODE_ADD_LINE_POS_INFO: { 248e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org JITCodeLineInfo* line_info = 249e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org reinterpret_cast<JITCodeLineInfo*>(event->user_data); 250e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (line_info != NULL) { 251e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org line_info->SetPosition(static_cast<intptr_t>(event->line_info.offset), 252e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org static_cast<int>(event->line_info.pos)); 253e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 254e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 255e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 256e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case v8::JitCodeEvent::CODE_START_LINE_INFO_RECORDING: { 257e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::JitCodeEvent* temp_event = const_cast<v8::JitCodeEvent*>(event); 258e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org temp_event->user_data = new JITCodeLineInfo(); 259e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 260e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 261e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org case v8::JitCodeEvent::CODE_END_LINE_INFO_RECORDING: { 262e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org GetEntries()->insert(std::pair <void*, void*>(event->code_start, event->user_data)); 263e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 264e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 265e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org default: 266e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org break; 267e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 268e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 269e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org return; 270e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 271e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 272e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} // namespace internal 273e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 27457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgvoid InitializeVtuneForV8() { 275e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (v8::V8::Initialize()) { 276e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::V8::SetFlagsFromString("--nocompact_code_space", 277e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org (int)strlen("--nocompact_code_space")); 278e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::V8::SetJitCodeEventHandler(v8::kJitCodeEventDefault, 279e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org vTune::internal::VTUNEJITInterface::event_handler); 280e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 281e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} 282e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 283e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org} // namespace vTune 284