Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Side by Side Diff: src/profiler/cpu-profiler.cc

Issue 1728593002: [Interpreter] Add support for cpu profiler logging. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/profiler/cpu-profiler.h ('k') | src/profiler/profile-generator.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/profiler/cpu-profiler.h ('k') | src/profiler/profile-generator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698