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