OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // | 2 // |
3 // Tests of profiles generator and utilities. | 3 // Tests of profiles generator and utilities. |
4 | 4 |
| 5 #ifdef ENABLE_CPP_PROFILES_PROCESSOR |
| 6 |
5 #include "v8.h" | 7 #include "v8.h" |
6 #include "cpu-profiler-inl.h" | 8 #include "cpu-profiler-inl.h" |
7 #include "cctest.h" | 9 #include "cctest.h" |
8 | 10 |
9 namespace i = v8::internal; | 11 namespace i = v8::internal; |
10 | 12 |
11 using i::CodeEntry; | 13 using i::CodeEntry; |
| 14 using i::CpuProfile; |
12 using i::CpuProfilesCollection; | 15 using i::CpuProfilesCollection; |
13 using i::ProfileGenerator; | 16 using i::ProfileGenerator; |
14 using i::ProfileNode; | 17 using i::ProfileNode; |
15 using i::ProfilerEventsProcessor; | 18 using i::ProfilerEventsProcessor; |
16 | 19 |
17 | 20 |
18 TEST(StartStop) { | 21 TEST(StartStop) { |
19 CpuProfilesCollection profiles; | 22 CpuProfilesCollection profiles; |
20 ProfileGenerator generator(&profiles); | 23 ProfileGenerator generator(&profiles); |
21 ProfilerEventsProcessor processor(&generator); | 24 ProfilerEventsProcessor processor(&generator); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 } | 56 } |
54 if (frame3 != NULL) { | 57 if (frame3 != NULL) { |
55 sample->stack[1] = frame3; | 58 sample->stack[1] = frame3; |
56 sample->frames_count = 2; | 59 sample->frames_count = 2; |
57 } | 60 } |
58 } | 61 } |
59 | 62 |
60 TEST(CodeEvents) { | 63 TEST(CodeEvents) { |
61 InitializeVM(); | 64 InitializeVM(); |
62 CpuProfilesCollection profiles; | 65 CpuProfilesCollection profiles; |
63 profiles.AddProfile(0); | 66 profiles.StartProfiling("", 1); |
64 ProfileGenerator generator(&profiles); | 67 ProfileGenerator generator(&profiles); |
65 ProfilerEventsProcessor processor(&generator); | 68 ProfilerEventsProcessor processor(&generator); |
66 processor.Start(); | 69 processor.Start(); |
67 while (!processor.running()) { | 70 while (!processor.running()) { |
68 i::Thread::YieldCPU(); | 71 i::Thread::YieldCPU(); |
69 } | 72 } |
70 | 73 |
71 // Enqueue code creation events. | 74 // Enqueue code creation events. |
72 i::HandleScope scope; | 75 i::HandleScope scope; |
73 const char* aaa_str = "aaa"; | 76 const char* aaa_str = "aaa"; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 } | 122 } |
120 | 123 |
121 | 124 |
122 template<typename T> | 125 template<typename T> |
123 static int CompareProfileNodes(const T* p1, const T* p2) { | 126 static int CompareProfileNodes(const T* p1, const T* p2) { |
124 return strcmp((*p1)->entry()->name(), (*p2)->entry()->name()); | 127 return strcmp((*p1)->entry()->name(), (*p2)->entry()->name()); |
125 } | 128 } |
126 | 129 |
127 TEST(TickEvents) { | 130 TEST(TickEvents) { |
128 CpuProfilesCollection profiles; | 131 CpuProfilesCollection profiles; |
129 profiles.AddProfile(0); | 132 profiles.StartProfiling("", 1); |
130 ProfileGenerator generator(&profiles); | 133 ProfileGenerator generator(&profiles); |
131 ProfilerEventsProcessor processor(&generator); | 134 ProfilerEventsProcessor processor(&generator); |
132 processor.Start(); | 135 processor.Start(); |
133 while (!processor.running()) { | 136 while (!processor.running()) { |
134 i::Thread::YieldCPU(); | 137 i::Thread::YieldCPU(); |
135 } | 138 } |
136 | 139 |
137 processor.CodeCreateEvent(i::Logger::BUILTIN_TAG, | 140 processor.CodeCreateEvent(i::Logger::BUILTIN_TAG, |
138 "bbb", | 141 "bbb", |
139 ToAddress(0x1200), | 142 ToAddress(0x1200), |
140 0x80); | 143 0x80); |
141 processor.CodeCreateEvent(i::Logger::STUB_TAG, 5, ToAddress(0x1300), 0x10); | 144 processor.CodeCreateEvent(i::Logger::STUB_TAG, 5, ToAddress(0x1300), 0x10); |
142 processor.CodeCreateEvent(i::Logger::BUILTIN_TAG, | 145 processor.CodeCreateEvent(i::Logger::BUILTIN_TAG, |
143 "ddd", | 146 "ddd", |
144 ToAddress(0x1400), | 147 ToAddress(0x1400), |
145 0x80); | 148 0x80); |
146 EnqueueTickSampleEvent(&processor, ToAddress(0x1210)); | 149 EnqueueTickSampleEvent(&processor, ToAddress(0x1210)); |
147 EnqueueTickSampleEvent(&processor, ToAddress(0x1305), ToAddress(0x1220)); | 150 EnqueueTickSampleEvent(&processor, ToAddress(0x1305), ToAddress(0x1220)); |
148 EnqueueTickSampleEvent(&processor, | 151 EnqueueTickSampleEvent(&processor, |
149 ToAddress(0x1404), | 152 ToAddress(0x1404), |
150 ToAddress(0x1305), | 153 ToAddress(0x1305), |
151 ToAddress(0x1230)); | 154 ToAddress(0x1230)); |
152 | 155 |
153 processor.Stop(); | 156 processor.Stop(); |
154 processor.Join(); | 157 processor.Join(); |
| 158 CpuProfile* profile = profiles.StopProfiling(""); |
| 159 CHECK_NE(NULL, profile); |
155 | 160 |
156 // Check call trees. | 161 // Check call trees. |
157 i::List<ProfileNode*> top_down_root_children; | 162 const i::List<ProfileNode*>* top_down_root_children = |
158 profiles.profile()->top_down()->root()->GetChildren(&top_down_root_children); | 163 profile->top_down()->root()->children(); |
159 CHECK_EQ(1, top_down_root_children.length()); | 164 CHECK_EQ(1, top_down_root_children->length()); |
160 CHECK_EQ("bbb", top_down_root_children.last()->entry()->name()); | 165 CHECK_EQ("bbb", top_down_root_children->last()->entry()->name()); |
161 i::List<ProfileNode*> top_down_bbb_children; | 166 const i::List<ProfileNode*>* top_down_bbb_children = |
162 top_down_root_children.last()->GetChildren(&top_down_bbb_children); | 167 top_down_root_children->last()->children(); |
163 CHECK_EQ(1, top_down_bbb_children.length()); | 168 CHECK_EQ(1, top_down_bbb_children->length()); |
164 CHECK_EQ("args_count: 5", top_down_bbb_children.last()->entry()->name()); | 169 CHECK_EQ("args_count: 5", top_down_bbb_children->last()->entry()->name()); |
165 i::List<ProfileNode*> top_down_stub_children; | 170 const i::List<ProfileNode*>* top_down_stub_children = |
166 top_down_bbb_children.last()->GetChildren(&top_down_stub_children); | 171 top_down_bbb_children->last()->children(); |
167 CHECK_EQ(1, top_down_stub_children.length()); | 172 CHECK_EQ(1, top_down_stub_children->length()); |
168 CHECK_EQ("ddd", top_down_stub_children.last()->entry()->name()); | 173 CHECK_EQ("ddd", top_down_stub_children->last()->entry()->name()); |
169 i::List<ProfileNode*> top_down_ddd_children; | 174 const i::List<ProfileNode*>* top_down_ddd_children = |
170 top_down_stub_children.last()->GetChildren(&top_down_ddd_children); | 175 top_down_stub_children->last()->children(); |
171 CHECK_EQ(0, top_down_ddd_children.length()); | 176 CHECK_EQ(0, top_down_ddd_children->length()); |
172 | 177 |
173 i::List<ProfileNode*> bottom_up_root_children; | 178 const i::List<ProfileNode*>* bottom_up_root_children_unsorted = |
174 profiles.profile()->bottom_up()->root()->GetChildren( | 179 profile->bottom_up()->root()->children(); |
175 &bottom_up_root_children); | 180 CHECK_EQ(3, bottom_up_root_children_unsorted->length()); |
176 CHECK_EQ(3, bottom_up_root_children.length()); | 181 i::List<ProfileNode*> bottom_up_root_children(3); |
| 182 bottom_up_root_children.AddAll(*bottom_up_root_children_unsorted); |
177 bottom_up_root_children.Sort(&CompareProfileNodes); | 183 bottom_up_root_children.Sort(&CompareProfileNodes); |
178 CHECK_EQ("args_count: 5", bottom_up_root_children[0]->entry()->name()); | 184 CHECK_EQ("args_count: 5", bottom_up_root_children[0]->entry()->name()); |
179 CHECK_EQ("bbb", bottom_up_root_children[1]->entry()->name()); | 185 CHECK_EQ("bbb", bottom_up_root_children[1]->entry()->name()); |
180 CHECK_EQ("ddd", bottom_up_root_children[2]->entry()->name()); | 186 CHECK_EQ("ddd", bottom_up_root_children[2]->entry()->name()); |
181 i::List<ProfileNode*> bottom_up_stub_children; | 187 const i::List<ProfileNode*>* bottom_up_stub_children = |
182 bottom_up_root_children[0]->GetChildren(&bottom_up_stub_children); | 188 bottom_up_root_children[0]->children(); |
183 CHECK_EQ(1, bottom_up_stub_children.length()); | 189 CHECK_EQ(1, bottom_up_stub_children->length()); |
184 CHECK_EQ("bbb", bottom_up_stub_children.last()->entry()->name()); | 190 CHECK_EQ("bbb", bottom_up_stub_children->last()->entry()->name()); |
185 i::List<ProfileNode*> bottom_up_bbb_children; | 191 const i::List<ProfileNode*>* bottom_up_bbb_children = |
186 bottom_up_root_children[1]->GetChildren(&bottom_up_bbb_children); | 192 bottom_up_root_children[1]->children(); |
187 CHECK_EQ(0, bottom_up_bbb_children.length()); | 193 CHECK_EQ(0, bottom_up_bbb_children->length()); |
188 i::List<ProfileNode*> bottom_up_ddd_children; | 194 const i::List<ProfileNode*>* bottom_up_ddd_children = |
189 bottom_up_root_children[2]->GetChildren(&bottom_up_ddd_children); | 195 bottom_up_root_children[2]->children(); |
190 CHECK_EQ(1, bottom_up_ddd_children.length()); | 196 CHECK_EQ(1, bottom_up_ddd_children->length()); |
191 CHECK_EQ("args_count: 5", bottom_up_ddd_children.last()->entry()->name()); | 197 CHECK_EQ("args_count: 5", bottom_up_ddd_children->last()->entry()->name()); |
192 i::List<ProfileNode*> bottom_up_ddd_stub_children; | 198 const i::List<ProfileNode*>* bottom_up_ddd_stub_children = |
193 bottom_up_ddd_children.last()->GetChildren(&bottom_up_ddd_stub_children); | 199 bottom_up_ddd_children->last()->children(); |
194 CHECK_EQ(1, bottom_up_ddd_stub_children.length()); | 200 CHECK_EQ(1, bottom_up_ddd_stub_children->length()); |
195 CHECK_EQ("bbb", bottom_up_ddd_stub_children.last()->entry()->name()); | 201 CHECK_EQ("bbb", bottom_up_ddd_stub_children->last()->entry()->name()); |
196 } | 202 } |
| 203 |
| 204 #endif // ENABLE_CPP_PROFILES_PROCESSOR |
OLD | NEW |