| 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/profiler/cpu-profiler.h" | 5 #include "src/profiler/cpu-profiler.h" |
| 6 | 6 |
| 7 #include "src/debug/debug.h" | 7 #include "src/debug/debug.h" |
| 8 #include "src/deoptimizer.h" | 8 #include "src/deoptimizer.h" |
| 9 #include "src/frames-inl.h" | 9 #include "src/frames-inl.h" |
| 10 #include "src/locked-queue-inl.h" | 10 #include "src/locked-queue-inl.h" |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 204 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 205 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 205 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 206 rec->start = entry_point; | 206 rec->start = entry_point; |
| 207 rec->entry = profiles_->NewCodeEntry( | 207 rec->entry = profiles_->NewCodeEntry( |
| 208 Logger::CALLBACK_TAG, | 208 Logger::CALLBACK_TAG, |
| 209 profiles_->GetName(name)); | 209 profiles_->GetName(name)); |
| 210 rec->size = 1; | 210 rec->size = 1; |
| 211 processor_->Enqueue(evt_rec); | 211 processor_->Enqueue(evt_rec); |
| 212 } | 212 } |
| 213 | 213 |
| 214 | |
| 215 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 214 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 216 Code* code, | 215 AbstractCode* code, const char* name) { |
| 217 const char* name) { | |
| 218 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 216 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 219 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 217 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 220 rec->start = code->address(); | 218 rec->start = code->address(); |
| 221 rec->entry = profiles_->NewCodeEntry( | 219 rec->entry = profiles_->NewCodeEntry( |
| 222 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, | 220 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
| 223 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 221 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 224 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 222 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 225 rec->size = code->ExecutableSize(); | 223 rec->size = code->ExecutableSize(); |
| 226 processor_->Enqueue(evt_rec); | 224 processor_->Enqueue(evt_rec); |
| 227 } | 225 } |
| 228 | 226 |
| 229 | |
| 230 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 227 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 231 Code* code, | 228 AbstractCode* code, Name* name) { |
| 232 Name* name) { | |
| 233 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 229 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 234 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 230 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 235 rec->start = code->address(); | 231 rec->start = code->address(); |
| 236 rec->entry = profiles_->NewCodeEntry( | 232 rec->entry = profiles_->NewCodeEntry( |
| 237 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, | 233 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
| 238 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 234 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 239 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 235 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 240 rec->size = code->ExecutableSize(); | 236 rec->size = code->ExecutableSize(); |
| 241 processor_->Enqueue(evt_rec); | 237 processor_->Enqueue(evt_rec); |
| 242 } | 238 } |
| 243 | 239 |
| 244 | 240 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 245 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 241 AbstractCode* code, |
| 246 SharedFunctionInfo* shared, | 242 SharedFunctionInfo* shared, |
| 247 CompilationInfo* info, Name* script_name) { | 243 CompilationInfo* info, Name* script_name) { |
| 248 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 244 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 249 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 245 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 250 rec->start = code->address(); | 246 rec->start = code->address(); |
| 251 rec->entry = profiles_->NewCodeEntry( | 247 rec->entry = profiles_->NewCodeEntry( |
| 252 tag, profiles_->GetFunctionName(shared->DebugName()), | 248 tag, profiles_->GetFunctionName(shared->DebugName()), |
| 253 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), | 249 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), |
| 254 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, | 250 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, |
| 255 NULL, code->instruction_start()); | 251 NULL, code->instruction_start()); |
| 256 if (info) { | 252 if (info) { |
| 257 rec->entry->set_inlined_function_infos(info->inlined_function_infos()); | 253 rec->entry->set_inlined_function_infos(info->inlined_function_infos()); |
| 258 } | 254 } |
| 259 rec->entry->FillFunctionInfo(shared); | 255 rec->entry->FillFunctionInfo(shared); |
| 260 rec->size = code->ExecutableSize(); | 256 rec->size = code->ExecutableSize(); |
| 261 processor_->Enqueue(evt_rec); | 257 processor_->Enqueue(evt_rec); |
| 262 } | 258 } |
| 263 | 259 |
| 264 | 260 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 265 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 261 AbstractCode* abstract_code, |
| 266 SharedFunctionInfo* shared, | 262 SharedFunctionInfo* shared, |
| 267 CompilationInfo* info, Name* script_name, | 263 CompilationInfo* info, Name* script_name, |
| 268 int line, int column) { | 264 int line, int column) { |
| 269 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 265 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 270 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 266 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 271 rec->start = code->address(); | 267 rec->start = abstract_code->address(); |
| 272 Script* script = Script::cast(shared->script()); | 268 Script* script = Script::cast(shared->script()); |
| 273 JITLineInfoTable* line_table = NULL; | 269 JITLineInfoTable* line_table = NULL; |
| 274 if (script) { | 270 if (script) { |
| 275 line_table = new JITLineInfoTable(); | 271 if (abstract_code->IsCode()) { |
| 276 for (RelocIterator it(code); !it.done(); it.next()) { | 272 Code* code = abstract_code->GetCode(); |
| 277 RelocInfo::Mode mode = it.rinfo()->rmode(); | 273 line_table = new JITLineInfoTable(); |
| 278 if (RelocInfo::IsPosition(mode)) { | 274 for (RelocIterator it(code); !it.done(); it.next()) { |
| 279 int position = static_cast<int>(it.rinfo()->data()); | 275 RelocInfo::Mode mode = it.rinfo()->rmode(); |
| 280 if (position >= 0) { | 276 if (RelocInfo::IsPosition(mode)) { |
| 281 int pc_offset = static_cast<int>(it.rinfo()->pc() - code->address()); | 277 int position = static_cast<int>(it.rinfo()->data()); |
| 282 int line_number = script->GetLineNumber(position) + 1; | 278 if (position >= 0) { |
| 283 line_table->SetPosition(pc_offset, line_number); | 279 int pc_offset = |
| 280 static_cast<int>(it.rinfo()->pc() - code->address()); |
| 281 int line_number = script->GetLineNumber(position) + 1; |
| 282 line_table->SetPosition(pc_offset, line_number); |
| 283 } |
| 284 } | 284 } |
| 285 } | 285 } |
| 286 } else { |
| 287 DCHECK(abstract_code->IsBytecodeArray()); |
| 288 // TODO(rmcilroy): source position tracking for bytecode arrays. |
| 286 } | 289 } |
| 287 } | 290 } |
| 288 rec->entry = profiles_->NewCodeEntry( | 291 rec->entry = profiles_->NewCodeEntry( |
| 289 tag, profiles_->GetFunctionName(shared->DebugName()), | 292 tag, profiles_->GetFunctionName(shared->DebugName()), |
| 290 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), line, | 293 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), line, |
| 291 column, line_table, code->instruction_start()); | 294 column, line_table, abstract_code->instruction_start()); |
| 292 if (info) { | 295 if (info) { |
| 293 rec->entry->set_inlined_function_infos(info->inlined_function_infos()); | 296 rec->entry->set_inlined_function_infos(info->inlined_function_infos()); |
| 294 } | 297 } |
| 295 rec->entry->FillFunctionInfo(shared); | 298 rec->entry->FillFunctionInfo(shared); |
| 296 rec->size = code->ExecutableSize(); | 299 rec->size = abstract_code->ExecutableSize(); |
| 297 processor_->Enqueue(evt_rec); | 300 processor_->Enqueue(evt_rec); |
| 298 } | 301 } |
| 299 | 302 |
| 300 | |
| 301 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 303 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 302 Code* code, | 304 AbstractCode* code, int args_count) { |
| 303 int args_count) { | |
| 304 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 305 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 305 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 306 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 306 rec->start = code->address(); | 307 rec->start = code->address(); |
| 307 rec->entry = profiles_->NewCodeEntry( | 308 rec->entry = profiles_->NewCodeEntry( |
| 308 tag, profiles_->GetName(args_count), "args_count: ", | 309 tag, profiles_->GetName(args_count), "args_count: ", |
| 309 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 310 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 310 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 311 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 311 rec->size = code->ExecutableSize(); | 312 rec->size = code->ExecutableSize(); |
| 312 processor_->Enqueue(evt_rec); | 313 processor_->Enqueue(evt_rec); |
| 313 } | 314 } |
| 314 | 315 |
| 315 | 316 void CpuProfiler::CodeMoveEvent(AbstractCode* from, Address to) { |
| 316 void CpuProfiler::CodeMoveEvent(Address from, Address to) { | |
| 317 CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); | 317 CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); |
| 318 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; | 318 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; |
| 319 rec->from = from; | 319 rec->from = from->address(); |
| 320 rec->to = to; | 320 rec->to = to; |
| 321 processor_->Enqueue(evt_rec); | 321 processor_->Enqueue(evt_rec); |
| 322 } | 322 } |
| 323 | 323 |
| 324 | 324 void CpuProfiler::CodeDisableOptEvent(AbstractCode* code, |
| 325 void CpuProfiler::CodeDisableOptEvent(Code* code, SharedFunctionInfo* shared) { | 325 SharedFunctionInfo* shared) { |
| 326 CodeEventsContainer evt_rec(CodeEventRecord::CODE_DISABLE_OPT); | 326 CodeEventsContainer evt_rec(CodeEventRecord::CODE_DISABLE_OPT); |
| 327 CodeDisableOptEventRecord* rec = &evt_rec.CodeDisableOptEventRecord_; | 327 CodeDisableOptEventRecord* rec = &evt_rec.CodeDisableOptEventRecord_; |
| 328 rec->start = code->address(); | 328 rec->start = code->address(); |
| 329 rec->bailout_reason = GetBailoutReason(shared->disable_optimization_reason()); | 329 rec->bailout_reason = GetBailoutReason(shared->disable_optimization_reason()); |
| 330 processor_->Enqueue(evt_rec); | 330 processor_->Enqueue(evt_rec); |
| 331 } | 331 } |
| 332 | 332 |
| 333 | |
| 334 void CpuProfiler::CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta) { | 333 void CpuProfiler::CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta) { |
| 335 CodeEventsContainer evt_rec(CodeEventRecord::CODE_DEOPT); | 334 CodeEventsContainer evt_rec(CodeEventRecord::CODE_DEOPT); |
| 336 CodeDeoptEventRecord* rec = &evt_rec.CodeDeoptEventRecord_; | 335 CodeDeoptEventRecord* rec = &evt_rec.CodeDeoptEventRecord_; |
| 337 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(code, pc); | 336 Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(code, pc); |
| 338 rec->start = code->address(); | 337 rec->start = code->address(); |
| 339 rec->deopt_reason = Deoptimizer::GetDeoptReason(info.deopt_reason); | 338 rec->deopt_reason = Deoptimizer::GetDeoptReason(info.deopt_reason); |
| 340 rec->position = info.position; | 339 rec->position = info.position; |
| 341 rec->pc_offset = pc - code->instruction_start(); | 340 rec->pc_offset = pc - code->instruction_start(); |
| 342 processor_->Enqueue(evt_rec); | 341 processor_->Enqueue(evt_rec); |
| 343 processor_->AddDeoptStack(isolate_, pc, fp_to_sp_delta); | 342 processor_->AddDeoptStack(isolate_, pc, fp_to_sp_delta); |
| 344 } | 343 } |
| 345 | 344 |
| 346 | |
| 347 void CpuProfiler::CodeDeleteEvent(Address from) { | |
| 348 } | |
| 349 | |
| 350 | |
| 351 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { | 345 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { |
| 352 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 346 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 353 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 347 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 354 rec->start = entry_point; | 348 rec->start = entry_point; |
| 355 rec->entry = profiles_->NewCodeEntry( | 349 rec->entry = profiles_->NewCodeEntry( |
| 356 Logger::CALLBACK_TAG, | 350 Logger::CALLBACK_TAG, |
| 357 profiles_->GetName(name), | 351 profiles_->GetName(name), |
| 358 "get "); | 352 "get "); |
| 359 rec->size = 1; | 353 rec->size = 1; |
| 360 processor_->Enqueue(evt_rec); | 354 processor_->Enqueue(evt_rec); |
| 361 } | 355 } |
| 362 | 356 |
| 363 | 357 void CpuProfiler::RegExpCodeCreateEvent(AbstractCode* code, String* source) { |
| 364 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { | |
| 365 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 358 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 366 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 359 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 367 rec->start = code->address(); | 360 rec->start = code->address(); |
| 368 rec->entry = profiles_->NewCodeEntry( | 361 rec->entry = profiles_->NewCodeEntry( |
| 369 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", | 362 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", |
| 370 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 363 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 371 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 364 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 372 rec->size = code->ExecutableSize(); | 365 rec->size = code->ExecutableSize(); |
| 373 processor_->Enqueue(evt_rec); | 366 processor_->Enqueue(evt_rec); |
| 374 } | 367 } |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 526 Builtins::Name id = static_cast<Builtins::Name>(i); | 519 Builtins::Name id = static_cast<Builtins::Name>(i); |
| 527 rec->start = builtins->builtin(id)->address(); | 520 rec->start = builtins->builtin(id)->address(); |
| 528 rec->builtin_id = id; | 521 rec->builtin_id = id; |
| 529 processor_->Enqueue(evt_rec); | 522 processor_->Enqueue(evt_rec); |
| 530 } | 523 } |
| 531 } | 524 } |
| 532 | 525 |
| 533 | 526 |
| 534 } // namespace internal | 527 } // namespace internal |
| 535 } // namespace v8 | 528 } // namespace v8 |
| OLD | NEW |