// 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_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_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_
