| Index: src/log.cc
|
| diff --git a/src/log.cc b/src/log.cc
|
| index 6a956b496dc4b37859fd6ef880fbb3628d184586..875c8a64836e7127f5742440d94a7d3bd5e92ca8 100644
|
| --- a/src/log.cc
|
| +++ b/src/log.cc
|
| @@ -203,6 +203,8 @@ void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| }
|
| name_buffer_->AppendByte(':');
|
| name_buffer_->AppendInt(line);
|
| + name_buffer_->AppendByte(':');
|
| + name_buffer_->AppendInt(column);
|
| LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
|
| }
|
|
|
| @@ -939,6 +941,7 @@ Logger::Logger(Isolate* isolate)
|
| ll_logger_(NULL),
|
| jit_logger_(NULL),
|
| listeners_(5),
|
| + sampler_thread_(NULL),
|
| is_initialized_(false) {
|
| }
|
|
|
| @@ -1329,16 +1332,38 @@ void Logger::SetterCallbackEvent(Name* name, Address entry_point) {
|
| }
|
|
|
|
|
| -static void AppendCodeCreateHeader(Log::MessageBuilder* msg,
|
| - Logger::LogEventsAndTags tag,
|
| - Code* code) {
|
| - ASSERT(msg);
|
| - msg->Append("%s,%s,%d,",
|
| - kLogEventsNames[Logger::CODE_CREATION_EVENT],
|
| - kLogEventsNames[tag],
|
| - code->kind());
|
| - msg->AppendAddress(code->address());
|
| - msg->Append(",%d,", code->ExecutableSize());
|
| +void Logger::CodeCreateEvent(const v8::JitCodeEvent* event) {
|
| + if (!is_logging_code_events() ||
|
| + !FLAG_log_code ||
|
| + !log_->IsEnabled()) return;
|
| +
|
| + Log::MessageBuilder msg(log_);
|
| + msg.Append("%s,", kLogEventsNames[Logger::CODE_CREATION_EVENT]);
|
| +
|
| + // Extract the tag name.
|
| + unsigned i = 0;
|
| + for (; i < event->name.len; i++) {
|
| + if (event->name.str[i] == ':') break;
|
| + msg.Append(event->name.str[i]);
|
| + }
|
| + i++;
|
| +
|
| + msg.Append(",,%p,%d,\"", event->code_start, event->code_len);
|
| +
|
| + // Have a look at function ComputeMarker
|
| + // The first character here might be the marker.
|
| + // In that case, get rid of that.
|
| + if ((i < event->name.len) &&
|
| + ((event->name.str[i] == '~') ||
|
| + (event->name.str[i] == '*')))
|
| + i++;
|
| +
|
| + for (; i < event->name.len; i++) {
|
| + msg.Append(event->name.str[i]);
|
| + }
|
| + msg.Append("\"\n");
|
| +
|
| + msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1349,13 +1374,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
|
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(CodeCreateEvent(tag, code, comment));
|
| -
|
| - if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| - Log::MessageBuilder msg(log_);
|
| - AppendCodeCreateHeader(&msg, tag, code);
|
| - msg.AppendDoubleQuotedString(comment);
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1366,19 +1384,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
|
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(CodeCreateEvent(tag, code, name));
|
| -
|
| - if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| - Log::MessageBuilder msg(log_);
|
| - AppendCodeCreateHeader(&msg, tag, code);
|
| - if (name->IsString()) {
|
| - msg.Append('"');
|
| - msg.AppendDetailed(String::cast(name), false);
|
| - msg.Append('"');
|
| - } else {
|
| - msg.AppendSymbolName(Symbol::cast(name));
|
| - }
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1391,25 +1396,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
|
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(CodeCreateEvent(tag, code, shared, info, name));
|
| -
|
| - if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| - if (code == isolate_->builtins()->builtin(Builtins::kCompileUnoptimized))
|
| - return;
|
| -
|
| - Log::MessageBuilder msg(log_);
|
| - AppendCodeCreateHeader(&msg, tag, code);
|
| - if (name->IsString()) {
|
| - SmartArrayPointer<char> str =
|
| - String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
|
| - msg.Append("\"%s\"", str.get());
|
| - } else {
|
| - msg.AppendSymbolName(Symbol::cast(name));
|
| - }
|
| - msg.Append(',');
|
| - msg.AppendAddress(shared->address());
|
| - msg.Append(",%s", ComputeMarker(code));
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1426,25 +1412,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(CodeCreateEvent(tag, code, shared, info, source, line,
|
| column));
|
| -
|
| - if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| - Log::MessageBuilder msg(log_);
|
| - AppendCodeCreateHeader(&msg, tag, code);
|
| - SmartArrayPointer<char> name =
|
| - shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
|
| - msg.Append("\"%s ", name.get());
|
| - if (source->IsString()) {
|
| - SmartArrayPointer<char> sourcestr =
|
| - String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
|
| - msg.Append("%s", sourcestr.get());
|
| - } else {
|
| - msg.AppendSymbolName(Symbol::cast(source));
|
| - }
|
| - msg.Append(":%d:%d\",", line, column);
|
| - msg.AppendAddress(shared->address());
|
| - msg.Append(",%s", ComputeMarker(code));
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1455,13 +1422,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
|
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(CodeCreateEvent(tag, code, args_count));
|
| -
|
| - if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| - Log::MessageBuilder msg(log_);
|
| - AppendCodeCreateHeader(&msg, tag, code);
|
| - msg.Append("\"args_count: %d\"", args_count);
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1498,15 +1458,14 @@ void Logger::RegExpCodeCreateEvent(Code* code, String* source) {
|
|
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(RegExpCodeCreateEvent(code, source));
|
| +}
|
|
|
| - if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| - Log::MessageBuilder msg(log_);
|
| - AppendCodeCreateHeader(&msg, REG_EXP_TAG, code);
|
| - msg.Append('"');
|
| - msg.AppendDetailed(source, false);
|
| - msg.Append('"');
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| +
|
| +void Logger::CodeMoveEvent(const v8::JitCodeEvent* event) {
|
| + if (!is_logging_code_events()) return;
|
| + MoveEventInternal(CODE_MOVE_EVENT,
|
| + static_cast<Address>(event->code_start),
|
| + static_cast<Address>(event->new_code_start));
|
| }
|
|
|
|
|
| @@ -1515,25 +1474,28 @@ void Logger::CodeMoveEvent(Address from, Address to) {
|
|
|
| if (!is_logging_code_events()) return;
|
| CALL_LISTENERS(CodeMoveEvent(from, to));
|
| - MoveEventInternal(CODE_MOVE_EVENT, from, to);
|
| }
|
|
|
|
|
| -void Logger::CodeDeleteEvent(Address from) {
|
| - PROFILER_LOG(CodeDeleteEvent(from));
|
| -
|
| +void Logger::CodeDeleteEvent(const v8::JitCodeEvent* event) {
|
| if (!is_logging_code_events()) return;
|
| - CALL_LISTENERS(CodeDeleteEvent(from));
|
| -
|
| if (!FLAG_log_code || !log_->IsEnabled()) return;
|
| Log::MessageBuilder msg(log_);
|
| msg.Append("%s,", kLogEventsNames[CODE_DELETE_EVENT]);
|
| - msg.AppendAddress(from);
|
| + msg.AppendAddress(static_cast<Address>(event->code_start));
|
| msg.Append('\n');
|
| msg.WriteToLogFile();
|
| }
|
|
|
|
|
| +void Logger::CodeDeleteEvent(Address from) {
|
| + PROFILER_LOG(CodeDeleteEvent(from));
|
| +
|
| + if (!is_logging_code_events()) return;
|
| + CALL_LISTENERS(CodeDeleteEvent(from));
|
| +}
|
| +
|
| +
|
| void Logger::CodeLinePosInfoAddPositionEvent(void* jit_handler_data,
|
| int pc_offset,
|
| int position) {
|
| @@ -1701,23 +1663,13 @@ void Logger::DebugEvent(const char* event_type, Vector<uint16_t> parameter) {
|
| }
|
|
|
|
|
| -void Logger::TickEvent(TickSample* sample, bool overflow) {
|
| +void Logger::LogSample(v8::Sample* sample) {
|
| if (!log_->IsEnabled() || !FLAG_prof) return;
|
| +
|
| Log::MessageBuilder msg(log_);
|
| - msg.Append("%s,", kLogEventsNames[TICK_EVENT]);
|
| - msg.AppendAddress(sample->pc);
|
| - msg.Append(",%ld", static_cast<int>(timer_.Elapsed().InMicroseconds()));
|
| - if (sample->has_external_callback) {
|
| - msg.Append(",1,");
|
| - msg.AppendAddress(sample->external_callback);
|
| - } else {
|
| - msg.Append(",0,");
|
| - msg.AppendAddress(sample->tos);
|
| - }
|
| - msg.Append(",%d", static_cast<int>(sample->state));
|
| - if (overflow) {
|
| - msg.Append(",overflow");
|
| - }
|
| + msg.Append("%s,,%ld,,,",
|
| + kLogEventsNames[TICK_EVENT],
|
| + static_cast<int>(timer_.Elapsed().InMicroseconds()));
|
| for (unsigned i = 0; i < sample->frames_count; ++i) {
|
| msg.Append(',');
|
| msg.AppendAddress(static_cast<Address>(sample->stack[i]));
|
| @@ -2058,6 +2010,9 @@ bool Logger::SetUp(Isolate* isolate) {
|
| profiler_ = new Profiler(isolate);
|
| is_logging_ = true;
|
| profiler_->Engage();
|
| +
|
| + sampler_thread_ = new SamplerThread(
|
| + reinterpret_cast<v8::Isolate*>(isolate));
|
| }
|
|
|
| // TODO(gholap): This one's for the new sampler API. (include/v8-sampler.h)
|
| @@ -2136,7 +2091,61 @@ FILE* Logger::TearDown() {
|
| jit_logger_ = NULL;
|
| }
|
|
|
| + if (sampler_thread_) {
|
| + delete sampler_thread_;
|
| + sampler_thread_ = NULL;
|
| + }
|
| +
|
| return log_->Close();
|
| }
|
|
|
| +
|
| +void Logger::SamplerThread::JitCodeEventHandler(const v8::JitCodeEvent* event) {
|
| + switch (event->type) {
|
| + case v8::JitCodeEvent::CODE_ADDED:
|
| + Isolate::Current()->logger()->CodeCreateEvent(event);
|
| + break;
|
| +
|
| + case v8::JitCodeEvent::CODE_MOVED:
|
| + Isolate::Current()->logger()->CodeMoveEvent(event);
|
| + break;
|
| +
|
| + case v8::JitCodeEvent::CODE_REMOVED:
|
| + Isolate::Current()->logger()->CodeDeleteEvent(event);
|
| + break;
|
| +
|
| + default:
|
| + break;
|
| + }
|
| +}
|
| +
|
| +
|
| +Logger::SamplerThread::SamplerThread(v8::Isolate* isolate)
|
| + : Thread(Thread::Options("d8:sampler")),
|
| + isolate_(isolate),
|
| + done_sampling_(false) {
|
| + reinterpret_cast<Isolate*>(isolate)->logger()->SetCodeEventHandler(
|
| + v8::kJitCodeEventDefault,
|
| + Logger::SamplerThread::JitCodeEventHandler);
|
| + Start();
|
| +}
|
| +
|
| +
|
| +void Logger::SamplerThread::Run() {
|
| + Sample sample;
|
| + while (!done_sampling_) {
|
| + v8::base::OS::Sleep(1);
|
| + isolate_->GetSample(&sample);
|
| + if (sample.frames_count != 0) {
|
| + reinterpret_cast<Isolate*>(isolate_)->logger()->LogSample(&sample);
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +Logger::SamplerThread::~SamplerThread() {
|
| + done_sampling_ = true;
|
| + Join();
|
| +}
|
| +
|
| } } // namespace v8::internal
|
|
|