OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/cpu-profiler.h" | 5 #include "src/cpu-profiler.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/cpu-profiler-inl.h" | 8 #include "src/cpu-profiler-inl.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/frames-inl.h" | 10 #include "src/frames-inl.h" |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 void CpuProfiler::DeleteProfile(CpuProfile* profile) { | 193 void CpuProfiler::DeleteProfile(CpuProfile* profile) { |
194 profiles_->RemoveProfile(profile); | 194 profiles_->RemoveProfile(profile); |
195 delete profile; | 195 delete profile; |
196 if (profiles_->profiles()->is_empty() && !is_profiling_) { | 196 if (profiles_->profiles()->is_empty() && !is_profiling_) { |
197 // If this was the last profile, clean up all accessory data as well. | 197 // If this was the last profile, clean up all accessory data as well. |
198 ResetProfiles(); | 198 ResetProfiles(); |
199 } | 199 } |
200 } | 200 } |
201 | 201 |
202 | 202 |
203 static bool FilterOutCodeCreateEvent(Logger::LogEventsAndTags tag) { | |
204 return FLAG_prof_browser_mode | |
205 && (tag != Logger::CALLBACK_TAG | |
206 && tag != Logger::FUNCTION_TAG | |
207 && tag != Logger::LAZY_COMPILE_TAG | |
208 && tag != Logger::REG_EXP_TAG | |
209 && tag != Logger::SCRIPT_TAG); | |
210 } | |
211 | |
212 | |
213 void CpuProfiler::CallbackEvent(Name* name, Address entry_point) { | 203 void CpuProfiler::CallbackEvent(Name* name, Address entry_point) { |
214 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | |
215 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 204 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
216 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 205 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
217 rec->start = entry_point; | 206 rec->start = entry_point; |
218 rec->entry = profiles_->NewCodeEntry( | 207 rec->entry = profiles_->NewCodeEntry( |
219 Logger::CALLBACK_TAG, | 208 Logger::CALLBACK_TAG, |
220 profiles_->GetName(name)); | 209 profiles_->GetName(name)); |
221 rec->size = 1; | 210 rec->size = 1; |
222 processor_->Enqueue(evt_rec); | 211 processor_->Enqueue(evt_rec); |
223 } | 212 } |
224 | 213 |
225 | 214 |
226 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 215 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
227 Code* code, | 216 Code* code, |
228 const char* name) { | 217 const char* name) { |
229 if (FilterOutCodeCreateEvent(tag)) return; | |
230 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 218 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
231 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 219 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
232 rec->start = code->address(); | 220 rec->start = code->address(); |
233 rec->entry = profiles_->NewCodeEntry( | 221 rec->entry = profiles_->NewCodeEntry( |
234 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, | 222 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
235 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 223 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
236 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 224 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
237 rec->size = code->ExecutableSize(); | 225 rec->size = code->ExecutableSize(); |
238 processor_->Enqueue(evt_rec); | 226 processor_->Enqueue(evt_rec); |
239 } | 227 } |
240 | 228 |
241 | 229 |
242 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 230 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
243 Code* code, | 231 Code* code, |
244 Name* name) { | 232 Name* name) { |
245 if (FilterOutCodeCreateEvent(tag)) return; | |
246 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 233 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
247 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 234 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
248 rec->start = code->address(); | 235 rec->start = code->address(); |
249 rec->entry = profiles_->NewCodeEntry( | 236 rec->entry = profiles_->NewCodeEntry( |
250 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, | 237 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
251 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 238 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
252 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 239 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
253 rec->size = code->ExecutableSize(); | 240 rec->size = code->ExecutableSize(); |
254 processor_->Enqueue(evt_rec); | 241 processor_->Enqueue(evt_rec); |
255 } | 242 } |
256 | 243 |
257 | 244 |
258 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 245 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, |
259 SharedFunctionInfo* shared, | 246 SharedFunctionInfo* shared, |
260 CompilationInfo* info, Name* script_name) { | 247 CompilationInfo* info, Name* script_name) { |
261 if (FilterOutCodeCreateEvent(tag)) return; | |
262 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 248 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
263 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 249 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
264 rec->start = code->address(); | 250 rec->start = code->address(); |
265 rec->entry = profiles_->NewCodeEntry( | 251 rec->entry = profiles_->NewCodeEntry( |
266 tag, profiles_->GetFunctionName(shared->DebugName()), | 252 tag, profiles_->GetFunctionName(shared->DebugName()), |
267 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), | 253 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), |
268 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, | 254 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, |
269 NULL, code->instruction_start()); | 255 NULL, code->instruction_start()); |
270 if (info) { | 256 if (info) { |
271 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); | 257 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); |
272 rec->entry->set_inlined_function_infos(info->inlined_function_infos()); | 258 rec->entry->set_inlined_function_infos(info->inlined_function_infos()); |
273 } | 259 } |
274 rec->entry->FillFunctionInfo(shared); | 260 rec->entry->FillFunctionInfo(shared); |
275 rec->size = code->ExecutableSize(); | 261 rec->size = code->ExecutableSize(); |
276 processor_->Enqueue(evt_rec); | 262 processor_->Enqueue(evt_rec); |
277 } | 263 } |
278 | 264 |
279 | 265 |
280 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 266 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, |
281 SharedFunctionInfo* shared, | 267 SharedFunctionInfo* shared, |
282 CompilationInfo* info, Name* script_name, | 268 CompilationInfo* info, Name* script_name, |
283 int line, int column) { | 269 int line, int column) { |
284 if (FilterOutCodeCreateEvent(tag)) return; | |
285 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 270 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
286 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 271 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
287 rec->start = code->address(); | 272 rec->start = code->address(); |
288 Script* script = Script::cast(shared->script()); | 273 Script* script = Script::cast(shared->script()); |
289 JITLineInfoTable* line_table = NULL; | 274 JITLineInfoTable* line_table = NULL; |
290 if (script) { | 275 if (script) { |
291 line_table = new JITLineInfoTable(); | 276 line_table = new JITLineInfoTable(); |
292 for (RelocIterator it(code); !it.done(); it.next()) { | 277 for (RelocIterator it(code); !it.done(); it.next()) { |
293 RelocInfo::Mode mode = it.rinfo()->rmode(); | 278 RelocInfo::Mode mode = it.rinfo()->rmode(); |
294 if (RelocInfo::IsPosition(mode)) { | 279 if (RelocInfo::IsPosition(mode)) { |
(...skipping 16 matching lines...) Expand all Loading... |
311 } | 296 } |
312 rec->entry->FillFunctionInfo(shared); | 297 rec->entry->FillFunctionInfo(shared); |
313 rec->size = code->ExecutableSize(); | 298 rec->size = code->ExecutableSize(); |
314 processor_->Enqueue(evt_rec); | 299 processor_->Enqueue(evt_rec); |
315 } | 300 } |
316 | 301 |
317 | 302 |
318 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 303 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
319 Code* code, | 304 Code* code, |
320 int args_count) { | 305 int args_count) { |
321 if (FilterOutCodeCreateEvent(tag)) return; | |
322 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 306 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
323 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 307 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
324 rec->start = code->address(); | 308 rec->start = code->address(); |
325 rec->entry = profiles_->NewCodeEntry( | 309 rec->entry = profiles_->NewCodeEntry( |
326 tag, profiles_->GetName(args_count), "args_count: ", | 310 tag, profiles_->GetName(args_count), "args_count: ", |
327 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 311 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
328 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 312 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
329 rec->size = code->ExecutableSize(); | 313 rec->size = code->ExecutableSize(); |
330 processor_->Enqueue(evt_rec); | 314 processor_->Enqueue(evt_rec); |
331 } | 315 } |
(...skipping 28 matching lines...) Expand all Loading... |
360 processor_->Enqueue(evt_rec); | 344 processor_->Enqueue(evt_rec); |
361 processor_->AddDeoptStack(isolate_, pc, fp_to_sp_delta); | 345 processor_->AddDeoptStack(isolate_, pc, fp_to_sp_delta); |
362 } | 346 } |
363 | 347 |
364 | 348 |
365 void CpuProfiler::CodeDeleteEvent(Address from) { | 349 void CpuProfiler::CodeDeleteEvent(Address from) { |
366 } | 350 } |
367 | 351 |
368 | 352 |
369 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { | 353 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { |
370 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | |
371 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 354 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
372 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 355 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
373 rec->start = entry_point; | 356 rec->start = entry_point; |
374 rec->entry = profiles_->NewCodeEntry( | 357 rec->entry = profiles_->NewCodeEntry( |
375 Logger::CALLBACK_TAG, | 358 Logger::CALLBACK_TAG, |
376 profiles_->GetName(name), | 359 profiles_->GetName(name), |
377 "get "); | 360 "get "); |
378 rec->size = 1; | 361 rec->size = 1; |
379 processor_->Enqueue(evt_rec); | 362 processor_->Enqueue(evt_rec); |
380 } | 363 } |
381 | 364 |
382 | 365 |
383 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { | 366 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { |
384 if (FilterOutCodeCreateEvent(Logger::REG_EXP_TAG)) return; | |
385 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 367 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
386 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 368 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
387 rec->start = code->address(); | 369 rec->start = code->address(); |
388 rec->entry = profiles_->NewCodeEntry( | 370 rec->entry = profiles_->NewCodeEntry( |
389 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", | 371 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", |
390 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 372 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
391 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 373 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
392 rec->size = code->ExecutableSize(); | 374 rec->size = code->ExecutableSize(); |
393 processor_->Enqueue(evt_rec); | 375 processor_->Enqueue(evt_rec); |
394 } | 376 } |
395 | 377 |
396 | 378 |
397 void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) { | 379 void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) { |
398 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | |
399 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 380 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
400 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 381 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
401 rec->start = entry_point; | 382 rec->start = entry_point; |
402 rec->entry = profiles_->NewCodeEntry( | 383 rec->entry = profiles_->NewCodeEntry( |
403 Logger::CALLBACK_TAG, | 384 Logger::CALLBACK_TAG, |
404 profiles_->GetName(name), | 385 profiles_->GetName(name), |
405 "set "); | 386 "set "); |
406 rec->size = 1; | 387 rec->size = 1; |
407 processor_->Enqueue(evt_rec); | 388 processor_->Enqueue(evt_rec); |
408 } | 389 } |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 Builtins::Name id = static_cast<Builtins::Name>(i); | 522 Builtins::Name id = static_cast<Builtins::Name>(i); |
542 rec->start = builtins->builtin(id)->address(); | 523 rec->start = builtins->builtin(id)->address(); |
543 rec->builtin_id = id; | 524 rec->builtin_id = id; |
544 processor_->Enqueue(evt_rec); | 525 processor_->Enqueue(evt_rec); |
545 } | 526 } |
546 } | 527 } |
547 | 528 |
548 | 529 |
549 } // namespace internal | 530 } // namespace internal |
550 } // namespace v8 | 531 } // namespace v8 |
OLD | NEW |