// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. #ifndef RUNTIME_VM_COMPILER_STATS_H_ #define RUNTIME_VM_COMPILER_STATS_H_ #include "platform/atomic.h" #include "vm/allocation.h" #include "vm/flags.h" #include "vm/isolate.h" #include "vm/timer.h" 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_execute_const) \ 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); ~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. Timer graphbuilder_timer; // Included in codegen_timer. Timer ssa_timer; // Included in codegen_timer. Timer graphinliner_timer; // Included in codegen_timer. Timer graphinliner_parse_timer; // Included in codegen_timer. Timer graphinliner_build_timer; // Included in codegen_timer. Timer graphinliner_ssa_timer; // Included in codegen_timer. Timer graphinliner_opt_timer; // Included in codegen_timer. Timer graphinliner_subst_timer; // Included in codegen_timer. Timer graphoptimizer_timer; // Included in codegen_timer. Timer graphcompiler_timer; // Included in codegen_timer. Timer codefinalizer_timer; // Included in codegen_timer. ALIGN8 int64_t num_tokens_total; // Isolate + VM isolate. ALIGN8 int64_t num_tokens_scanned; ALIGN8 int64_t num_tokens_consumed; ALIGN8 int64_t num_cached_consts; ALIGN8 int64_t num_const_cache_hits; ALIGN8 int64_t num_execute_const; ALIGN8 int64_t num_classes_parsed; ALIGN8 int64_t num_class_tokens; ALIGN8 int64_t num_functions_parsed; // Num parsed functions. ALIGN8 int64_t num_functions_compiled; // Num unoptimized compilations. ALIGN8 int64_t num_functions_optimized; // Num optimized compilations. ALIGN8 int64_t num_func_tokens_compiled; ALIGN8 int64_t num_implicit_final_getters; ALIGN8 int64_t num_method_extractors; ALIGN8 int64_t src_length; // Total number of characters in source. ALIGN8 int64_t total_code_size; // Bytes allocated for code and meta info. ALIGN8 int64_t total_instr_size; // Total size of generated code in bytes. ALIGN8 int64_t pc_desc_size; ALIGN8 int64_t vardesc_size; char* text; bool use_benchmark_output; 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) { \ AtomicOperations::IncrementInt64By(&(thread)->compiler_stats()->counter, \ (incr)); \ } #define STAT_VALUE(thread, counter) \ ((FLAG_support_compiler_stats && FLAG_compiler_stats) \ ? (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)->compiler_stats()->t) \ : NULL, \ thr); } // namespace dart #endif // RUNTIME_VM_COMPILER_STATS_H_