1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch/* 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch This file is provided under a dual BSD/GPLv2 license. When using or 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch redistributing this file, you may do so under either license. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GPL LICENSE SUMMARY 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Copyright(c) 2005-2012 Intel Corporation. All rights reserved. 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch This program is free software; you can redistribute it and/or modify 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch it under the terms of version 2 of the GNU General Public License as 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch published by the Free Software Foundation. 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch This program is distributed in the hope that it will be useful, but 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WITHOUT ANY WARRANTY; without even the implied warranty of 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch General Public License for more details. 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch You should have received a copy of the GNU General Public License 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch along with this program; if not, write to the Free Software 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch The full GNU General Public License is included in this distribution 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch in the file called LICENSE.GPL. 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Contact Information: 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/ 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BSD LICENSE 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Copyright(c) 2005-2012 Intel Corporation. All rights reserved. 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch All rights reserved. 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Redistribution and use in source and binary forms, with or without 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch modification, are permitted provided that the following conditions 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch are met: 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Redistributions of source code must retain the above copyright 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch notice, this list of conditions and the following disclaimer. 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Redistributions in binary form must reproduce the above copyright 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch notice, this list of conditions and the following disclaimer in 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch the documentation and/or other materials provided with the 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch distribution. 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch * Neither the name of Intel Corporation nor the names of its 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch contributors may be used to endorse or promote products derived 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch from this software without specific prior written permission. 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch*/ 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include <stdlib.h> 60bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include <string.h> 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <list> 63bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch#include <unordered_map> 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "v8-vtune.h" 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "vtune-jit.h" 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace vTune { 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This class is used to record the JITted code position info for JIT 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// code profiling. 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass JITCodeLineInfo { 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JITCodeLineInfo() { } 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetPosition(intptr_t pc, int pos) { 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddCodeLineInfo(LineNumInfo(pc, pos)); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct LineNumInfo { 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LineNumInfo(intptr_t pc, int pos) 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : pc_(pc), pos_(pos) { } 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intptr_t pc_; 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pos_; 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::list<LineNumInfo>* GetLineNumInfo() { 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return &line_num_info_; 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCodeLineInfo(const LineNumInfo& line_info) { 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_num_info_.push_back(line_info); 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::list<LineNumInfo> line_num_info_; 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct SameCodeObjects { 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool operator () (void* key1, void* key2) const { 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return key1 == key2; 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct HashForCodeObject { 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t operator () (void* code) const { 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const uintptr_t kGoldenRatio = 2654435761u; 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uintptr_t hash = reinterpret_cast<uintptr_t>(code); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<uint32_t>(hash * kGoldenRatio); 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 115bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochtypedef std::unordered_map<void*, void*, HashForCodeObject, SameCodeObjects> 116bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch JitInfoMap; 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic JitInfoMap* GetEntries() { 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static JitInfoMap* entries; 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (entries == NULL) { 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch entries = new JitInfoMap(); 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return entries; 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic bool IsLineInfoTagged(void* ptr) { 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return 0 != (reinterpret_cast<intptr_t>(ptr)); 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic JITCodeLineInfo* UntagLineInfo(void* ptr) { 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<JITCodeLineInfo*>( 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<intptr_t>(ptr)); 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The parameter str is a mixed pattern which contains the 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// function name and some other info. It comes from all the 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Logger::CodeCreateEvent(...) function. This funtion get the 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// pure function name from the input parameter. 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic char* GetFunctionNameFromMixedName(const char* str, int length) { 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = 0; 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int count = 0; 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* start_ptr = NULL; 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (str[index++] != ':' && (index < length)) {} 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (str[index] == '*' || str[index] == '~' ) index++; 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index >= length) return NULL; 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch start_ptr = const_cast<char*>(str + index); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (index < length && str[index++] != ' ') { 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch count++; 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* result = new char[count + 1]; 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memcpy(result, start_ptr, count); 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result[count] = '\0'; 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// The JitCodeEventHandler for Vtune. 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid VTUNEJITInterface::event_handler(const v8::JitCodeEvent* event) { 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (VTUNERUNNING && event != NULL) { 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (event->type) { 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case v8::JitCodeEvent::CODE_ADDED: { 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* temp_file_name = NULL; 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char* temp_method_name = 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GetFunctionNameFromMixedName(event->name.str, 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int>(event->name.len)); 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch iJIT_Method_Load jmethod; 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch memset(&jmethod, 0, sizeof jmethod); 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.method_id = iJIT_GetNewMethodID(); 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.method_load_address = event->code_start; 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.method_size = static_cast<unsigned int>(event->code_len); 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.method_name = temp_method_name; 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<UnboundScript> script = event->script; 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (*script != NULL) { 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the source file name and set it to jmethod.source_file_name 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((*script->GetScriptName())->IsString()) { 183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String> script_name = 184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Local<String>::Cast(script->GetScriptName()); 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp_file_name = new char[script_name->Utf8Length() + 1]; 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch script_name->WriteUtf8(temp_file_name); 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.source_file_name = temp_file_name; 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JitInfoMap::iterator entry = 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GetEntries()->find(event->code_start); 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (entry != GetEntries()->end() && IsLineInfoTagged(entry->first)) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JITCodeLineInfo* line_info = UntagLineInfo(entry->second); 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Get the line_num_info and set it to jmethod.line_number_table 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::list<JITCodeLineInfo::LineNumInfo>* vtunelineinfo = 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_info->GetLineNumInfo(); 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.line_number_size = (unsigned int)vtunelineinfo->size(); 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.line_number_table = 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<LineNumberInfo*>( 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch malloc(sizeof(LineNumberInfo)*jmethod.line_number_size)); 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::list<JITCodeLineInfo::LineNumInfo>::iterator Iter; 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = 0; 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (Iter = vtunelineinfo->begin(); 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Iter != vtunelineinfo->end(); 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Iter++) { 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.line_number_table[index].Offset = 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<unsigned int>(Iter->pc_); 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch jmethod.line_number_table[index++].LineNumber = 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch script->GetLineNumber(Iter->pos_) + 1; 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GetEntries()->erase(event->code_start); 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<void*>(&jmethod)); 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (temp_method_name) 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete []temp_method_name; 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (temp_file_name) 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch delete []temp_file_name; 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(chunyang.dai@intel.com): code_move will be supported. 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case v8::JitCodeEvent::CODE_MOVED: 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Currently the CODE_REMOVED event is not issued. 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case v8::JitCodeEvent::CODE_REMOVED: 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case v8::JitCodeEvent::CODE_ADD_LINE_POS_INFO: { 232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JITCodeLineInfo* line_info = 233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch reinterpret_cast<JITCodeLineInfo*>(event->user_data); 234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (line_info != NULL) { 235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch line_info->SetPosition(static_cast<intptr_t>(event->line_info.offset), 236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static_cast<int>(event->line_info.pos)); 237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case v8::JitCodeEvent::CODE_START_LINE_INFO_RECORDING: { 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::JitCodeEvent* temp_event = const_cast<v8::JitCodeEvent*>(event); 242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch temp_event->user_data = new JITCodeLineInfo(); 243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case v8::JitCodeEvent::CODE_END_LINE_INFO_RECORDING: { 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GetEntries()->insert(std::pair <void*, void*>(event->code_start, event->user_data)); 247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierv8::JitCodeEventHandler GetVtuneCodeEventHandler() { 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch v8::V8::SetFlagsFromString("--nocompact_code_space", 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (int)strlen("--nocompact_code_space")); 261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return vTune::internal::VTUNEJITInterface::event_handler; 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace vTune 265