// 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 VM_COMPILER_STATS_H_
#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"


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.

  int64_t num_tokens_total;    // Isolate + VM isolate
  int64_t num_tokens_scanned;
  int64_t num_tokens_consumed;
  int64_t num_cached_consts;
  int64_t num_const_cache_hits;
  int64_t num_execute_const;

  int64_t num_classes_parsed;
  int64_t num_class_tokens;
  int64_t num_functions_parsed;      // Num parsed functions.
  int64_t num_functions_compiled;    // Num unoptimized compilations.
  int64_t num_functions_optimized;   // Num optimized compilations.
  int64_t num_func_tokens_compiled;
  int64_t num_implicit_final_getters;
  int64_t num_method_extractors;

  int64_t src_length;          // Total number of characters in source.
  int64_t total_code_size;     // Bytes allocated for code and meta info.
  int64_t total_instr_size;    // Total size of generated code in bytes.
  int64_t pc_desc_size;
  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  // VM_COMPILER_STATS_H_
