1086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org// Copyright 2010 the V8 project authors. All rights reserved.
2750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Redistribution and use in source and binary forms, with or without
3750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// modification, are permitted provided that the following conditions are
4750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// met:
5750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
6750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions of source code must retain the above copyright
7750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       notice, this list of conditions and the following disclaimer.
8750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Redistributions in binary form must reproduce the above
9750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       copyright notice, this list of conditions and the following
10750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       disclaimer in the documentation and/or other materials provided
11750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       with the distribution.
12750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//     * Neither the name of Google Inc. nor the names of its
13750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       contributors may be used to endorse or promote products derived
14750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//       from this software without specific prior written permission.
15750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org//
16750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org//
28086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org// Tests of profiles generator and utilities.
29086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
30086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org#include "v8.h"
31086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org#include "profile-generator-inl.h"
32086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org#include "cctest.h"
33c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org#include "cpu-profiler.h"
3482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org#include "../include/v8-profiler.h"
35086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
36086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::CodeEntry;
37086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::CodeMap;
3825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgusing i::CpuProfile;
3982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgusing i::CpuProfiler;
40cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgusing i::CpuProfilesCollection;
41086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::ProfileNode;
42086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::ProfileTree;
43cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgusing i::ProfileGenerator;
44cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgusing i::TickSample;
45086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::Vector;
46086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
47086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
48086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileNodeFindOrAddChild) {
49f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileTree tree;
50f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileNode node(&tree, NULL);
5193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
52086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
53086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, childNode1);
54086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
5593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
56086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* childNode2 = node.FindOrAddChild(&entry2);
57086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, childNode2);
58086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(childNode1, childNode2);
59086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
60086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(childNode2, node.FindOrAddChild(&entry2));
6193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
62086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* childNode3 = node.FindOrAddChild(&entry3);
63086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, childNode3);
64086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(childNode1, childNode3);
65086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(childNode2, childNode3);
66086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
67086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(childNode2, node.FindOrAddChild(&entry2));
68086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(childNode3, node.FindOrAddChild(&entry3));
69086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
70086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
71086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
72c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgTEST(ProfileNodeFindOrAddChildForSameFunction) {
73c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  const char* aaa = "aaa";
74f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileTree tree;
75f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileNode node(&tree, NULL);
7693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, aaa);
77c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
78c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  CHECK_NE(NULL, childNode1);
79c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
80c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  // The same function again.
8193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, aaa);
82c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  CHECK_EQ(childNode1, node.FindOrAddChild(&entry2));
83c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  // Now with a different security token.
84e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, aaa);
85c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  CHECK_EQ(childNode1, node.FindOrAddChild(&entry3));
86c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org}
87c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
88c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
89086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgnamespace {
90086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
91086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgclass ProfileTreeTestHelper {
92086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org public:
9325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  explicit ProfileTreeTestHelper(const ProfileTree* tree)
94086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      : tree_(tree) { }
95086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
96086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* Walk(CodeEntry* entry1,
97086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                    CodeEntry* entry2 = NULL,
98086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                    CodeEntry* entry3 = NULL) {
99086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    ProfileNode* node = tree_->root();
100086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    node = node->FindChild(entry1);
101086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    if (node == NULL) return NULL;
102086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    if (entry2 != NULL) {
103086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      node = node->FindChild(entry2);
104086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      if (node == NULL) return NULL;
105086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    }
106086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    if (entry3 != NULL) {
107086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      node = node->FindChild(entry3);
108086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    }
109086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    return node;
110086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  }
111086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
112086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org private:
11325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  const ProfileTree* tree_;
114086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org};
115086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
116086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}  // namespace
117086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
118086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileTreeAddPathFromStart) {
11993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
12093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
12193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
122086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree tree;
123086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper helper(&tree);
124086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1));
125086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
126086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
127086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
128086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path[] = {NULL, &entry1, NULL, &entry2, NULL, NULL, &entry3, NULL};
129086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0]));
130086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromStart(path_vec);
131086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
132086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
133086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node1 = helper.Walk(&entry1);
134086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
135086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
136086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
137086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
138086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node2 = helper.Walk(&entry1, &entry2);
139086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
140086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node2);
141086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
142086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
143086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry2));
144086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node3 = helper.Walk(&entry1, &entry2, &entry3);
145086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node3);
146086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node3);
147086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node2, node3);
148086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node3->self_ticks());
149086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
150086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromStart(path_vec);
151086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
152086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
153086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
154086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
155086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
156086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
157086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
158086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path2[] = {&entry1, &entry2, &entry2};
159086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path2_vec(path2, sizeof(path2) / sizeof(path2[0]));
160086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromStart(path2_vec);
161086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
162086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
163086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
164086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
165086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
166086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
167086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
168086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
169086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
170086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2);
171086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node4);
172086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node3, node4);
173086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node4->self_ticks());
174086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
175086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
176086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
177086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileTreeAddPathFromEnd) {
17893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
17993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
18093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
181086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree tree;
182086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper helper(&tree);
183086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1));
184086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
185086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
186086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
187086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path[] = {NULL, &entry3, NULL, &entry2, NULL, NULL, &entry1, NULL};
188086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0]));
189086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromEnd(path_vec);
190086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
191086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
192086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node1 = helper.Walk(&entry1);
193086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
194086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
195086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
196086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
197086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node2 = helper.Walk(&entry1, &entry2);
198086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
199086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node2);
200086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
201086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
202086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry2));
203086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node3 = helper.Walk(&entry1, &entry2, &entry3);
204086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node3);
205086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node3);
206086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node2, node3);
207086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node3->self_ticks());
208086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
209086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromEnd(path_vec);
210086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
211086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
212086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
213086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
214086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
215086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
216086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
217086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path2[] = {&entry2, &entry2, &entry1};
218086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path2_vec(path2, sizeof(path2) / sizeof(path2[0]));
219086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromEnd(path2_vec);
220086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
221086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
222086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
223086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
224086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
225086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
226086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
227086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
228086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
229086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2);
230086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node4);
231086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node3, node4);
232086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node4->self_ticks());
233086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
234086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
235086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
236086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileTreeCalculateTotalTicks) {
237086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree empty_tree;
238086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, empty_tree.root()->self_ticks());
239086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  empty_tree.root()->IncrementSelfTicks();
240086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, empty_tree.root()->self_ticks());
241086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
24293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
243086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e1_path[] = {&entry1};
244086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e1_path_vec(
245086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e1_path, sizeof(e1_path) / sizeof(e1_path[0]));
2469dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
2479dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  ProfileTree single_child_tree;
2489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  single_child_tree.AddPathFromStart(e1_path_vec);
2499dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  single_child_tree.root()->IncrementSelfTicks();
2509dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_EQ(1, single_child_tree.root()->self_ticks());
2519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  ProfileTreeTestHelper single_child_helper(&single_child_tree);
2529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  ProfileNode* node1 = single_child_helper.Walk(&entry1);
2539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_NE(NULL, node1);
2549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_EQ(1, single_child_tree.root()->self_ticks());
2559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_EQ(1, node1->self_ticks());
2569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
25793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
258086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e1_e2_path[] = {&entry1, &entry2};
259086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e1_e2_path_vec(
260086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e1_e2_path, sizeof(e1_e2_path) / sizeof(e1_e2_path[0]));
261086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
262086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree flat_tree;
263086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper flat_helper(&flat_tree);
264086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_path_vec);
265086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_path_vec);
266086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_e2_path_vec);
267086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_e2_path_vec);
268086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_e2_path_vec);
269086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Results in {root,0,0} -> {entry1,0,2} -> {entry2,0,3}
270086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, flat_tree.root()->self_ticks());
2719dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  node1 = flat_helper.Walk(&entry1);
272086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
273086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
274086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node2 = flat_helper.Walk(&entry1, &entry2);
275086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
276086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(3, node2->self_ticks());
277086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Must calculate {root,5,0} -> {entry1,5,2} -> {entry2,3,3}
278086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, flat_tree.root()->self_ticks());
279086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
280086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
281086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e2_path[] = {&entry2};
282086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e2_path_vec(
283086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e2_path, sizeof(e2_path) / sizeof(e2_path[0]));
28493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
285086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e3_path[] = {&entry3};
286086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e3_path_vec(
287086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e3_path, sizeof(e3_path) / sizeof(e3_path[0]));
288086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
289086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree wide_tree;
290086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper wide_helper(&wide_tree);
291086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e1_path_vec);
292086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e1_path_vec);
293086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e1_e2_path_vec);
294086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e2_path_vec);
295086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e2_path_vec);
296086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e2_path_vec);
297086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
298086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
299086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
300086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
301086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Results in            -> {entry1,0,2} -> {entry2,0,1}
302086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //            {root,0,0} -> {entry2,0,3}
303086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //                       -> {entry3,0,4}
304086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, wide_tree.root()->self_ticks());
305086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  node1 = wide_helper.Walk(&entry1);
306086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
307086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
308086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node1_2 = wide_helper.Walk(&entry1, &entry2);
309086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1_2);
310086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node1_2->self_ticks());
311086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  node2 = wide_helper.Walk(&entry2);
312086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
313086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(3, node2->self_ticks());
314086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node3 = wide_helper.Walk(&entry3);
315086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node3);
316086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(4, node3->self_ticks());
317086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Calculates             -> {entry1,3,2} -> {entry2,1,1}
318086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //            {root,10,0} -> {entry2,3,3}
319086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //                        -> {entry3,4,4}
320086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, wide_tree.root()->self_ticks());
321086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
322086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node1_2->self_ticks());
323086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(3, node2->self_ticks());
324086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(4, node3->self_ticks());
325086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
326086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
327086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
328086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgstatic inline i::Address ToAddress(int n) {
329086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  return reinterpret_cast<i::Address>(n);
330086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
331086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
332e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
333086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(CodeMapAddCode) {
334086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeMap code_map;
33593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
33693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
33793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
33893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry4(i::Logger::FUNCTION_TAG, "ddd");
339086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
340086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
341086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1900), &entry3, 0x50);
342086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1950), &entry4, 0x10);
343086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(0));
344086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1500 - 1)));
345086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
346086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500 + 0x100)));
347086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500 + 0x200 - 1)));
348086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700)));
349086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700 + 0x50)));
350086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700 + 0x100 - 1)));
351086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700 + 0x100)));
352086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1900 - 1)));
353086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1900)));
354086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1900 + 0x28)));
355086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry4, code_map.FindEntry(ToAddress(0x1950)));
356086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry4, code_map.FindEntry(ToAddress(0x1950 + 0x7)));
357086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry4, code_map.FindEntry(ToAddress(0x1950 + 0x10 - 1)));
358086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1950 + 0x10)));
359086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0xFFFFFFFF)));
360086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
361086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
362086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
363086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(CodeMapMoveAndDeleteCode) {
364086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeMap code_map;
36593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
36693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
367086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
368086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
369086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
370086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700)));
37134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  code_map.MoveCode(ToAddress(0x1500), ToAddress(0x1700));  // Deprecate bbb.
372086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1500)));
37334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1700)));
37493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
37534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  code_map.AddCode(ToAddress(0x1750), &entry3, 0x100);
376086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700)));
37734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1750)));
378086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
379cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
380cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
381357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgnamespace {
382357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
383357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgclass TestSetup {
384357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org public:
385357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  TestSetup()
386357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org      : old_flag_prof_browser_mode_(i::FLAG_prof_browser_mode) {
387357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org    i::FLAG_prof_browser_mode = false;
388357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  }
389357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
390357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  ~TestSetup() {
391357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org    i::FLAG_prof_browser_mode = old_flag_prof_browser_mode_;
392357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  }
393357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
394357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org private:
395357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  bool old_flag_prof_browser_mode_;
396357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org};
397357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
398357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org}  // namespace
399357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
400cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgTEST(RecordTickSample) {
401357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  TestSetup test_setup;
402528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection profiles(CcTest::heap());
403f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  profiles.StartProfiling("", 1, false);
404cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileGenerator generator(&profiles);
405ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
406ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry2 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb");
407ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry3 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "ccc");
408cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
409cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.code_map()->AddCode(ToAddress(0x1700), entry2, 0x100);
410cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.code_map()->AddCode(ToAddress(0x1900), entry3, 0x50);
411cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
412cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  // We are building the following calls tree:
413cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //      -> aaa         - sample1
414cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //  aaa -> bbb -> ccc  - sample2
415cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //      -> ccc -> aaa  - sample3
416cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  TickSample sample1;
417cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample1.pc = ToAddress(0x1600);
41877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  sample1.tos = ToAddress(0x1500);
419cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample1.stack[0] = ToAddress(0x1510);
420cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample1.frames_count = 1;
421cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.RecordTickSample(sample1);
422cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  TickSample sample2;
423cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.pc = ToAddress(0x1925);
42477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  sample2.tos = ToAddress(0x1900);
425cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.stack[0] = ToAddress(0x1780);
426cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.stack[1] = ToAddress(0x10000);  // non-existent.
427cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.stack[2] = ToAddress(0x1620);
428cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.frames_count = 3;
429cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.RecordTickSample(sample2);
430cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  TickSample sample3;
431cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.pc = ToAddress(0x1510);
43277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  sample3.tos = ToAddress(0x1500);
433cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.stack[0] = ToAddress(0x1910);
434cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.stack[1] = ToAddress(0x1610);
435cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.frames_count = 2;
436cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.RecordTickSample(sample3);
437cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
438d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CpuProfile* profile = profiles.StopProfiling("");
43925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  CHECK_NE(NULL, profile);
44025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  ProfileTreeTestHelper top_down_test_helper(profile->top_down());
44125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  CHECK_EQ(NULL, top_down_test_helper.Walk(entry2));
44225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  CHECK_EQ(NULL, top_down_test_helper.Walk(entry3));
443cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node1 = top_down_test_helper.Walk(entry1);
444cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node1);
445cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry1, node1->entry());
446cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node2 = top_down_test_helper.Walk(entry1, entry1);
447cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node2);
448cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry1, node2->entry());
449cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node3 = top_down_test_helper.Walk(entry1, entry2, entry3);
450cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node3);
451cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry3, node3->entry());
452cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node4 = top_down_test_helper.Walk(entry1, entry3, entry1);
453cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node4);
454cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry1, node4->entry());
455cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org}
45625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
457c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
458f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgstatic void CheckNodeIds(ProfileNode* node, int* expectedId) {
459f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ((*expectedId)++, node->id());
460f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (int i = 0; i < node->children()->length(); i++) {
461f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    CheckNodeIds(node->children()->at(i), expectedId);
462f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
463f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
464f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
465e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
466f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgTEST(SampleIds) {
467f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TestSetup test_setup;
468528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection profiles(CcTest::heap());
469f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  profiles.StartProfiling("", 1, true);
470f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileGenerator generator(&profiles);
471ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
472ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry2 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb");
473ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry3 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "ccc");
474f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
475f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1700), entry2, 0x100);
476f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1900), entry3, 0x50);
477f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
478f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // We are building the following calls tree:
479f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //                    -> aaa #3           - sample1
480f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // (root)#1 -> aaa #2 -> bbb #4 -> ccc #5 - sample2
481f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //                    -> ccc #6 -> aaa #7 - sample3
482f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample1;
483f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.pc = ToAddress(0x1600);
484f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.stack[0] = ToAddress(0x1510);
485f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.frames_count = 1;
486f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample1);
487f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample2;
488f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.pc = ToAddress(0x1925);
489f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.stack[0] = ToAddress(0x1780);
490f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.stack[1] = ToAddress(0x10000);  // non-existent.
491f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.stack[2] = ToAddress(0x1620);
492f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.frames_count = 3;
493f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample2);
494f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample3;
495f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.pc = ToAddress(0x1510);
496f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.stack[0] = ToAddress(0x1910);
497f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.stack[1] = ToAddress(0x1610);
498f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.frames_count = 2;
499f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample3);
500f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
501d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CpuProfile* profile = profiles.StopProfiling("");
502f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  int nodeId = 1;
503f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CheckNodeIds(profile->top_down()->root(), &nodeId);
504f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(7, nodeId - 1);
505f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
506f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(3, profile->samples_count());
507f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  int expected_id[] = {3, 5, 7};
508f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (int i = 0; i < 3; i++) {
509f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    CHECK_EQ(expected_id[i], profile->sample(i)->id());
510f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
511f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
512f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
513f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
514f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgTEST(NoSamples) {
515f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TestSetup test_setup;
516528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection profiles(CcTest::heap());
517f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  profiles.StartProfiling("", 1, false);
518f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileGenerator generator(&profiles);
519ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
520f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
521f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
522f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // We are building the following calls tree:
523f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // (root)#1 -> aaa #2 -> aaa #3 - sample1
524f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample1;
525f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.pc = ToAddress(0x1600);
526f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.stack[0] = ToAddress(0x1510);
527f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.frames_count = 1;
528f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample1);
529f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
530d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CpuProfile* profile = profiles.StopProfiling("");
531f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  int nodeId = 1;
532f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CheckNodeIds(profile->top_down()->root(), &nodeId);
533f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(3, nodeId - 1);
534f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
535f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(0, profile->samples_count());
536f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
537f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
538f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
53982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org// --- P r o f i l e r   E x t e n s i o n ---
54082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
54182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgclass ProfilerExtension : public v8::Extension {
54282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org public:
54382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  ProfilerExtension() : v8::Extension("v8/profiler", kSource) { }
5449f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
5459f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org      v8::Isolate* isolate,
54682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      v8::Handle<v8::String> name);
5471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void StartProfiling(const v8::FunctionCallbackInfo<v8::Value>& args);
5481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  static void StopProfiling(const v8::FunctionCallbackInfo<v8::Value>& args);
54982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org private:
55082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  static const char* kSource;
55182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org};
55282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
55382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
55482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgconst char* ProfilerExtension::kSource =
55582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    "native function startProfiling();"
55682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    "native function stopProfiling();";
55782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
5589f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.orgv8::Handle<v8::FunctionTemplate> ProfilerExtension::GetNativeFunctionTemplate(
5599f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org    v8::Isolate* isolate, v8::Handle<v8::String> name) {
5609f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  if (name->Equals(v8::String::NewFromUtf8(isolate, "startProfiling"))) {
56182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    return v8::FunctionTemplate::New(ProfilerExtension::StartProfiling);
5629f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org  } else if (name->Equals(v8::String::NewFromUtf8(isolate, "stopProfiling"))) {
56382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    return v8::FunctionTemplate::New(ProfilerExtension::StopProfiling);
56482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  } else {
56582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    CHECK(false);
56682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    return v8::Handle<v8::FunctionTemplate>();
56782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  }
56882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
56982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
57082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
5711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid ProfilerExtension::StartProfiling(
5721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::FunctionCallbackInfo<v8::Value>& args) {
573f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  v8::CpuProfiler* cpu_profiler = args.GetIsolate()->GetCpuProfiler();
57482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  if (args.Length() > 0)
575f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    cpu_profiler->StartCpuProfiling(args[0].As<v8::String>());
57682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  else
577f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    cpu_profiler->StartCpuProfiling(
578f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::String::NewFromUtf8(args.GetIsolate(), ""));
57982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
58082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
58182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
5821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid ProfilerExtension::StopProfiling(
5831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    const v8::FunctionCallbackInfo<v8::Value>& args) {
584f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  v8::CpuProfiler* cpu_profiler = args.GetIsolate()->GetCpuProfiler();
58582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  if (args.Length() > 0)
586f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    cpu_profiler->StopCpuProfiling(args[0].As<v8::String>());
58782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  else
588f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    cpu_profiler->StopCpuProfiling(
589f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org        v8::String::NewFromUtf8(args.GetIsolate(), ""));
59082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
59182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
59282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
59382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgstatic ProfilerExtension kProfilerExtension;
59482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgv8::DeclareExtension kProfilerExtensionDeclaration(&kProfilerExtension);
59582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
59682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgstatic const ProfileNode* PickChild(const ProfileNode* parent,
59782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org                                    const char* name) {
59882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  for (int i = 0; i < parent->children()->length(); ++i) {
59982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    const ProfileNode* child = parent->children()->at(i);
60082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    if (strcmp(child->entry()->name(), name) == 0) return child;
60182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  }
60282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  return NULL;
60382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
60482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
60582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
60682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgTEST(RecordStackTraceAtStartProfiling) {
607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // This test does not pass with inlining enabled since inlined functions
608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // don't appear in the stack trace.
609a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  i::FLAG_use_inlining = false;
610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
611528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  v8::Isolate* isolate = CcTest::isolate();
61257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::HandleScope scope(isolate);
61357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  const char* extensions[] = { "v8/profiler" };
61457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  v8::ExtensionConfiguration config(1, extensions);
615c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  v8::Local<v8::Context> context = v8::Context::New(isolate, &config);
61657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  context->Enter();
61782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
618528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfiler* profiler = CcTest::i_isolate()->cpu_profiler();
619f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(0, profiler->GetProfilesCount());
62082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CompileRun(
62182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "function c() { startProfiling(); }\n"
62282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "function b() { c(); }\n"
62382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "function a() { b(); }\n"
62482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "a();\n"
62582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "stopProfiling();");
626f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(1, profiler->GetProfilesCount());
627e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CpuProfile* profile = profiler->GetProfile(0);
62882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  const ProfileTree* topDown = profile->top_down();
62982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  const ProfileNode* current = topDown->root();
6305f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  const_cast<ProfileNode*>(current)->Print(0);
63182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  // The tree should look like this:
63282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //  (root)
63382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //   (anonymous function)
63482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //     a
63582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //       b
63682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //         c
6375f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // There can also be:
6385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  //           startProfiling
6395f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // if the sampler managed to get a tick.
64082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "(anonymous function)");
64182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
64282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "a");
64382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
64482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "b");
64582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
64682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "c");
64782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
6485f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  CHECK(current->children()->length() == 0 ||
6495f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        current->children()->length() == 1);
6505f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (current->children()->length() == 1) {
6515f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    current = PickChild(current, "startProfiling");
6525f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    CHECK_EQ(0, current->children()->length());
6535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
65482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
65582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
656d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
657d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgTEST(Issue51919) {
658528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection collection(CcTest::heap());
659d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  i::EmbeddedVector<char*,
660d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org      CpuProfilesCollection::kMaxSimultaneousProfiles> titles;
661d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i) {
662d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    i::Vector<char> title = i::Vector<char>::New(16);
663d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    i::OS::SNPrintF(title, "%d", i);
664f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    // UID must be > 0.
665f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    CHECK(collection.StartProfiling(title.start(), i + 1, false));
666d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    titles[i] = title.start();
667d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  }
668d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  CHECK(!collection.StartProfiling(
669f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      "maximum", CpuProfilesCollection::kMaxSimultaneousProfiles + 1, false));
670d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i)
671d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    i::DeleteArray(titles[i]);
672d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org}
67393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
67493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
67593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgstatic const v8::CpuProfileNode* PickChild(const v8::CpuProfileNode* parent,
67693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                           const char* name) {
67793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  for (int i = 0; i < parent->GetChildrenCount(); ++i) {
67893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    const v8::CpuProfileNode* child = parent->GetChild(i);
679f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::String::Utf8Value function_name(child->GetFunctionName());
68093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    if (strcmp(*function_name, name) == 0) return child;
68193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  }
68293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  return NULL;
68393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org}
68493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
68593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
68693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgTEST(ProfileNodeScriptId) {
68793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // This test does not pass with inlining enabled since inlined functions
68893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // don't appear in the stack trace.
68993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  i::FLAG_use_inlining = false;
69093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
69193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  const char* extensions[] = { "v8/profiler" };
69293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  v8::ExtensionConfiguration config(1, extensions);
69393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  LocalContext env(&config);
69493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  v8::HandleScope hs(env->GetIsolate());
69593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
69693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler();
69793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_EQ(0, profiler->GetProfileCount());
698f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Script> script_a = v8::Script::Compile(v8::String::NewFromUtf8(
699f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      env->GetIsolate(), "function a() { startProfiling(); }\n"));
70093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  script_a->Run();
701f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Script> script_b =
702f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
703f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "function b() { a(); }\n"
704f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "b();\n"
705f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "stopProfiling();\n"));
70693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  script_b->Run();
70793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_EQ(1, profiler->GetProfileCount());
70893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  const v8::CpuProfile* profile = profiler->GetCpuProfile(0);
70993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  const v8::CpuProfileNode* current = profile->GetTopDownRoot();
71093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  reinterpret_cast<ProfileNode*>(
71193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      const_cast<v8::CpuProfileNode*>(current))->Print(0);
71293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // The tree should look like this:
71393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //  (root)
71493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //   (anonymous function)
71593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //     b
71693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //       a
71793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // There can also be:
71893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //         startProfiling
71993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // if the sampler managed to get a tick.
72093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  current = PickChild(current, i::ProfileGenerator::kAnonymousFunctionName);
72193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
72293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
72393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  current = PickChild(current, "b");
72493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
72593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_EQ(script_b->GetId(), current->GetScriptId());
72693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
72793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  current = PickChild(current, "a");
72893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
72993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_EQ(script_a->GetId(), current->GetScriptId());
73093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org}
73193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
73293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
733e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
734e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
735e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgstatic const char* line_number_test_source_existing_functions =
736e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function foo_at_the_first_line() {\n"
737e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"}\n"
738e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"foo_at_the_first_line();\n"
739e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function lazy_func_at_forth_line() {}\n";
740e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
741e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
742e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgstatic const char* line_number_test_source_profile_time_functions =
743e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"// Empty first line\n"
744e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function bar_at_the_second_line() {\n"
745e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"  foo_at_the_first_line();\n"
746e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"}\n"
747e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"bar_at_the_second_line();\n"
748e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function lazy_func_at_6th_line() {}";
749e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
750e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgint GetFunctionLineNumber(LocalContext* env, const char* name) {
751528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfiler* profiler = CcTest::i_isolate()->cpu_profiler();
752e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeMap* code_map = profiler->generator()->code_map();
753e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  i::Handle<i::JSFunction> func = v8::Utils::OpenHandle(
754e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      *v8::Local<v8::Function>::Cast(
755e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org          (*(*env))->Global()->Get(v8_str(name))));
756e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeEntry* func_entry = code_map->FindEntry(func->code()->address());
757e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  if (!func_entry)
758e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    FATAL(name);
759e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  return func_entry->line_number();
760e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
761e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
762e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
763e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgTEST(LineNumber) {
764e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  i::FLAG_use_inlining = false;
765e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
766e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CcTest::InitializeVM();
767e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LocalContext env;
768528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  i::Isolate* isolate = CcTest::i_isolate();
769e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  TestSetup test_setup;
770e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
771e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  i::HandleScope scope(isolate);
772e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
773e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CompileRun(line_number_test_source_existing_functions);
774e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
775e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CpuProfiler* profiler = isolate->cpu_profiler();
776e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  profiler->StartProfiling("LineNumber");
777e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
778e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CompileRun(line_number_test_source_profile_time_functions);
779e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
780e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  profiler->processor()->StopSynchronously();
781e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
782e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(1, GetFunctionLineNumber(&env, "foo_at_the_first_line"));
783e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(0, GetFunctionLineNumber(&env, "lazy_func_at_forth_line"));
784e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(2, GetFunctionLineNumber(&env, "bar_at_the_second_line"));
785e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(0, GetFunctionLineNumber(&env, "lazy_func_at_6th_line"));
786e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
787e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  profiler->StopProfiling("LineNumber");
788e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
7892c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7902c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7912c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7922c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgTEST(BailoutReason) {
7932c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  const char* extensions[] = { "v8/profiler" };
7942c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  v8::ExtensionConfiguration config(1, extensions);
7952c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  LocalContext env(&config);
7962c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  v8::HandleScope hs(env->GetIsolate());
7972c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7982c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler();
7992c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(0, profiler->GetProfileCount());
800f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Script> script =
801f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
802f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "function TryCatch() {\n"
803f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  try {\n"
804f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "    startProfiling();\n"
805f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  } catch (e) { };\n"
806f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "}\n"
807f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "function TryFinally() {\n"
808f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  try {\n"
809f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "    TryCatch();\n"
810f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  } finally { };\n"
811f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "}\n"
812f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "TryFinally();\n"
813f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "stopProfiling();"));
8142c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  script->Run();
8152c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_EQ(1, profiler->GetProfileCount());
8162c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  const v8::CpuProfile* profile = profiler->GetCpuProfile(0);
8172c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  const v8::CpuProfileNode* current = profile->GetTopDownRoot();
8182c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  reinterpret_cast<ProfileNode*>(
8192c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org      const_cast<v8::CpuProfileNode*>(current))->Print(0);
8202c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  // The tree should look like this:
8212c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //  (root)
8222c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //   (anonymous function)
8232c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //     kTryFinally
8242c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //       kTryCatch
8252c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  current = PickChild(current, i::ProfileGenerator::kAnonymousFunctionName);
8262c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
8272c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
8282c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  current = PickChild(current, "TryFinally");
8292c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
8302c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK(!strcmp("TryFinallyStatement", current->GetBailoutReason()));
8312c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
8322c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  current = PickChild(current, "TryCatch");
8332c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
8342c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK(!strcmp("TryCatchStatement", current->GetBailoutReason()));
8352c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org}
836