Index: src/d8.cc |
diff --git a/src/d8.cc b/src/d8.cc |
index c23c1a4a9c722f0839fd4ca4976c41e90b10cda0..e511df6b80b3cbf442d99a19e11f11e535d91a71 100644 |
--- a/src/d8.cc |
+++ b/src/d8.cc |
@@ -12,6 +12,7 @@ |
#include <stdlib.h> |
#include <string.h> |
#include <sys/stat.h> |
+#include <fstream> |
#ifdef V8_SHARED |
#include <assert.h> |
@@ -41,6 +42,7 @@ |
#include "src/base/platform/platform.h" |
#include "src/base/sys-info.h" |
#include "src/basic-block-profiler.h" |
+#include "src/interpreter/interpreter.h" |
#include "src/snapshot/natives.h" |
#include "src/utils.h" |
#include "src/v8.h" |
@@ -1275,6 +1277,53 @@ struct CounterAndKey { |
inline bool operator<(const CounterAndKey& lhs, const CounterAndKey& rhs) { |
return strcmp(lhs.key, rhs.key) < 0; |
} |
+ |
+void Shell::WriteInterpreterDispatchCounters(Isolate* isolate) { |
+ std::ofstream stream(i::FLAG_trace_ignition_dispatches_output_file); |
+ |
+ uintptr_t* handler_to_handler_dispatch_counters = |
rmcilroy
2016/04/08 16:40:31
update variable name.
Stefano Sanfilippo
2016/04/08 17:01:05
Done.
|
+ reinterpret_cast<i::Isolate*>(isolate) |
+ ->interpreter() |
+ ->bytecode_dispatch_count_table(); |
+ |
+ static const int kCountersTableRowSize = |
+ static_cast<int>(i::interpreter::Bytecode::kLast) + 1; |
+ |
+ stream << '{'; |
rmcilroy
2016/04/08 16:40:31
nit - brief comment explaining this emits the outp
Stefano Sanfilippo
2016/04/08 17:01:05
Done.
|
+ |
+ for (int from_index = 0; from_index < kCountersTableRowSize; ++from_index) { |
+ if (from_index > 0) stream << ",\n "; |
+ |
+ i::interpreter::Bytecode from_bytecode = |
+ i::interpreter::Bytecodes::FromByte(from_index); |
+ stream << "\"" << i::interpreter::Bytecodes::ToString(from_bytecode) |
+ << "\": {"; |
+ |
+ bool emitted_first_non_zero_cell_of_the_row = false; |
rmcilroy
2016/04/08 16:40:31
This name is a bit long winded, how about just emi
Stefano Sanfilippo
2016/04/08 17:01:05
Done.
|
+ for (int to_index = 0; to_index < kCountersTableRowSize; ++to_index) { |
+ uintptr_t counter = |
+ handler_to_handler_dispatch_counters[from_index * |
+ kCountersTableRowSize + |
+ to_index]; |
+ if (counter > 0) { |
+ if (emitted_first_non_zero_cell_of_the_row) { |
+ stream << ", "; |
+ } else { |
+ emitted_first_non_zero_cell_of_the_row = true; |
+ } |
+ |
+ i::interpreter::Bytecode to_bytecode = |
+ i::interpreter::Bytecodes::FromByte(to_index); |
+ stream << '"' << i::interpreter::Bytecodes::ToString(to_bytecode) |
+ << "\": " << counter; |
+ } |
+ } |
+ |
+ stream << "}"; |
+ } |
+ stream << '}'; |
+} |
+ |
#endif // !V8_SHARED |
@@ -1312,6 +1361,11 @@ void Shell::OnExit(v8::Isolate* isolate) { |
"-------------+\n"); |
delete [] counters; |
} |
+ |
+ if (i::FLAG_trace_ignition_dispatches) { |
+ WriteInterpreterDispatchCounters(isolate); |
+ } |
+ |
delete counters_file_; |
delete counter_map_; |
#endif // !V8_SHARED |