| Index: test/cctest/test-profile-generator.cc
|
| diff --git a/test/cctest/test-profile-generator.cc b/test/cctest/test-profile-generator.cc
|
| index 2d673d45677dd4daf21e89cd66e44f19ac53d293..fc4d603e61020cae6cb437521744ca5626a951c3 100644
|
| --- a/test/cctest/test-profile-generator.cc
|
| +++ b/test/cctest/test-profile-generator.cc
|
| @@ -10,25 +10,27 @@ namespace i = v8::internal;
|
|
|
| using i::CodeEntry;
|
| using i::CodeMap;
|
| +using i::CpuProfilesCollection;
|
| using i::ProfileNode;
|
| using i::ProfileTree;
|
| -using i::StaticNameCodeEntry;
|
| +using i::ProfileGenerator;
|
| +using i::TickSample;
|
| using i::Vector;
|
|
|
|
|
| TEST(ProfileNodeFindOrAddChild) {
|
| ProfileNode node(NULL);
|
| - StaticNameCodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
| + CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", "", 0);
|
| ProfileNode* childNode1 = node.FindOrAddChild(&entry1);
|
| CHECK_NE(NULL, childNode1);
|
| CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
| - StaticNameCodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
| + CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", "", 0);
|
| ProfileNode* childNode2 = node.FindOrAddChild(&entry2);
|
| CHECK_NE(NULL, childNode2);
|
| CHECK_NE(childNode1, childNode2);
|
| CHECK_EQ(childNode1, node.FindOrAddChild(&entry1));
|
| CHECK_EQ(childNode2, node.FindOrAddChild(&entry2));
|
| - StaticNameCodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
| + CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc", "", 0);
|
| ProfileNode* childNode3 = node.FindOrAddChild(&entry3);
|
| CHECK_NE(NULL, childNode3);
|
| CHECK_NE(childNode1, childNode3);
|
| @@ -69,9 +71,9 @@ class ProfileTreeTestHelper {
|
| } // namespace
|
|
|
| TEST(ProfileTreeAddPathFromStart) {
|
| - StaticNameCodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
| - StaticNameCodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
| - StaticNameCodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
| + CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", "", 0);
|
| + CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", "", 0);
|
| + CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc", "", 0);
|
| ProfileTree tree;
|
| ProfileTreeTestHelper helper(&tree);
|
| CHECK_EQ(NULL, helper.Walk(&entry1));
|
| @@ -136,9 +138,9 @@ TEST(ProfileTreeAddPathFromStart) {
|
|
|
|
|
| TEST(ProfileTreeAddPathFromEnd) {
|
| - StaticNameCodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
| - StaticNameCodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
| - StaticNameCodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
| + CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", "", 0);
|
| + CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", "", 0);
|
| + CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc", "", 0);
|
| ProfileTree tree;
|
| ProfileTreeTestHelper helper(&tree);
|
| CHECK_EQ(NULL, helper.Walk(&entry1));
|
| @@ -216,8 +218,8 @@ TEST(ProfileTreeCalculateTotalTicks) {
|
| CHECK_EQ(1, empty_tree.root()->total_ticks());
|
| CHECK_EQ(1, empty_tree.root()->self_ticks());
|
|
|
| - StaticNameCodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
| - StaticNameCodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
| + CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", "", 0);
|
| + CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", "", 0);
|
| CodeEntry* e1_path[] = {&entry1};
|
| Vector<CodeEntry*> e1_path_vec(
|
| e1_path, sizeof(e1_path) / sizeof(e1_path[0]));
|
| @@ -255,7 +257,7 @@ TEST(ProfileTreeCalculateTotalTicks) {
|
| CodeEntry* e2_path[] = {&entry2};
|
| Vector<CodeEntry*> e2_path_vec(
|
| e2_path, sizeof(e2_path) / sizeof(e2_path[0]));
|
| - StaticNameCodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
| + CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc", "", 0);
|
| CodeEntry* e3_path[] = {&entry3};
|
| Vector<CodeEntry*> e3_path_vec(
|
| e3_path, sizeof(e3_path) / sizeof(e3_path[0]));
|
| @@ -316,10 +318,10 @@ static inline i::Address ToAddress(int n) {
|
|
|
| TEST(CodeMapAddCode) {
|
| CodeMap code_map;
|
| - StaticNameCodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
| - StaticNameCodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
| - StaticNameCodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc");
|
| - StaticNameCodeEntry entry4(i::Logger::FUNCTION_TAG, "ddd");
|
| + CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", "", 0);
|
| + CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", "", 0);
|
| + CodeEntry entry3(i::Logger::FUNCTION_TAG, "ccc", "", 0);
|
| + CodeEntry entry4(i::Logger::FUNCTION_TAG, "ddd", "", 0);
|
| code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
|
| code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
|
| code_map.AddCode(ToAddress(0x1900), &entry3, 0x50);
|
| @@ -346,8 +348,8 @@ TEST(CodeMapAddCode) {
|
|
|
| TEST(CodeMapMoveAndDeleteCode) {
|
| CodeMap code_map;
|
| - StaticNameCodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa");
|
| - StaticNameCodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb");
|
| + CodeEntry entry1(i::Logger::FUNCTION_TAG, "aaa", "", 0);
|
| + CodeEntry entry2(i::Logger::FUNCTION_TAG, "bbb", "", 0);
|
| code_map.AddCode(ToAddress(0x1500), &entry1, 0x200);
|
| code_map.AddCode(ToAddress(0x1700), &entry2, 0x100);
|
| CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1500)));
|
| @@ -360,3 +362,60 @@ TEST(CodeMapMoveAndDeleteCode) {
|
| CHECK_EQ(NULL, code_map.FindEntry(ToAddress(0x1700)));
|
| CHECK_EQ(&entry1, code_map.FindEntry(ToAddress(0x1800)));
|
| }
|
| +
|
| +
|
| +TEST(RecordTickSample) {
|
| + CpuProfilesCollection profiles;
|
| + profiles.AddProfile(0);
|
| + ProfileGenerator generator(&profiles);
|
| + CodeEntry* entry1 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "aaa");
|
| + CodeEntry* entry2 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "bbb");
|
| + CodeEntry* entry3 = generator.NewCodeEntry(i::Logger::FUNCTION_TAG, "ccc");
|
| + generator.code_map()->AddCode(ToAddress(0x1500), entry1, 0x200);
|
| + generator.code_map()->AddCode(ToAddress(0x1700), entry2, 0x100);
|
| + generator.code_map()->AddCode(ToAddress(0x1900), entry3, 0x50);
|
| +
|
| + ProfileTreeTestHelper top_down_test_helper(profiles.profile()->top_down());
|
| + CHECK_EQ(NULL, top_down_test_helper.Walk(entry1));
|
| + CHECK_EQ(NULL, top_down_test_helper.Walk(entry2));
|
| + CHECK_EQ(NULL, top_down_test_helper.Walk(entry3));
|
| +
|
| + // We are building the following calls tree:
|
| + // -> aaa - sample1
|
| + // aaa -> bbb -> ccc - sample2
|
| + // -> ccc -> aaa - sample3
|
| + TickSample sample1;
|
| + sample1.pc = ToAddress(0x1600);
|
| + sample1.function = ToAddress(0x1500);
|
| + sample1.stack[0] = ToAddress(0x1510);
|
| + sample1.frames_count = 1;
|
| + generator.RecordTickSample(sample1);
|
| + TickSample sample2;
|
| + sample2.pc = ToAddress(0x1925);
|
| + sample2.function = ToAddress(0x1900);
|
| + sample2.stack[0] = ToAddress(0x1780);
|
| + sample2.stack[1] = ToAddress(0x10000); // non-existent.
|
| + sample2.stack[2] = ToAddress(0x1620);
|
| + sample2.frames_count = 3;
|
| + generator.RecordTickSample(sample2);
|
| + TickSample sample3;
|
| + sample3.pc = ToAddress(0x1510);
|
| + sample3.function = ToAddress(0x1500);
|
| + sample3.stack[0] = ToAddress(0x1910);
|
| + sample3.stack[1] = ToAddress(0x1610);
|
| + sample3.frames_count = 2;
|
| + generator.RecordTickSample(sample3);
|
| +
|
| + ProfileNode* node1 = top_down_test_helper.Walk(entry1);
|
| + CHECK_NE(NULL, node1);
|
| + CHECK_EQ(entry1, node1->entry());
|
| + ProfileNode* node2 = top_down_test_helper.Walk(entry1, entry1);
|
| + CHECK_NE(NULL, node2);
|
| + CHECK_EQ(entry1, node2->entry());
|
| + // ProfileNode* node3 = top_down_test_helper.Walk(entry1, entry2, entry3);
|
| + // CHECK_NE(NULL, node3);
|
| + // CHECK_EQ(entry2, node3->entry());
|
| + ProfileNode* node4 = top_down_test_helper.Walk(entry1, entry3, entry1);
|
| + CHECK_NE(NULL, node4);
|
| + CHECK_EQ(entry1, node4->entry());
|
| +}
|
|
|