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 | 345 void CpuProfiler::CodeDeleteEvent(AbstractCode* from) {} |
347 void CpuProfiler::CodeDeleteEvent(Address from) { | |
348 } | |
349 | |
350 | 346 |
351 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { | 347 void CpuProfiler::GetterCallbackEvent(Name* name, Address entry_point) { |
352 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 348 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
353 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 349 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
354 rec->start = entry_point; | 350 rec->start = entry_point; |
355 rec->entry = profiles_->NewCodeEntry( | 351 rec->entry = profiles_->NewCodeEntry( |
356 Logger::CALLBACK_TAG, | 352 Logger::CALLBACK_TAG, |
357 profiles_->GetName(name), | 353 profiles_->GetName(name), |
358 "get "); | 354 "get "); |
359 rec->size = 1; | 355 rec->size = 1; |
360 processor_->Enqueue(evt_rec); | 356 processor_->Enqueue(evt_rec); |
361 } | 357 } |
362 | 358 |
363 | 359 void CpuProfiler::RegExpCodeCreateEvent(AbstractCode* code, String* source) { |
364 void CpuProfiler::RegExpCodeCreateEvent(Code* code, String* source) { | |
365 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); | 360 CodeEventsContainer evt_rec(CodeEventRecord::CODE_CREATION); |
366 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; | 361 CodeCreateEventRecord* rec = &evt_rec.CodeCreateEventRecord_; |
367 rec->start = code->address(); | 362 rec->start = code->address(); |
368 rec->entry = profiles_->NewCodeEntry( | 363 rec->entry = profiles_->NewCodeEntry( |
369 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", | 364 Logger::REG_EXP_TAG, profiles_->GetName(source), "RegExp: ", |
370 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, | 365 CodeEntry::kEmptyResourceName, CpuProfileNode::kNoLineNumberInfo, |
371 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); | 366 CpuProfileNode::kNoColumnNumberInfo, NULL, code->instruction_start()); |
372 rec->size = code->ExecutableSize(); | 367 rec->size = code->ExecutableSize(); |
373 processor_->Enqueue(evt_rec); | 368 processor_->Enqueue(evt_rec); |
374 } | 369 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 Builtins::Name id = static_cast<Builtins::Name>(i); | 521 Builtins::Name id = static_cast<Builtins::Name>(i); |
527 rec->start = builtins->builtin(id)->address(); | 522 rec->start = builtins->builtin(id)->address(); |
528 rec->builtin_id = id; | 523 rec->builtin_id = id; |
529 processor_->Enqueue(evt_rec); | 524 processor_->Enqueue(evt_rec); |
530 } | 525 } |
531 } | 526 } |
532 | 527 |
533 | 528 |
534 } // namespace internal | 529 } // namespace internal |
535 } // namespace v8 | 530 } // namespace v8 |
OLD | NEW |