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