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