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/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/cpu-profiler-inl.h" | 7 #include "src/cpu-profiler-inl.h" |
8 | 8 |
9 #include "src/compiler.h" | 9 #include "src/compiler.h" |
10 #include "src/deoptimizer.h" | 10 #include "src/deoptimizer.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 194 |
195 void CpuProfiler::CallbackEvent(Name* name, Address entry_point) { | 195 void CpuProfiler::CallbackEvent(Name* name, Address entry_point) { |
196 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | 196 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; |
197 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 197 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
198 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 198 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
199 rec->start = entry_point; | 199 rec->start = entry_point; |
200 rec->entry = profiles_->NewCodeEntry( | 200 rec->entry = profiles_->NewCodeEntry( |
201 Logger::CALLBACK_TAG, | 201 Logger::CALLBACK_TAG, |
202 profiles_->GetName(name)); | 202 profiles_->GetName(name)); |
203 rec->size = 1; | 203 rec->size = 1; |
204 rec->shared = NULL; | |
205 processor_->Enqueue(evt_rec); | 204 processor_->Enqueue(evt_rec); |
206 } | 205 } |
207 | 206 |
208 | 207 |
209 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 208 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
210 Code* code, | 209 Code* code, |
211 const char* name) { | 210 const char* name) { |
212 if (FilterOutCodeCreateEvent(tag)) return; | 211 if (FilterOutCodeCreateEvent(tag)) return; |
213 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 212 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
214 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 213 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
215 rec->start = code->address(); | 214 rec->start = code->address(); |
216 rec->entry = profiles_->NewCodeEntry( | 215 rec->entry = profiles_->NewCodeEntry( |
217 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, | 216 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
218 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 217 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
219 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 218 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
220 rec->size = code->ExecutableSize(); | 219 rec->size = code->ExecutableSize(); |
221 rec->shared = NULL; | |
222 processor_->Enqueue(evt_rec); | 220 processor_->Enqueue(evt_rec); |
223 } | 221 } |
224 | 222 |
225 | 223 |
226 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 224 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
227 Code* code, | 225 Code* code, |
228 Name* name) { | 226 Name* name) { |
229 if (FilterOutCodeCreateEvent(tag)) return; | 227 if (FilterOutCodeCreateEvent(tag)) return; |
230 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 228 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
231 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 229 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
232 rec->start = code->address(); | 230 rec->start = code->address(); |
233 rec->entry = profiles_->NewCodeEntry( | 231 rec->entry = profiles_->NewCodeEntry( |
234 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, | 232 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
235 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 233 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
236 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 234 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
237 rec->size = code->ExecutableSize(); | 235 rec->size = code->ExecutableSize(); |
238 rec->shared = NULL; | |
239 processor_->Enqueue(evt_rec); | 236 processor_->Enqueue(evt_rec); |
240 } | 237 } |
241 | 238 |
242 | 239 |
243 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 240 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, |
244 SharedFunctionInfo* shared, | 241 SharedFunctionInfo* shared, |
245 CompilationInfo* info, Name* script_name) { | 242 CompilationInfo* info, Name* script_name) { |
246 if (FilterOutCodeCreateEvent(tag)) return; | 243 if (FilterOutCodeCreateEvent(tag)) return; |
247 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 244 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
248 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 245 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
249 rec->start = code->address(); | 246 rec->start = code->address(); |
250 rec->entry = profiles_->NewCodeEntry( | 247 rec->entry = profiles_->NewCodeEntry( |
251 tag, profiles_->GetFunctionName(shared->DebugName()), | 248 tag, profiles_->GetFunctionName(shared->DebugName()), |
252 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), | 249 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), |
253 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, | 250 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, |
254 NULL, code->instruction_start()); | 251 NULL, code->instruction_start()); |
255 if (info) { | 252 if (info) { |
256 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); | 253 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); |
257 } | 254 } |
258 if (shared->script()->IsScript()) { | 255 rec->entry->FillFunctionInfo(shared); |
259 DCHECK(Script::cast(shared->script())); | |
260 Script* script = Script::cast(shared->script()); | |
261 rec->entry->set_script_id(script->id()->value()); | |
262 rec->entry->set_bailout_reason( | |
263 GetBailoutReason(shared->disable_optimization_reason())); | |
264 } | |
265 rec->size = code->ExecutableSize(); | 256 rec->size = code->ExecutableSize(); |
266 rec->shared = shared->address(); | |
267 processor_->Enqueue(evt_rec); | 257 processor_->Enqueue(evt_rec); |
268 } | 258 } |
269 | 259 |
270 | 260 |
271 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 261 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, |
272 SharedFunctionInfo* shared, | 262 SharedFunctionInfo* shared, |
273 CompilationInfo* info, Name* script_name, | 263 CompilationInfo* info, Name* script_name, |
274 int line, int column) { | 264 int line, int column) { |
275 if (FilterOutCodeCreateEvent(tag)) return; | 265 if (FilterOutCodeCreateEvent(tag)) return; |
276 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 266 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
(...skipping 15 matching lines...) Expand all Loading... |
292 } | 282 } |
293 } | 283 } |
294 } | 284 } |
295 rec->entry = profiles_->NewCodeEntry( | 285 rec->entry = profiles_->NewCodeEntry( |
296 tag, profiles_->GetFunctionName(shared->DebugName()), | 286 tag, profiles_->GetFunctionName(shared->DebugName()), |
297 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), line, | 287 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), line, |
298 column, line_table, code->instruction_start()); | 288 column, line_table, code->instruction_start()); |
299 if (info) { | 289 if (info) { |
300 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); | 290 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); |
301 } | 291 } |
302 rec->entry->set_script_id(script->id()->value()); | 292 rec->entry->FillFunctionInfo(shared); |
303 rec->size = code->ExecutableSize(); | 293 rec->size = code->ExecutableSize(); |
304 rec->shared = shared->address(); | |
305 rec->entry->set_bailout_reason( | |
306 GetBailoutReason(shared->disable_optimization_reason())); | |
307 processor_->Enqueue(evt_rec); | 294 processor_->Enqueue(evt_rec); |
308 } | 295 } |
309 | 296 |
310 | 297 |
311 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 298 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
312 Code* code, | 299 Code* code, |
313 int args_count) { | 300 int args_count) { |
314 if (FilterOutCodeCreateEvent(tag)) return; | 301 if (FilterOutCodeCreateEvent(tag)) return; |
315 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 302 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
316 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 303 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
317 rec->start = code->address(); | 304 rec->start = code->address(); |
318 rec->entry = profiles_->NewCodeEntry( | 305 rec->entry = profiles_->NewCodeEntry( |
319 tag, profiles_->GetName(args_count), "args_count: ", | 306 tag, profiles_->GetName(args_count), "args_count: ", |
320 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 307 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
321 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 308 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
322 rec->size = code->ExecutableSize(); | 309 rec->size = code->ExecutableSize(); |
323 rec->shared = NULL; | |
324 processor_->Enqueue(evt_rec); | 310 processor_->Enqueue(evt_rec); |
325 } | 311 } |
326 | 312 |
327 | 313 |
328 void CpuProfiler::CodeMoveEvent(Address from, Address to) { | 314 void CpuProfiler::CodeMoveEvent(Address from, Address to) { |
329 CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); | 315 CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); |
330 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; | 316 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; |
331 rec->from = from; | 317 rec->from = from; |
332 rec->to = to; | 318 rec->to = to; |
333 processor_->Enqueue(evt_rec); | 319 processor_->Enqueue(evt_rec); |
(...skipping 19 matching lines...) Expand all Loading... |
353 rec->raw_position = info.raw_position; | 339 rec->raw_position = info.raw_position; |
354 processor_->Enqueue(evt_rec); | 340 processor_->Enqueue(evt_rec); |
355 processor_->AddDeoptStack(isolate_, pc, fp_to_sp_delta); | 341 processor_->AddDeoptStack(isolate_, pc, fp_to_sp_delta); |
356 } | 342 } |
357 | 343 |
358 | 344 |
359 void CpuProfiler::CodeDeleteEvent(Address from) { | 345 void CpuProfiler::CodeDeleteEvent(Address from) { |
360 } | 346 } |
361 | 347 |
362 | 348 |
363 void CpuProfiler::SharedFunctionInfoMoveEvent(Address from, Address to) { | |
364 CodeEventsContainer evt_rec(CodeEventRecord::SHARED_FUNC_MOVE); | |
365 SharedFunctionInfoMoveEventRecord* rec = | |
366 &evt_rec.SharedFunctionInfoMoveEventRecord_; | |
367 rec->from = from; | |
368 rec->to = to; | |
369 processor_->Enqueue(evt_rec); | |
370 } | |
371 | |
372 | |
373 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { | 349 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { |
374 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | 350 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; |
375 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 351 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
376 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 352 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
377 rec->start = entry_point; | 353 rec->start = entry_point; |
378 rec->entry = profiles_->NewCodeEntry( | 354 rec->entry = profiles_->NewCodeEntry( |
379 Logger::CALLBACK_TAG, | 355 Logger::CALLBACK_TAG, |
380 profiles_->GetName(name), | 356 profiles_->GetName(name), |
381 "get "); | 357 "get "); |
382 rec->size = 1; | 358 rec->size = 1; |
383 rec->shared = NULL; | |
384 processor_->Enqueue(evt_rec); | 359 processor_->Enqueue(evt_rec); |
385 } | 360 } |
386 | 361 |
387 | 362 |
388 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { | 363 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { |
389 if (FilterOutCodeCreateEvent(Logger::REG_EXP_TAG)) return; | 364 if (FilterOutCodeCreateEvent(Logger::REG_EXP_TAG)) return; |
390 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 365 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
391 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 366 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
392 rec->start = code->address(); | 367 rec->start = code->address(); |
393 rec->entry = profiles_->NewCodeEntry( | 368 rec->entry = profiles_->NewCodeEntry( |
394 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", | 369 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", |
395 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 370 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
396 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 371 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
397 rec->size = code->ExecutableSize(); | 372 rec->size = code->ExecutableSize(); |
398 processor_->Enqueue(evt_rec); | 373 processor_->Enqueue(evt_rec); |
399 } | 374 } |
400 | 375 |
401 | 376 |
402 void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) { | 377 void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) { |
403 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | 378 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; |
404 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 379 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
405 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 380 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
406 rec->start = entry_point; | 381 rec->start = entry_point; |
407 rec->entry = profiles_->NewCodeEntry( | 382 rec->entry = profiles_->NewCodeEntry( |
408 Logger::CALLBACK_TAG, | 383 Logger::CALLBACK_TAG, |
409 profiles_->GetName(name), | 384 profiles_->GetName(name), |
410 "set "); | 385 "set "); |
411 rec->size = 1; | 386 rec->size = 1; |
412 rec->shared = NULL; | |
413 processor_->Enqueue(evt_rec); | 387 processor_->Enqueue(evt_rec); |
414 } | 388 } |
415 | 389 |
416 | 390 |
417 CpuProfiler::CpuProfiler(Isolate* isolate) | 391 CpuProfiler::CpuProfiler(Isolate* isolate) |
418 : isolate_(isolate), | 392 : isolate_(isolate), |
419 sampling_interval_(base::TimeDelta::FromMicroseconds( | 393 sampling_interval_(base::TimeDelta::FromMicroseconds( |
420 FLAG_cpu_profiler_sampling_interval)), | 394 FLAG_cpu_profiler_sampling_interval)), |
421 profiles_(new CpuProfilesCollection(isolate->heap())), | 395 profiles_(new CpuProfilesCollection(isolate->heap())), |
422 generator_(NULL), | 396 generator_(NULL), |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 ReportBuiltinEventRecord* rec = &evt_rec.ReportBuiltinEventRecord_; | 520 ReportBuiltinEventRecord* rec = &evt_rec.ReportBuiltinEventRecord_; |
547 Builtins::Name id = static_cast<Builtins::Name>(i); | 521 Builtins::Name id = static_cast<Builtins::Name>(i); |
548 rec->start = builtins->builtin(id)->address(); | 522 rec->start = builtins->builtin(id)->address(); |
549 rec->builtin_id = id; | 523 rec->builtin_id = id; |
550 processor_->Enqueue(evt_rec); | 524 processor_->Enqueue(evt_rec); |
551 } | 525 } |
552 } | 526 } |
553 | 527 |
554 | 528 |
555 } } // namespace v8::internal | 529 } } // namespace v8::internal |
OLD | NEW |