| Index: runtime/vm/compiler_stats.h
|
| diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
|
| index 9b9e67b7a0898677cf81139b7cfdc66ac1a54b8e..5ed753703f311b300399d9bb109bdf9a70dfd862 100644
|
| --- a/runtime/vm/compiler_stats.h
|
| +++ b/runtime/vm/compiler_stats.h
|
| @@ -6,6 +6,7 @@
|
| #define VM_COMPILER_STATS_H_
|
|
|
| #include "vm/allocation.h"
|
| +#include "vm/atomic.h"
|
| #include "vm/flags.h"
|
| #include "vm/isolate.h"
|
| #include "vm/timer.h"
|
| @@ -13,10 +14,47 @@
|
|
|
| namespace dart {
|
|
|
| -
|
| DECLARE_FLAG(bool, compiler_stats);
|
| DECLARE_FLAG(bool, compiler_benchmark);
|
|
|
| +
|
| +#define STAT_TIMERS(V) \
|
| + V(parser_timer, "parser timer") \
|
| + V(scanner_timer, "scanner timer") \
|
| + V(codegen_timer, "codegen timer") \
|
| + V(graphbuilder_timer, "flow graph builder timer") \
|
| + V(ssa_timer, "flow graph SSA timer") \
|
| + V(graphinliner_timer, "flow graph inliner timer") \
|
| + V(graphinliner_parse_timer, "inliner parsing timer") \
|
| + V(graphinliner_build_timer, "inliner building timer") \
|
| + V(graphinliner_ssa_timer, "inliner SSA timer") \
|
| + V(graphinliner_opt_timer, "inliner optimization timer") \
|
| + V(graphinliner_subst_timer, "inliner substitution timer") \
|
| + V(graphoptimizer_timer, "flow graph optimizer timer") \
|
| + V(graphcompiler_timer, "flow graph compiler timer") \
|
| + V(codefinalizer_timer, "code finalization timer") \
|
| +
|
| +
|
| +#define STAT_COUNTERS(V) \
|
| + V(num_tokens_total) \
|
| + V(num_tokens_scanned) \
|
| + V(num_tokens_consumed) \
|
| + V(num_cached_consts) \
|
| + V(num_const_cache_hits) \
|
| + V(num_classes_parsed) \
|
| + V(num_class_tokens) \
|
| + V(num_functions_parsed) \
|
| + V(num_functions_compiled) \
|
| + V(num_functions_optimized) \
|
| + V(num_func_tokens_compiled) \
|
| + V(num_implicit_final_getters) \
|
| + V(num_method_extractors) \
|
| + V(src_length) \
|
| + V(total_code_size) \
|
| + V(total_instr_size) \
|
| + V(pc_desc_size) \
|
| + V(vardesc_size) \
|
| +
|
| class CompilerStats {
|
| public:
|
| explicit CompilerStats(Isolate* isolate);
|
| @@ -24,6 +62,8 @@ class CompilerStats {
|
|
|
| Isolate* isolate_;
|
|
|
| + // We could use STAT_TIMERS and STAT_COUNTERS to declare fields, but then
|
| + // we would be losing the comments.
|
| Timer parser_timer; // Cumulative runtime of parser.
|
| Timer scanner_timer; // Cumulative runtime of scanner.
|
| Timer codegen_timer; // Cumulative runtime of code generator.
|
| @@ -63,28 +103,38 @@ class CompilerStats {
|
| char* text;
|
| bool use_benchmark_output;
|
|
|
| - // Update stats that are computed, e.g. token count.
|
| - void Update();
|
|
|
| void EnableBenchmark();
|
| char* BenchmarkOutput();
|
| char* PrintToZone();
|
| +
|
| + // Used to aggregate stats.
|
| + void Add(const CompilerStats& other);
|
| + void Clear();
|
| +
|
| + bool IsCleared() const;
|
| +
|
| + private:
|
| + // Update stats that are computed, e.g. token count.
|
| + void Update();
|
| };
|
|
|
| +// Make increment atomic in case it occurs in parallel with aggregation from
|
| +// other thread.
|
| #define INC_STAT(thread, counter, incr) \
|
| if (FLAG_support_compiler_stats && FLAG_compiler_stats) { \
|
| - MutexLocker ml((thread)->isolate()->mutex()); \
|
| - (thread)->isolate()->compiler_stats()->counter += (incr); \
|
| + AtomicOperations::IncrementInt64By( \
|
| + &(thread)->compiler_stats()->counter, (incr)); \
|
| }
|
|
|
| #define STAT_VALUE(thread, counter) \
|
| ((FLAG_support_compiler_stats && FLAG_compiler_stats) ? \
|
| - (thread)->isolate()->compiler_stats()->counter : 0)
|
| + (thread)->compiler_stats()->counter : 0)
|
|
|
| #define CSTAT_TIMER_SCOPE(thr, t) \
|
| TimerScope timer(FLAG_support_compiler_stats && FLAG_compiler_stats, \
|
| (FLAG_support_compiler_stats && FLAG_compiler_stats) ? \
|
| - &((thr)->isolate()->compiler_stats()->t) : NULL, \
|
| + &((thr)->compiler_stats()->t) : NULL, \
|
| thr);
|
|
|
|
|
|
|