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

Side by Side Diff: src/log.cc

Issue 19724007: Logger: introduce abstract interface for CodeEvent listeners. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: comments addressed. rebaselined. Created 7 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « src/log.h ('k') | src/serialize.h » ('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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 namespace internal { 47 namespace internal {
48 48
49 49
50 #define DECLARE_EVENT(ignore1, name) name, 50 #define DECLARE_EVENT(ignore1, name) name,
51 static const char* const kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = { 51 static const char* const kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = {
52 LOG_EVENTS_AND_TAGS_LIST(DECLARE_EVENT) 52 LOG_EVENTS_AND_TAGS_LIST(DECLARE_EVENT)
53 }; 53 };
54 #undef DECLARE_EVENT 54 #undef DECLARE_EVENT
55 55
56 56
57 #define CALL_LISTENERS(Call) \
58 for (int i = 0; i < listeners_.length(); ++i) { \
59 listeners_[i]->Call; \
60 }
61
57 #define PROFILER_LOG(Call) \ 62 #define PROFILER_LOG(Call) \
58 do { \ 63 do { \
59 CpuProfiler* cpu_profiler = isolate_->cpu_profiler(); \ 64 CpuProfiler* cpu_profiler = isolate_->cpu_profiler(); \
60 if (cpu_profiler->is_profiling()) { \ 65 if (cpu_profiler->is_profiling()) { \
61 cpu_profiler->Call; \ 66 cpu_profiler->Call; \
62 } \ 67 } \
63 } while (false); 68 } while (false);
64 69
65 // ComputeMarker must only be used when SharedFunctionInfo is known. 70 // ComputeMarker must only be used when SharedFunctionInfo is known.
66 static const char* ComputeMarker(Code* code) { 71 static const char* ComputeMarker(Code* code) {
67 switch (code->kind()) { 72 switch (code->kind()) {
68 case Code::FUNCTION: return code->optimizable() ? "~" : ""; 73 case Code::FUNCTION: return code->optimizable() ? "~" : "";
69 case Code::OPTIMIZED_FUNCTION: return "*"; 74 case Code::OPTIMIZED_FUNCTION: return "*";
70 default: return ""; 75 default: return "";
71 } 76 }
72 } 77 }
73 78
74 79
75 class CodeEventLogger { 80 class CodeEventLogger::NameBuffer {
76 public: 81 public:
77 virtual ~CodeEventLogger() { } 82 NameBuffer() { Reset(); }
78 83
79 void CodeCreateEvent(Logger::LogEventsAndTags tag, 84 void Reset() {
80 Code* code, 85 utf8_pos_ = 0;
81 const char* comment); 86 }
82 void CodeCreateEvent(Logger::LogEventsAndTags tag,
83 Code* code,
84 Name* name);
85 void CodeCreateEvent(Logger::LogEventsAndTags tag,
86 Code* code,
87 int args_count);
88 void CodeCreateEvent(Logger::LogEventsAndTags tag,
89 Code* code,
90 SharedFunctionInfo* shared,
91 CompilationInfo* info,
92 Name* name);
93 void CodeCreateEvent(Logger::LogEventsAndTags tag,
94 Code* code,
95 SharedFunctionInfo* shared,
96 CompilationInfo* info,
97 Name* source,
98 int line);
99 void RegExpCodeCreateEvent(Code* code, String* source);
100 87
101 protected: 88 void Init(Logger::LogEventsAndTags tag) {
102 class NameBuffer { 89 Reset();
103 public: 90 AppendBytes(kLogEventsNames[tag]);
104 NameBuffer() { Reset(); } 91 AppendByte(':');
92 }
105 93
106 void Reset() { 94 void AppendName(Name* name) {
107 utf8_pos_ = 0; 95 if (name->IsString()) {
96 AppendString(String::cast(name));
97 } else {
98 Symbol* symbol = Symbol::cast(name);
99 AppendBytes("symbol(");
100 if (!symbol->name()->IsUndefined()) {
101 AppendBytes("\"");
102 AppendString(String::cast(symbol->name()));
103 AppendBytes("\" ");
104 }
105 AppendBytes("hash ");
106 AppendHex(symbol->Hash());
107 AppendByte(')');
108 } 108 }
109 }
109 110
110 void Init(Logger::LogEventsAndTags tag) { 111 void AppendString(String* str) {
111 Reset(); 112 if (str == NULL) return;
112 AppendBytes(kLogEventsNames[tag]); 113 int uc16_length = Min(str->length(), kUtf16BufferSize);
113 AppendByte(':'); 114 String::WriteToFlat(str, utf16_buffer, 0, uc16_length);
115 int previous = unibrow::Utf16::kNoPreviousCharacter;
116 for (int i = 0; i < uc16_length && utf8_pos_ < kUtf8BufferSize; ++i) {
117 uc16 c = utf16_buffer[i];
118 if (c <= unibrow::Utf8::kMaxOneByteChar) {
119 utf8_buffer_[utf8_pos_++] = static_cast<char>(c);
120 } else {
121 int char_length = unibrow::Utf8::Length(c, previous);
122 if (utf8_pos_ + char_length > kUtf8BufferSize) break;
123 unibrow::Utf8::Encode(utf8_buffer_ + utf8_pos_, c, previous);
124 utf8_pos_ += char_length;
125 }
126 previous = c;
114 } 127 }
128 }
115 129
116 void AppendName(Name* name) { 130 void AppendBytes(const char* bytes, int size) {
117 if (name->IsString()) { 131 size = Min(size, kUtf8BufferSize - utf8_pos_);
118 AppendString(String::cast(name)); 132 OS::MemCopy(utf8_buffer_ + utf8_pos_, bytes, size);
119 } else { 133 utf8_pos_ += size;
120 Symbol* symbol = Symbol::cast(name); 134 }
121 AppendBytes("symbol(");
122 if (!symbol->name()->IsUndefined()) {
123 AppendBytes("\"");
124 AppendString(String::cast(symbol->name()));
125 AppendBytes("\" ");
126 }
127 AppendBytes("hash ");
128 AppendHex(symbol->Hash());
129 AppendByte(')');
130 }
131 }
132 135
133 void AppendString(String* str) { 136 void AppendBytes(const char* bytes) {
134 if (str == NULL) return; 137 AppendBytes(bytes, StrLength(bytes));
135 int uc16_length = Min(str->length(), kUtf16BufferSize); 138 }
136 String::WriteToFlat(str, utf16_buffer, 0, uc16_length);
137 int previous = unibrow::Utf16::kNoPreviousCharacter;
138 for (int i = 0; i < uc16_length && utf8_pos_ < kUtf8BufferSize; ++i) {
139 uc16 c = utf16_buffer[i];
140 if (c <= unibrow::Utf8::kMaxOneByteChar) {
141 utf8_buffer_[utf8_pos_++] = static_cast<char>(c);
142 } else {
143 int char_length = unibrow::Utf8::Length(c, previous);
144 if (utf8_pos_ + char_length > kUtf8BufferSize) break;
145 unibrow::Utf8::Encode(utf8_buffer_ + utf8_pos_, c, previous);
146 utf8_pos_ += char_length;
147 }
148 previous = c;
149 }
150 }
151 139
152 void AppendBytes(const char* bytes, int size) { 140 void AppendByte(char c) {
153 size = Min(size, kUtf8BufferSize - utf8_pos_); 141 if (utf8_pos_ >= kUtf8BufferSize) return;
154 OS::MemCopy(utf8_buffer_ + utf8_pos_, bytes, size); 142 utf8_buffer_[utf8_pos_++] = c;
143 }
144
145 void AppendInt(int n) {
146 Vector<char> buffer(utf8_buffer_ + utf8_pos_,
147 kUtf8BufferSize - utf8_pos_);
148 int size = OS::SNPrintF(buffer, "%d", n);
149 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
155 utf8_pos_ += size; 150 utf8_pos_ += size;
156 } 151 }
152 }
157 153
158 void AppendBytes(const char* bytes) { 154 void AppendHex(uint32_t n) {
159 AppendBytes(bytes, StrLength(bytes)); 155 Vector<char> buffer(utf8_buffer_ + utf8_pos_,
156 kUtf8BufferSize - utf8_pos_);
157 int size = OS::SNPrintF(buffer, "%x", n);
158 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
159 utf8_pos_ += size;
160 } 160 }
161 }
161 162
162 void AppendByte(char c) { 163 const char* get() { return utf8_buffer_; }
163 if (utf8_pos_ >= kUtf8BufferSize) return; 164 int size() const { return utf8_pos_; }
164 utf8_buffer_[utf8_pos_++] = c;
165 }
166
167 void AppendInt(int n) {
168 Vector<char> buffer(utf8_buffer_ + utf8_pos_,
169 kUtf8BufferSize - utf8_pos_);
170 int size = OS::SNPrintF(buffer, "%d", n);
171 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
172 utf8_pos_ += size;
173 }
174 }
175
176 void AppendHex(uint32_t n) {
177 Vector<char> buffer(utf8_buffer_ + utf8_pos_,
178 kUtf8BufferSize - utf8_pos_);
179 int size = OS::SNPrintF(buffer, "%x", n);
180 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
181 utf8_pos_ += size;
182 }
183 }
184
185 const char* get() { return utf8_buffer_; }
186 int size() const { return utf8_pos_; }
187
188 private:
189 static const int kUtf8BufferSize = 512;
190 static const int kUtf16BufferSize = 128;
191
192 int utf8_pos_;
193 char utf8_buffer_[kUtf8BufferSize];
194 uc16 utf16_buffer[kUtf16BufferSize];
195 };
196 165
197 private: 166 private:
198 virtual void LogRecordedBuffer(Code* code, 167 static const int kUtf8BufferSize = 512;
199 SharedFunctionInfo* shared, 168 static const int kUtf16BufferSize = 128;
200 NameBuffer* name_buffer) = 0;
201 169
202 NameBuffer name_buffer_; 170 int utf8_pos_;
171 char utf8_buffer_[kUtf8BufferSize];
172 uc16 utf16_buffer[kUtf16BufferSize];
203 }; 173 };
204 174
205 175
176 CodeEventLogger::CodeEventLogger() : name_buffer_(new NameBuffer) { }
177
178 CodeEventLogger::~CodeEventLogger() { delete name_buffer_; }
179
180
206 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag, 181 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
207 Code* code, 182 Code* code,
208 const char* comment) { 183 const char* comment) {
209 name_buffer_.Init(tag); 184 name_buffer_->Init(tag);
210 name_buffer_.AppendBytes(comment); 185 name_buffer_->AppendBytes(comment);
211 LogRecordedBuffer(code, NULL, &name_buffer_); 186 LogRecordedBuffer(code, NULL, name_buffer_->get(), name_buffer_->size());
212 } 187 }
213 188
214 189
215 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag, 190 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
216 Code* code, 191 Code* code,
217 Name* name) { 192 Name* name) {
218 name_buffer_.Init(tag); 193 name_buffer_->Init(tag);
219 name_buffer_.AppendName(name); 194 name_buffer_->AppendName(name);
220 LogRecordedBuffer(code, NULL, &name_buffer_); 195 LogRecordedBuffer(code, NULL, name_buffer_->get(), name_buffer_->size());
221 } 196 }
222 197
223 198
224 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag, 199 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
225 Code* code, 200 Code* code,
226 SharedFunctionInfo* shared, 201 SharedFunctionInfo* shared,
227 CompilationInfo* info, 202 CompilationInfo* info,
228 Name* name) { 203 Name* name) {
229 name_buffer_.Init(tag); 204 name_buffer_->Init(tag);
230 name_buffer_.AppendBytes(ComputeMarker(code)); 205 name_buffer_->AppendBytes(ComputeMarker(code));
231 name_buffer_.AppendName(name); 206 name_buffer_->AppendName(name);
232 LogRecordedBuffer(code, shared, &name_buffer_); 207 LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
233 } 208 }
234 209
235 210
236 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag, 211 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
237 Code* code, 212 Code* code,
238 SharedFunctionInfo* shared, 213 SharedFunctionInfo* shared,
239 CompilationInfo* info, 214 CompilationInfo* info,
240 Name* source, int line) { 215 Name* source, int line) {
241 name_buffer_.Init(tag); 216 name_buffer_->Init(tag);
242 name_buffer_.AppendBytes(ComputeMarker(code)); 217 name_buffer_->AppendBytes(ComputeMarker(code));
243 name_buffer_.AppendString(shared->DebugName()); 218 name_buffer_->AppendString(shared->DebugName());
244 name_buffer_.AppendByte(' '); 219 name_buffer_->AppendByte(' ');
245 if (source->IsString()) { 220 if (source->IsString()) {
246 name_buffer_.AppendString(String::cast(source)); 221 name_buffer_->AppendString(String::cast(source));
247 } else { 222 } else {
248 name_buffer_.AppendBytes("symbol(hash "); 223 name_buffer_->AppendBytes("symbol(hash ");
249 name_buffer_.AppendHex(Name::cast(source)->Hash()); 224 name_buffer_->AppendHex(Name::cast(source)->Hash());
250 name_buffer_.AppendByte(')'); 225 name_buffer_->AppendByte(')');
251 } 226 }
252 name_buffer_.AppendByte(':'); 227 name_buffer_->AppendByte(':');
253 name_buffer_.AppendInt(line); 228 name_buffer_->AppendInt(line);
254 LogRecordedBuffer(code, shared, &name_buffer_); 229 LogRecordedBuffer(code, shared, name_buffer_->get(), name_buffer_->size());
255 } 230 }
256 231
257 232
258 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag, 233 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
259 Code* code, 234 Code* code,
260 int args_count) { 235 int args_count) {
261 name_buffer_.Init(tag); 236 name_buffer_->Init(tag);
262 name_buffer_.AppendInt(args_count); 237 name_buffer_->AppendInt(args_count);
263 LogRecordedBuffer(code, NULL, &name_buffer_); 238 LogRecordedBuffer(code, NULL, name_buffer_->get(), name_buffer_->size());
264 } 239 }
265 240
266 241
267 void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) { 242 void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) {
268 name_buffer_.Init(Logger::REG_EXP_TAG); 243 name_buffer_->Init(Logger::REG_EXP_TAG);
269 name_buffer_.AppendString(source); 244 name_buffer_->AppendString(source);
270 LogRecordedBuffer(code, NULL, &name_buffer_); 245 LogRecordedBuffer(code, NULL, name_buffer_->get(), name_buffer_->size());
271 } 246 }
272 247
273 248
274 // Low-level logging support. 249 // Low-level logging support.
250 #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call;
251
275 class LowLevelLogger : public CodeEventLogger { 252 class LowLevelLogger : public CodeEventLogger {
276 public: 253 public:
277 explicit LowLevelLogger(const char* file_name); 254 explicit LowLevelLogger(const char* file_name);
278 virtual ~LowLevelLogger(); 255 virtual ~LowLevelLogger();
279 256
280 void CodeMoveEvent(Address from, Address to); 257 virtual void CodeMoveEvent(Address from, Address to);
281 void CodeDeleteEvent(Address from); 258 virtual void CodeDeleteEvent(Address from);
282 void SnapshotPositionEvent(Address addr, int pos); 259 virtual void SnapshotPositionEvent(Address addr, int pos);
283 void CodeMovingGCEvent(); 260 virtual void CodeMovingGCEvent();
284 261
285 private: 262 private:
286 virtual void LogRecordedBuffer(Code* code, 263 virtual void LogRecordedBuffer(Code* code,
287 SharedFunctionInfo* shared, 264 SharedFunctionInfo* shared,
288 NameBuffer* name_buffer); 265 const char* name,
266 int length);
289 267
290 // Low-level profiling event structures. 268 // Low-level profiling event structures.
291 struct CodeCreateStruct { 269 struct CodeCreateStruct {
292 static const char kTag = 'C'; 270 static const char kTag = 'C';
293 271
294 int32_t name_size; 272 int32_t name_size;
295 Address code_address; 273 Address code_address;
296 int32_t code_size; 274 int32_t code_size;
297 }; 275 };
298 276
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 const char arch[] = "mips"; 354 const char arch[] = "mips";
377 #else 355 #else
378 const char arch[] = "unknown"; 356 const char arch[] = "unknown";
379 #endif 357 #endif
380 LogWriteBytes(arch, sizeof(arch)); 358 LogWriteBytes(arch, sizeof(arch));
381 } 359 }
382 360
383 361
384 void LowLevelLogger::LogRecordedBuffer(Code* code, 362 void LowLevelLogger::LogRecordedBuffer(Code* code,
385 SharedFunctionInfo*, 363 SharedFunctionInfo*,
386 NameBuffer* name_buffer) { 364 const char* name,
365 int length) {
387 CodeCreateStruct event; 366 CodeCreateStruct event;
388 event.name_size = name_buffer->size(); 367 event.name_size = length;
389 event.code_address = code->instruction_start(); 368 event.code_address = code->instruction_start();
390 ASSERT(event.code_address == code->address() + Code::kHeaderSize); 369 ASSERT(event.code_address == code->address() + Code::kHeaderSize);
391 event.code_size = code->instruction_size(); 370 event.code_size = code->instruction_size();
392 LogWriteStruct(event); 371 LogWriteStruct(event);
393 LogWriteBytes(name_buffer->get(), name_buffer->size()); 372 LogWriteBytes(name, length);
394 LogWriteBytes( 373 LogWriteBytes(
395 reinterpret_cast<const char*>(code->instruction_start()), 374 reinterpret_cast<const char*>(code->instruction_start()),
396 code->instruction_size()); 375 code->instruction_size());
397 } 376 }
398 377
399 378
400 void LowLevelLogger::CodeMoveEvent(Address from, Address to) { 379 void LowLevelLogger::CodeMoveEvent(Address from, Address to) {
401 CodeMoveStruct event; 380 CodeMoveStruct event;
402 event.from_address = from + Code::kHeaderSize; 381 event.from_address = from + Code::kHeaderSize;
403 event.to_address = to + Code::kHeaderSize; 382 event.to_address = to + Code::kHeaderSize;
(...skipping 23 matching lines...) Expand all
427 } 406 }
428 407
429 408
430 void LowLevelLogger::CodeMovingGCEvent() { 409 void LowLevelLogger::CodeMovingGCEvent() {
431 const char tag = kCodeMovingGCTag; 410 const char tag = kCodeMovingGCTag;
432 411
433 LogWriteBytes(&tag, sizeof(tag)); 412 LogWriteBytes(&tag, sizeof(tag));
434 } 413 }
435 414
436 415
437 #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call; 416 #define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
438
439
440 class CodeAddressMap: public CodeEventLogger {
441 public:
442 CodeAddressMap() { }
443 virtual ~CodeAddressMap() { }
444
445 void CodeMoveEvent(Address from, Address to) {
446 address_to_name_map_.Move(from, to);
447 }
448
449 void CodeDeleteEvent(Address from) {
450 address_to_name_map_.Remove(from);
451 }
452
453 const char* Lookup(Address address) {
454 return address_to_name_map_.Lookup(address);
455 }
456
457 private:
458 class NameMap {
459 public:
460 NameMap() : impl_(&PointerEquals) {}
461
462 ~NameMap() {
463 for (HashMap::Entry* p = impl_.Start(); p != NULL; p = impl_.Next(p)) {
464 DeleteArray(static_cast<const char*>(p->value));
465 }
466 }
467
468 void Insert(Address code_address, const char* name, int name_size) {
469 HashMap::Entry* entry = FindOrCreateEntry(code_address);
470 if (entry->value == NULL) {
471 entry->value = CopyName(name, name_size);
472 }
473 }
474
475 const char* Lookup(Address code_address) {
476 HashMap::Entry* entry = FindEntry(code_address);
477 return (entry != NULL) ? static_cast<const char*>(entry->value) : NULL;
478 }
479
480 void Remove(Address code_address) {
481 HashMap::Entry* entry = FindEntry(code_address);
482 if (entry != NULL) {
483 DeleteArray(static_cast<char*>(entry->value));
484 RemoveEntry(entry);
485 }
486 }
487
488 void Move(Address from, Address to) {
489 if (from == to) return;
490 HashMap::Entry* from_entry = FindEntry(from);
491 ASSERT(from_entry != NULL);
492 void* value = from_entry->value;
493 RemoveEntry(from_entry);
494 HashMap::Entry* to_entry = FindOrCreateEntry(to);
495 ASSERT(to_entry->value == NULL);
496 to_entry->value = value;
497 }
498
499 private:
500 static bool PointerEquals(void* lhs, void* rhs) {
501 return lhs == rhs;
502 }
503
504 static char* CopyName(const char* name, int name_size) {
505 char* result = NewArray<char>(name_size + 1);
506 for (int i = 0; i < name_size; ++i) {
507 char c = name[i];
508 if (c == '\0') c = ' ';
509 result[i] = c;
510 }
511 result[name_size] = '\0';
512 return result;
513 }
514
515 HashMap::Entry* FindOrCreateEntry(Address code_address) {
516 return impl_.Lookup(code_address, ComputePointerHash(code_address), true);
517 }
518
519 HashMap::Entry* FindEntry(Address code_address) {
520 return impl_.Lookup(code_address,
521 ComputePointerHash(code_address),
522 false);
523 }
524
525 void RemoveEntry(HashMap::Entry* entry) {
526 impl_.Remove(entry->key, entry->hash);
527 }
528
529 HashMap impl_;
530
531 DISALLOW_COPY_AND_ASSIGN(NameMap);
532 };
533
534 virtual void LogRecordedBuffer(Code* code,
535 SharedFunctionInfo*,
536 NameBuffer* name_buffer) {
537 address_to_name_map_.Insert(code->address(),
538 name_buffer->get(),
539 name_buffer->size());
540 }
541
542 NameMap address_to_name_map_;
543 };
544
545
546 #define CODE_ADDRESS_MAP_LOG(Call)\
547 if (Serializer::enabled()) code_address_map_->Call;
548 417
549 418
550 class JitLogger : public CodeEventLogger { 419 class JitLogger : public CodeEventLogger {
551 public: 420 public:
552 explicit JitLogger(JitCodeEventHandler code_event_handler); 421 explicit JitLogger(JitCodeEventHandler code_event_handler);
553 422
554 void CodeMoveEvent(Address from, Address to); 423 virtual void CodeMoveEvent(Address from, Address to);
555 void CodeDeleteEvent(Address from); 424 virtual void CodeDeleteEvent(Address from);
556 void AddCodeLinePosInfoEvent( 425 virtual void AddCodeLinePosInfoEvent(
557 void* jit_handler_data, 426 void* jit_handler_data,
558 int pc_offset, 427 int pc_offset,
559 int position, 428 int position,
560 JitCodeEvent::PositionType position_type); 429 JitCodeEvent::PositionType position_type);
430
561 void* StartCodePosInfoEvent(); 431 void* StartCodePosInfoEvent();
562 void EndCodePosInfoEvent(Code* code, void* jit_handler_data); 432 void EndCodePosInfoEvent(Code* code, void* jit_handler_data);
563 433
564 private: 434 private:
565 virtual void LogRecordedBuffer(Code* code, 435 virtual void LogRecordedBuffer(Code* code,
566 SharedFunctionInfo* shared, 436 SharedFunctionInfo* shared,
567 CodeEventLogger::NameBuffer* name_buffer); 437 const char* name,
438 int length);
568 439
569 JitCodeEventHandler code_event_handler_; 440 JitCodeEventHandler code_event_handler_;
570 }; 441 };
571 442
572 #define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
573
574 443
575 JitLogger::JitLogger(JitCodeEventHandler code_event_handler) 444 JitLogger::JitLogger(JitCodeEventHandler code_event_handler)
576 : code_event_handler_(code_event_handler) { 445 : code_event_handler_(code_event_handler) {
577 } 446 }
578 447
579 448
580 void JitLogger::LogRecordedBuffer(Code* code, 449 void JitLogger::LogRecordedBuffer(Code* code,
581 SharedFunctionInfo* shared, 450 SharedFunctionInfo* shared,
582 CodeEventLogger::NameBuffer* name_buffer) { 451 const char* name,
452 int length) {
583 JitCodeEvent event; 453 JitCodeEvent event;
584 memset(&event, 0, sizeof(event)); 454 memset(&event, 0, sizeof(event));
585 event.type = JitCodeEvent::CODE_ADDED; 455 event.type = JitCodeEvent::CODE_ADDED;
586 event.code_start = code->instruction_start(); 456 event.code_start = code->instruction_start();
587 event.code_len = code->instruction_size(); 457 event.code_len = code->instruction_size();
588 Handle<Script> script_handle; 458 Handle<Script> script_handle;
589 if (shared && shared->script()->IsScript()) { 459 if (shared && shared->script()->IsScript()) {
590 script_handle = Handle<Script>(Script::cast(shared->script())); 460 script_handle = Handle<Script>(Script::cast(shared->script()));
591 } 461 }
592 event.script = ToApiHandle<v8::Script>(script_handle); 462 event.script = ToApiHandle<v8::Script>(script_handle);
593 event.name.str = name_buffer->get(); 463 event.name.str = name;
594 event.name.len = name_buffer->size(); 464 event.name.len = length;
595 code_event_handler_(&event); 465 code_event_handler_(&event);
596 } 466 }
597 467
598 468
599 void JitLogger::CodeMoveEvent(Address from, Address to) { 469 void JitLogger::CodeMoveEvent(Address from, Address to) {
600 Code* from_code = Code::cast(HeapObject::FromAddress(from)); 470 Code* from_code = Code::cast(HeapObject::FromAddress(from));
601 471
602 JitCodeEvent event; 472 JitCodeEvent event;
603 event.type = JitCodeEvent::CODE_MOVED; 473 event.type = JitCodeEvent::CODE_MOVED;
604 event.code_start = from_code->instruction_start(); 474 event.code_start = from_code->instruction_start();
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 Logger::Logger(Isolate* isolate) 707 Logger::Logger(Isolate* isolate)
838 : isolate_(isolate), 708 : isolate_(isolate),
839 ticker_(NULL), 709 ticker_(NULL),
840 profiler_(NULL), 710 profiler_(NULL),
841 log_events_(NULL), 711 log_events_(NULL),
842 logging_nesting_(0), 712 logging_nesting_(0),
843 cpu_profiler_nesting_(0), 713 cpu_profiler_nesting_(0),
844 log_(new Log(this)), 714 log_(new Log(this)),
845 ll_logger_(NULL), 715 ll_logger_(NULL),
846 jit_logger_(NULL), 716 jit_logger_(NULL),
847 code_address_map_(new CodeAddressMap), 717 listeners_(5),
848 is_initialized_(false), 718 is_initialized_(false),
849 last_address_(NULL), 719 last_address_(NULL),
850 prev_sp_(NULL), 720 prev_sp_(NULL),
851 prev_function_(NULL), 721 prev_function_(NULL),
852 prev_to_(NULL), 722 prev_to_(NULL),
853 prev_code_(NULL), 723 prev_code_(NULL),
854 epoch_(0) { 724 epoch_(0) {
855 } 725 }
856 726
857 727
858 Logger::~Logger() { 728 Logger::~Logger() {
859 delete code_address_map_;
860 delete log_; 729 delete log_;
861 } 730 }
862 731
863 732
733 void Logger::addCodeEventListener(CodeEventListener* listener) {
734 ASSERT(!hasCodeEventListener(listener));
735 listeners_.Add(listener);
736 }
737
738
739 void Logger::removeCodeEventListener(CodeEventListener* listener) {
740 ASSERT(hasCodeEventListener(listener));
741 listeners_.RemoveElement(listener);
742 }
743
744
745 bool Logger::hasCodeEventListener(CodeEventListener* listener) {
746 return listeners_.Contains(listener);
747 }
748
749
864 void Logger::ProfilerBeginEvent() { 750 void Logger::ProfilerBeginEvent() {
865 if (!log_->IsEnabled()) return; 751 if (!log_->IsEnabled()) return;
866 Log::MessageBuilder msg(log_); 752 Log::MessageBuilder msg(log_);
867 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); 753 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs);
868 msg.WriteToLogFile(); 754 msg.WriteToLogFile();
869 } 755 }
870 756
871 757
872 void Logger::StringEvent(const char* name, const char* value) { 758 void Logger::StringEvent(const char* name, const char* value) {
873 if (FLAG_log) UncheckedStringEvent(name, value); 759 if (FLAG_log) UncheckedStringEvent(name, value);
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 msg->Append(",%d,", code->ExecutableSize()); 1158 msg->Append(",%d,", code->ExecutableSize());
1273 } 1159 }
1274 1160
1275 1161
1276 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1162 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1277 Code* code, 1163 Code* code,
1278 const char* comment) { 1164 const char* comment) {
1279 PROFILER_LOG(CodeCreateEvent(tag, code, comment)); 1165 PROFILER_LOG(CodeCreateEvent(tag, code, comment));
1280 1166
1281 if (!is_logging_code_events()) return; 1167 if (!is_logging_code_events()) return;
1282 JIT_LOG(CodeCreateEvent(tag, code, comment)); 1168 CALL_LISTENERS(CodeCreateEvent(tag, code, comment));
1283 LL_LOG(CodeCreateEvent(tag, code, comment));
1284 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, comment));
1285 1169
1286 if (!FLAG_log_code || !log_->IsEnabled()) return; 1170 if (!FLAG_log_code || !log_->IsEnabled()) return;
1287 Log::MessageBuilder msg(log_); 1171 Log::MessageBuilder msg(log_);
1288 AppendCodeCreateHeader(&msg, tag, code); 1172 AppendCodeCreateHeader(&msg, tag, code);
1289 msg.AppendDoubleQuotedString(comment); 1173 msg.AppendDoubleQuotedString(comment);
1290 msg.Append('\n'); 1174 msg.Append('\n');
1291 msg.WriteToLogFile(); 1175 msg.WriteToLogFile();
1292 } 1176 }
1293 1177
1294 1178
1295 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1179 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1296 Code* code, 1180 Code* code,
1297 Name* name) { 1181 Name* name) {
1298 PROFILER_LOG(CodeCreateEvent(tag, code, name)); 1182 PROFILER_LOG(CodeCreateEvent(tag, code, name));
1299 1183
1300 if (!is_logging_code_events()) return; 1184 if (!is_logging_code_events()) return;
1301 JIT_LOG(CodeCreateEvent(tag, code, name)); 1185 CALL_LISTENERS(CodeCreateEvent(tag, code, name));
1302 LL_LOG(CodeCreateEvent(tag, code, name));
1303 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, name));
1304 1186
1305 if (!FLAG_log_code || !log_->IsEnabled()) return; 1187 if (!FLAG_log_code || !log_->IsEnabled()) return;
1306 Log::MessageBuilder msg(log_); 1188 Log::MessageBuilder msg(log_);
1307 AppendCodeCreateHeader(&msg, tag, code); 1189 AppendCodeCreateHeader(&msg, tag, code);
1308 if (name->IsString()) { 1190 if (name->IsString()) {
1309 msg.Append('"'); 1191 msg.Append('"');
1310 msg.AppendDetailed(String::cast(name), false); 1192 msg.AppendDetailed(String::cast(name), false);
1311 msg.Append('"'); 1193 msg.Append('"');
1312 } else { 1194 } else {
1313 msg.AppendSymbolName(Symbol::cast(name)); 1195 msg.AppendSymbolName(Symbol::cast(name));
1314 } 1196 }
1315 msg.Append('\n'); 1197 msg.Append('\n');
1316 msg.WriteToLogFile(); 1198 msg.WriteToLogFile();
1317 } 1199 }
1318 1200
1319 1201
1320 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1202 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1321 Code* code, 1203 Code* code,
1322 SharedFunctionInfo* shared, 1204 SharedFunctionInfo* shared,
1323 CompilationInfo* info, 1205 CompilationInfo* info,
1324 Name* name) { 1206 Name* name) {
1325 PROFILER_LOG(CodeCreateEvent(tag, code, shared, info, name)); 1207 PROFILER_LOG(CodeCreateEvent(tag, code, shared, info, name));
1326 1208
1327 if (!is_logging_code_events()) return; 1209 if (!is_logging_code_events()) return;
1328 JIT_LOG(CodeCreateEvent(tag, code, shared, info, name)); 1210 CALL_LISTENERS(CodeCreateEvent(tag, code, shared, info, name));
1329 LL_LOG(CodeCreateEvent(tag, code, shared, info, name));
1330 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, shared, info, name));
1331 1211
1332 if (!FLAG_log_code || !log_->IsEnabled()) return; 1212 if (!FLAG_log_code || !log_->IsEnabled()) return;
1333 if (code == isolate_->builtins()->builtin( 1213 if (code == isolate_->builtins()->builtin(
1334 Builtins::kLazyCompile)) 1214 Builtins::kLazyCompile))
1335 return; 1215 return;
1336 1216
1337 Log::MessageBuilder msg(log_); 1217 Log::MessageBuilder msg(log_);
1338 AppendCodeCreateHeader(&msg, tag, code); 1218 AppendCodeCreateHeader(&msg, tag, code);
1339 if (name->IsString()) { 1219 if (name->IsString()) {
1340 SmartArrayPointer<char> str = 1220 SmartArrayPointer<char> str =
(...skipping 14 matching lines...) Expand all
1355 // the SharedFunctionInfo object, we left it to caller 1235 // the SharedFunctionInfo object, we left it to caller
1356 // to leave logging functions free from heap allocations. 1236 // to leave logging functions free from heap allocations.
1357 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1237 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1358 Code* code, 1238 Code* code,
1359 SharedFunctionInfo* shared, 1239 SharedFunctionInfo* shared,
1360 CompilationInfo* info, 1240 CompilationInfo* info,
1361 Name* source, int line) { 1241 Name* source, int line) {
1362 PROFILER_LOG(CodeCreateEvent(tag, code, shared, info, source, line)); 1242 PROFILER_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1363 1243
1364 if (!is_logging_code_events()) return; 1244 if (!is_logging_code_events()) return;
1365 JIT_LOG(CodeCreateEvent(tag, code, shared, info, source, line)); 1245 CALL_LISTENERS(CodeCreateEvent(tag, code, shared, info, source, line));
1366 LL_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1367 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1368 1246
1369 if (!FLAG_log_code || !log_->IsEnabled()) return; 1247 if (!FLAG_log_code || !log_->IsEnabled()) return;
1370 Log::MessageBuilder msg(log_); 1248 Log::MessageBuilder msg(log_);
1371 AppendCodeCreateHeader(&msg, tag, code); 1249 AppendCodeCreateHeader(&msg, tag, code);
1372 SmartArrayPointer<char> name = 1250 SmartArrayPointer<char> name =
1373 shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 1251 shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
1374 msg.Append("\"%s ", *name); 1252 msg.Append("\"%s ", *name);
1375 if (source->IsString()) { 1253 if (source->IsString()) {
1376 SmartArrayPointer<char> sourcestr = 1254 SmartArrayPointer<char> sourcestr =
1377 String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 1255 String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
1378 msg.Append("%s", *sourcestr); 1256 msg.Append("%s", *sourcestr);
1379 } else { 1257 } else {
1380 msg.AppendSymbolName(Symbol::cast(source)); 1258 msg.AppendSymbolName(Symbol::cast(source));
1381 } 1259 }
1382 msg.Append(":%d\",", line); 1260 msg.Append(":%d\",", line);
1383 msg.AppendAddress(shared->address()); 1261 msg.AppendAddress(shared->address());
1384 msg.Append(",%s", ComputeMarker(code)); 1262 msg.Append(",%s", ComputeMarker(code));
1385 msg.Append('\n'); 1263 msg.Append('\n');
1386 msg.WriteToLogFile(); 1264 msg.WriteToLogFile();
1387 } 1265 }
1388 1266
1389 1267
1390 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1268 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1391 Code* code, 1269 Code* code,
1392 int args_count) { 1270 int args_count) {
1393 PROFILER_LOG(CodeCreateEvent(tag, code, args_count)); 1271 PROFILER_LOG(CodeCreateEvent(tag, code, args_count));
1394 1272
1395 if (!is_logging_code_events()) return; 1273 if (!is_logging_code_events()) return;
1396 JIT_LOG(CodeCreateEvent(tag, code, args_count)); 1274 CALL_LISTENERS(CodeCreateEvent(tag, code, args_count));
1397 LL_LOG(CodeCreateEvent(tag, code, args_count));
1398 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, args_count));
1399 1275
1400 if (!FLAG_log_code || !log_->IsEnabled()) return; 1276 if (!FLAG_log_code || !log_->IsEnabled()) return;
1401 Log::MessageBuilder msg(log_); 1277 Log::MessageBuilder msg(log_);
1402 AppendCodeCreateHeader(&msg, tag, code); 1278 AppendCodeCreateHeader(&msg, tag, code);
1403 msg.Append("\"args_count: %d\"", args_count); 1279 msg.Append("\"args_count: %d\"", args_count);
1404 msg.Append('\n'); 1280 msg.Append('\n');
1405 msg.WriteToLogFile(); 1281 msg.WriteToLogFile();
1406 } 1282 }
1407 1283
1408 1284
1409 void Logger::CodeMovingGCEvent() { 1285 void Logger::CodeMovingGCEvent() {
1410 PROFILER_LOG(CodeMovingGCEvent()); 1286 PROFILER_LOG(CodeMovingGCEvent());
1411 1287
1412 if (!is_logging_code_events()) return; 1288 if (!is_logging_code_events()) return;
1413 if (!log_->IsEnabled() || !FLAG_ll_prof) return; 1289 if (!log_->IsEnabled() || !FLAG_ll_prof) return;
1414 LL_LOG(CodeMovingGCEvent()); 1290 CALL_LISTENERS(CodeMovingGCEvent());
1415 OS::SignalCodeMovingGC(); 1291 OS::SignalCodeMovingGC();
1416 } 1292 }
1417 1293
1418 1294
1419 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { 1295 void Logger::RegExpCodeCreateEvent(Code* code, String* source) {
1420 PROFILER_LOG(RegExpCodeCreateEvent(code, source)); 1296 PROFILER_LOG(RegExpCodeCreateEvent(code, source));
1421 1297
1422 if (!is_logging_code_events()) return; 1298 if (!is_logging_code_events()) return;
1423 JIT_LOG(RegExpCodeCreateEvent(code, source)); 1299 CALL_LISTENERS(RegExpCodeCreateEvent(code, source));
1424 LL_LOG(RegExpCodeCreateEvent(code, source));
1425 CODE_ADDRESS_MAP_LOG(RegExpCodeCreateEvent(code, source));
1426 1300
1427 if (!FLAG_log_code || !log_->IsEnabled()) return; 1301 if (!FLAG_log_code || !log_->IsEnabled()) return;
1428 Log::MessageBuilder msg(log_); 1302 Log::MessageBuilder msg(log_);
1429 AppendCodeCreateHeader(&msg, REG_EXP_TAG, code); 1303 AppendCodeCreateHeader(&msg, REG_EXP_TAG, code);
1430 msg.Append('"'); 1304 msg.Append('"');
1431 msg.AppendDetailed(source, false); 1305 msg.AppendDetailed(source, false);
1432 msg.Append('"'); 1306 msg.Append('"');
1433 msg.Append('\n'); 1307 msg.Append('\n');
1434 msg.WriteToLogFile(); 1308 msg.WriteToLogFile();
1435 } 1309 }
1436 1310
1437 1311
1438 void Logger::CodeMoveEvent(Address from, Address to) { 1312 void Logger::CodeMoveEvent(Address from, Address to) {
1439 PROFILER_LOG(CodeMoveEvent(from, to)); 1313 PROFILER_LOG(CodeMoveEvent(from, to));
1440 1314
1441 if (!is_logging_code_events()) return; 1315 if (!is_logging_code_events()) return;
1442 JIT_LOG(CodeMoveEvent(from, to)); 1316 CALL_LISTENERS(CodeMoveEvent(from, to));
1443 LL_LOG(CodeMoveEvent(from, to));
1444 CODE_ADDRESS_MAP_LOG(CodeMoveEvent(from, to));
1445 MoveEventInternal(CODE_MOVE_EVENT, from, to); 1317 MoveEventInternal(CODE_MOVE_EVENT, from, to);
1446 } 1318 }
1447 1319
1448 1320
1449 void Logger::CodeDeleteEvent(Address from) { 1321 void Logger::CodeDeleteEvent(Address from) {
1450 PROFILER_LOG(CodeDeleteEvent(from)); 1322 PROFILER_LOG(CodeDeleteEvent(from));
1451 1323
1452 if (!is_logging_code_events()) return; 1324 if (!is_logging_code_events()) return;
1453 JIT_LOG(CodeDeleteEvent(from)); 1325 CALL_LISTENERS(CodeDeleteEvent(from));
1454 LL_LOG(CodeDeleteEvent(from));
1455 CODE_ADDRESS_MAP_LOG(CodeDeleteEvent(from));
1456 1326
1457 if (!FLAG_log_code || !log_->IsEnabled()) return; 1327 if (!FLAG_log_code || !log_->IsEnabled()) return;
1458 Log::MessageBuilder msg(log_); 1328 Log::MessageBuilder msg(log_);
1459 msg.Append("%s,", kLogEventsNames[CODE_DELETE_EVENT]); 1329 msg.Append("%s,", kLogEventsNames[CODE_DELETE_EVENT]);
1460 msg.AppendAddress(from); 1330 msg.AppendAddress(from);
1461 msg.Append('\n'); 1331 msg.Append('\n');
1462 msg.WriteToLogFile(); 1332 msg.WriteToLogFile();
1463 } 1333 }
1464 1334
1465 1335
(...skipping 23 matching lines...) Expand all
1489 } 1359 }
1490 } 1360 }
1491 1361
1492 1362
1493 void Logger::CodeEndLinePosInfoRecordEvent(Code* code, 1363 void Logger::CodeEndLinePosInfoRecordEvent(Code* code,
1494 void* jit_handler_data) { 1364 void* jit_handler_data) {
1495 JIT_LOG(EndCodePosInfoEvent(code, jit_handler_data)); 1365 JIT_LOG(EndCodePosInfoEvent(code, jit_handler_data));
1496 } 1366 }
1497 1367
1498 1368
1369 void Logger::CodeNameEvent(Address addr, int pos, const char* code_name) {
1370 if (code_name == NULL) return; // Not a code object.
1371 Log::MessageBuilder msg(log_);
1372 msg.Append("%s,%d,", kLogEventsNames[SNAPSHOT_CODE_NAME_EVENT], pos);
1373 msg.AppendDoubleQuotedString(code_name);
1374 msg.Append("\n");
1375 msg.WriteToLogFile();
1376 }
1377
1378
1499 void Logger::SnapshotPositionEvent(Address addr, int pos) { 1379 void Logger::SnapshotPositionEvent(Address addr, int pos) {
1500 if (!log_->IsEnabled()) return; 1380 if (!log_->IsEnabled()) return;
1501 LL_LOG(SnapshotPositionEvent(addr, pos)); 1381 LL_LOG(SnapshotPositionEvent(addr, pos));
1502 if (Serializer::enabled()) {
1503 const char* code_name = code_address_map_->Lookup(addr);
1504 if (code_name == NULL) return; // Not a code object.
1505 Log::MessageBuilder msg(log_);
1506 msg.Append("%s,%d,", kLogEventsNames[SNAPSHOT_CODE_NAME_EVENT], pos);
1507 msg.AppendDoubleQuotedString(code_name);
1508 msg.Append("\n");
1509 msg.WriteToLogFile();
1510 }
1511 if (!FLAG_log_snapshot_positions) return; 1382 if (!FLAG_log_snapshot_positions) return;
1512 Log::MessageBuilder msg(log_); 1383 Log::MessageBuilder msg(log_);
1513 msg.Append("%s,", kLogEventsNames[SNAPSHOT_POSITION_EVENT]); 1384 msg.Append("%s,", kLogEventsNames[SNAPSHOT_POSITION_EVENT]);
1514 msg.AppendAddress(addr); 1385 msg.AppendAddress(addr);
1515 msg.Append(",%d", pos); 1386 msg.Append(",%d", pos);
1516 msg.Append('\n'); 1387 msg.Append('\n');
1517 msg.WriteToLogFile(); 1388 msg.WriteToLogFile();
1518 } 1389 }
1519 1390
1520 1391
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
2003 FLAG_log_code = false; 1874 FLAG_log_code = false;
2004 FLAG_prof_auto = false; 1875 FLAG_prof_auto = false;
2005 } 1876 }
2006 1877
2007 SmartArrayPointer<const char> log_file_name = 1878 SmartArrayPointer<const char> log_file_name =
2008 PrepareLogFileName(FLAG_logfile); 1879 PrepareLogFileName(FLAG_logfile);
2009 log_->Initialize(*log_file_name); 1880 log_->Initialize(*log_file_name);
2010 1881
2011 if (FLAG_ll_prof) { 1882 if (FLAG_ll_prof) {
2012 ll_logger_ = new LowLevelLogger(*log_file_name); 1883 ll_logger_ = new LowLevelLogger(*log_file_name);
1884 addCodeEventListener(ll_logger_);
2013 } 1885 }
2014 1886
2015 ticker_ = new Ticker(isolate, kSamplingIntervalMs); 1887 ticker_ = new Ticker(isolate, kSamplingIntervalMs);
2016 1888
2017 if (Log::InitLogAtStart()) { 1889 if (Log::InitLogAtStart()) {
2018 logging_nesting_ = 1; 1890 logging_nesting_ = 1;
2019 } 1891 }
2020 1892
2021 if (FLAG_prof) { 1893 if (FLAG_prof) {
2022 profiler_ = new Profiler(isolate); 1894 profiler_ = new Profiler(isolate);
2023 if (!FLAG_prof_auto) { 1895 if (!FLAG_prof_auto) {
2024 profiler_->pause(); 1896 profiler_->pause();
2025 } else { 1897 } else {
2026 logging_nesting_ = 1; 1898 logging_nesting_ = 1;
2027 } 1899 }
2028 if (!FLAG_prof_lazy) { 1900 if (!FLAG_prof_lazy) {
2029 profiler_->Engage(); 1901 profiler_->Engage();
2030 } 1902 }
2031 } 1903 }
2032 1904
2033 if (FLAG_log_internal_timer_events || FLAG_prof) epoch_ = OS::Ticks(); 1905 if (FLAG_log_internal_timer_events || FLAG_prof) epoch_ = OS::Ticks();
2034 1906
2035 return true; 1907 return true;
2036 } 1908 }
2037 1909
2038 1910
2039 void Logger::SetCodeEventHandler(uint32_t options, 1911 void Logger::SetCodeEventHandler(uint32_t options,
2040 JitCodeEventHandler event_handler) { 1912 JitCodeEventHandler event_handler) {
2041 if (jit_logger_) { 1913 if (jit_logger_) {
1914 removeCodeEventListener(jit_logger_);
2042 delete jit_logger_; 1915 delete jit_logger_;
2043 jit_logger_ = NULL; 1916 jit_logger_ = NULL;
2044 } 1917 }
2045 1918
2046 if (event_handler) { 1919 if (event_handler) {
2047 jit_logger_ = new JitLogger(event_handler); 1920 jit_logger_ = new JitLogger(event_handler);
2048 } 1921 addCodeEventListener(jit_logger_);
2049 1922 if (options & kJitCodeEventEnumExisting) {
2050 if (jit_logger_ != NULL && (options & kJitCodeEventEnumExisting)) { 1923 HandleScope scope(isolate_);
2051 HandleScope scope(isolate_); 1924 LogCodeObjects();
2052 LogCodeObjects(); 1925 LogCompiledFunctions();
2053 LogCompiledFunctions(); 1926 }
2054 } 1927 }
2055 } 1928 }
2056 1929
2057 1930
2058 Sampler* Logger::sampler() { 1931 Sampler* Logger::sampler() {
2059 return ticker_; 1932 return ticker_;
2060 } 1933 }
2061 1934
2062 1935
2063 FILE* Logger::TearDown() { 1936 FILE* Logger::TearDown() {
2064 if (!is_initialized_) return NULL; 1937 if (!is_initialized_) return NULL;
2065 is_initialized_ = false; 1938 is_initialized_ = false;
2066 1939
2067 // Stop the profiler before closing the file. 1940 // Stop the profiler before closing the file.
2068 if (profiler_ != NULL) { 1941 if (profiler_ != NULL) {
2069 profiler_->Disengage(); 1942 profiler_->Disengage();
2070 delete profiler_; 1943 delete profiler_;
2071 profiler_ = NULL; 1944 profiler_ = NULL;
2072 } 1945 }
2073 1946
2074 delete ticker_; 1947 delete ticker_;
2075 ticker_ = NULL; 1948 ticker_ = NULL;
2076 1949
2077 if (ll_logger_) { 1950 if (ll_logger_) {
1951 removeCodeEventListener(ll_logger_);
2078 delete ll_logger_; 1952 delete ll_logger_;
2079 ll_logger_ = NULL; 1953 ll_logger_ = NULL;
2080 } 1954 }
2081 1955
2082 if (jit_logger_) { 1956 if (jit_logger_) {
1957 removeCodeEventListener(jit_logger_);
2083 delete jit_logger_; 1958 delete jit_logger_;
2084 jit_logger_ = NULL; 1959 jit_logger_ = NULL;
2085 } 1960 }
2086 1961
2087 return log_->Close(); 1962 return log_->Close();
2088 } 1963 }
2089 1964
2090 } } // namespace v8::internal 1965 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/log.h ('k') | src/serialize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698