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

Side by Side Diff: src/log.cc

Issue 19724004: Logger: reorder methods in log.cc (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: 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 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 // ComputeMarker must only be used when SharedFunctionInfo is known.
58 static const char* ComputeMarker(Code* code) {
59 switch (code->kind()) {
60 case Code::FUNCTION: return code->optimizable() ? "~" : "";
61 case Code::OPTIMIZED_FUNCTION: return "*";
62 default: return "";
63 }
64 }
65
66
57 class CodeEventLogger { 67 class CodeEventLogger {
58 public: 68 public:
59 virtual ~CodeEventLogger() { } 69 virtual ~CodeEventLogger() { }
60 70
61 void CodeCreateEvent(Logger::LogEventsAndTags tag, 71 void CodeCreateEvent(Logger::LogEventsAndTags tag,
62 Code* code, 72 Code* code,
63 const char* comment); 73 const char* comment);
64 void CodeCreateEvent(Logger::LogEventsAndTags tag, 74 void CodeCreateEvent(Logger::LogEventsAndTags tag,
65 Code* code, 75 Code* code,
66 Name* name); 76 Name* name);
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 188
179 private: 189 private:
180 virtual void LogRecordedBuffer(Code* code, 190 virtual void LogRecordedBuffer(Code* code,
181 SharedFunctionInfo* shared, 191 SharedFunctionInfo* shared,
182 NameBuffer* name_buffer) = 0; 192 NameBuffer* name_buffer) = 0;
183 193
184 NameBuffer name_buffer_; 194 NameBuffer name_buffer_;
185 }; 195 };
186 196
187 197
198 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
199 Code* code,
200 const char* comment) {
201 name_buffer_.Init(tag);
202 name_buffer_.AppendBytes(comment);
203 LogRecordedBuffer(code, NULL, &name_buffer_);
204 }
205
206
207 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
208 Code* code,
209 Name* name) {
210 name_buffer_.Init(tag);
211 name_buffer_.AppendName(name);
212 LogRecordedBuffer(code, NULL, &name_buffer_);
213 }
214
215
216 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
217 Code* code,
218 SharedFunctionInfo* shared,
219 CompilationInfo* info,
220 Name* name) {
221 name_buffer_.Init(tag);
222 name_buffer_.AppendBytes(ComputeMarker(code));
223 name_buffer_.AppendName(name);
224 LogRecordedBuffer(code, shared, &name_buffer_);
225 }
226
227
228 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
229 Code* code,
230 SharedFunctionInfo* shared,
231 CompilationInfo* info,
232 Name* source, int line) {
233 name_buffer_.Init(tag);
234 name_buffer_.AppendBytes(ComputeMarker(code));
235 name_buffer_.AppendString(shared->DebugName());
236 name_buffer_.AppendByte(' ');
237 if (source->IsString()) {
238 name_buffer_.AppendString(String::cast(source));
239 } else {
240 name_buffer_.AppendBytes("symbol(hash ");
241 name_buffer_.AppendHex(Name::cast(source)->Hash());
242 name_buffer_.AppendByte(')');
243 }
244 name_buffer_.AppendByte(':');
245 name_buffer_.AppendInt(line);
246 LogRecordedBuffer(code, shared, &name_buffer_);
247 }
248
249
250 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
251 Code* code,
252 int args_count) {
253 name_buffer_.Init(tag);
254 name_buffer_.AppendInt(args_count);
255 LogRecordedBuffer(code, NULL, &name_buffer_);
256 }
257
258
259 void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) {
260 name_buffer_.Init(Logger::REG_EXP_TAG);
261 name_buffer_.AppendString(source);
262 LogRecordedBuffer(code, NULL, &name_buffer_);
263 }
264
265
188 // Low-level logging support. 266 // Low-level logging support.
189 class LowLevelLogger : public CodeEventLogger { 267 class LowLevelLogger : public CodeEventLogger {
190 public: 268 public:
191 explicit LowLevelLogger(const char* file_name); 269 explicit LowLevelLogger(const char* file_name);
192 virtual ~LowLevelLogger(); 270 virtual ~LowLevelLogger();
193 271
194 void CodeMoveEvent(Address from, Address to); 272 void CodeMoveEvent(Address from, Address to);
195 void CodeDeleteEvent(Address from); 273 void CodeDeleteEvent(Address from);
196 void SnapshotPositionEvent(Address addr, int pos); 274 void SnapshotPositionEvent(Address addr, int pos);
197 void CodeMovingGCEvent(); 275 void CodeMovingGCEvent();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 char tag = T::kTag; 330 char tag = T::kTag;
253 LogWriteBytes(reinterpret_cast<const char*>(&tag), sizeof(tag)); 331 LogWriteBytes(reinterpret_cast<const char*>(&tag), sizeof(tag));
254 LogWriteBytes(reinterpret_cast<const char*>(&s), sizeof(s)); 332 LogWriteBytes(reinterpret_cast<const char*>(&s), sizeof(s));
255 } 333 }
256 334
257 FILE* ll_output_handle_; 335 FILE* ll_output_handle_;
258 }; 336 };
259 337
260 const char LowLevelLogger::kLogExt[] = ".ll"; 338 const char LowLevelLogger::kLogExt[] = ".ll";
261 339
340 LowLevelLogger::LowLevelLogger(const char* name)
341 : ll_output_handle_(NULL) {
342 // Open the low-level log file.
343 size_t len = strlen(name);
344 ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLogExt)));
345 OS::MemCopy(ll_name.start(), name, len);
346 OS::MemCopy(ll_name.start() + len, kLogExt, sizeof(kLogExt));
347 ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode);
348 setvbuf(ll_output_handle_, NULL, _IOFBF, kLogBufferSize);
349
350 LogCodeInfo();
351 }
352
353
354 LowLevelLogger::~LowLevelLogger() {
355 fclose(ll_output_handle_);
356 ll_output_handle_ = NULL;
357 }
358
359
360 void LowLevelLogger::LogCodeInfo() {
361 #if V8_TARGET_ARCH_IA32
362 const char arch[] = "ia32";
363 #elif V8_TARGET_ARCH_X64
364 const char arch[] = "x64";
365 #elif V8_TARGET_ARCH_ARM
366 const char arch[] = "arm";
367 #elif V8_TARGET_ARCH_MIPS
368 const char arch[] = "mips";
369 #else
370 const char arch[] = "unknown";
371 #endif
372 LogWriteBytes(arch, sizeof(arch));
373 }
374
375
376 void LowLevelLogger::LogRecordedBuffer(Code* code,
377 SharedFunctionInfo*,
378 NameBuffer* name_buffer) {
379 CodeCreateStruct event;
380 event.name_size = name_buffer->size();
381 event.code_address = code->instruction_start();
382 ASSERT(event.code_address == code->address() + Code::kHeaderSize);
383 event.code_size = code->instruction_size();
384 LogWriteStruct(event);
385 LogWriteBytes(name_buffer->get(), name_buffer->size());
386 LogWriteBytes(
387 reinterpret_cast<const char*>(code->instruction_start()),
388 code->instruction_size());
389 }
390
391
392 void LowLevelLogger::CodeMoveEvent(Address from, Address to) {
393 CodeMoveStruct event;
394 event.from_address = from + Code::kHeaderSize;
395 event.to_address = to + Code::kHeaderSize;
396 LogWriteStruct(event);
397 }
398
399
400 void LowLevelLogger::CodeDeleteEvent(Address from) {
401 CodeDeleteStruct event;
402 event.address = from + Code::kHeaderSize;
403 LogWriteStruct(event);
404 }
405
406
407 void LowLevelLogger::SnapshotPositionEvent(Address addr, int pos) {
408 SnapshotPositionStruct event;
409 event.address = addr + Code::kHeaderSize;
410 event.position = pos;
411 LogWriteStruct(event);
412 }
413
414
415 void LowLevelLogger::LogWriteBytes(const char* bytes, int size) {
416 size_t rv = fwrite(bytes, 1, size, ll_output_handle_);
417 ASSERT(static_cast<size_t>(size) == rv);
418 USE(rv);
419 }
420
421
422 void LowLevelLogger::CodeMovingGCEvent() {
423 const char tag = kCodeMovingGCTag;
424
425 LogWriteBytes(&tag, sizeof(tag));
426 }
427
428
262 #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call; 429 #define LL_LOG(Call) if (ll_logger_) ll_logger_->Call;
263 430
264 431
265 class CodeAddressMap: public CodeEventLogger { 432 class CodeAddressMap: public CodeEventLogger {
266 public: 433 public:
267 CodeAddressMap() { } 434 CodeAddressMap() { }
268 virtual ~CodeAddressMap() { } 435 virtual ~CodeAddressMap() { }
269 436
270 void CodeMoveEvent(Address from, Address to) { 437 void CodeMoveEvent(Address from, Address to) {
271 address_to_name_map_.Move(from, to); 438 address_to_name_map_.Move(from, to);
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 } 532 }
366 533
367 NameMap address_to_name_map_; 534 NameMap address_to_name_map_;
368 }; 535 };
369 536
370 537
371 #define CODE_ADDRESS_MAP_LOG(Call)\ 538 #define CODE_ADDRESS_MAP_LOG(Call)\
372 if (Serializer::enabled()) code_address_map_->Call; 539 if (Serializer::enabled()) code_address_map_->Call;
373 540
374 541
542 class JitLogger : public CodeEventLogger {
543 public:
544 explicit JitLogger(JitCodeEventHandler code_event_handler);
545
546 void CodeMovedEvent(Address from, Address to);
547 void CodeDeleteEvent(Address from);
548 void AddCodeLinePosInfoEvent(
549 void* jit_handler_data,
550 int pc_offset,
551 int position,
552 JitCodeEvent::PositionType position_type);
553 void* StartCodePosInfoEvent();
554 void EndCodePosInfoEvent(Code* code, void* jit_handler_data);
555
556 private:
557 virtual void LogRecordedBuffer(Code* code,
558 SharedFunctionInfo* shared,
559 CodeEventLogger::NameBuffer* name_buffer);
560
561 JitCodeEventHandler code_event_handler_;
562 };
563
564 #define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
565
566
567 JitLogger::JitLogger(JitCodeEventHandler code_event_handler)
568 : code_event_handler_(code_event_handler) {
569 }
570
571
572 void JitLogger::LogRecordedBuffer(Code* code,
573 SharedFunctionInfo* shared,
574 CodeEventLogger::NameBuffer* name_buffer) {
575 JitCodeEvent event;
576 memset(&event, 0, sizeof(event));
577 event.type = JitCodeEvent::CODE_ADDED;
578 event.code_start = code->instruction_start();
579 event.code_len = code->instruction_size();
580 Handle<Script> script_handle;
581 if (shared && shared->script()->IsScript()) {
582 script_handle = Handle<Script>(Script::cast(shared->script()));
583 }
584 event.script = ToApiHandle<v8::Script>(script_handle);
585 event.name.str = name_buffer->get();
586 event.name.len = name_buffer->size();
587 code_event_handler_(&event);
588 }
589
590
591 void JitLogger::CodeMovedEvent(Address from, Address to) {
592 Code* from_code = Code::cast(HeapObject::FromAddress(from));
593
594 JitCodeEvent event;
595 event.type = JitCodeEvent::CODE_MOVED;
596 event.code_start = from_code->instruction_start();
597 event.code_len = from_code->instruction_size();
598
599 // Calculate the header size.
600 const size_t header_size =
601 from_code->instruction_start() - reinterpret_cast<byte*>(from_code);
602
603 // Calculate the new start address of the instructions.
604 event.new_code_start =
605 reinterpret_cast<byte*>(HeapObject::FromAddress(to)) + header_size;
606
607 code_event_handler_(&event);
608 }
609
610
611 void JitLogger::CodeDeleteEvent(Address from) {
612 Code* from_code = Code::cast(HeapObject::FromAddress(from));
613
614 JitCodeEvent event;
615 event.type = JitCodeEvent::CODE_REMOVED;
616 event.code_start = from_code->instruction_start();
617 event.code_len = from_code->instruction_size();
618
619 code_event_handler_(&event);
620 }
621
622 void JitLogger::AddCodeLinePosInfoEvent(
623 void* jit_handler_data,
624 int pc_offset,
625 int position,
626 JitCodeEvent::PositionType position_type) {
627 JitCodeEvent event;
628 memset(&event, 0, sizeof(event));
629 event.type = JitCodeEvent::CODE_ADD_LINE_POS_INFO;
630 event.user_data = jit_handler_data;
631 event.line_info.offset = pc_offset;
632 event.line_info.pos = position;
633 event.line_info.position_type = position_type;
634
635 code_event_handler_(&event);
636 }
637
638
639 void* JitLogger::StartCodePosInfoEvent() {
640 JitCodeEvent event;
641 memset(&event, 0, sizeof(event));
642 event.type = JitCodeEvent::CODE_START_LINE_INFO_RECORDING;
643
644 code_event_handler_(&event);
645 return event.user_data;
646 }
647
648
649 void JitLogger::EndCodePosInfoEvent(Code* code, void* jit_handler_data) {
650 JitCodeEvent event;
651 memset(&event, 0, sizeof(event));
652 event.type = JitCodeEvent::CODE_END_LINE_INFO_RECORDING;
653 event.code_start = code->instruction_start();
654 event.user_data = jit_handler_data;
655
656 code_event_handler_(&event);
657 }
658
659
375 // The Profiler samples pc and sp values for the main thread. 660 // The Profiler samples pc and sp values for the main thread.
376 // Each sample is appended to a circular buffer. 661 // Each sample is appended to a circular buffer.
377 // An independent thread removes data and writes it to the log. 662 // An independent thread removes data and writes it to the log.
378 // This design minimizes the time spent in the sampler. 663 // This design minimizes the time spent in the sampler.
379 // 664 //
380 class Profiler: public Thread { 665 class Profiler: public Thread {
381 public: 666 public:
382 explicit Profiler(Isolate* isolate); 667 explicit Profiler(Isolate* isolate);
383 void Engage(); 668 void Engage();
384 void Disengage(); 669 void Disengage();
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 epoch_(0) { 846 epoch_(0) {
562 } 847 }
563 848
564 849
565 Logger::~Logger() { 850 Logger::~Logger() {
566 delete code_address_map_; 851 delete code_address_map_;
567 delete log_; 852 delete log_;
568 } 853 }
569 854
570 855
571 class JitLogger : public CodeEventLogger {
572 public:
573 explicit JitLogger(JitCodeEventHandler code_event_handler);
574
575 void CodeMovedEvent(Address from, Address to);
576 void CodeDeleteEvent(Address from);
577 void AddCodeLinePosInfoEvent(
578 void* jit_handler_data,
579 int pc_offset,
580 int position,
581 JitCodeEvent::PositionType position_type);
582 void* StartCodePosInfoEvent();
583 void EndCodePosInfoEvent(Code* code, void* jit_handler_data);
584
585 private:
586 virtual void LogRecordedBuffer(Code* code,
587 SharedFunctionInfo* shared,
588 CodeEventLogger::NameBuffer* name_buffer);
589
590 JitCodeEventHandler code_event_handler_;
591 };
592
593 #define JIT_LOG(Call) if (jit_logger_) jit_logger_->Call;
594
595
596 JitLogger::JitLogger(JitCodeEventHandler code_event_handler)
597 : code_event_handler_(code_event_handler) {
598 }
599
600
601 void JitLogger::LogRecordedBuffer(Code* code,
602 SharedFunctionInfo* shared,
603 CodeEventLogger::NameBuffer* name_buffer) {
604 JitCodeEvent event;
605 memset(&event, 0, sizeof(event));
606 event.type = JitCodeEvent::CODE_ADDED;
607 event.code_start = code->instruction_start();
608 event.code_len = code->instruction_size();
609 Handle<Script> script_handle;
610 if (shared && shared->script()->IsScript()) {
611 script_handle = Handle<Script>(Script::cast(shared->script()));
612 }
613 event.script = ToApiHandle<v8::Script>(script_handle);
614 event.name.str = name_buffer->get();
615 event.name.len = name_buffer->size();
616 code_event_handler_(&event);
617 }
618
619
620 void JitLogger::CodeMovedEvent(Address from, Address to) {
621 Code* from_code = Code::cast(HeapObject::FromAddress(from));
622
623 JitCodeEvent event;
624 event.type = JitCodeEvent::CODE_MOVED;
625 event.code_start = from_code->instruction_start();
626 event.code_len = from_code->instruction_size();
627
628 // Calculate the header size.
629 const size_t header_size =
630 from_code->instruction_start() - reinterpret_cast<byte*>(from_code);
631
632 // Calculate the new start address of the instructions.
633 event.new_code_start =
634 reinterpret_cast<byte*>(HeapObject::FromAddress(to)) + header_size;
635
636 code_event_handler_(&event);
637 }
638
639
640 void JitLogger::CodeDeleteEvent(Address from) {
641 Code* from_code = Code::cast(HeapObject::FromAddress(from));
642
643 JitCodeEvent event;
644 event.type = JitCodeEvent::CODE_REMOVED;
645 event.code_start = from_code->instruction_start();
646 event.code_len = from_code->instruction_size();
647
648 code_event_handler_(&event);
649 }
650
651 void JitLogger::AddCodeLinePosInfoEvent(
652 void* jit_handler_data,
653 int pc_offset,
654 int position,
655 JitCodeEvent::PositionType position_type) {
656 JitCodeEvent event;
657 memset(&event, 0, sizeof(event));
658 event.type = JitCodeEvent::CODE_ADD_LINE_POS_INFO;
659 event.user_data = jit_handler_data;
660 event.line_info.offset = pc_offset;
661 event.line_info.pos = position;
662 event.line_info.position_type = position_type;
663
664 code_event_handler_(&event);
665 }
666
667
668 void* JitLogger::StartCodePosInfoEvent() {
669 JitCodeEvent event;
670 memset(&event, 0, sizeof(event));
671 event.type = JitCodeEvent::CODE_START_LINE_INFO_RECORDING;
672
673 code_event_handler_(&event);
674 return event.user_data;
675 }
676
677
678 void JitLogger::EndCodePosInfoEvent(Code* code, void* jit_handler_data) {
679 JitCodeEvent event;
680 memset(&event, 0, sizeof(event));
681 event.type = JitCodeEvent::CODE_END_LINE_INFO_RECORDING;
682 event.code_start = code->instruction_start();
683 event.user_data = jit_handler_data;
684
685 code_event_handler_(&event);
686 }
687
688
689 void Logger::ProfilerBeginEvent() { 856 void Logger::ProfilerBeginEvent() {
690 if (!log_->IsEnabled()) return; 857 if (!log_->IsEnabled()) return;
691 Log::MessageBuilder msg(log_); 858 Log::MessageBuilder msg(log_);
692 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs); 859 msg.Append("profiler,\"begin\",%d\n", kSamplingIntervalMs);
693 msg.WriteToLogFile(); 860 msg.WriteToLogFile();
694 } 861 }
695 862
696 863
697 void Logger::StringEvent(const char* name, const char* value) { 864 void Logger::StringEvent(const char* name, const char* value) {
698 if (FLAG_log) UncheckedStringEvent(name, value); 865 if (FLAG_log) UncheckedStringEvent(name, value);
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
1091 ASSERT(msg); 1258 ASSERT(msg);
1092 msg->Append("%s,%s,%d,", 1259 msg->Append("%s,%s,%d,",
1093 kLogEventsNames[Logger::CODE_CREATION_EVENT], 1260 kLogEventsNames[Logger::CODE_CREATION_EVENT],
1094 kLogEventsNames[tag], 1261 kLogEventsNames[tag],
1095 code->kind()); 1262 code->kind());
1096 msg->AppendAddress(code->address()); 1263 msg->AppendAddress(code->address());
1097 msg->Append(",%d,", code->ExecutableSize()); 1264 msg->Append(",%d,", code->ExecutableSize());
1098 } 1265 }
1099 1266
1100 1267
1101 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1102 Code* code,
1103 const char* comment) {
1104 name_buffer_.Init(tag);
1105 name_buffer_.AppendBytes(comment);
1106 LogRecordedBuffer(code, NULL, &name_buffer_);
1107 }
1108
1109
1110 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1268 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1111 Code* code, 1269 Code* code,
1112 const char* comment) { 1270 const char* comment) {
1113 if (!is_logging_code_events()) return; 1271 if (!is_logging_code_events()) return;
1114 1272
1115 JIT_LOG(CodeCreateEvent(tag, code, comment)); 1273 JIT_LOG(CodeCreateEvent(tag, code, comment));
1116 LL_LOG(CodeCreateEvent(tag, code, comment)); 1274 LL_LOG(CodeCreateEvent(tag, code, comment));
1117 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, comment)); 1275 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, comment));
1118 1276
1119 if (!FLAG_log_code || !log_->IsEnabled()) return; 1277 if (!FLAG_log_code || !log_->IsEnabled()) return;
1120 Log::MessageBuilder msg(log_); 1278 Log::MessageBuilder msg(log_);
1121 AppendCodeCreateHeader(&msg, tag, code); 1279 AppendCodeCreateHeader(&msg, tag, code);
1122 msg.AppendDoubleQuotedString(comment); 1280 msg.AppendDoubleQuotedString(comment);
1123 msg.Append('\n'); 1281 msg.Append('\n');
1124 msg.WriteToLogFile(); 1282 msg.WriteToLogFile();
1125 } 1283 }
1126 1284
1127 1285
1128 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1129 Code* code,
1130 Name* name) {
1131 name_buffer_.Init(tag);
1132 name_buffer_.AppendName(name);
1133 LogRecordedBuffer(code, NULL, &name_buffer_);
1134 }
1135
1136
1137 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1286 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1138 Code* code, 1287 Code* code,
1139 Name* name) { 1288 Name* name) {
1140 if (!is_logging_code_events()) return; 1289 if (!is_logging_code_events()) return;
1141 1290
1142 JIT_LOG(CodeCreateEvent(tag, code, name)); 1291 JIT_LOG(CodeCreateEvent(tag, code, name));
1143 LL_LOG(CodeCreateEvent(tag, code, name)); 1292 LL_LOG(CodeCreateEvent(tag, code, name));
1144 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, name)); 1293 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, name));
1145 1294
1146 if (!FLAG_log_code || !log_->IsEnabled()) return; 1295 if (!FLAG_log_code || !log_->IsEnabled()) return;
1147 Log::MessageBuilder msg(log_); 1296 Log::MessageBuilder msg(log_);
1148 AppendCodeCreateHeader(&msg, tag, code); 1297 AppendCodeCreateHeader(&msg, tag, code);
1149 if (name->IsString()) { 1298 if (name->IsString()) {
1150 msg.Append('"'); 1299 msg.Append('"');
1151 msg.AppendDetailed(String::cast(name), false); 1300 msg.AppendDetailed(String::cast(name), false);
1152 msg.Append('"'); 1301 msg.Append('"');
1153 } else { 1302 } else {
1154 msg.AppendSymbolName(Symbol::cast(name)); 1303 msg.AppendSymbolName(Symbol::cast(name));
1155 } 1304 }
1156 msg.Append('\n'); 1305 msg.Append('\n');
1157 msg.WriteToLogFile(); 1306 msg.WriteToLogFile();
1158 } 1307 }
1159 1308
1160 1309
1161 // ComputeMarker must only be used when SharedFunctionInfo is known.
1162 static const char* ComputeMarker(Code* code) {
1163 switch (code->kind()) {
1164 case Code::FUNCTION: return code->optimizable() ? "~" : "";
1165 case Code::OPTIMIZED_FUNCTION: return "*";
1166 default: return "";
1167 }
1168 }
1169
1170
1171 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1172 Code* code,
1173 SharedFunctionInfo* shared,
1174 CompilationInfo* info,
1175 Name* name) {
1176 name_buffer_.Init(tag);
1177 name_buffer_.AppendBytes(ComputeMarker(code));
1178 name_buffer_.AppendName(name);
1179 LogRecordedBuffer(code, shared, &name_buffer_);
1180 }
1181
1182
1183 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1310 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1184 Code* code, 1311 Code* code,
1185 SharedFunctionInfo* shared, 1312 SharedFunctionInfo* shared,
1186 CompilationInfo* info, 1313 CompilationInfo* info,
1187 Name* name) { 1314 Name* name) {
1188 if (!is_logging_code_events()) return; 1315 if (!is_logging_code_events()) return;
1189 1316
1190 JIT_LOG(CodeCreateEvent(tag, code, shared, info, name)); 1317 JIT_LOG(CodeCreateEvent(tag, code, shared, info, name));
1191 LL_LOG(CodeCreateEvent(tag, code, shared, info, name)); 1318 LL_LOG(CodeCreateEvent(tag, code, shared, info, name));
1192 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, shared, info, name)); 1319 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, shared, info, name));
(...skipping 16 matching lines...) Expand all
1209 msg.AppendAddress(shared->address()); 1336 msg.AppendAddress(shared->address());
1210 msg.Append(",%s", ComputeMarker(code)); 1337 msg.Append(",%s", ComputeMarker(code));
1211 msg.Append('\n'); 1338 msg.Append('\n');
1212 msg.WriteToLogFile(); 1339 msg.WriteToLogFile();
1213 } 1340 }
1214 1341
1215 1342
1216 // Although, it is possible to extract source and line from 1343 // Although, it is possible to extract source and line from
1217 // the SharedFunctionInfo object, we left it to caller 1344 // the SharedFunctionInfo object, we left it to caller
1218 // to leave logging functions free from heap allocations. 1345 // to leave logging functions free from heap allocations.
1219 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1220 Code* code,
1221 SharedFunctionInfo* shared,
1222 CompilationInfo* info,
1223 Name* source, int line) {
1224 name_buffer_.Init(tag);
1225 name_buffer_.AppendBytes(ComputeMarker(code));
1226 name_buffer_.AppendString(shared->DebugName());
1227 name_buffer_.AppendByte(' ');
1228 if (source->IsString()) {
1229 name_buffer_.AppendString(String::cast(source));
1230 } else {
1231 name_buffer_.AppendBytes("symbol(hash ");
1232 name_buffer_.AppendHex(Name::cast(source)->Hash());
1233 name_buffer_.AppendByte(')');
1234 }
1235 name_buffer_.AppendByte(':');
1236 name_buffer_.AppendInt(line);
1237 LogRecordedBuffer(code, shared, &name_buffer_);
1238 }
1239
1240
1241 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1346 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1242 Code* code, 1347 Code* code,
1243 SharedFunctionInfo* shared, 1348 SharedFunctionInfo* shared,
1244 CompilationInfo* info, 1349 CompilationInfo* info,
1245 Name* source, int line) { 1350 Name* source, int line) {
1246 if (!is_logging_code_events()) return; 1351 if (!is_logging_code_events()) return;
1247 1352
1248 JIT_LOG(CodeCreateEvent(tag, code, shared, info, source, line)); 1353 JIT_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1249 LL_LOG(CodeCreateEvent(tag, code, shared, info, source, line)); 1354 LL_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
1250 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, shared, info, source, line)); 1355 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, shared, info, source, line));
(...skipping 12 matching lines...) Expand all
1263 msg.AppendSymbolName(Symbol::cast(source)); 1368 msg.AppendSymbolName(Symbol::cast(source));
1264 } 1369 }
1265 msg.Append(":%d\",", line); 1370 msg.Append(":%d\",", line);
1266 msg.AppendAddress(shared->address()); 1371 msg.AppendAddress(shared->address());
1267 msg.Append(",%s", ComputeMarker(code)); 1372 msg.Append(",%s", ComputeMarker(code));
1268 msg.Append('\n'); 1373 msg.Append('\n');
1269 msg.WriteToLogFile(); 1374 msg.WriteToLogFile();
1270 } 1375 }
1271 1376
1272 1377
1273 void CodeEventLogger::CodeCreateEvent(Logger::LogEventsAndTags tag,
1274 Code* code,
1275 int args_count) {
1276 name_buffer_.Init(tag);
1277 name_buffer_.AppendInt(args_count);
1278 LogRecordedBuffer(code, NULL, &name_buffer_);
1279 }
1280
1281
1282 void Logger::CodeCreateEvent(LogEventsAndTags tag, 1378 void Logger::CodeCreateEvent(LogEventsAndTags tag,
1283 Code* code, 1379 Code* code,
1284 int args_count) { 1380 int args_count) {
1285 if (!is_logging_code_events()) return; 1381 if (!is_logging_code_events()) return;
1286 1382
1287 JIT_LOG(CodeCreateEvent(tag, code, args_count)); 1383 JIT_LOG(CodeCreateEvent(tag, code, args_count));
1288 LL_LOG(CodeCreateEvent(tag, code, args_count)); 1384 LL_LOG(CodeCreateEvent(tag, code, args_count));
1289 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, args_count)); 1385 CODE_ADDRESS_MAP_LOG(CodeCreateEvent(tag, code, args_count));
1290 1386
1291 if (!FLAG_log_code || !log_->IsEnabled()) return; 1387 if (!FLAG_log_code || !log_->IsEnabled()) return;
1292 Log::MessageBuilder msg(log_); 1388 Log::MessageBuilder msg(log_);
1293 AppendCodeCreateHeader(&msg, tag, code); 1389 AppendCodeCreateHeader(&msg, tag, code);
1294 msg.Append("\"args_count: %d\"", args_count); 1390 msg.Append("\"args_count: %d\"", args_count);
1295 msg.Append('\n'); 1391 msg.Append('\n');
1296 msg.WriteToLogFile(); 1392 msg.WriteToLogFile();
1297 } 1393 }
1298 1394
1299 1395
1300 void Logger::CodeMovingGCEvent() { 1396 void Logger::CodeMovingGCEvent() {
1301 if (!log_->IsEnabled() || !FLAG_ll_prof) return; 1397 if (!log_->IsEnabled() || !FLAG_ll_prof) return;
1302 LL_LOG(CodeMovingGCEvent()); 1398 LL_LOG(CodeMovingGCEvent());
1303 OS::SignalCodeMovingGC(); 1399 OS::SignalCodeMovingGC();
1304 } 1400 }
1305 1401
1306 1402
1307 void CodeEventLogger::RegExpCodeCreateEvent(Code* code, String* source) {
1308 name_buffer_.Init(Logger::REG_EXP_TAG);
1309 name_buffer_.AppendString(source);
1310 LogRecordedBuffer(code, NULL, &name_buffer_);
1311 }
1312
1313
1314 void Logger::RegExpCodeCreateEvent(Code* code, String* source) { 1403 void Logger::RegExpCodeCreateEvent(Code* code, String* source) {
1315 if (!is_logging_code_events()) return; 1404 if (!is_logging_code_events()) return;
1316 1405
1317 JIT_LOG(RegExpCodeCreateEvent(code, source)); 1406 JIT_LOG(RegExpCodeCreateEvent(code, source));
1318 LL_LOG(RegExpCodeCreateEvent(code, source)); 1407 LL_LOG(RegExpCodeCreateEvent(code, source));
1319 CODE_ADDRESS_MAP_LOG(RegExpCodeCreateEvent(code, source)); 1408 CODE_ADDRESS_MAP_LOG(RegExpCodeCreateEvent(code, source));
1320 1409
1321 if (!FLAG_log_code || !log_->IsEnabled()) return; 1410 if (!FLAG_log_code || !log_->IsEnabled()) return;
1322 Log::MessageBuilder msg(log_); 1411 Log::MessageBuilder msg(log_);
1323 AppendCodeCreateHeader(&msg, REG_EXP_TAG, code); 1412 AppendCodeCreateHeader(&msg, REG_EXP_TAG, code);
(...skipping 12 matching lines...) Expand all
1336 CODE_ADDRESS_MAP_LOG(CodeMoveEvent(from, to)); 1425 CODE_ADDRESS_MAP_LOG(CodeMoveEvent(from, to));
1337 MoveEventInternal(CODE_MOVE_EVENT, from, to); 1426 MoveEventInternal(CODE_MOVE_EVENT, from, to);
1338 } 1427 }
1339 1428
1340 1429
1341 void Logger::CodeDeleteEvent(Address from) { 1430 void Logger::CodeDeleteEvent(Address from) {
1342 JIT_LOG(CodeDeleteEvent(from)); 1431 JIT_LOG(CodeDeleteEvent(from));
1343 if (!log_->IsEnabled()) return; 1432 if (!log_->IsEnabled()) return;
1344 LL_LOG(CodeDeleteEvent(from)); 1433 LL_LOG(CodeDeleteEvent(from));
1345 CODE_ADDRESS_MAP_LOG(CodeDeleteEvent(from)); 1434 CODE_ADDRESS_MAP_LOG(CodeDeleteEvent(from));
1346 DeleteEventInternal(CODE_DELETE_EVENT, from); 1435
1436 if (!log_->IsEnabled() || !FLAG_log_code) return;
1437 Log::MessageBuilder msg(log_);
1438 msg.Append("%s,", kLogEventsNames[CODE_DELETE_EVENT]);
1439 msg.AppendAddress(from);
1440 msg.Append('\n');
1441 msg.WriteToLogFile();
1347 } 1442 }
1348 1443
1349 1444
1350 void Logger::CodeLinePosInfoAddPositionEvent(void* jit_handler_data, 1445 void Logger::CodeLinePosInfoAddPositionEvent(void* jit_handler_data,
1351 int pc_offset, 1446 int pc_offset,
1352 int position) { 1447 int position) {
1353 JIT_LOG(AddCodeLinePosInfoEvent(jit_handler_data, 1448 JIT_LOG(AddCodeLinePosInfoEvent(jit_handler_data,
1354 pc_offset, 1449 pc_offset,
1355 position, 1450 position,
1356 JitCodeEvent::POSITION)); 1451 JitCodeEvent::POSITION));
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 Log::MessageBuilder msg(log_); 1509 Log::MessageBuilder msg(log_);
1415 msg.Append("%s,", kLogEventsNames[event]); 1510 msg.Append("%s,", kLogEventsNames[event]);
1416 msg.AppendAddress(from); 1511 msg.AppendAddress(from);
1417 msg.Append(','); 1512 msg.Append(',');
1418 msg.AppendAddress(to); 1513 msg.AppendAddress(to);
1419 msg.Append('\n'); 1514 msg.Append('\n');
1420 msg.WriteToLogFile(); 1515 msg.WriteToLogFile();
1421 } 1516 }
1422 1517
1423 1518
1424 void Logger::DeleteEventInternal(LogEventsAndTags event, Address from) {
1425 if (!log_->IsEnabled() || !FLAG_log_code) return;
1426 Log::MessageBuilder msg(log_);
1427 msg.Append("%s,", kLogEventsNames[event]);
1428 msg.AppendAddress(from);
1429 msg.Append('\n');
1430 msg.WriteToLogFile();
1431 }
1432
1433
1434 void Logger::ResourceEvent(const char* name, const char* tag) { 1519 void Logger::ResourceEvent(const char* name, const char* tag) {
1435 if (!log_->IsEnabled() || !FLAG_log) return; 1520 if (!log_->IsEnabled() || !FLAG_log) return;
1436 Log::MessageBuilder msg(log_); 1521 Log::MessageBuilder msg(log_);
1437 msg.Append("%s,%s,", name, tag); 1522 msg.Append("%s,%s,", name, tag);
1438 1523
1439 uint32_t sec, usec; 1524 uint32_t sec, usec;
1440 if (OS::GetUserTime(&sec, &usec) != -1) { 1525 if (OS::GetUserTime(&sec, &usec) != -1) {
1441 msg.Append("%d,%d,", sec, usec); 1526 msg.Append("%d,%d,", sec, usec);
1442 } 1527 }
1443 msg.Append("%.0f", OS::TimeCurrentMillis()); 1528 msg.Append("%.0f", OS::TimeCurrentMillis());
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 description = "A keyed call IC from the snapshot"; 1798 description = "A keyed call IC from the snapshot";
1714 tag = Logger::KEYED_CALL_IC_TAG; 1799 tag = Logger::KEYED_CALL_IC_TAG;
1715 break; 1800 break;
1716 case Code::NUMBER_OF_KINDS: 1801 case Code::NUMBER_OF_KINDS:
1717 break; 1802 break;
1718 } 1803 }
1719 PROFILE(isolate_, CodeCreateEvent(tag, code_object, description)); 1804 PROFILE(isolate_, CodeCreateEvent(tag, code_object, description));
1720 } 1805 }
1721 1806
1722 1807
1723 LowLevelLogger::LowLevelLogger(const char* name)
1724 : ll_output_handle_(NULL) {
1725 // Open the low-level log file.
1726 size_t len = strlen(name);
1727 ScopedVector<char> ll_name(static_cast<int>(len + sizeof(kLogExt)));
1728 OS::MemCopy(ll_name.start(), name, len);
1729 OS::MemCopy(ll_name.start() + len, kLogExt, sizeof(kLogExt));
1730 ll_output_handle_ = OS::FOpen(ll_name.start(), OS::LogFileOpenMode);
1731 setvbuf(ll_output_handle_, NULL, _IOFBF, kLogBufferSize);
1732
1733 LogCodeInfo();
1734 }
1735
1736
1737 LowLevelLogger::~LowLevelLogger() {
1738 fclose(ll_output_handle_);
1739 ll_output_handle_ = NULL;
1740 }
1741
1742
1743 void LowLevelLogger::LogCodeInfo() {
1744 #if V8_TARGET_ARCH_IA32
1745 const char arch[] = "ia32";
1746 #elif V8_TARGET_ARCH_X64
1747 const char arch[] = "x64";
1748 #elif V8_TARGET_ARCH_ARM
1749 const char arch[] = "arm";
1750 #elif V8_TARGET_ARCH_MIPS
1751 const char arch[] = "mips";
1752 #else
1753 const char arch[] = "unknown";
1754 #endif
1755 LogWriteBytes(arch, sizeof(arch));
1756 }
1757
1758
1759 void LowLevelLogger::LogRecordedBuffer(Code* code,
1760 SharedFunctionInfo*,
1761 NameBuffer* name_buffer) {
1762 CodeCreateStruct event;
1763 event.name_size = name_buffer->size();
1764 event.code_address = code->instruction_start();
1765 ASSERT(event.code_address == code->address() + Code::kHeaderSize);
1766 event.code_size = code->instruction_size();
1767 LogWriteStruct(event);
1768 LogWriteBytes(name_buffer->get(), name_buffer->size());
1769 LogWriteBytes(
1770 reinterpret_cast<const char*>(code->instruction_start()),
1771 code->instruction_size());
1772 }
1773
1774
1775 void LowLevelLogger::CodeMoveEvent(Address from, Address to) {
1776 CodeMoveStruct event;
1777 event.from_address = from + Code::kHeaderSize;
1778 event.to_address = to + Code::kHeaderSize;
1779 LogWriteStruct(event);
1780 }
1781
1782
1783 void LowLevelLogger::CodeDeleteEvent(Address from) {
1784 CodeDeleteStruct event;
1785 event.address = from + Code::kHeaderSize;
1786 LogWriteStruct(event);
1787 }
1788
1789
1790 void LowLevelLogger::SnapshotPositionEvent(Address addr, int pos) {
1791 SnapshotPositionStruct event;
1792 event.address = addr + Code::kHeaderSize;
1793 event.position = pos;
1794 LogWriteStruct(event);
1795 }
1796
1797
1798 void LowLevelLogger::LogWriteBytes(const char* bytes, int size) {
1799 size_t rv = fwrite(bytes, 1, size, ll_output_handle_);
1800 ASSERT(static_cast<size_t>(size) == rv);
1801 USE(rv);
1802 }
1803
1804
1805 void LowLevelLogger::CodeMovingGCEvent() {
1806 const char tag = kCodeMovingGCTag;
1807
1808 LogWriteBytes(&tag, sizeof(tag));
1809 }
1810
1811
1812 void Logger::LogCodeObjects() { 1808 void Logger::LogCodeObjects() {
1813 Heap* heap = isolate_->heap(); 1809 Heap* heap = isolate_->heap();
1814 heap->CollectAllGarbage(Heap::kMakeHeapIterableMask, 1810 heap->CollectAllGarbage(Heap::kMakeHeapIterableMask,
1815 "Logger::LogCodeObjects"); 1811 "Logger::LogCodeObjects");
1816 HeapIterator iterator(heap); 1812 HeapIterator iterator(heap);
1817 DisallowHeapAllocation no_gc; 1813 DisallowHeapAllocation no_gc;
1818 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { 1814 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
1819 if (obj->IsCode()) LogCodeObject(obj); 1815 if (obj->IsCode()) LogCodeObject(obj);
1820 } 1816 }
1821 } 1817 }
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
2061 2057
2062 if (jit_logger_) { 2058 if (jit_logger_) {
2063 delete jit_logger_; 2059 delete jit_logger_;
2064 jit_logger_ = NULL; 2060 jit_logger_ = NULL;
2065 } 2061 }
2066 2062
2067 return log_->Close(); 2063 return log_->Close();
2068 } 2064 }
2069 2065
2070 } } // namespace v8::internal 2066 } } // 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