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