| 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/frames-inl.h" | 10 #include "src/frames-inl.h" |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 } | 192 } |
| 193 | 193 |
| 194 | 194 |
| 195 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 195 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 196 Code* code, | 196 Code* code, |
| 197 const char* name) { | 197 const char* name) { |
| 198 if (FilterOutCodeCreateEvent(tag)) return; | 198 if (FilterOutCodeCreateEvent(tag)) return; |
| 199 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 199 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 200 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 200 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 201 rec->start = code->address(); | 201 rec->start = code->address(); |
| 202 rec->entry = profiles_->NewCodeEntry(tag, profiles_->GetFunctionName(name)); | 202 rec->entry = profiles_->NewCodeEntry( |
| 203 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
| 204 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 205 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 203 rec->size = code->ExecutableSize(); | 206 rec->size = code->ExecutableSize(); |
| 204 rec->shared = NULL; | 207 rec->shared = NULL; |
| 205 processor_->Enqueue(evt_rec); | 208 processor_->Enqueue(evt_rec); |
| 206 } | 209 } |
| 207 | 210 |
| 208 | 211 |
| 209 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 212 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 210 Code* code, | 213 Code* code, |
| 211 Name* name) { | 214 Name* name) { |
| 212 if (FilterOutCodeCreateEvent(tag)) return; | 215 if (FilterOutCodeCreateEvent(tag)) return; |
| 213 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 216 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 214 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 217 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 215 rec->start = code->address(); | 218 rec->start = code->address(); |
| 216 rec->entry = profiles_->NewCodeEntry(tag, profiles_->GetFunctionName(name)); | 219 rec->entry = profiles_->NewCodeEntry( |
| 220 tag, profiles_->GetFunctionName(name), CodeEntry::kEmptyNamePrefix, |
| 221 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 222 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 217 rec->size = code->ExecutableSize(); | 223 rec->size = code->ExecutableSize(); |
| 218 rec->shared = NULL; | 224 rec->shared = NULL; |
| 219 processor_->Enqueue(evt_rec); | 225 processor_->Enqueue(evt_rec); |
| 220 } | 226 } |
| 221 | 227 |
| 222 | 228 |
| 223 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 229 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, |
| 224 SharedFunctionInfo* shared, | 230 SharedFunctionInfo* shared, |
| 225 CompilationInfo* info, Name* script_name) { | 231 CompilationInfo* info, Name* script_name) { |
| 226 if (FilterOutCodeCreateEvent(tag)) return; | 232 if (FilterOutCodeCreateEvent(tag)) return; |
| 227 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 233 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 228 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 234 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 229 rec->start = code->address(); | 235 rec->start = code->address(); |
| 230 rec->entry = profiles_->NewCodeEntry( | 236 rec->entry = profiles_->NewCodeEntry( |
| 231 tag, profiles_->GetFunctionName(shared->DebugName()), | 237 tag, profiles_->GetFunctionName(shared->DebugName()), |
| 232 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name)); | 238 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), |
| 239 CpuProfileNode::kNoLineNumberInfo, CpuProfileNode::kNoColumnNumberInfo, |
| 240 NULL, code->instruction_start()); |
| 233 if (info) { | 241 if (info) { |
| 234 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); | 242 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); |
| 235 } | 243 } |
| 236 if (shared->script()->IsScript()) { | 244 if (shared->script()->IsScript()) { |
| 237 DCHECK(Script::cast(shared->script())); | 245 DCHECK(Script::cast(shared->script())); |
| 238 Script* script = Script::cast(shared->script()); | 246 Script* script = Script::cast(shared->script()); |
| 239 rec->entry->set_script_id(script->id()->value()); | 247 rec->entry->set_script_id(script->id()->value()); |
| 240 rec->entry->set_bailout_reason( | 248 rec->entry->set_bailout_reason( |
| 241 GetBailoutReason(shared->DisableOptimizationReason())); | 249 GetBailoutReason(shared->DisableOptimizationReason())); |
| 242 } | 250 } |
| 243 rec->size = code->ExecutableSize(); | 251 rec->size = code->ExecutableSize(); |
| 244 rec->shared = shared->address(); | 252 rec->shared = shared->address(); |
| 245 processor_->Enqueue(evt_rec); | 253 processor_->Enqueue(evt_rec); |
| 246 } | 254 } |
| 247 | 255 |
| 248 | 256 |
| 249 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, | 257 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, Code* code, |
| 250 SharedFunctionInfo* shared, | 258 SharedFunctionInfo* shared, |
| 251 CompilationInfo* info, Name* script_name, | 259 CompilationInfo* info, Name* script_name, |
| 252 int line, int column) { | 260 int line, int column) { |
| 253 if (FilterOutCodeCreateEvent(tag)) return; | 261 if (FilterOutCodeCreateEvent(tag)) return; |
| 254 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 262 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 255 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 263 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 256 rec->start = code->address(); | 264 rec->start = code->address(); |
| 265 Script* script = Script::cast(shared->script()); |
| 266 JITLineInfoTable* line_table = NULL; |
| 267 if (script) { |
| 268 line_table = new JITLineInfoTable(); |
| 269 for (RelocIterator it(code); !it.done(); it.next()) { |
| 270 RelocInfo::Mode mode = it.rinfo()->rmode(); |
| 271 if (RelocInfo::IsPosition(mode)) { |
| 272 int position = static_cast<int>(it.rinfo()->data()); |
| 273 if (position >= 0) { |
| 274 int pc_offset = static_cast<int>(it.rinfo()->pc() - code->address()); |
| 275 int line_number = script->GetLineNumber(position) + 1; |
| 276 line_table->SetPosition(pc_offset, line_number); |
| 277 } |
| 278 } |
| 279 } |
| 280 } |
| 257 rec->entry = profiles_->NewCodeEntry( | 281 rec->entry = profiles_->NewCodeEntry( |
| 258 tag, profiles_->GetFunctionName(shared->DebugName()), | 282 tag, profiles_->GetFunctionName(shared->DebugName()), |
| 259 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), line, | 283 CodeEntry::kEmptyNamePrefix, profiles_->GetName(script_name), line, |
| 260 column); | 284 column, line_table, code->instruction_start()); |
| 261 if (info) { | 285 if (info) { |
| 262 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); | 286 rec->entry->set_no_frame_ranges(info->ReleaseNoFrameRanges()); |
| 263 } | 287 } |
| 264 DCHECK(Script::cast(shared->script())); | |
| 265 Script* script = Script::cast(shared->script()); | |
| 266 rec->entry->set_script_id(script->id()->value()); | 288 rec->entry->set_script_id(script->id()->value()); |
| 267 rec->size = code->ExecutableSize(); | 289 rec->size = code->ExecutableSize(); |
| 268 rec->shared = shared->address(); | 290 rec->shared = shared->address(); |
| 269 rec->entry->set_bailout_reason( | 291 rec->entry->set_bailout_reason( |
| 270 GetBailoutReason(shared->DisableOptimizationReason())); | 292 GetBailoutReason(shared->DisableOptimizationReason())); |
| 271 processor_->Enqueue(evt_rec); | 293 processor_->Enqueue(evt_rec); |
| 272 } | 294 } |
| 273 | 295 |
| 274 | 296 |
| 275 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, | 297 void CpuProfiler::CodeCreateEvent(Logger::LogEventsAndTags tag, |
| 276 Code* code, | 298 Code* code, |
| 277 int args_count) { | 299 int args_count) { |
| 278 if (FilterOutCodeCreateEvent(tag)) return; | 300 if (FilterOutCodeCreateEvent(tag)) return; |
| 279 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 301 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 280 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 302 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 281 rec->start = code->address(); | 303 rec->start = code->address(); |
| 282 rec->entry = profiles_->NewCodeEntry( | 304 rec->entry = profiles_->NewCodeEntry( |
| 283 tag, | 305 tag, profiles_->GetName(args_count), "args_count: ", |
| 284 profiles_->GetName(args_count), | 306 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 285 "args_count: "); | 307 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 286 rec->size = code->ExecutableSize(); | 308 rec->size = code->ExecutableSize(); |
| 287 rec->shared = NULL; | 309 rec->shared = NULL; |
| 288 processor_->Enqueue(evt_rec); | 310 processor_->Enqueue(evt_rec); |
| 289 } | 311 } |
| 290 | 312 |
| 291 | 313 |
| 292 void CpuProfiler::CodeMoveEvent(Address from, Address to) { | 314 void CpuProfiler::CodeMoveEvent(Address from, Address to) { |
| 293 CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); | 315 CodeEventsContainer evt_rec(CodeEventRecord::CODE_MOVE); |
| 294 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; | 316 CodeMoveEventRecord* rec = &evt_rec.CodeMoveEventRecord_; |
| 295 rec->from = from; | 317 rec->from = from; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 processor_->Enqueue(evt_rec); | 357 processor_->Enqueue(evt_rec); |
| 336 } | 358 } |
| 337 | 359 |
| 338 | 360 |
| 339 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { | 361 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { |
| 340 if (FilterOutCodeCreateEvent(Logger::REG_EXP_TAG)) return; | 362 if (FilterOutCodeCreateEvent(Logger::REG_EXP_TAG)) return; |
| 341 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 363 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 342 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 364 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 343 rec->start = code->address(); | 365 rec->start = code->address(); |
| 344 rec->entry = profiles_->NewCodeEntry( | 366 rec->entry = profiles_->NewCodeEntry( |
| 345 Logger::REG_EXP_TAG, | 367 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", |
| 346 profiles_->GetName(source), | 368 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
| 347 "RegExp: "); | 369 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
| 348 rec->size = code->ExecutableSize(); | 370 rec->size = code->ExecutableSize(); |
| 349 processor_->Enqueue(evt_rec); | 371 processor_->Enqueue(evt_rec); |
| 350 } | 372 } |
| 351 | 373 |
| 352 | 374 |
| 353 void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) { | 375 void CpuProfiler::SetterCallbackEvent(Name* name, Address entry_point) { |
| 354 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; | 376 if (FilterOutCodeCreateEvent(Logger::CALLBACK_TAG)) return; |
| 355 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 377 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
| 356 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 378 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
| 357 rec->start = entry_point; | 379 rec->start = entry_point; |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 ReportBuiltinEventRecord* rec = &evt_rec.ReportBuiltinEventRecord_; | 519 ReportBuiltinEventRecord* rec = &evt_rec.ReportBuiltinEventRecord_; |
| 498 Builtins::Name id = static_cast<Builtins::Name>(i); | 520 Builtins::Name id = static_cast<Builtins::Name>(i); |
| 499 rec->start = builtins->builtin(id)->address(); | 521 rec->start = builtins->builtin(id)->address(); |
| 500 rec->builtin_id = id; | 522 rec->builtin_id = id; |
| 501 processor_->Enqueue(evt_rec); | 523 processor_->Enqueue(evt_rec); |
| 502 } | 524 } |
| 503 } | 525 } |
| 504 | 526 |
| 505 | 527 |
| 506 } } // namespace v8::internal | 528 } } // namespace v8::internal |
| OLD | NEW |