Chromium Code Reviews| Index: src/log.cc |
| diff --git a/src/log.cc b/src/log.cc |
| index 46872a150c48259ca932d7c6e06f1e70a89cc483..aa01a2f0ac02c27fb4c70c0e389c3f5409e47586 100644 |
| --- a/src/log.cc |
| +++ b/src/log.cc |
| @@ -843,12 +843,41 @@ void Logger::SharedLibraryEvent(const std::string& library_path, |
| msg.WriteToLogFile(); |
| } |
| - |
| -void Logger::CodeDeoptEvent(Code* code, Address pc, int fp_to_sp_delta) { |
| - if (!log_->IsEnabled() || !FLAG_log_internal_timer_events) return; |
| +void Logger::CodeDeoptEvent(DeoptKind kind, Code* code, Address pc, |
| + int fp_to_sp_delta) { |
| + if (!log_->IsEnabled()) return; |
| + Deoptimizer::DeoptInfo info = Deoptimizer::GetDeoptInfo(code, pc); |
| Log::MessageBuilder msg(log_); |
| int since_epoch = static_cast<int>(timer_.Elapsed().InMicroseconds()); |
| - msg.Append("code-deopt,%d,%d", since_epoch, code->CodeSize()); |
| + msg.Append("code-deopt,%d,%d,", since_epoch, code->CodeSize()); |
| + msg.AppendAddress(code->address()); |
| + |
| + // Deoptimization position. |
| + std::ostringstream deopt_location; |
| + int inlining_id = -1; |
| + int script_offset = -1; |
| + if (info.position.IsKnown()) { |
| + info.position.Print(deopt_location, code); |
| + inlining_id = info.position.InliningId(); |
| + script_offset = info.position.ScriptOffset(); |
| + } else { |
| + deopt_location << "<unknown>"; |
| + } |
| + msg.Append(",%d,%d,", inlining_id, script_offset); |
| + switch (kind) { |
| + case kLazy: |
| + msg.Append("\"lazy\","); |
| + break; |
| + case kSoft: |
| + msg.Append("\"soft\","); |
| + break; |
| + case kEager: |
| + msg.Append("\"eager\","); |
| + break; |
| + } |
| + msg.AppendDoubleQuotedString(deopt_location.str().c_str()); |
| + msg.Append(","); |
| + msg.AppendDoubleQuotedString(DeoptimizeReasonToString(info.deopt_reason)); |
| msg.WriteToLogFile(); |
| } |
| @@ -972,6 +1001,11 @@ void Logger::CallbackEventInternal(const char* prefix, Name* name, |
| msg.Append("%s,%s,-2,", |
| kLogEventsNames[CodeEventListener::CODE_CREATION_EVENT], |
| kLogEventsNames[CodeEventListener::CALLBACK_TAG]); |
| + if (timer_.IsStarted()) { |
| + msg.Append("%d,", static_cast<int>(timer_.Elapsed().InMicroseconds())); |
| + } else { |
| + msg.Append("-1,"); |
| + } |
| msg.AppendAddress(entry_point); |
| if (name->IsString()) { |
| std::unique_ptr<char[]> str = |
| @@ -1007,23 +1041,31 @@ void Logger::SetterCallbackEvent(Name* name, Address entry_point) { |
| CallbackEventInternal("set ", name, entry_point); |
| } |
| -static void AppendCodeCreateHeader(Log::MessageBuilder* msg, |
| - CodeEventListener::LogEventsAndTags tag, |
| - AbstractCode* code) { |
| +namespace { |
| + |
| +void AppendCodeCreateHeader(Log::MessageBuilder* msg, |
| + CodeEventListener::LogEventsAndTags tag, |
| + AbstractCode* code, base::ElapsedTimer* timer) { |
| DCHECK(msg); |
| msg->Append("%s,%s,%d,", |
| kLogEventsNames[CodeEventListener::CODE_CREATION_EVENT], |
| kLogEventsNames[tag], code->kind()); |
| + int timestamp = timer->IsStarted() |
|
Leszek Swirski
2017/03/21 14:28:39
nit: inconsistent use of if blocks vs. ternary ope
|
| + ? static_cast<int>(timer->Elapsed().InMicroseconds()) |
| + : -1; |
| + msg->Append("%d,", timestamp); |
| msg->AppendAddress(code->address()); |
| msg->Append(",%d,", code->ExecutableSize()); |
| } |
| +} // namespace |
| + |
| void Logger::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, |
| AbstractCode* code, const char* comment) { |
| if (!is_logging_code_events()) return; |
| if (!FLAG_log_code || !log_->IsEnabled()) return; |
| Log::MessageBuilder msg(log_); |
| - AppendCodeCreateHeader(&msg, tag, code); |
| + AppendCodeCreateHeader(&msg, tag, code, &timer_); |
| msg.AppendDoubleQuotedString(comment); |
| msg.WriteToLogFile(); |
| } |
| @@ -1033,7 +1075,7 @@ void Logger::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, |
| if (!is_logging_code_events()) return; |
| if (!FLAG_log_code || !log_->IsEnabled()) return; |
| Log::MessageBuilder msg(log_); |
| - AppendCodeCreateHeader(&msg, tag, code); |
| + AppendCodeCreateHeader(&msg, tag, code, &timer_); |
| if (name->IsString()) { |
| msg.Append('"'); |
| msg.AppendDetailed(String::cast(name), false); |
| @@ -1055,7 +1097,7 @@ void Logger::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, |
| } |
| Log::MessageBuilder msg(log_); |
| - AppendCodeCreateHeader(&msg, tag, code); |
| + AppendCodeCreateHeader(&msg, tag, code, &timer_); |
| if (name->IsString()) { |
| std::unique_ptr<char[]> str = |
| String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| @@ -1079,7 +1121,7 @@ void Logger::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, |
| if (!is_logging_code_events()) return; |
| if (!FLAG_log_code || !log_->IsEnabled()) return; |
| Log::MessageBuilder msg(log_); |
| - AppendCodeCreateHeader(&msg, tag, code); |
| + AppendCodeCreateHeader(&msg, tag, code, &timer_); |
| std::unique_ptr<char[]> name = |
| shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); |
| msg.Append("\"%s ", name.get()); |
| @@ -1101,7 +1143,7 @@ void Logger::CodeCreateEvent(CodeEventListener::LogEventsAndTags tag, |
| if (!is_logging_code_events()) return; |
| if (!FLAG_log_code || !log_->IsEnabled()) return; |
| Log::MessageBuilder msg(log_); |
| - AppendCodeCreateHeader(&msg, tag, code); |
| + AppendCodeCreateHeader(&msg, tag, code, &timer_); |
| msg.Append("\"args_count: %d\"", args_count); |
| msg.WriteToLogFile(); |
| } |
| @@ -1130,7 +1172,7 @@ void Logger::RegExpCodeCreateEvent(AbstractCode* code, String* source) { |
| if (!is_logging_code_events()) return; |
| if (!FLAG_log_code || !log_->IsEnabled()) return; |
| Log::MessageBuilder msg(log_); |
| - AppendCodeCreateHeader(&msg, CodeEventListener::REG_EXP_TAG, code); |
| + AppendCodeCreateHeader(&msg, CodeEventListener::REG_EXP_TAG, code, &timer_); |
| msg.Append('"'); |
| msg.AppendDetailed(source, false); |
| msg.Append('"'); |