| Index: src/log.cc
|
| diff --git a/src/log.cc b/src/log.cc
|
| index 46872a150c48259ca932d7c6e06f1e70a89cc483..d32ce1aa8ea1e8bd78d7b61c5a5a126506119b3e 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(Code* code, DeoptKind kind, 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,10 @@ void Logger::CallbackEventInternal(const char* prefix, Name* name,
|
| msg.Append("%s,%s,-2,",
|
| kLogEventsNames[CodeEventListener::CODE_CREATION_EVENT],
|
| kLogEventsNames[CodeEventListener::CALLBACK_TAG]);
|
| + int timestamp = timer_.IsStarted()
|
| + ? static_cast<int>(timer_.Elapsed().InMicroseconds())
|
| + : -1;
|
| + msg.Append("%d,", timestamp);
|
| msg.AppendAddress(entry_point);
|
| if (name->IsString()) {
|
| std::unique_ptr<char[]> str =
|
| @@ -1007,23 +1040,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()
|
| + ? 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 +1074,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 +1096,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 +1120,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 +1142,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 +1171,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('"');
|
|
|