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

Side by Side Diff: src/log.cc

Issue 19795002: Logger: extract CodeEventLogger classes. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: minor fixes 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') | no next file » | 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 29 matching lines...) Expand all
40 #include "platform.h" 40 #include "platform.h"
41 #include "runtime-profiler.h" 41 #include "runtime-profiler.h"
42 #include "serialize.h" 42 #include "serialize.h"
43 #include "string-stream.h" 43 #include "string-stream.h"
44 #include "vm-state-inl.h" 44 #include "vm-state-inl.h"
45 45
46 namespace v8 { 46 namespace v8 {
47 namespace internal { 47 namespace internal {
48 48
49 49
50 #define DECLARE_EVENT(ignore1, name) name,
51 static const char* const kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = {
52 LOG_EVENTS_AND_TAGS_LIST(DECLARE_EVENT)
53 };
54 #undef DECLARE_EVENT
55
56
57 class CodeEventLogger {
58 public:
59 virtual ~CodeEventLogger() { }
60
61 void CodeCreateEvent(Logger::LogEventsAndTags tag,
62 Code* code,
63 const char* comment);
64 void CodeCreateEvent(Logger::LogEventsAndTags tag,
65 Code* code,
66 Name* name);
67 void CodeCreateEvent(Logger::LogEventsAndTags tag,
68 Code* code,
69 int args_count);
70 void CodeCreateEvent(Logger::LogEventsAndTags tag,
71 Code* code,
72 SharedFunctionInfo* shared,
73 CompilationInfo* info,
74 Name* name);
75 void CodeCreateEvent(Logger::LogEventsAndTags tag,
76 Code* code,
77 SharedFunctionInfo* shared,
78 CompilationInfo* info,
79 Name* source,
80 int line);
81 void RegExpCodeCreateEvent(Code* code, String* source);
82
83 class NameBuffer {
yurys 2013/07/19 12:30:34 Should be protected in CodeEventLogger?
84 public:
85 NameBuffer() { Reset(); }
86
87 void Reset() {
88 utf8_pos_ = 0;
89 }
90
91 void Init(Logger::LogEventsAndTags tag) {
92 Reset();
93 AppendBytes(kLogEventsNames[tag]);
94 AppendByte(':');
95 }
96
97 void AppendName(Name* name) {
98 if (name->IsString()) {
99 AppendString(String::cast(name));
100 } else {
101 Symbol* symbol = Symbol::cast(name);
102 AppendBytes("symbol(");
103 if (!symbol->name()->IsUndefined()) {
104 AppendBytes("\"");
105 AppendString(String::cast(symbol->name()));
106 AppendBytes("\" ");
107 }
108 AppendBytes("hash ");
109 AppendHex(symbol->Hash());
110 AppendByte(')');
111 }
112 }
113
114 void AppendString(String* str) {
115 if (str == NULL) return;
116 int uc16_length = Min(str->length(), kUtf16BufferSize);
117 String::WriteToFlat(str, utf16_buffer, 0, uc16_length);
118 int previous = unibrow::Utf16::kNoPreviousCharacter;
119 for (int i = 0; i < uc16_length && utf8_pos_ < kUtf8BufferSize; ++i) {
120 uc16 c = utf16_buffer[i];
121 if (c <= unibrow::Utf8::kMaxOneByteChar) {
122 utf8_buffer_[utf8_pos_++] = static_cast<char>(c);
123 } else {
124 int char_length = unibrow::Utf8::Length(c, previous);
125 if (utf8_pos_ + char_length > kUtf8BufferSize) break;
126 unibrow::Utf8::Encode(utf8_buffer_ + utf8_pos_, c, previous);
127 utf8_pos_ += char_length;
128 }
129 previous = c;
130 }
131 }
132
133 void AppendBytes(const char* bytes, int size) {
134 size = Min(size, kUtf8BufferSize - utf8_pos_);
135 OS::MemCopy(utf8_buffer_ + utf8_pos_, bytes, size);
136 utf8_pos_ += size;
137 }
138
139 void AppendBytes(const char* bytes) {
140 AppendBytes(bytes, StrLength(bytes));
141 }
142
143 void AppendByte(char c) {
144 if (utf8_pos_ >= kUtf8BufferSize) return;
145 utf8_buffer_[utf8_pos_++] = c;
146 }
147
148 void AppendInt(int n) {
149 Vector<char> buffer(utf8_buffer_ + utf8_pos_,
150 kUtf8BufferSize - utf8_pos_);
151 int size = OS::SNPrintF(buffer, "%d", n);
152 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
153 utf8_pos_ += size;
154 }
155 }
156
157 void AppendHex(uint32_t n) {
158 Vector<char> buffer(utf8_buffer_ + utf8_pos_,
159 kUtf8BufferSize - utf8_pos_);
160 int size = OS::SNPrintF(buffer, "%x", n);
161 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
162 utf8_pos_ += size;
163 }
164 }
165
166 const char* get() { return utf8_buffer_; }
167 int size() const { return utf8_pos_; }
168
169 private:
170 static const int kUtf8BufferSize = 512;
171 static const int kUtf16BufferSize = 128;
172
173 int utf8_pos_;
174 char utf8_buffer_[kUtf8BufferSize];
175 uc16 utf16_buffer[kUtf16BufferSize];
176 };
177
178 private:
179 virtual void LogRecordedBuffer(Code* code,
180 SharedFunctionInfo* shared,
181 NameBuffer* name_buffer) = 0;
182
183 NameBuffer name_buffer_;
yurys 2013/07/19 12:30:34 Now there is a separate instance of NameBuffer in
184 };
185
186
50 // Low-level logging support. 187 // Low-level logging support.
51 class LowLevelLogger { 188 class LowLevelLogger : public CodeEventLogger {
52 public: 189 public:
53 explicit LowLevelLogger(const char* file_name); 190 explicit LowLevelLogger(const char* file_name);
54 ~LowLevelLogger(); 191 virtual ~LowLevelLogger();
55 192
56 void CodeCreateEvent(Code* code, const char* name, int name_size);
57 void CodeMoveEvent(Address from, Address to); 193 void CodeMoveEvent(Address from, Address to);
58 void CodeDeleteEvent(Address from); 194 void CodeDeleteEvent(Address from);
59 void SnapshotPositionEvent(Address addr, int pos); 195 void SnapshotPositionEvent(Address addr, int pos);
60 void CodeMovingGCEvent(); 196 void CodeMovingGCEvent();
61 197
62 private: 198 private:
199 virtual void LogRecordedBuffer(Code* code,
200 SharedFunctionInfo* shared,
201 NameBuffer* name_buffer);
202
63 // Low-level profiling event structures. 203 // Low-level profiling event structures.
64
65 struct CodeCreateStruct { 204 struct CodeCreateStruct {
66 static const char kTag = 'C'; 205 static const char kTag = 'C';
67 206
68 int32_t name_size; 207 int32_t name_size;
69 Address code_address; 208 Address code_address;
70 int32_t code_size; 209 int32_t code_size;
71 }; 210 };
72 211
73 212
74 struct CodeMoveStruct { 213 struct CodeMoveStruct {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 } 254 }
116 255
117 FILE* ll_output_handle_; 256 FILE* ll_output_handle_;
118 }; 257 };
119 258
120 const char LowLevelLogger::kLogExt[] = ".ll"; 259 const char LowLevelLogger::kLogExt[] = ".ll";
121 260
122 #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call; 261 #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call;
123 262
124 263
264 class CodeAddressMap: public CodeEventLogger {
265 public:
266 CodeAddressMap() { }
267 virtual ~CodeAddressMap() { }
268
269 void CodeMoveEvent(Address from, Address to) {
270 address_to_name_map_.Move(from, to);
271 }
272
273 void CodeDeleteEvent(Address from) {
274 address_to_name_map_.Remove(from);
275 }
276
277 const char* Lookup(Address address) {
278 return address_to_name_map_.Lookup(address);
279 }
280
281 private:
282 class NameMap {
283 public:
284 NameMap() : impl_(&PointerEquals) {}
285
286 ~NameMap() {
287 for (HashMap::Entry* p = impl_.Start(); p != NULL; p = impl_.Next(p)) {
288 DeleteArray(static_cast<const char*>(p->value));
289 }
290 }
291
292 void Insert(Address code_address, const char* name, int name_size) {
293 HashMap::Entry* entry = FindOrCreateEntry(code_address);
294 if (entry->value == NULL) {
295 entry->value = CopyName(name, name_size);
296 }
297 }
298
299 const char* Lookup(Address code_address) {
300 HashMap::Entry* entry = FindEntry(code_address);
301 return (entry != NULL) ? static_cast<const char*>(entry->value) : NULL;
302 }
303
304 void Remove(Address code_address) {
305 HashMap::Entry* entry = FindEntry(code_address);
306 if (entry != NULL) {
307 DeleteArray(static_cast<char*>(entry->value));
308 RemoveEntry(entry);
309 }
310 }
311
312 void Move(Address from, Address to) {
313 if (from == to) return;
314 HashMap::Entry* from_entry = FindEntry(from);
315 ASSERT(from_entry != NULL);
316 void* value = from_entry->value;
317 RemoveEntry(from_entry);
318 HashMap::Entry* to_entry = FindOrCreateEntry(to);
319 ASSERT(to_entry->value == NULL);
320 to_entry->value = value;
321 }
322
323 private:
324 static bool PointerEquals(void* lhs, void* rhs) {
325 return lhs == rhs;
326 }
327
328 static char* CopyName(const char* name, int name_size) {
329 char* result = NewArray<char>(name_size + 1);
330 for (int i = 0; i < name_size; ++i) {
331 char c = name[i];
332 if (c == '\0') c = ' ';
333 result[i] = c;
334 }
335 result[name_size] = '\0';
336 return result;
337 }
338
339 HashMap::Entry* FindOrCreateEntry(Address code_address) {
340 return impl_.Lookup(code_address, ComputePointerHash(code_address), true);
341 }
342
343 HashMap::Entry* FindEntry(Address code_address) {
344 return impl_.Lookup(code_address,
345 ComputePointerHash(code_address),
346 false);
347 }
348
349 void RemoveEntry(HashMap::Entry* entry) {
350 impl_.Remove(entry->key, entry->hash);
351 }
352
353 HashMap impl_;
354
355 DISALLOW_COPY_AND_ASSIGN(NameMap);
356 };
357
358 virtual void LogRecordedBuffer(Code* code,
359 SharedFunctionInfo*,
360 NameBuffer* name_buffer) {
361 address_to_name_map_.Insert(code->address(),
362 name_buffer->get(),
363 name_buffer->size());
364 }
365
366 NameMap address_to_name_map_;
367 };
368
369
370 #define CODE_ADDRESS_MAP(Call)\
yurys 2013/07/19 12:30:34 CODE_ADDRESS_MAP_LOG?
371 if (Serializer::enabled()) code_address_map_->Call;
372
373
125 // The Profiler samples pc and sp values for the main thread. 374 // The Profiler samples pc and sp values for the main thread.
126 // Each sample is appended to a circular buffer. 375 // Each sample is appended to a circular buffer.
127 // An independent thread removes data and writes it to the log. 376 // An independent thread removes data and writes it to the log.
128 // This design minimizes the time spent in the sampler. 377 // This design minimizes the time spent in the sampler.
129 // 378 //
130 class Profiler: public Thread { 379 class Profiler: public Thread {
131 public: 380 public:
132 explicit Profiler(Isolate* isolate); 381 explicit Profiler(Isolate* isolate);
133 void Engage(); 382 void Engage();
134 void Disengage(); 383 void Disengage();
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 LOG(isolate_, TickEvent(&sample, overflow)); 533 LOG(isolate_, TickEvent(&sample, overflow));
285 overflow = Remove(&sample); 534 overflow = Remove(&sample);
286 } 535 }
287 } 536 }
288 537
289 538
290 // 539 //
291 // Logger class implementation. 540 // Logger class implementation.
292 // 541 //
293 542
294 class Logger::NameMap {
295 public:
296 NameMap() : impl_(&PointerEquals) {}
297
298 ~NameMap() {
299 for (HashMap::Entry* p = impl_.Start(); p != NULL; p = impl_.Next(p)) {
300 DeleteArray(static_cast<const char*>(p->value));
301 }
302 }
303
304 void Insert(Address code_address, const char* name, int name_size) {
305 HashMap::Entry* entry = FindOrCreateEntry(code_address);
306 if (entry->value == NULL) {
307 entry->value = CopyName(name, name_size);
308 }
309 }
310
311 const char* Lookup(Address code_address) {
312 HashMap::Entry* entry = FindEntry(code_address);
313 return (entry != NULL) ? static_cast<const char*>(entry->value) : NULL;
314 }
315
316 void Remove(Address code_address) {
317 HashMap::Entry* entry = FindEntry(code_address);
318 if (entry != NULL) {
319 DeleteArray(static_cast<char*>(entry->value));
320 RemoveEntry(entry);
321 }
322 }
323
324 void Move(Address from, Address to) {
325 if (from == to) return;
326 HashMap::Entry* from_entry = FindEntry(from);
327 ASSERT(from_entry != NULL);
328 void* value = from_entry->value;
329 RemoveEntry(from_entry);
330 HashMap::Entry* to_entry = FindOrCreateEntry(to);
331 ASSERT(to_entry->value == NULL);
332 to_entry->value = value;
333 }
334
335 private:
336 static bool PointerEquals(void* lhs, void* rhs) {
337 return lhs == rhs;
338 }
339
340 static char* CopyName(const char* name, int name_size) {
341 char* result = NewArray<char>(name_size + 1);
342 for (int i = 0; i < name_size; ++i) {
343 char c = name[i];
344 if (c == '\0') c = ' ';
345 result[i] = c;
346 }
347 result[name_size] = '\0';
348 return result;
349 }
350
351 HashMap::Entry* FindOrCreateEntry(Address code_address) {
352 return impl_.Lookup(code_address, ComputePointerHash(code_address), true);
353 }
354
355 HashMap::Entry* FindEntry(Address code_address) {
356 return impl_.Lookup(code_address, ComputePointerHash(code_address), false);
357 }
358
359 void RemoveEntry(HashMap::Entry* entry) {
360 impl_.Remove(entry->key, entry->hash);
361 }
362
363 HashMap impl_;
364
365 DISALLOW_COPY_AND_ASSIGN(NameMap);
366 };
367
368
369 class Logger::NameBuffer {
370 public:
371 NameBuffer() { Reset(); }
372
373 void Reset() {
374 utf8_pos_ = 0;
375 }
376
377 void AppendString(String* str) {
378 if (str == NULL) return;
379 int uc16_length = Min(str->length(), kUtf16BufferSize);
380 String::WriteToFlat(str, utf16_buffer, 0, uc16_length);
381 int previous = unibrow::Utf16::kNoPreviousCharacter;
382 for (int i = 0; i < uc16_length && utf8_pos_ < kUtf8BufferSize; ++i) {
383 uc16 c = utf16_buffer[i];
384 if (c <= unibrow::Utf8::kMaxOneByteChar) {
385 utf8_buffer_[utf8_pos_++] = static_cast<char>(c);
386 } else {
387 int char_length = unibrow::Utf8::Length(c, previous);
388 if (utf8_pos_ + char_length > kUtf8BufferSize) break;
389 unibrow::Utf8::Encode(utf8_buffer_ + utf8_pos_, c, previous);
390 utf8_pos_ += char_length;
391 }
392 previous = c;
393 }
394 }
395
396 void AppendBytes(const char* bytes, int size) {
397 size = Min(size, kUtf8BufferSize - utf8_pos_);
398 OS::MemCopy(utf8_buffer_ + utf8_pos_, bytes, size);
399 utf8_pos_ += size;
400 }
401
402 void AppendBytes(const char* bytes) {
403 AppendBytes(bytes, StrLength(bytes));
404 }
405
406 void AppendByte(char c) {
407 if (utf8_pos_ >= kUtf8BufferSize) return;
408 utf8_buffer_[utf8_pos_++] = c;
409 }
410
411 void AppendInt(int n) {
412 Vector<char> buffer(utf8_buffer_ + utf8_pos_, kUtf8BufferSize - utf8_pos_);
413 int size = OS::SNPrintF(buffer, "%d", n);
414 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
415 utf8_pos_ += size;
416 }
417 }
418
419 void AppendHex(uint32_t n) {
420 Vector<char> buffer(utf8_buffer_ + utf8_pos_, kUtf8BufferSize - utf8_pos_);
421 int size = OS::SNPrintF(buffer, "%x", n);
422 if (size > 0 && utf8_pos_ + size <= kUtf8BufferSize) {
423 utf8_pos_ += size;
424 }
425 }
426
427 const char* get() { return utf8_buffer_; }
428 int size() const { return utf8_pos_; }
429
430 private:
431 static const int kUtf8BufferSize = 512;
432 static const int kUtf16BufferSize = 128;
433
434 int utf8_pos_;
435 char utf8_buffer_[kUtf8BufferSize];
436 uc16 utf16_buffer[kUtf16BufferSize];
437 };
438
439
440 Logger::Logger(Isolate* isolate) 543 Logger::Logger(Isolate* isolate)
441 : isolate_(isolate), 544 : isolate_(isolate),
442 ticker_(NULL), 545 ticker_(NULL),
443 profiler_(NULL), 546 profiler_(NULL),
444 log_events_(NULL), 547 log_events_(NULL),
445 logging_nesting_(0), 548 logging_nesting_(0),
446 cpu_profiler_nesting_(0), 549 cpu_profiler_nesting_(0),
447 log_(new Log(this)), 550 log_(new Log(this)),
448 ll_logger_(NULL), 551 ll_logger_(NULL),
449 jit_logger_(NULL), 552 jit_logger_(NULL),
450 name_buffer_(new NameBuffer), 553 code_address_map_(new CodeAddressMap),
451 address_to_name_map_(NULL),
452 is_initialized_(false), 554 is_initialized_(false),
453 last_address_(NULL), 555 last_address_(NULL),
454 prev_sp_(NULL), 556 prev_sp_(NULL),
455 prev_function_(NULL), 557 prev_function_(NULL),
456 prev_to_(NULL), 558 prev_to_(NULL),
457 prev_code_(NULL), 559 prev_code_(NULL),
458 epoch_(0) { 560 epoch_(0) {
459 } 561 }
460 562
461 563
462 Logger::~Logger() { 564 Logger::~Logger() {
463 delete address_to_name_map_; 565 delete code_address_map_;
464 delete name_buffer_;
465 delete log_; 566 delete log_;
466 } 567 }
467 568
468 569
469 class JitLogger { 570 class JitLogger : public CodeEventLogger {
470 public: 571 public:
471 explicit JitLogger(JitCodeEventHandler code_event_handler); 572 explicit JitLogger(JitCodeEventHandler code_event_handler);
472 573
473 void CodeCreateEvent(Code* code, Script* script,
474 const char* name, size_t name_len);
475 void CodeMovedEvent(Address from, Address to); 574 void CodeMovedEvent(Address from, Address to);
476 void CodeRemovedEvent(Address from); 575 void CodeDeleteEvent(Address from);
477 void AddCodeLinePosInfoEvent( 576 void AddCodeLinePosInfoEvent(
478 void* jit_handler_data, 577 void* jit_handler_data,
479 int pc_offset, 578 int pc_offset,
480 int position, 579 int position,
481 JitCodeEvent::PositionType position_type); 580 JitCodeEvent::PositionType position_type);
482 void* StartCodePosInfoEvent(); 581 void* StartCodePosInfoEvent();
483 void EndCodePosInfoEvent(Code* code, void* jit_handler_data); 582 void EndCodePosInfoEvent(Code* code, void* jit_handler_data);
484 583
485 private: 584 private:
585 virtual void LogRecordedBuffer(Code* code,
586 SharedFunctionInfo* shared,
587 CodeEventLogger::NameBuffer* name_buffer);
588
486 JitCodeEventHandler code_event_handler_; 589 JitCodeEventHandler code_event_handler_;
487 }; 590 };
488 591
489 #define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call; 592 #define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
490 593
491 594
492 JitLogger::JitLogger(JitCodeEventHandler code_event_handler) 595 JitLogger::JitLogger(JitCodeEventHandler code_event_handler)
493 : code_event_handler_(code_event_handler) { 596 : code_event_handler_(code_event_handler) {
494 } 597 }
495 598
496 599
497 void JitLogger::CodeCreateEvent(Code* code, 600 void JitLogger::LogRecordedBuffer(Code* code,
498 Script* script, 601 SharedFunctionInfo* shared,
499 const char* name, 602 CodeEventLogger::NameBuffer* name_buffer) {
500 size_t name_len) {
501 JitCodeEvent event; 603 JitCodeEvent event;
502 memset(&event, 0, sizeof(event)); 604 memset(&event, 0, sizeof(event));
503 event.type = JitCodeEvent::CODE_ADDED; 605 event.type = JitCodeEvent::CODE_ADDED;
504 event.code_start = code->instruction_start(); 606 event.code_start = code->instruction_start();
505 event.code_len = code->instruction_size(); 607 event.code_len = code->instruction_size();
506 Handle<Script> script_handle = 608 Handle<Script> script_handle;
507 script != NULL ? Handle<Script>(script) : Handle<Script>(); 609 if (shared && shared->script()->IsScript()) {
610 script_handle = Handle<Script>(Script::cast(shared->script()));
611 }
508 event.script = ToApiHandle<v8::Script>(script_handle); 612 event.script = ToApiHandle<v8::Script>(script_handle);
509 event.name.str = name; 613 event.name.str = name_buffer->get();
510 event.name.len = name_len; 614 event.name.len = name_buffer->size();
511
512 code_event_handler_(&event); 615 code_event_handler_(&event);
513 } 616 }
514 617
515 618
516 void JitLogger::CodeMovedEvent(Address from, Address to) { 619 void JitLogger::CodeMovedEvent(Address from, Address to) {
517 Code* from_code = Code::cast(HeapObject::FromAddress(from)); 620 Code* from_code = Code::cast(HeapObject::FromAddress(from));
518 621
519 JitCodeEvent event; 622 JitCodeEvent event;
520 event.type = JitCodeEvent::CODE_MOVED; 623 event.type = JitCodeEvent::CODE_MOVED;
521 event.code_start = from_code->instruction_start(); 624 event.code_start = from_code->instruction_start();
522 event.code_len = from_code->instruction_size(); 625 event.code_len = from_code->instruction_size();
523 626
524 // Calculate the header size. 627 // Calculate the header size.
525 const size_t header_size = 628 const size_t header_size =
526 from_code->instruction_start() - reinterpret_cast<byte*>(from_code); 629 from_code->instruction_start() - reinterpret_cast<byte*>(from_code);
527 630
528 // Calculate the new start address of the instructions. 631 // Calculate the new start address of the instructions.
529 event.new_code_start = 632 event.new_code_start =
530 reinterpret_cast<byte*>(HeapObject::FromAddress(to)) + header_size; 633 reinterpret_cast<byte*>(HeapObject::FromAddress(to)) + header_size;
531 634
532 code_event_handler_(&event); 635 code_event_handler_(&event);
533 } 636 }
534 637
535 638
536 void JitLogger::CodeRemovedEvent(Address from) { 639 void JitLogger::CodeDeleteEvent(Address from) {
537 Code* from_code = Code::cast(HeapObject::FromAddress(from)); 640 Code* from_code = Code::cast(HeapObject::FromAddress(from));
538 641
539 JitCodeEvent event; 642 JitCodeEvent event;
540 event.type = JitCodeEvent::CODE_REMOVED; 643 event.type = JitCodeEvent::CODE_REMOVED;
541 event.code_start = from_code->instruction_start(); 644 event.code_start = from_code->instruction_start();
542 event.code_len = from_code->instruction_size(); 645 event.code_len = from_code->instruction_size();
543 646
544 code_event_handler_(&event); 647 code_event_handler_(&event);
545 } 648 }
546 649
(...skipping 27 matching lines...) Expand all
574 void JitLogger::EndCodePosInfoEvent(Code* code, void* jit_handler_data) { 677 void JitLogger::EndCodePosInfoEvent(Code* code, void* jit_handler_data) {
575 JitCodeEvent event; 678 JitCodeEvent event;
576 memset(&event, 0, sizeof(event)); 679 memset(&event, 0, sizeof(event));
577 event.type = JitCodeEvent::CODE_END_LINE_INFO_RECORDING; 680 event.type = JitCodeEvent::CODE_END_LINE_INFO_RECORDING;
578 event.code_start = code->instruction_start(); 681 event.code_start = code->instruction_start();
579 event.user_data = jit_handler_data; 682 event.user_data = jit_handler_data;
580 683
581 code_event_handler_(&event); 684 code_event_handler_(&event);
582 } 685 }
583 686
584 #define DECLARE_EVENT(ignore1, name) name,
585 static const char* const kLogEventsNames[Logger::NUMBER_OF_LOG_EVENTS] = {
586 LOG_EVENTS_AND_TAGS_LIST(DECLARE_EVENT)
587 };
588 #undef DECLARE_EVENT
589
590 687
591 void Logger::ProfilerBeginEvent() { 688 void Logger::ProfilerBeginEvent() {
592 if (!log_->IsEnabled()) return; 689 if (!log_->IsEnabled()) return;
593 Log::MessageBuilder msg(log_); 690 Log::MessageBuilder msg(log_);
594 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); 691 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs);
595 msg.WriteToLogFile(); 692 msg.WriteToLogFile();
596 } 693 }
597 694
598 695
599 void Logger::StringEvent(const char* name, const char* value) { 696 void Logger::StringEvent(const char* name, const char* value) {
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
980 CallbackEventInternal("get ", name, entry_point); 1077 CallbackEventInternal("get ", name, entry_point);
981 } 1078 }
982 1079
983 1080
984 void Logger::SetterCallbackEvent(Name* name, Address entry_point) { 1081 void Logger::SetterCallbackEvent(Name* name, Address entry_point) {
985 if (!log_->IsEnabled() || !FLAG_log_code) return; 1082 if (!log_->IsEnabled() || !FLAG_log_code) return;
986 CallbackEventInternal("set ", name, entry_point); 1083 CallbackEventInternal("set ", name, entry_point);
987 } 1084 }
988 1085
989 1086
990 void Logger::AppendName(Name* name) {
991 if (name->IsString()) {
992 name_buffer_->AppendString(String::cast(name));
993 } else {
994 Symbol* symbol = Symbol::cast(name);
995 name_buffer_->AppendBytes("symbol(");
996 if (!symbol->name()->IsUndefined()) {
997 name_buffer_->AppendBytes("\"");
998 name_buffer_->AppendString(String::cast(symbol->name()));
999 name_buffer_->AppendBytes("\" ");
1000 }
1001 name_buffer_->AppendBytes("hash ");
1002 name_buffer_->AppendHex(symbol->Hash());
1003 name_buffer_->AppendByte(')');
1004 }
1005 }
1006
1007
1008 void Logger::InitNameBuffer(LogEventsAndTags tag) {
1009 name_buffer_->Reset();
1010 name_buffer_->AppendBytes(kLogEventsNames[tag]);
1011 name_buffer_->AppendByte(':');
1012 }
1013
1014
1015 void Logger::LogRecordedBuffer(Code* code, SharedFunctionInfo* shared) {
1016 Script* script = shared && shared->script()->IsScript() ?
1017 Script::cast(shared->script()) : NULL;
1018 JIT_LOG(CodeCreateEvent(code, script, name_buffer_->get(),
1019 name_buffer_->size()));
1020 if (!log_->IsEnabled()) return;
1021 LL_LOG(CodeCreateEvent(code, name_buffer_->get(), name_buffer_->size()));
1022 if (Serializer::enabled()) {
1023 RegisterSnapshotCodeName(code, name_buffer_->get(), name_buffer_->size());
1024 }
1025 }
1026
1027
1028 static void AppendCodeCreateHeader(Log::MessageBuilder* msg, 1087 static void AppendCodeCreateHeader(Log::MessageBuilder* msg,
1029 Logger::LogEventsAndTags tag, 1088 Logger::LogEventsAndTags tag,
1030 Code* code) { 1089 Code* code) {
1031 ASSERT(msg); 1090 ASSERT(msg);
1032 msg->Append("%s,%s,%d,", 1091 msg->Append("%s,%s,%d,",
1033 kLogEventsNames[Logger::CODE_CREATION_EVENT], 1092 kLogEventsNames[Logger::CODE_CREATION_EVENT],
1034 kLogEventsNames[tag], 1093 kLogEventsNames[tag],
1035 code->kind()); 1094 code->kind());
1036 msg->AppendAddress(code->address()); 1095 msg->AppendAddress(code->address());
1037 msg->Append(",%d,", code->ExecutableSize()); 1096 msg->Append(",%d,", code->ExecutableSize());
1038 } 1097 }
1039 1098
1040 1099
1100 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1101 Code* code,
1102 const char* comment) {
1103 name_buffer_.Init(tag);
1104 name_buffer_.AppendBytes(comment);
1105 LogRecordedBuffer(code, NULL, &name_buffer_);
1106 }
1107
1108
1041 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1109 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1042 Code* code, 1110 Code* code,
1043 const char* comment) { 1111 const char* comment) {
1044 if (!is_logging_code_events()) return; 1112 if (!is_logging_code_events()) return;
1045 if (FLAG_ll_prof || Serializer::enabled() || jit_logger_ != NULL) { 1113
1046 InitNameBuffer(tag); 1114 JIT_LOG(CodeCreateEvent(tag, code, comment));
1047 name_buffer_->AppendBytes(comment); 1115 LL_LOG(CodeCreateEvent(tag, code, comment));
1048 LogRecordedBuffer(code, NULL); 1116 CODE_ADDRESS_MAP(CodeCreateEvent(tag, code, comment));
1049 }
1050 1117
1051 if (!FLAG_log_code || !log_->IsEnabled()) return; 1118 if (!FLAG_log_code || !log_->IsEnabled()) return;
1052 Log::MessageBuilder msg(log_); 1119 Log::MessageBuilder msg(log_);
1053 AppendCodeCreateHeader(&msg, tag, code); 1120 AppendCodeCreateHeader(&msg, tag, code);
1054 msg.AppendDoubleQuotedString(comment); 1121 msg.AppendDoubleQuotedString(comment);
1055 msg.Append('\n'); 1122 msg.Append('\n');
1056 msg.WriteToLogFile(); 1123 msg.WriteToLogFile();
1057 } 1124 }
1058 1125
1059 1126
1127 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1128 Code* code,
1129 Name* name) {
1130 name_buffer_.Init(tag);
1131 name_buffer_.AppendName(name);
1132 LogRecordedBuffer(code, NULL, &name_buffer_);
1133 }
1134
1135
1060 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1136 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1061 Code* code, 1137 Code* code,
1062 Name* name) { 1138 Name* name) {
1063 if (!is_logging_code_events()) return; 1139 if (!is_logging_code_events()) return;
1064 if (FLAG_ll_prof || Serializer::enabled() || jit_logger_ != NULL) { 1140
1065 InitNameBuffer(tag); 1141 JIT_LOG(CodeCreateEvent(tag, code, name));
1066 AppendName(name); 1142 LL_LOG(CodeCreateEvent(tag, code, name));
1067 LogRecordedBuffer(code, NULL); 1143 CODE_ADDRESS_MAP(CodeCreateEvent(tag, code, name));
1068 }
1069 1144
1070 if (!FLAG_log_code || !log_->IsEnabled()) return; 1145 if (!FLAG_log_code || !log_->IsEnabled()) return;
1071 Log::MessageBuilder msg(log_); 1146 Log::MessageBuilder msg(log_);
1072 AppendCodeCreateHeader(&msg, tag, code); 1147 AppendCodeCreateHeader(&msg, tag, code);
1073 if (name->IsString()) { 1148 if (name->IsString()) {
1074 msg.Append('"'); 1149 msg.Append('"');
1075 msg.AppendDetailed(String::cast(name), false); 1150 msg.AppendDetailed(String::cast(name), false);
1076 msg.Append('"'); 1151 msg.Append('"');
1077 } else { 1152 } else {
1078 msg.AppendSymbolName(Symbol::cast(name)); 1153 msg.AppendSymbolName(Symbol::cast(name));
1079 } 1154 }
1080 msg.Append('\n'); 1155 msg.Append('\n');
1081 msg.WriteToLogFile(); 1156 msg.WriteToLogFile();
1082 } 1157 }
1083 1158
1084 1159
1085 // ComputeMarker must only be used when SharedFunctionInfo is known. 1160 // ComputeMarker must only be used when SharedFunctionInfo is known.
1086 static const char* ComputeMarker(Code* code) { 1161 static const char* ComputeMarker(Code* code) {
1087 switch (code->kind()) { 1162 switch (code->kind()) {
1088 case Code::FUNCTION: return code->optimizable() ? "~" : ""; 1163 case Code::FUNCTION: return code->optimizable() ? "~" : "";
1089 case Code::OPTIMIZED_FUNCTION: return "*"; 1164 case Code::OPTIMIZED_FUNCTION: return "*";
1090 default: return ""; 1165 default: return "";
1091 } 1166 }
1092 } 1167 }
1093 1168
1094 1169
1170 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1171 Code* code,
1172 SharedFunctionInfo* shared,
1173 CompilationInfo* info,
1174 Name* name) {
1175 name_buffer_.Init(tag);
1176 name_buffer_.AppendBytes(ComputeMarker(code));
1177 name_buffer_.AppendName(name);
1178 LogRecordedBuffer(code, shared, &name_buffer_);
1179 }
1180
1181
1095 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1182 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1096 Code* code, 1183 Code* code,
1097 SharedFunctionInfo* shared, 1184 SharedFunctionInfo* shared,
1098 CompilationInfo* info, 1185 CompilationInfo* info,
1099 Name* name) { 1186 Name* name) {
1100 if (!is_logging_code_events()) return; 1187 if (!is_logging_code_events()) return;
1101 if (FLAG_ll_prof || Serializer::enabled() || jit_logger_ != NULL) { 1188
1102 InitNameBuffer(tag); 1189 JIT_LOG(CodeCreateEvent(tag, code, shared, info, name));
1103 name_buffer_->AppendBytes(ComputeMarker(code)); 1190 LL_LOG(CodeCreateEvent(tag, code, shared, info, name));
1104 AppendName(name); 1191 CODE_ADDRESS_MAP(CodeCreateEvent(tag, code, shared, info, name));
1105 LogRecordedBuffer(code, shared);
1106 }
1107 1192
1108 if (!FLAG_log_code || !log_->IsEnabled()) return; 1193 if (!FLAG_log_code || !log_->IsEnabled()) return;
1109 if (code == isolate_->builtins()->builtin( 1194 if (code == isolate_->builtins()->builtin(
1110 Builtins::kLazyCompile)) 1195 Builtins::kLazyCompile))
1111 return; 1196 return;
1112 1197
1113 Log::MessageBuilder msg(log_); 1198 Log::MessageBuilder msg(log_);
1114 AppendCodeCreateHeader(&msg, tag, code); 1199 AppendCodeCreateHeader(&msg, tag, code);
1115 if (name->IsString()) { 1200 if (name->IsString()) {
1116 SmartArrayPointer<char> str = 1201 SmartArrayPointer<char> str =
1117 String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 1202 String::cast(name)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
1118 msg.Append("\"%s\"", *str); 1203 msg.Append("\"%s\"", *str);
1119 } else { 1204 } else {
1120 msg.AppendSymbolName(Symbol::cast(name)); 1205 msg.AppendSymbolName(Symbol::cast(name));
1121 } 1206 }
1122 msg.Append(','); 1207 msg.Append(',');
1123 msg.AppendAddress(shared->address()); 1208 msg.AppendAddress(shared->address());
1124 msg.Append(",%s", ComputeMarker(code)); 1209 msg.Append(",%s", ComputeMarker(code));
1125 msg.Append('\n'); 1210 msg.Append('\n');
1126 msg.WriteToLogFile(); 1211 msg.WriteToLogFile();
1127 } 1212 }
1128 1213
1129 1214
1130 // Although, it is possible to extract source and line from 1215 // Although, it is possible to extract source and line from
1131 // the SharedFunctionInfo object, we left it to caller 1216 // the SharedFunctionInfo object, we left it to caller
1132 // to leave logging functions free from heap allocations. 1217 // to leave logging functions free from heap allocations.
1218 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1219 Code* code,
1220 SharedFunctionInfo* shared,
1221 CompilationInfo* info,
1222 Name* source, int line) {
1223 name_buffer_.Init(tag);
1224 name_buffer_.AppendBytes(ComputeMarker(code));
1225 name_buffer_.AppendString(shared->DebugName());
1226 name_buffer_.AppendByte(' ');
1227 if (source->IsString()) {
1228 name_buffer_.AppendString(String::cast(source));
1229 } else {
1230 name_buffer_.AppendBytes("symbol(hash ");
1231 name_buffer_.AppendHex(Name::cast(source)->Hash());
1232 name_buffer_.AppendByte(')');
1233 }
1234 name_buffer_.AppendByte(':');
1235 name_buffer_.AppendInt(line);
1236 LogRecordedBuffer(code, shared, &name_buffer_);
1237 }
1238
1239
1133 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1240 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1134 Code* code, 1241 Code* code,
1135 SharedFunctionInfo* shared, 1242 SharedFunctionInfo* shared,
1136 CompilationInfo* info, 1243 CompilationInfo* info,
1137 Name* source, int line) { 1244 Name* source, int line) {
1138 if (!is_logging_code_events()) return; 1245 if (!is_logging_code_events()) return;
1139 if (FLAG_ll_prof || Serializer::enabled() || jit_logger_ != NULL) { 1246
1140 InitNameBuffer(tag); 1247 JIT_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1141 name_buffer_->AppendBytes(ComputeMarker(code)); 1248 LL_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1142 name_buffer_->AppendString(shared->DebugName()); 1249 CODE_ADDRESS_MAP(CodeCreateEvent(tag, code, shared, info, source, line));
1143 name_buffer_->AppendByte(' ');
1144 if (source->IsString()) {
1145 name_buffer_->AppendString(String::cast(source));
1146 } else {
1147 name_buffer_->AppendBytes("symbol(hash ");
1148 name_buffer_->AppendHex(Name::cast(source)->Hash());
1149 name_buffer_->AppendByte(')');
1150 }
1151 name_buffer_->AppendByte(':');
1152 name_buffer_->AppendInt(line);
1153 LogRecordedBuffer(code, shared);
1154 }
1155 1250
1156 if (!FLAG_log_code || !log_->IsEnabled()) return; 1251 if (!FLAG_log_code || !log_->IsEnabled()) return;
1157 Log::MessageBuilder msg(log_); 1252 Log::MessageBuilder msg(log_);
1158 AppendCodeCreateHeader(&msg, tag, code); 1253 AppendCodeCreateHeader(&msg, tag, code);
1159 SmartArrayPointer<char> name = 1254 SmartArrayPointer<char> name =
1160 shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 1255 shared->DebugName()->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
1161 msg.Append("\"%s ", *name); 1256 msg.Append("\"%s ", *name);
1162 if (source->IsString()) { 1257 if (source->IsString()) {
1163 SmartArrayPointer<char> sourcestr = 1258 SmartArrayPointer<char> sourcestr =
1164 String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 1259 String::cast(source)->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
1165 msg.Append("%s", *sourcestr); 1260 msg.Append("%s", *sourcestr);
1166 } else { 1261 } else {
1167 msg.AppendSymbolName(Symbol::cast(source)); 1262 msg.AppendSymbolName(Symbol::cast(source));
1168 } 1263 }
1169 msg.Append(":%d\",", line); 1264 msg.Append(":%d\",", line);
1170 msg.AppendAddress(shared->address()); 1265 msg.AppendAddress(shared->address());
1171 msg.Append(",%s", ComputeMarker(code)); 1266 msg.Append(",%s", ComputeMarker(code));
1172 msg.Append('\n'); 1267 msg.Append('\n');
1173 msg.WriteToLogFile(); 1268 msg.WriteToLogFile();
1174 } 1269 }
1175 1270
1176 1271
1177 void Logger::CodeCreateEvent(LogEventsAndTags tag, Code* code, int args_count) { 1272 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1273 Code* code,
1274 int args_count) {
1275 name_buffer_.Init(tag);
1276 name_buffer_.AppendInt(args_count);
1277 LogRecordedBuffer(code, NULL, &name_buffer_);
1278 }
1279
1280
1281 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1282 Code* code,
1283 int args_count) {
1178 if (!is_logging_code_events()) return; 1284 if (!is_logging_code_events()) return;
1179 if (FLAG_ll_prof || Serializer::enabled() || jit_logger_ != NULL) { 1285
1180 InitNameBuffer(tag); 1286 JIT_LOG(CodeCreateEvent(tag, code, args_count));
1181 name_buffer_->AppendInt(args_count); 1287 LL_LOG(CodeCreateEvent(tag, code, args_count));
1182 LogRecordedBuffer(code, NULL); 1288 CODE_ADDRESS_MAP(CodeCreateEvent(tag, code, args_count));
1183 }
1184 1289
1185 if (!FLAG_log_code || !log_->IsEnabled()) return; 1290 if (!FLAG_log_code || !log_->IsEnabled()) return;
1186 Log::MessageBuilder msg(log_); 1291 Log::MessageBuilder msg(log_);
1187 AppendCodeCreateHeader(&msg, tag, code); 1292 AppendCodeCreateHeader(&msg, tag, code);
1188 msg.Append("\"args_count: %d\"", args_count); 1293 msg.Append("\"args_count: %d\"", args_count);
1189 msg.Append('\n'); 1294 msg.Append('\n');
1190 msg.WriteToLogFile(); 1295 msg.WriteToLogFile();
1191 } 1296 }
1192 1297
1193 1298
1194 void Logger::CodeMovingGCEvent() { 1299 void Logger::CodeMovingGCEvent() {
1195 if (!log_->IsEnabled() || !FLAG_ll_prof) return; 1300 if (!log_->IsEnabled() || !FLAG_ll_prof) return;
1196 LL_LOG(CodeMovingGCEvent()); 1301 LL_LOG(CodeMovingGCEvent());
1197 OS::SignalCodeMovingGC(); 1302 OS::SignalCodeMovingGC();
1198 } 1303 }
1199 1304
1200 1305
1306 void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) {
1307 name_buffer_.Init(Logger::REG_EXP_TAG);
1308 name_buffer_.AppendString(source);
1309 LogRecordedBuffer(code, NULL, &name_buffer_);
1310 }
1311
1312
1201 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { 1313 void Logger::RegExpCodeCreateEvent(Code* code, String* source) {
1202 if (!is_logging_code_events()) return; 1314 if (!is_logging_code_events()) return;
1203 if (FLAG_ll_prof || Serializer::enabled() || jit_logger_ != NULL) { 1315
1204 InitNameBuffer(REG_EXP_TAG); 1316 JIT_LOG(RegExpCodeCreateEvent(code, source));
1205 name_buffer_->AppendString(source); 1317 LL_LOG(RegExpCodeCreateEvent(code, source));
1206 LogRecordedBuffer(code, NULL); 1318 CODE_ADDRESS_MAP(RegExpCodeCreateEvent(code, source));
1207 }
1208 1319
1209 if (!FLAG_log_code || !log_->IsEnabled()) return; 1320 if (!FLAG_log_code || !log_->IsEnabled()) return;
1210 Log::MessageBuilder msg(log_); 1321 Log::MessageBuilder msg(log_);
1211 AppendCodeCreateHeader(&msg, REG_EXP_TAG, code); 1322 AppendCodeCreateHeader(&msg, REG_EXP_TAG, code);
1212 msg.Append('"'); 1323 msg.Append('"');
1213 msg.AppendDetailed(source, false); 1324 msg.AppendDetailed(source, false);
1214 msg.Append('"'); 1325 msg.Append('"');
1215 msg.Append('\n'); 1326 msg.Append('\n');
1216 msg.WriteToLogFile(); 1327 msg.WriteToLogFile();
1217 } 1328 }
1218 1329
1219 1330
1220 void Logger::CodeMoveEvent(Address from, Address to) { 1331 void Logger::CodeMoveEvent(Address from, Address to) {
1221 JIT_LOG(CodeMovedEvent(from, to)); 1332 JIT_LOG(CodeMovedEvent(from, to));
1222 if (!log_->IsEnabled()) return; 1333 if (!log_->IsEnabled()) return;
1223 LL_LOG(CodeMoveEvent(from, to)); 1334 LL_LOG(CodeMoveEvent(from, to));
1224 if (Serializer::enabled() && address_to_name_map_ != NULL) { 1335 CODE_ADDRESS_MAP(CodeMoveEvent(from, to));
1225 address_to_name_map_->Move(from, to);
1226 }
1227 MoveEventInternal(CODE_MOVE_EVENT, from, to); 1336 MoveEventInternal(CODE_MOVE_EVENT, from, to);
1228 } 1337 }
1229 1338
1230 1339
1231 void Logger::CodeDeleteEvent(Address from) { 1340 void Logger::CodeDeleteEvent(Address from) {
1232 JIT_LOG(CodeRemovedEvent(from)); 1341 JIT_LOG(CodeDeleteEvent(from));
1233 if (!log_->IsEnabled()) return; 1342 if (!log_->IsEnabled()) return;
1234 LL_LOG(CodeDeleteEvent(from)); 1343 LL_LOG(CodeDeleteEvent(from));
1235 if (Serializer::enabled() && address_to_name_map_ != NULL) { 1344 CODE_ADDRESS_MAP(CodeDeleteEvent(from));
1236 address_to_name_map_->Remove(from);
1237 }
1238 DeleteEventInternal(CODE_DELETE_EVENT, from); 1345 DeleteEventInternal(CODE_DELETE_EVENT, from);
1239 } 1346 }
1240 1347
1348
1241 void Logger::CodeLinePosInfoAddPositionEvent(void* jit_handler_data, 1349 void Logger::CodeLinePosInfoAddPositionEvent(void* jit_handler_data,
1242 int pc_offset, 1350 int pc_offset,
1243 int position) { 1351 int position) {
1244 JIT_LOG(AddCodeLinePosInfoEvent(jit_handler_data, 1352 JIT_LOG(AddCodeLinePosInfoEvent(jit_handler_data,
1245 pc_offset, 1353 pc_offset,
1246 position, 1354 position,
1247 JitCodeEvent::POSITION)); 1355 JitCodeEvent::POSITION));
1248 } 1356 }
1249 1357
1358
1250 void Logger::CodeLinePosInfoAddStatementPositionEvent(void* jit_handler_data, 1359 void Logger::CodeLinePosInfoAddStatementPositionEvent(void* jit_handler_data,
1251 int pc_offset, 1360 int pc_offset,
1252 int position) { 1361 int position) {
1253 JIT_LOG(AddCodeLinePosInfoEvent(jit_handler_data, 1362 JIT_LOG(AddCodeLinePosInfoEvent(jit_handler_data,
1254 pc_offset, 1363 pc_offset,
1255 position, 1364 position,
1256 JitCodeEvent::STATEMENT_POSITION)); 1365 JitCodeEvent::STATEMENT_POSITION));
1257 } 1366 }
1258 1367
1259 1368
1260 void Logger::CodeStartLinePosInfoRecordEvent(PositionsRecorder* pos_recorder) { 1369 void Logger::CodeStartLinePosInfoRecordEvent(PositionsRecorder* pos_recorder) {
1261 if (jit_logger_ != NULL) { 1370 if (jit_logger_ != NULL) {
1262 pos_recorder->AttachJITHandlerData(jit_logger_->StartCodePosInfoEvent()); 1371 pos_recorder->AttachJITHandlerData(jit_logger_->StartCodePosInfoEvent());
1263 } 1372 }
1264 } 1373 }
1265 1374
1375
1266 void Logger::CodeEndLinePosInfoRecordEvent(Code* code, 1376 void Logger::CodeEndLinePosInfoRecordEvent(Code* code,
1267 void* jit_handler_data) { 1377 void* jit_handler_data) {
1268 JIT_LOG(EndCodePosInfoEvent(code, jit_handler_data)); 1378 JIT_LOG(EndCodePosInfoEvent(code, jit_handler_data));
1269 } 1379 }
1270 1380
1271 1381
1272 void Logger::SnapshotPositionEvent(Address addr, int pos) { 1382 void Logger::SnapshotPositionEvent(Address addr, int pos) {
1273 if (!log_->IsEnabled()) return; 1383 if (!log_->IsEnabled()) return;
1274 LL_LOG(SnapshotPositionEvent(addr, pos)); 1384 LL_LOG(SnapshotPositionEvent(addr, pos));
1275 if (Serializer::enabled() && address_to_name_map_ != NULL) { 1385 if (Serializer::enabled()) {
1276 const char* code_name = address_to_name_map_->Lookup(addr); 1386 const char* code_name = code_address_map_->Lookup(addr);
1277 if (code_name == NULL) return; // Not a code object. 1387 if (code_name == NULL) return; // Not a code object.
1278 Log::MessageBuilder msg(log_); 1388 Log::MessageBuilder msg(log_);
1279 msg.Append("%s,%d,", kLogEventsNames[SNAPSHOT_CODE_NAME_EVENT], pos); 1389 msg.Append("%s,%d,", kLogEventsNames[SNAPSHOT_CODE_NAME_EVENT], pos);
1280 msg.AppendDoubleQuotedString(code_name); 1390 msg.AppendDoubleQuotedString(code_name);
1281 msg.Append("\n"); 1391 msg.Append("\n");
1282 msg.WriteToLogFile(); 1392 msg.WriteToLogFile();
1283 } 1393 }
1284 if (!FLAG_log_snapshot_positions) return; 1394 if (!FLAG_log_snapshot_positions) return;
1285 Log::MessageBuilder msg(log_); 1395 Log::MessageBuilder msg(log_);
1286 msg.Append("%s,", kLogEventsNames[SNAPSHOT_POSITION_EVENT]); 1396 msg.Append("%s,", kLogEventsNames[SNAPSHOT_POSITION_EVENT]);
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1602 description = "A keyed call IC from the snapshot"; 1712 description = "A keyed call IC from the snapshot";
1603 tag = Logger::KEYED_CALL_IC_TAG; 1713 tag = Logger::KEYED_CALL_IC_TAG;
1604 break; 1714 break;
1605 case Code::NUMBER_OF_KINDS: 1715 case Code::NUMBER_OF_KINDS:
1606 break; 1716 break;
1607 } 1717 }
1608 PROFILE(isolate_, CodeCreateEvent(tag, code_object, description)); 1718 PROFILE(isolate_, CodeCreateEvent(tag, code_object, description));
1609 } 1719 }
1610 1720
1611 1721
1612 void Logger::RegisterSnapshotCodeName(Code* code,
1613 const char* name,
1614 int name_size) {
1615 ASSERT(Serializer::enabled());
1616 if (address_to_name_map_ == NULL) {
1617 address_to_name_map_ = new NameMap;
1618 }
1619 address_to_name_map_->Insert(code->address(), name, name_size);
1620 }
1621
1622
1623 LowLevelLogger::LowLevelLogger(const char* name) 1722 LowLevelLogger::LowLevelLogger(const char* name)
1624 : ll_output_handle_(NULL) { 1723 : ll_output_handle_(NULL) {
1625 // Open the low-level log file. 1724 // Open the low-level log file.
1626 size_t len = strlen(name); 1725 size_t len = strlen(name);
1627 ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLogExt))); 1726 ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLogExt)));
1628 OS::MemCopy(ll_name.start(), name, len); 1727 OS::MemCopy(ll_name.start(), name, len);
1629 OS::MemCopy(ll_name.start() + len, kLogExt, sizeof(kLogExt)); 1728 OS::MemCopy(ll_name.start() + len, kLogExt, sizeof(kLogExt));
1630 ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode); 1729 ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode);
1631 setvbuf(ll_output_handle_, NULL, _IOFBF, kLogBufferSize); 1730 setvbuf(ll_output_handle_, NULL, _IOFBF, kLogBufferSize);
1632 1731
(...skipping 15 matching lines...) Expand all
1648 #elif V8_TARGET_ARCH_ARM 1747 #elif V8_TARGET_ARCH_ARM
1649 const char arch[] = "arm"; 1748 const char arch[] = "arm";
1650 #elif V8_TARGET_ARCH_MIPS 1749 #elif V8_TARGET_ARCH_MIPS
1651 const char arch[] = "mips"; 1750 const char arch[] = "mips";
1652 #else 1751 #else
1653 const char arch[] = "unknown"; 1752 const char arch[] = "unknown";
1654 #endif 1753 #endif
1655 LogWriteBytes(arch, sizeof(arch)); 1754 LogWriteBytes(arch, sizeof(arch));
1656 } 1755 }
1657 1756
1658 void LowLevelLogger::CodeCreateEvent(Code* code, 1757
1659 const char* name, 1758 void LowLevelLogger::LogRecordedBuffer(Code* code,
1660 int name_size) { 1759 SharedFunctionInfo*,
1760 NameBuffer* name_buffer) {
1661 CodeCreateStruct event; 1761 CodeCreateStruct event;
1662 event.name_size = name_size; 1762 event.name_size = name_buffer->size();
1663 event.code_address = code->instruction_start(); 1763 event.code_address = code->instruction_start();
1664 ASSERT(event.code_address == code->address() + Code::kHeaderSize); 1764 ASSERT(event.code_address == code->address() + Code::kHeaderSize);
1665 event.code_size = code->instruction_size(); 1765 event.code_size = code->instruction_size();
1666 LogWriteStruct(event); 1766 LogWriteStruct(event);
1667 LogWriteBytes(name, name_size); 1767 LogWriteBytes(name_buffer->get(), name_buffer->size());
1668 LogWriteBytes( 1768 LogWriteBytes(
1669 reinterpret_cast<const char*>(code->instruction_start()), 1769 reinterpret_cast<const char*>(code->instruction_start()),
1670 code->instruction_size()); 1770 code->instruction_size());
1671 } 1771 }
1672 1772
1673 1773
1674 void LowLevelLogger::CodeMoveEvent(Address from, Address to) { 1774 void LowLevelLogger::CodeMoveEvent(Address from, Address to) {
1675 CodeMoveStruct event; 1775 CodeMoveStruct event;
1676 event.from_address = from + Code::kHeaderSize; 1776 event.from_address = from + Code::kHeaderSize;
1677 event.to_address = to + Code::kHeaderSize; 1777 event.to_address = to + Code::kHeaderSize;
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after
1960 2060
1961 if (jit_logger_) { 2061 if (jit_logger_) {
1962 delete jit_logger_; 2062 delete jit_logger_;
1963 jit_logger_ = NULL; 2063 jit_logger_ = NULL;
1964 } 2064 }
1965 2065
1966 return log_->Close(); 2066 return log_->Close();
1967 } 2067 }
1968 2068
1969 } } // namespace v8::internal 2069 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/log.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698