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