| Index: src/log.cc
|
| diff --git a/src/log.cc b/src/log.cc
|
| index 1a9dd297a90ad05b2de3e2a14c61cdcbf9d8436f..d26279bb24ad03e9098683adbda34794b06505c9 100644
|
| --- a/src/log.cc
|
| +++ b/src/log.cc
|
| @@ -54,6 +54,16 @@ static const char* const kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = {
|
| #undef DECLARE_EVENT
|
|
|
|
|
| +// ComputeMarker must only be used when SharedFunctionInfo is known.
|
| +static const char* ComputeMarker(Code* code) {
|
| + switch (code->kind()) {
|
| + case Code::FUNCTION: return code->optimizable() ? "~" : "";
|
| + case Code::OPTIMIZED_FUNCTION: return "*";
|
| + default: return "";
|
| + }
|
| +}
|
| +
|
| +
|
| class CodeEventLogger {
|
| public:
|
| virtual ~CodeEventLogger() { }
|
| @@ -185,6 +195,74 @@ class CodeEventLogger {
|
| };
|
|
|
|
|
| +void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + Code* code,
|
| + const char* comment) {
|
| + name_buffer_.Init(tag);
|
| + name_buffer_.AppendBytes(comment);
|
| + LogRecordedBuffer(code, NULL, &name_buffer_);
|
| +}
|
| +
|
| +
|
| +void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + Code* code,
|
| + Name* name) {
|
| + name_buffer_.Init(tag);
|
| + name_buffer_.AppendName(name);
|
| + LogRecordedBuffer(code, NULL, &name_buffer_);
|
| +}
|
| +
|
| +
|
| +void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + Code* code,
|
| + SharedFunctionInfo* shared,
|
| + CompilationInfo* info,
|
| + Name* name) {
|
| + name_buffer_.Init(tag);
|
| + name_buffer_.AppendBytes(ComputeMarker(code));
|
| + name_buffer_.AppendName(name);
|
| + LogRecordedBuffer(code, shared, &name_buffer_);
|
| +}
|
| +
|
| +
|
| +void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + Code* code,
|
| + SharedFunctionInfo* shared,
|
| + CompilationInfo* info,
|
| + Name* source, int line) {
|
| + name_buffer_.Init(tag);
|
| + name_buffer_.AppendBytes(ComputeMarker(code));
|
| + name_buffer_.AppendString(shared->DebugName());
|
| + name_buffer_.AppendByte(' ');
|
| + if (source->IsString()) {
|
| + name_buffer_.AppendString(String::cast(source));
|
| + } else {
|
| + name_buffer_.AppendBytes("symbol(hash ");
|
| + name_buffer_.AppendHex(Name::cast(source)->Hash());
|
| + name_buffer_.AppendByte(')');
|
| + }
|
| + name_buffer_.AppendByte(':');
|
| + name_buffer_.AppendInt(line);
|
| + LogRecordedBuffer(code, shared, &name_buffer_);
|
| +}
|
| +
|
| +
|
| +void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| + Code* code,
|
| + int args_count) {
|
| + name_buffer_.Init(tag);
|
| + name_buffer_.AppendInt(args_count);
|
| + LogRecordedBuffer(code, NULL, &name_buffer_);
|
| +}
|
| +
|
| +
|
| +void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) {
|
| + name_buffer_.Init(Logger::REG_EXP_TAG);
|
| + name_buffer_.AppendString(source);
|
| + LogRecordedBuffer(code, NULL, &name_buffer_);
|
| +}
|
| +
|
| +
|
| // Low-level logging support.
|
| class LowLevelLogger : public CodeEventLogger {
|
| public:
|
| @@ -259,6 +337,95 @@ class LowLevelLogger : public CodeEventLogger {
|
|
|
| const char LowLevelLogger::kLogExt[] = ".ll";
|
|
|
| +LowLevelLogger::LowLevelLogger(const char* name)
|
| + : ll_output_handle_(NULL) {
|
| + // Open the low-level log file.
|
| + size_t len = strlen(name);
|
| + ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLogExt)));
|
| + OS::MemCopy(ll_name.start(), name, len);
|
| + OS::MemCopy(ll_name.start() + len, kLogExt, sizeof(kLogExt));
|
| + ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode);
|
| + setvbuf(ll_output_handle_, NULL, _IOFBF, kLogBufferSize);
|
| +
|
| + LogCodeInfo();
|
| +}
|
| +
|
| +
|
| +LowLevelLogger::~LowLevelLogger() {
|
| + fclose(ll_output_handle_);
|
| + ll_output_handle_ = NULL;
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::LogCodeInfo() {
|
| +#if V8_TARGET_ARCH_IA32
|
| + const char arch[] = "ia32";
|
| +#elif V8_TARGET_ARCH_X64
|
| + const char arch[] = "x64";
|
| +#elif V8_TARGET_ARCH_ARM
|
| + const char arch[] = "arm";
|
| +#elif V8_TARGET_ARCH_MIPS
|
| + const char arch[] = "mips";
|
| +#else
|
| + const char arch[] = "unknown";
|
| +#endif
|
| + LogWriteBytes(arch, sizeof(arch));
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::LogRecordedBuffer(Code* code,
|
| + SharedFunctionInfo*,
|
| + NameBuffer* name_buffer) {
|
| + CodeCreateStruct event;
|
| + event.name_size = name_buffer->size();
|
| + event.code_address = code->instruction_start();
|
| + ASSERT(event.code_address == code->address() + Code::kHeaderSize);
|
| + event.code_size = code->instruction_size();
|
| + LogWriteStruct(event);
|
| + LogWriteBytes(name_buffer->get(), name_buffer->size());
|
| + LogWriteBytes(
|
| + reinterpret_cast<const char*>(code->instruction_start()),
|
| + code->instruction_size());
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::CodeMoveEvent(Address from, Address to) {
|
| + CodeMoveStruct event;
|
| + event.from_address = from + Code::kHeaderSize;
|
| + event.to_address = to + Code::kHeaderSize;
|
| + LogWriteStruct(event);
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::CodeDeleteEvent(Address from) {
|
| + CodeDeleteStruct event;
|
| + event.address = from + Code::kHeaderSize;
|
| + LogWriteStruct(event);
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::SnapshotPositionEvent(Address addr, int pos) {
|
| + SnapshotPositionStruct event;
|
| + event.address = addr + Code::kHeaderSize;
|
| + event.position = pos;
|
| + LogWriteStruct(event);
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::LogWriteBytes(const char* bytes, int size) {
|
| + size_t rv = fwrite(bytes, 1, size, ll_output_handle_);
|
| + ASSERT(static_cast<size_t>(size) == rv);
|
| + USE(rv);
|
| +}
|
| +
|
| +
|
| +void LowLevelLogger::CodeMovingGCEvent() {
|
| + const char tag = kCodeMovingGCTag;
|
| +
|
| + LogWriteBytes(&tag, sizeof(tag));
|
| +}
|
| +
|
| +
|
| #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call;
|
|
|
|
|
| @@ -372,6 +539,124 @@ class CodeAddressMap: public CodeEventLogger {
|
| if (Serializer::enabled()) code_address_map_->Call;
|
|
|
|
|
| +class JitLogger : public CodeEventLogger {
|
| + public:
|
| + explicit JitLogger(JitCodeEventHandler code_event_handler);
|
| +
|
| + void CodeMovedEvent(Address from, Address to);
|
| + void CodeDeleteEvent(Address from);
|
| + void AddCodeLinePosInfoEvent(
|
| + void* jit_handler_data,
|
| + int pc_offset,
|
| + int position,
|
| + JitCodeEvent::PositionType position_type);
|
| + void* StartCodePosInfoEvent();
|
| + void EndCodePosInfoEvent(Code* code, void* jit_handler_data);
|
| +
|
| + private:
|
| + virtual void LogRecordedBuffer(Code* code,
|
| + SharedFunctionInfo* shared,
|
| + CodeEventLogger::NameBuffer* name_buffer);
|
| +
|
| + JitCodeEventHandler code_event_handler_;
|
| +};
|
| +
|
| +#define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
|
| +
|
| +
|
| +JitLogger::JitLogger(JitCodeEventHandler code_event_handler)
|
| + : code_event_handler_(code_event_handler) {
|
| +}
|
| +
|
| +
|
| +void JitLogger::LogRecordedBuffer(Code* code,
|
| + SharedFunctionInfo* shared,
|
| + CodeEventLogger::NameBuffer* name_buffer) {
|
| + JitCodeEvent event;
|
| + memset(&event, 0, sizeof(event));
|
| + event.type = JitCodeEvent::CODE_ADDED;
|
| + event.code_start = code->instruction_start();
|
| + event.code_len = code->instruction_size();
|
| + Handle<Script> script_handle;
|
| + if (shared && shared->script()->IsScript()) {
|
| + script_handle = Handle<Script>(Script::cast(shared->script()));
|
| + }
|
| + event.script = ToApiHandle<v8::Script>(script_handle);
|
| + event.name.str = name_buffer->get();
|
| + event.name.len = name_buffer->size();
|
| + code_event_handler_(&event);
|
| +}
|
| +
|
| +
|
| +void JitLogger::CodeMovedEvent(Address from, Address to) {
|
| + Code* from_code = Code::cast(HeapObject::FromAddress(from));
|
| +
|
| + JitCodeEvent event;
|
| + event.type = JitCodeEvent::CODE_MOVED;
|
| + event.code_start = from_code->instruction_start();
|
| + event.code_len = from_code->instruction_size();
|
| +
|
| + // Calculate the header size.
|
| + const size_t header_size =
|
| + from_code->instruction_start() - reinterpret_cast<byte*>(from_code);
|
| +
|
| + // Calculate the new start address of the instructions.
|
| + event.new_code_start =
|
| + reinterpret_cast<byte*>(HeapObject::FromAddress(to)) + header_size;
|
| +
|
| + code_event_handler_(&event);
|
| +}
|
| +
|
| +
|
| +void JitLogger::CodeDeleteEvent(Address from) {
|
| + Code* from_code = Code::cast(HeapObject::FromAddress(from));
|
| +
|
| + JitCodeEvent event;
|
| + event.type = JitCodeEvent::CODE_REMOVED;
|
| + event.code_start = from_code->instruction_start();
|
| + event.code_len = from_code->instruction_size();
|
| +
|
| + code_event_handler_(&event);
|
| +}
|
| +
|
| +void JitLogger::AddCodeLinePosInfoEvent(
|
| + void* jit_handler_data,
|
| + int pc_offset,
|
| + int position,
|
| + JitCodeEvent::PositionType position_type) {
|
| + JitCodeEvent event;
|
| + memset(&event, 0, sizeof(event));
|
| + event.type = JitCodeEvent::CODE_ADD_LINE_POS_INFO;
|
| + event.user_data = jit_handler_data;
|
| + event.line_info.offset = pc_offset;
|
| + event.line_info.pos = position;
|
| + event.line_info.position_type = position_type;
|
| +
|
| + code_event_handler_(&event);
|
| +}
|
| +
|
| +
|
| +void* JitLogger::StartCodePosInfoEvent() {
|
| + JitCodeEvent event;
|
| + memset(&event, 0, sizeof(event));
|
| + event.type = JitCodeEvent::CODE_START_LINE_INFO_RECORDING;
|
| +
|
| + code_event_handler_(&event);
|
| + return event.user_data;
|
| +}
|
| +
|
| +
|
| +void JitLogger::EndCodePosInfoEvent(Code* code, void* jit_handler_data) {
|
| + JitCodeEvent event;
|
| + memset(&event, 0, sizeof(event));
|
| + event.type = JitCodeEvent::CODE_END_LINE_INFO_RECORDING;
|
| + event.code_start = code->instruction_start();
|
| + event.user_data = jit_handler_data;
|
| +
|
| + code_event_handler_(&event);
|
| +}
|
| +
|
| +
|
| // The Profiler samples pc and sp values for the main thread.
|
| // Each sample is appended to a circular buffer.
|
| // An independent thread removes data and writes it to the log.
|
| @@ -511,178 +796,60 @@ void Profiler::Disengage() {
|
| if (!engaged_) return;
|
|
|
| // Stop receiving ticks.
|
| - isolate_->logger()->ticker_->ClearProfiler();
|
| -
|
| - // Terminate the worker thread by setting running_ to false,
|
| - // inserting a fake element in the queue and then wait for
|
| - // the thread to terminate.
|
| - running_ = false;
|
| - TickSample sample;
|
| - // Reset 'paused_' flag, otherwise semaphore may not be signalled.
|
| - resume();
|
| - Insert(&sample);
|
| - Join();
|
| -
|
| - LOG(ISOLATE, UncheckedStringEvent("profiler", "end"));
|
| -}
|
| -
|
| -
|
| -void Profiler::Run() {
|
| - TickSample sample;
|
| - bool overflow = Remove(&sample);
|
| - while (running_) {
|
| - LOG(isolate_, TickEvent(&sample, overflow));
|
| - overflow = Remove(&sample);
|
| - }
|
| -}
|
| -
|
| -
|
| -//
|
| -// Logger class implementation.
|
| -//
|
| -
|
| -Logger::Logger(Isolate* isolate)
|
| - : isolate_(isolate),
|
| - ticker_(NULL),
|
| - profiler_(NULL),
|
| - log_events_(NULL),
|
| - logging_nesting_(0),
|
| - cpu_profiler_nesting_(0),
|
| - log_(new Log(this)),
|
| - ll_logger_(NULL),
|
| - jit_logger_(NULL),
|
| - code_address_map_(new CodeAddressMap),
|
| - is_initialized_(false),
|
| - last_address_(NULL),
|
| - prev_sp_(NULL),
|
| - prev_function_(NULL),
|
| - prev_to_(NULL),
|
| - prev_code_(NULL),
|
| - epoch_(0) {
|
| -}
|
| -
|
| -
|
| -Logger::~Logger() {
|
| - delete code_address_map_;
|
| - delete log_;
|
| -}
|
| -
|
| -
|
| -class JitLogger : public CodeEventLogger {
|
| - public:
|
| - explicit JitLogger(JitCodeEventHandler code_event_handler);
|
| -
|
| - void CodeMovedEvent(Address from, Address to);
|
| - void CodeDeleteEvent(Address from);
|
| - void AddCodeLinePosInfoEvent(
|
| - void* jit_handler_data,
|
| - int pc_offset,
|
| - int position,
|
| - JitCodeEvent::PositionType position_type);
|
| - void* StartCodePosInfoEvent();
|
| - void EndCodePosInfoEvent(Code* code, void* jit_handler_data);
|
| -
|
| - private:
|
| - virtual void LogRecordedBuffer(Code* code,
|
| - SharedFunctionInfo* shared,
|
| - CodeEventLogger::NameBuffer* name_buffer);
|
| -
|
| - JitCodeEventHandler code_event_handler_;
|
| -};
|
| -
|
| -#define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
|
| -
|
| -
|
| -JitLogger::JitLogger(JitCodeEventHandler code_event_handler)
|
| - : code_event_handler_(code_event_handler) {
|
| -}
|
| -
|
| -
|
| -void JitLogger::LogRecordedBuffer(Code* code,
|
| - SharedFunctionInfo* shared,
|
| - CodeEventLogger::NameBuffer* name_buffer) {
|
| - JitCodeEvent event;
|
| - memset(&event, 0, sizeof(event));
|
| - event.type = JitCodeEvent::CODE_ADDED;
|
| - event.code_start = code->instruction_start();
|
| - event.code_len = code->instruction_size();
|
| - Handle<Script> script_handle;
|
| - if (shared && shared->script()->IsScript()) {
|
| - script_handle = Handle<Script>(Script::cast(shared->script()));
|
| - }
|
| - event.script = ToApiHandle<v8::Script>(script_handle);
|
| - event.name.str = name_buffer->get();
|
| - event.name.len = name_buffer->size();
|
| - code_event_handler_(&event);
|
| -}
|
| -
|
| -
|
| -void JitLogger::CodeMovedEvent(Address from, Address to) {
|
| - Code* from_code = Code::cast(HeapObject::FromAddress(from));
|
| -
|
| - JitCodeEvent event;
|
| - event.type = JitCodeEvent::CODE_MOVED;
|
| - event.code_start = from_code->instruction_start();
|
| - event.code_len = from_code->instruction_size();
|
| -
|
| - // Calculate the header size.
|
| - const size_t header_size =
|
| - from_code->instruction_start() - reinterpret_cast<byte*>(from_code);
|
| -
|
| - // Calculate the new start address of the instructions.
|
| - event.new_code_start =
|
| - reinterpret_cast<byte*>(HeapObject::FromAddress(to)) + header_size;
|
| -
|
| - code_event_handler_(&event);
|
| -}
|
| -
|
| -
|
| -void JitLogger::CodeDeleteEvent(Address from) {
|
| - Code* from_code = Code::cast(HeapObject::FromAddress(from));
|
| + isolate_->logger()->ticker_->ClearProfiler();
|
|
|
| - JitCodeEvent event;
|
| - event.type = JitCodeEvent::CODE_REMOVED;
|
| - event.code_start = from_code->instruction_start();
|
| - event.code_len = from_code->instruction_size();
|
| + // Terminate the worker thread by setting running_ to false,
|
| + // inserting a fake element in the queue and then wait for
|
| + // the thread to terminate.
|
| + running_ = false;
|
| + TickSample sample;
|
| + // Reset 'paused_' flag, otherwise semaphore may not be signalled.
|
| + resume();
|
| + Insert(&sample);
|
| + Join();
|
|
|
| - code_event_handler_(&event);
|
| + LOG(ISOLATE, UncheckedStringEvent("profiler", "end"));
|
| }
|
|
|
| -void JitLogger::AddCodeLinePosInfoEvent(
|
| - void* jit_handler_data,
|
| - int pc_offset,
|
| - int position,
|
| - JitCodeEvent::PositionType position_type) {
|
| - JitCodeEvent event;
|
| - memset(&event, 0, sizeof(event));
|
| - event.type = JitCodeEvent::CODE_ADD_LINE_POS_INFO;
|
| - event.user_data = jit_handler_data;
|
| - event.line_info.offset = pc_offset;
|
| - event.line_info.pos = position;
|
| - event.line_info.position_type = position_type;
|
|
|
| - code_event_handler_(&event);
|
| +void Profiler::Run() {
|
| + TickSample sample;
|
| + bool overflow = Remove(&sample);
|
| + while (running_) {
|
| + LOG(isolate_, TickEvent(&sample, overflow));
|
| + overflow = Remove(&sample);
|
| + }
|
| }
|
|
|
|
|
| -void* JitLogger::StartCodePosInfoEvent() {
|
| - JitCodeEvent event;
|
| - memset(&event, 0, sizeof(event));
|
| - event.type = JitCodeEvent::CODE_START_LINE_INFO_RECORDING;
|
| +//
|
| +// Logger class implementation.
|
| +//
|
|
|
| - code_event_handler_(&event);
|
| - return event.user_data;
|
| +Logger::Logger(Isolate* isolate)
|
| + : isolate_(isolate),
|
| + ticker_(NULL),
|
| + profiler_(NULL),
|
| + log_events_(NULL),
|
| + logging_nesting_(0),
|
| + cpu_profiler_nesting_(0),
|
| + log_(new Log(this)),
|
| + ll_logger_(NULL),
|
| + jit_logger_(NULL),
|
| + code_address_map_(new CodeAddressMap),
|
| + is_initialized_(false),
|
| + last_address_(NULL),
|
| + prev_sp_(NULL),
|
| + prev_function_(NULL),
|
| + prev_to_(NULL),
|
| + prev_code_(NULL),
|
| + epoch_(0) {
|
| }
|
|
|
|
|
| -void JitLogger::EndCodePosInfoEvent(Code* code, void* jit_handler_data) {
|
| - JitCodeEvent event;
|
| - memset(&event, 0, sizeof(event));
|
| - event.type = JitCodeEvent::CODE_END_LINE_INFO_RECORDING;
|
| - event.code_start = code->instruction_start();
|
| - event.user_data = jit_handler_data;
|
| -
|
| - code_event_handler_(&event);
|
| +Logger::~Logger() {
|
| + delete code_address_map_;
|
| + delete log_;
|
| }
|
|
|
|
|
| @@ -1098,15 +1265,6 @@ static void AppendCodeCreateHeader(Log::MessageBuilder* msg,
|
| }
|
|
|
|
|
| -void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| - Code* code,
|
| - const char* comment) {
|
| - name_buffer_.Init(tag);
|
| - name_buffer_.AppendBytes(comment);
|
| - LogRecordedBuffer(code, NULL, &name_buffer_);
|
| -}
|
| -
|
| -
|
| void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| Code* code,
|
| const char* comment) {
|
| @@ -1125,15 +1283,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| }
|
|
|
|
|
| -void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| - Code* code,
|
| - Name* name) {
|
| - name_buffer_.Init(tag);
|
| - name_buffer_.AppendName(name);
|
| - LogRecordedBuffer(code, NULL, &name_buffer_);
|
| -}
|
| -
|
| -
|
| void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| Code* code,
|
| Name* name) {
|
| @@ -1158,28 +1307,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| }
|
|
|
|
|
| -// ComputeMarker must only be used when SharedFunctionInfo is known.
|
| -static const char* ComputeMarker(Code* code) {
|
| - switch (code->kind()) {
|
| - case Code::FUNCTION: return code->optimizable() ? "~" : "";
|
| - case Code::OPTIMIZED_FUNCTION: return "*";
|
| - default: return "";
|
| - }
|
| -}
|
| -
|
| -
|
| -void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| - Code* code,
|
| - SharedFunctionInfo* shared,
|
| - CompilationInfo* info,
|
| - Name* name) {
|
| - name_buffer_.Init(tag);
|
| - name_buffer_.AppendBytes(ComputeMarker(code));
|
| - name_buffer_.AppendName(name);
|
| - LogRecordedBuffer(code, shared, &name_buffer_);
|
| -}
|
| -
|
| -
|
| void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| Code* code,
|
| SharedFunctionInfo* shared,
|
| @@ -1216,28 +1343,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| // Although, it is possible to extract source and line from
|
| // the SharedFunctionInfo object, we left it to caller
|
| // to leave logging functions free from heap allocations.
|
| -void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| - Code* code,
|
| - SharedFunctionInfo* shared,
|
| - CompilationInfo* info,
|
| - Name* source, int line) {
|
| - name_buffer_.Init(tag);
|
| - name_buffer_.AppendBytes(ComputeMarker(code));
|
| - name_buffer_.AppendString(shared->DebugName());
|
| - name_buffer_.AppendByte(' ');
|
| - if (source->IsString()) {
|
| - name_buffer_.AppendString(String::cast(source));
|
| - } else {
|
| - name_buffer_.AppendBytes("symbol(hash ");
|
| - name_buffer_.AppendHex(Name::cast(source)->Hash());
|
| - name_buffer_.AppendByte(')');
|
| - }
|
| - name_buffer_.AppendByte(':');
|
| - name_buffer_.AppendInt(line);
|
| - LogRecordedBuffer(code, shared, &name_buffer_);
|
| -}
|
| -
|
| -
|
| void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| Code* code,
|
| SharedFunctionInfo* shared,
|
| @@ -1270,15 +1375,6 @@ void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| }
|
|
|
|
|
| -void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
|
| - Code* code,
|
| - int args_count) {
|
| - name_buffer_.Init(tag);
|
| - name_buffer_.AppendInt(args_count);
|
| - LogRecordedBuffer(code, NULL, &name_buffer_);
|
| -}
|
| -
|
| -
|
| void Logger::CodeCreateEvent(LogEventsAndTags tag,
|
| Code* code,
|
| int args_count) {
|
| @@ -1304,13 +1400,6 @@ void Logger::CodeMovingGCEvent() {
|
| }
|
|
|
|
|
| -void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) {
|
| - name_buffer_.Init(Logger::REG_EXP_TAG);
|
| - name_buffer_.AppendString(source);
|
| - LogRecordedBuffer(code, NULL, &name_buffer_);
|
| -}
|
| -
|
| -
|
| void Logger::RegExpCodeCreateEvent(Code* code, String* source) {
|
| if (!is_logging_code_events()) return;
|
|
|
| @@ -1343,7 +1432,13 @@ void Logger::CodeDeleteEvent(Address from) {
|
| if (!log_->IsEnabled()) return;
|
| LL_LOG(CodeDeleteEvent(from));
|
| CODE_ADDRESS_MAP_LOG(CodeDeleteEvent(from));
|
| - DeleteEventInternal(CODE_DELETE_EVENT, from);
|
| +
|
| + if (!log_->IsEnabled() || !FLAG_log_code) return;
|
| + Log::MessageBuilder msg(log_);
|
| + msg.Append("%s,", kLogEventsNames[CODE_DELETE_EVENT]);
|
| + msg.AppendAddress(from);
|
| + msg.Append('\n');
|
| + msg.WriteToLogFile();
|
| }
|
|
|
|
|
| @@ -1421,16 +1516,6 @@ void Logger::MoveEventInternal(LogEventsAndTags event,
|
| }
|
|
|
|
|
| -void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) {
|
| - if (!log_->IsEnabled() || !FLAG_log_code) return;
|
| - Log::MessageBuilder msg(log_);
|
| - msg.Append("%s,", kLogEventsNames[event]);
|
| - msg.AppendAddress(from);
|
| - msg.Append('\n');
|
| - msg.WriteToLogFile();
|
| -}
|
| -
|
| -
|
| void Logger::ResourceEvent(const char* name, const char* tag) {
|
| if (!log_->IsEnabled() || !FLAG_log) return;
|
| Log::MessageBuilder msg(log_);
|
| @@ -1720,95 +1805,6 @@ void Logger::LogCodeObject(Object* object) {
|
| }
|
|
|
|
|
| -LowLevelLogger::LowLevelLogger(const char* name)
|
| - : ll_output_handle_(NULL) {
|
| - // Open the low-level log file.
|
| - size_t len = strlen(name);
|
| - ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLogExt)));
|
| - OS::MemCopy(ll_name.start(), name, len);
|
| - OS::MemCopy(ll_name.start() + len, kLogExt, sizeof(kLogExt));
|
| - ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode);
|
| - setvbuf(ll_output_handle_, NULL, _IOFBF, kLogBufferSize);
|
| -
|
| - LogCodeInfo();
|
| -}
|
| -
|
| -
|
| -LowLevelLogger::~LowLevelLogger() {
|
| - fclose(ll_output_handle_);
|
| - ll_output_handle_ = NULL;
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::LogCodeInfo() {
|
| -#if V8_TARGET_ARCH_IA32
|
| - const char arch[] = "ia32";
|
| -#elif V8_TARGET_ARCH_X64
|
| - const char arch[] = "x64";
|
| -#elif V8_TARGET_ARCH_ARM
|
| - const char arch[] = "arm";
|
| -#elif V8_TARGET_ARCH_MIPS
|
| - const char arch[] = "mips";
|
| -#else
|
| - const char arch[] = "unknown";
|
| -#endif
|
| - LogWriteBytes(arch, sizeof(arch));
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::LogRecordedBuffer(Code* code,
|
| - SharedFunctionInfo*,
|
| - NameBuffer* name_buffer) {
|
| - CodeCreateStruct event;
|
| - event.name_size = name_buffer->size();
|
| - event.code_address = code->instruction_start();
|
| - ASSERT(event.code_address == code->address() + Code::kHeaderSize);
|
| - event.code_size = code->instruction_size();
|
| - LogWriteStruct(event);
|
| - LogWriteBytes(name_buffer->get(), name_buffer->size());
|
| - LogWriteBytes(
|
| - reinterpret_cast<const char*>(code->instruction_start()),
|
| - code->instruction_size());
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::CodeMoveEvent(Address from, Address to) {
|
| - CodeMoveStruct event;
|
| - event.from_address = from + Code::kHeaderSize;
|
| - event.to_address = to + Code::kHeaderSize;
|
| - LogWriteStruct(event);
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::CodeDeleteEvent(Address from) {
|
| - CodeDeleteStruct event;
|
| - event.address = from + Code::kHeaderSize;
|
| - LogWriteStruct(event);
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::SnapshotPositionEvent(Address addr, int pos) {
|
| - SnapshotPositionStruct event;
|
| - event.address = addr + Code::kHeaderSize;
|
| - event.position = pos;
|
| - LogWriteStruct(event);
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::LogWriteBytes(const char* bytes, int size) {
|
| - size_t rv = fwrite(bytes, 1, size, ll_output_handle_);
|
| - ASSERT(static_cast<size_t>(size) == rv);
|
| - USE(rv);
|
| -}
|
| -
|
| -
|
| -void LowLevelLogger::CodeMovingGCEvent() {
|
| - const char tag = kCodeMovingGCTag;
|
| -
|
| - LogWriteBytes(&tag, sizeof(tag));
|
| -}
|
| -
|
| -
|
| void Logger::LogCodeObjects() {
|
| Heap* heap = isolate_->heap();
|
| heap->CollectAllGarbage(Heap::kMakeHeapIterableMask,
|
|
|