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