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
30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "include/v8-profiler.h"
33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/cpu-profiler.h"
34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/profile-generator-inl.h"
35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h"
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/profiler-extension.h"
37086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
38086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::CodeEntry;
39086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::CodeMap;
4025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.orgusing i::CpuProfile;
4182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgusing i::CpuProfiler;
42cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgusing i::CpuProfilesCollection;
43086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::ProfileNode;
44086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::ProfileTree;
45cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgusing i::ProfileGenerator;
46cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgusing i::TickSample;
47086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgusing i::Vector;
48086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
49086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
50086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileNodeFindOrAddChild) {
51f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileTree tree;
5225530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  ProfileNode* node = tree.root();
5393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
5425530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  ProfileNode* childNode1 = node->FindOrAddChild(&entry1);
55086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, childNode1);
5625530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode1, node->FindOrAddChild(&entry1));
5793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
5825530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  ProfileNode* childNode2 = node->FindOrAddChild(&entry2);
59086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, childNode2);
60086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(childNode1, childNode2);
6125530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode1, node->FindOrAddChild(&entry1));
6225530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode2, node->FindOrAddChild(&entry2));
6393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
6425530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  ProfileNode* childNode3 = node->FindOrAddChild(&entry3);
65086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, childNode3);
66086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(childNode1, childNode3);
67086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(childNode2, childNode3);
6825530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode1, node->FindOrAddChild(&entry1));
6925530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode2, node->FindOrAddChild(&entry2));
7025530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode3, node->FindOrAddChild(&entry3));
71086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
72086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
73086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
74c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.orgTEST(ProfileNodeFindOrAddChildForSameFunction) {
75c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  const char* aaa = "aaa";
76f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileTree tree;
7725530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  ProfileNode* node = tree.root();
7893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, aaa);
7925530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  ProfileNode* childNode1 = node->FindOrAddChild(&entry1);
80c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  CHECK_NE(NULL, childNode1);
8125530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode1, node->FindOrAddChild(&entry1));
82c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  // The same function again.
8393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, aaa);
8425530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode1, node->FindOrAddChild(&entry2));
85c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org  // Now with a different security token.
86e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, aaa);
8725530ce9cb50f9e8386663ca40fd3f6e023ec9f6bmeurer@chromium.org  CHECK_EQ(childNode1, node->FindOrAddChild(&entry3));
88c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org}
89c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
90c20610af4f0ca150977ca140a1174f98ee46f5aafschneider@chromium.org
91086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgnamespace {
92086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
93086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgclass ProfileTreeTestHelper {
94086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org public:
9525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  explicit ProfileTreeTestHelper(const ProfileTree* tree)
96086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      : tree_(tree) { }
97086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
98086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* Walk(CodeEntry* entry1,
99086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                    CodeEntry* entry2 = NULL,
100086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org                    CodeEntry* entry3 = NULL) {
101086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    ProfileNode* node = tree_->root();
102086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    node = node->FindChild(entry1);
103086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    if (node == NULL) return NULL;
104086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    if (entry2 != NULL) {
105086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      node = node->FindChild(entry2);
106086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      if (node == NULL) return NULL;
107086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    }
108086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    if (entry3 != NULL) {
109086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      node = node->FindChild(entry3);
110086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    }
111086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org    return node;
112086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  }
113086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
114086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org private:
11525156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  const ProfileTree* tree_;
116086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org};
117086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
118086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}  // namespace
119086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
120086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileTreeAddPathFromStart) {
12193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
12293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
12393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
124086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree tree;
125086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper helper(&tree);
126086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1));
127086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
128086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
129086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
130086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path[] = {NULL, &entry1, NULL, &entry2, NULL, NULL, &entry3, NULL};
131086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0]));
132086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromStart(path_vec);
133086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
134086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
135086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node1 = helper.Walk(&entry1);
136086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
137086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
138086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
139086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
140086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node2 = helper.Walk(&entry1, &entry2);
141086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
142086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node2);
143086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
144086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
145086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry2));
146086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node3 = helper.Walk(&entry1, &entry2, &entry3);
147086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node3);
148086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node3);
149086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node2, node3);
150086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node3->self_ticks());
151086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
152086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromStart(path_vec);
153086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
154086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
155086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
156086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
157086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
158086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
159086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
160086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path2[] = {&entry1, &entry2, &entry2};
161086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path2_vec(path2, sizeof(path2) / sizeof(path2[0]));
162086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromStart(path2_vec);
163086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
164086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
165086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
166086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
167086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
168086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
169086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
170086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
171086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
172086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2);
173086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node4);
174086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node3, node4);
175086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node4->self_ticks());
176086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
177086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
178086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
179086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileTreeAddPathFromEnd) {
18093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
18193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
18293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
183086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree tree;
184086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper helper(&tree);
185086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1));
186086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
187086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
188086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
189086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path[] = {NULL, &entry3, NULL, &entry2, NULL, NULL, &entry1, NULL};
190086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path_vec(path, sizeof(path) / sizeof(path[0]));
191086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromEnd(path_vec);
192086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
193086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
194086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node1 = helper.Walk(&entry1);
195086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
196086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
197086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
198086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
199086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node2 = helper.Walk(&entry1, &entry2);
200086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
201086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node2);
202086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
203086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
204086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry2));
205086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node3 = helper.Walk(&entry1, &entry2, &entry3);
206086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node3);
207086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node1, node3);
208086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node2, node3);
209086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node3->self_ticks());
210086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
211086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromEnd(path_vec);
212086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
213086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
214086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
215086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node1->self_ticks());
216086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, node2->self_ticks());
217086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
218086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
219086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* path2[] = {&entry2, &entry2, &entry1};
220086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> path2_vec(path2, sizeof(path2) / sizeof(path2[0]));
221086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  tree.AddPathFromEnd(path2_vec);
222086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry2));
223086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry3));
224086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node1, helper.Walk(&entry1));
225086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry1));
226086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry3));
227086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node2, helper.Walk(&entry1, &entry2));
228086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, helper.Walk(&entry1, &entry2, &entry1));
229086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(node3, helper.Walk(&entry1, &entry2, &entry3));
230086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node3->self_ticks());
231086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node4 = helper.Walk(&entry1, &entry2, &entry2);
232086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node4);
233086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(node3, node4);
234086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node4->self_ticks());
235086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
236086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
237086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
238086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(ProfileTreeCalculateTotalTicks) {
239086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree empty_tree;
240086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, empty_tree.root()->self_ticks());
241086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  empty_tree.root()->IncrementSelfTicks();
242086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, empty_tree.root()->self_ticks());
243086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
24493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
245086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e1_path[] = {&entry1};
246086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e1_path_vec(
247086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e1_path, sizeof(e1_path) / sizeof(e1_path[0]));
2489dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
2499dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  ProfileTree single_child_tree;
2509dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  single_child_tree.AddPathFromStart(e1_path_vec);
2519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  single_child_tree.root()->IncrementSelfTicks();
2529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_EQ(1, single_child_tree.root()->self_ticks());
2539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  ProfileTreeTestHelper single_child_helper(&single_child_tree);
2549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  ProfileNode* node1 = single_child_helper.Walk(&entry1);
2559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_NE(NULL, node1);
2569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_EQ(1, single_child_tree.root()->self_ticks());
2579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  CHECK_EQ(1, node1->self_ticks());
2589dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com
25993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
260086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e1_e2_path[] = {&entry1, &entry2};
261086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e1_e2_path_vec(
262086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e1_e2_path, sizeof(e1_e2_path) / sizeof(e1_e2_path[0]));
263086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
264086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree flat_tree;
265086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper flat_helper(&flat_tree);
266086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_path_vec);
267086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_path_vec);
268086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_e2_path_vec);
269086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_e2_path_vec);
270086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  flat_tree.AddPathFromStart(e1_e2_path_vec);
271086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Results in {root,0,0} -> {entry1,0,2} -> {entry2,0,3}
272086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, flat_tree.root()->self_ticks());
2739dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com  node1 = flat_helper.Walk(&entry1);
274086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
275086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
276086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node2 = flat_helper.Walk(&entry1, &entry2);
277086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
278086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(3, node2->self_ticks());
279086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Must calculate {root,5,0} -> {entry1,5,2} -> {entry2,3,3}
280086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, flat_tree.root()->self_ticks());
281086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
282086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
283086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e2_path[] = {&entry2};
284086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e2_path_vec(
285086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e2_path, sizeof(e2_path) / sizeof(e2_path[0]));
28693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
287086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeEntry* e3_path[] = {&entry3};
288086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  Vector<CodeEntry*> e3_path_vec(
289086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org      e3_path, sizeof(e3_path) / sizeof(e3_path[0]));
290086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
291086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTree wide_tree;
292086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileTreeTestHelper wide_helper(&wide_tree);
293086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e1_path_vec);
294086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e1_path_vec);
295086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e1_e2_path_vec);
296086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e2_path_vec);
297086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e2_path_vec);
298086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e2_path_vec);
299086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
300086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
301086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
302086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  wide_tree.AddPathFromStart(e3_path_vec);
303086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Results in            -> {entry1,0,2} -> {entry2,0,1}
304086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //            {root,0,0} -> {entry2,0,3}
305086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //                       -> {entry3,0,4}
306086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, wide_tree.root()->self_ticks());
307086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  node1 = wide_helper.Walk(&entry1);
308086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1);
309086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
310086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node1_2 = wide_helper.Walk(&entry1, &entry2);
311086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node1_2);
312086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node1_2->self_ticks());
313086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  node2 = wide_helper.Walk(&entry2);
314086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node2);
315086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(3, node2->self_ticks());
316086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  ProfileNode* node3 = wide_helper.Walk(&entry3);
317086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_NE(NULL, node3);
318086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(4, node3->self_ticks());
319086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  // Calculates             -> {entry1,3,2} -> {entry2,1,1}
320086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //            {root,10,0} -> {entry2,3,3}
321086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  //                        -> {entry3,4,4}
322086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(0, wide_tree.root()->self_ticks());
323086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(2, node1->self_ticks());
324086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(1, node1_2->self_ticks());
325086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(3, node2->self_ticks());
326086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(4, node3->self_ticks());
327086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
328086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
329086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
330086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgstatic inline i::Address ToAddress(int n) {
331086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  return reinterpret_cast<i::Address>(n);
332086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
333086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
334e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
335086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(CodeMapAddCode) {
336086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeMap code_map;
33793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
33893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
33993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
34093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry4(i::Logger::FUNCTION_TAG, "ddd");
341086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
342086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
343086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1900), &entry3, 0x50);
344086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1950), &entry4, 0x10);
345086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(0));
346086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1500 - 1)));
347086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
348086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500 + 0x100)));
349086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500 + 0x200 - 1)));
350086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700)));
351086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700 + 0x50)));
352086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700 + 0x100 - 1)));
353086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700 + 0x100)));
354086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1900 - 1)));
355086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1900)));
356086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1900 + 0x28)));
357086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry4, code_map.FindEntry(ToAddress(0x1950)));
358086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry4, code_map.FindEntry(ToAddress(0x1950 + 0x7)));
359086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry4, code_map.FindEntry(ToAddress(0x1950 + 0x10 - 1)));
360086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1950 + 0x10)));
361086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0xFFFFFFFF)));
362086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
363086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
364086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org
365086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.orgTEST(CodeMapMoveAndDeleteCode) {
366086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CodeMap code_map;
36793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
36893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
369086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
370086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
371086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
372086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(&entry2, code_map.FindEntry(ToAddress(0x1700)));
37334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  code_map.MoveCode(ToAddress(0x1500), ToAddress(0x1700));  // Deprecate bbb.
374086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1500)));
37534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1700)));
37693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
37734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  code_map.AddCode(ToAddress(0x1750), &entry3, 0x100);
378086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org  CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700)));
37934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org  CHECK_EQ(&entry3, code_map.FindEntry(ToAddress(0x1750)));
380086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org}
381cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
382cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
383357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgnamespace {
384357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
385357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.orgclass TestSetup {
386357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org public:
387357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  TestSetup()
388357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org      : old_flag_prof_browser_mode_(i::FLAG_prof_browser_mode) {
389357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org    i::FLAG_prof_browser_mode = false;
390357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  }
391357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
392357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  ~TestSetup() {
393357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org    i::FLAG_prof_browser_mode = old_flag_prof_browser_mode_;
394357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  }
395357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
396357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org private:
397357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  bool old_flag_prof_browser_mode_;
398357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org};
399357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
400357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org}  // namespace
401357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org
402cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgTEST(RecordTickSample) {
403357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org  TestSetup test_setup;
404528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection profiles(CcTest::heap());
4054f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  profiles.StartProfiling("", false);
406cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileGenerator generator(&profiles);
407ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
408ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry2 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb");
409ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry3 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "ccc");
410cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
411cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.code_map()->AddCode(ToAddress(0x1700), entry2, 0x100);
412cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.code_map()->AddCode(ToAddress(0x1900), entry3, 0x50);
413cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
414cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  // We are building the following calls tree:
415cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //      -> aaa         - sample1
416cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //  aaa -> bbb -> ccc  - sample2
417cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  //      -> ccc -> aaa  - sample3
418cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  TickSample sample1;
419cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample1.pc = ToAddress(0x1600);
42077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  sample1.tos = ToAddress(0x1500);
421cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample1.stack[0] = ToAddress(0x1510);
422cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample1.frames_count = 1;
423cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.RecordTickSample(sample1);
424cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  TickSample sample2;
425cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.pc = ToAddress(0x1925);
42677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  sample2.tos = ToAddress(0x1900);
427cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.stack[0] = ToAddress(0x1780);
428cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.stack[1] = ToAddress(0x10000);  // non-existent.
429cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.stack[2] = ToAddress(0x1620);
430cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample2.frames_count = 3;
431cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.RecordTickSample(sample2);
432cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  TickSample sample3;
433cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.pc = ToAddress(0x1510);
43477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  sample3.tos = ToAddress(0x1500);
435cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.stack[0] = ToAddress(0x1910);
436cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.stack[1] = ToAddress(0x1610);
437cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  sample3.frames_count = 2;
438cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  generator.RecordTickSample(sample3);
439cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org
440d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CpuProfile* profile = profiles.StopProfiling("");
44125156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  CHECK_NE(NULL, profile);
44225156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  ProfileTreeTestHelper top_down_test_helper(profile->top_down());
44325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  CHECK_EQ(NULL, top_down_test_helper.Walk(entry2));
44425156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  CHECK_EQ(NULL, top_down_test_helper.Walk(entry3));
445cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node1 = top_down_test_helper.Walk(entry1);
446cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node1);
447cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry1, node1->entry());
448cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node2 = top_down_test_helper.Walk(entry1, entry1);
449cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node2);
450cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry1, node2->entry());
451cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node3 = top_down_test_helper.Walk(entry1, entry2, entry3);
452cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node3);
453cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry3, node3->entry());
454cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  ProfileNode* node4 = top_down_test_helper.Walk(entry1, entry3, entry1);
455cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_NE(NULL, node4);
456cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org  CHECK_EQ(entry1, node4->entry());
457cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org}
45825156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org
459c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org
460f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgstatic void CheckNodeIds(ProfileNode* node, int* expectedId) {
461f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ((*expectedId)++, node->id());
462f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (int i = 0; i < node->children()->length(); i++) {
463f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    CheckNodeIds(node->children()->at(i), expectedId);
464f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
465f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
466f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
467e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
468f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgTEST(SampleIds) {
469f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TestSetup test_setup;
470528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection profiles(CcTest::heap());
4714f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  profiles.StartProfiling("", true);
472f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileGenerator generator(&profiles);
473ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
474ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry2 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb");
475ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry3 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "ccc");
476f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
477f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1700), entry2, 0x100);
478f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1900), entry3, 0x50);
479f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
480f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // We are building the following calls tree:
481f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //                    -> aaa #3           - sample1
482f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // (root)#1 -> aaa #2 -> bbb #4 -> ccc #5 - sample2
483f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //                    -> ccc #6 -> aaa #7 - sample3
484f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample1;
485f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.pc = ToAddress(0x1600);
486f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.stack[0] = ToAddress(0x1510);
487f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.frames_count = 1;
488f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample1);
489f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample2;
490f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.pc = ToAddress(0x1925);
491f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.stack[0] = ToAddress(0x1780);
492f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.stack[1] = ToAddress(0x10000);  // non-existent.
493f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.stack[2] = ToAddress(0x1620);
494f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample2.frames_count = 3;
495f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample2);
496f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample3;
497f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.pc = ToAddress(0x1510);
498f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.stack[0] = ToAddress(0x1910);
499f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.stack[1] = ToAddress(0x1610);
500f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample3.frames_count = 2;
501f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample3);
502f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
503d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CpuProfile* profile = profiles.StopProfiling("");
504f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  int nodeId = 1;
505f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CheckNodeIds(profile->top_down()->root(), &nodeId);
506f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(7, nodeId - 1);
507f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
508f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(3, profile->samples_count());
509f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  int expected_id[] = {3, 5, 7};
510f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  for (int i = 0; i < 3; i++) {
511f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    CHECK_EQ(expected_id[i], profile->sample(i)->id());
512f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
513f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
514f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
515f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
516f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgTEST(NoSamples) {
517f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TestSetup test_setup;
518528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection profiles(CcTest::heap());
5194f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  profiles.StartProfiling("", false);
520f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  ProfileGenerator generator(&profiles);
521ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  CodeEntry* entry1 = profiles.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
522f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
523f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
524f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // We are building the following calls tree:
525f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // (root)#1 -> aaa #2 -> aaa #3 - sample1
526f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  TickSample sample1;
527f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.pc = ToAddress(0x1600);
528f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.stack[0] = ToAddress(0x1510);
529f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  sample1.frames_count = 1;
530f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  generator.RecordTickSample(sample1);
531f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
532d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  CpuProfile* profile = profiles.StopProfiling("");
533f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  int nodeId = 1;
534f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CheckNodeIds(profile->top_down()->root(), &nodeId);
535f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(3, nodeId - 1);
536f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
537f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(0, profile->samples_count());
538f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
539f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
540f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
54182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgstatic const ProfileNode* PickChild(const ProfileNode* parent,
54282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org                                    const char* name) {
54382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  for (int i = 0; i < parent->children()->length(); ++i) {
54482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    const ProfileNode* child = parent->children()->at(i);
54582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org    if (strcmp(child->entry()->name(), name) == 0) return child;
54682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  }
54782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  return NULL;
54882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
54982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
55082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
55182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.orgTEST(RecordStackTraceAtStartProfiling) {
552a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // This test does not pass with inlining enabled since inlined functions
553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // don't appear in the stack trace.
554a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  i::FLAG_use_inlining = false;
555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
55643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
55743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
55843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::Context::Scope context_scope(env);
55982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
560528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfiler* profiler = CcTest::i_isolate()->cpu_profiler();
561f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(0, profiler->GetProfilesCount());
56282dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CompileRun(
56382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "function c() { startProfiling(); }\n"
56482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "function b() { c(); }\n"
56582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "function a() { b(); }\n"
56682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "a();\n"
56782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org      "stopProfiling();");
568f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  CHECK_EQ(1, profiler->GetProfilesCount());
569e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CpuProfile* profile = profiler->GetProfile(0);
57082dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  const ProfileTree* topDown = profile->top_down();
57182dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  const ProfileNode* current = topDown->root();
5725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  const_cast<ProfileNode*>(current)->Print(0);
57382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  // The tree should look like this:
57482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //  (root)
5753e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  //   ""
57682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //     a
57782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //       b
57882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  //         c
5795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // There can also be:
5805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  //           startProfiling
5815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  // if the sampler managed to get a tick.
5823e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  current = PickChild(current, "");
58382dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
58482dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "a");
58582dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
58682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "b");
58782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
58882dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  current = PickChild(current, "c");
58982dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org  CHECK_NE(NULL, const_cast<ProfileNode*>(current));
5905f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  CHECK(current->children()->length() == 0 ||
5915f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org        current->children()->length() == 1);
5925f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  if (current->children()->length() == 1) {
5935f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    current = PickChild(current, "startProfiling");
5945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org    CHECK_EQ(0, current->children()->length());
5955f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  }
59682dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org}
59782dbbabc05f6729248cef210931fe34556fd7ca0sgjesse@chromium.org
598d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org
599d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgTEST(Issue51919) {
600528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfilesCollection collection(CcTest::heap());
601d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  i::EmbeddedVector<char*,
602d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org      CpuProfilesCollection::kMaxSimultaneousProfiles> titles;
603d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i) {
604d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    i::Vector<char> title = i::Vector<char>::New(16);
60570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    i::SNPrintF(title, "%d", i);
6064f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org    CHECK(collection.StartProfiling(title.start(), false));
607d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    titles[i] = title.start();
608d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  }
6094f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  CHECK(!collection.StartProfiling("maximum", false));
610d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org  for (int i = 0; i < CpuProfilesCollection::kMaxSimultaneousProfiles; ++i)
611d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org    i::DeleteArray(titles[i]);
612d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org}
61393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
61493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
61593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgstatic const v8::CpuProfileNode* PickChild(const v8::CpuProfileNode* parent,
61693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org                                           const char* name) {
61793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  for (int i = 0; i < parent->GetChildrenCount(); ++i) {
61893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    const v8::CpuProfileNode* child = parent->GetChild(i);
619f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org    v8::String::Utf8Value function_name(child->GetFunctionName());
62093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org    if (strcmp(*function_name, name) == 0) return child;
62193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  }
62293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  return NULL;
62393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org}
62493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
62593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
62693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.orgTEST(ProfileNodeScriptId) {
62793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // This test does not pass with inlining enabled since inlined functions
62893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // don't appear in the stack trace.
62993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  i::FLAG_use_inlining = false;
63093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
63143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
63243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
63343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::Context::Scope context_scope(env);
63493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
63593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler();
6364f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler);
6374f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  CHECK_EQ(0, iprofiler->GetProfilesCount());
638f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Script> script_a = v8::Script::Compile(v8::String::NewFromUtf8(
639f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      env->GetIsolate(), "function a() { startProfiling(); }\n"));
64093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  script_a->Run();
641f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Script> script_b =
642f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
643f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "function b() { a(); }\n"
644f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "b();\n"
645f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "stopProfiling();\n"));
64693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  script_b->Run();
6474f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  CHECK_EQ(1, iprofiler->GetProfilesCount());
64843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  const v8::CpuProfile* profile = i::ProfilerExtension::last_profile;
64993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  const v8::CpuProfileNode* current = profile->GetTopDownRoot();
65093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  reinterpret_cast<ProfileNode*>(
65193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org      const_cast<v8::CpuProfileNode*>(current))->Print(0);
65293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // The tree should look like this:
65393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //  (root)
6543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  //   ""
65593a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //     b
65693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //       a
65793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // There can also be:
65893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  //         startProfiling
65993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  // if the sampler managed to get a tick.
6603e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  current = PickChild(current, "");
66193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
66293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
66393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  current = PickChild(current, "b");
66493a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
6651e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  CHECK_EQ(script_b->GetUnboundScript()->GetId(), current->GetScriptId());
66693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
66793a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  current = PickChild(current, "a");
66893a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
6691e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  CHECK_EQ(script_a->GetUnboundScript()->GetId(), current->GetScriptId());
67093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org}
67193a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
67293a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org
673e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
674e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
675e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgstatic const char* line_number_test_source_existing_functions =
676e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function foo_at_the_first_line() {\n"
677e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"}\n"
678e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"foo_at_the_first_line();\n"
679e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function lazy_func_at_forth_line() {}\n";
680e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
681e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
682e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgstatic const char* line_number_test_source_profile_time_functions =
683e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"// Empty first line\n"
684e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function bar_at_the_second_line() {\n"
685e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"  foo_at_the_first_line();\n"
686e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"}\n"
687e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"bar_at_the_second_line();\n"
688e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org"function lazy_func_at_6th_line() {}";
689e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
690e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgint GetFunctionLineNumber(LocalContext* env, const char* name) {
691528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  CpuProfiler* profiler = CcTest::i_isolate()->cpu_profiler();
692e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeMap* code_map = profiler->generator()->code_map();
693e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  i::Handle<i::JSFunction> func = v8::Utils::OpenHandle(
694e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org      *v8::Local<v8::Function>::Cast(
695e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org          (*(*env))->Global()->Get(v8_str(name))));
696e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CodeEntry* func_entry = code_map->FindEntry(func->code()->address());
697e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  if (!func_entry)
698e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    FATAL(name);
699e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  return func_entry->line_number();
700e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
701e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
702e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
703e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgTEST(LineNumber) {
704e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  i::FLAG_use_inlining = false;
705e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
706e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CcTest::InitializeVM();
707e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  LocalContext env;
708528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  i::Isolate* isolate = CcTest::i_isolate();
709e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  TestSetup test_setup;
710e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
711e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  i::HandleScope scope(isolate);
712e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
713e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CompileRun(line_number_test_source_existing_functions);
714e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
715e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CpuProfiler* profiler = isolate->cpu_profiler();
716e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  profiler->StartProfiling("LineNumber");
717e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
718e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CompileRun(line_number_test_source_profile_time_functions);
719e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
720e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  profiler->processor()->StopSynchronously();
721e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
722e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(1, GetFunctionLineNumber(&env, "foo_at_the_first_line"));
723e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(0, GetFunctionLineNumber(&env, "lazy_func_at_forth_line"));
724e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(2, GetFunctionLineNumber(&env, "bar_at_the_second_line"));
725e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  CHECK_EQ(0, GetFunctionLineNumber(&env, "lazy_func_at_6th_line"));
726e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
727e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  profiler->StopProfiling("LineNumber");
728e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
7292c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7302c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7312c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7322c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.orgTEST(BailoutReason) {
73343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
73443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::Local<v8::Context> env = CcTest::NewContext(PROFILER_EXTENSION);
73543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  v8::Context::Scope context_scope(env);
7362c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7372c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  v8::CpuProfiler* profiler = env->GetIsolate()->GetCpuProfiler();
7384f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  i::CpuProfiler* iprofiler = reinterpret_cast<i::CpuProfiler*>(profiler);
7394f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  CHECK_EQ(0, iprofiler->GetProfilesCount());
740f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  v8::Handle<v8::Script> script =
741f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org      v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(),
742f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "function TryCatch() {\n"
743f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  try {\n"
744f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "    startProfiling();\n"
745f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  } catch (e) { };\n"
746f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "}\n"
747f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "function TryFinally() {\n"
748f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  try {\n"
749f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "    TryCatch();\n"
750f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "  } finally { };\n"
751f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "}\n"
752f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "TryFinally();\n"
753f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org                                                  "stopProfiling();"));
7542c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  script->Run();
7554f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  CHECK_EQ(1, iprofiler->GetProfilesCount());
75643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  const v8::CpuProfile* profile = i::ProfilerExtension::last_profile;
7574f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  CHECK(profile);
7582c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  const v8::CpuProfileNode* current = profile->GetTopDownRoot();
7592c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  reinterpret_cast<ProfileNode*>(
7602c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org      const_cast<v8::CpuProfileNode*>(current))->Print(0);
7612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  // The tree should look like this:
7622c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //  (root)
7633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  //   ""
7642c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //     kTryFinally
7652c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  //       kTryCatch
7663e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  current = PickChild(current, "");
7672c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
7682c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7692c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  current = PickChild(current, "TryFinally");
7702c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
7712c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK(!strcmp("TryFinallyStatement", current->GetBailoutReason()));
7722c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
7732c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  current = PickChild(current, "TryCatch");
7742c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK_NE(NULL, const_cast<v8::CpuProfileNode*>(current));
7752c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org  CHECK(!strcmp("TryCatchStatement", current->GetBailoutReason()));
7762c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org}
777