// Copyright (c) 2018, 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_BACKEND_CODE_STATISTICS_H_
#define RUNTIME_VM_COMPILER_BACKEND_CODE_STATISTICS_H_

#include "vm/compiler/assembler/assembler.h"
#include "vm/compiler/backend/il.h"
#include "vm/object.h"

namespace dart {

class CombinedCodeStatistics {
 public:
  // clang-format off
  enum EntryCounter {
#define DO(type) kTag##type,
    FOR_EACH_INSTRUCTION(DO)
#undef DO

#define DO(type) kTag##type##SlowPath,
    FOR_EACH_INSTRUCTION(DO)
#undef DO

    kTagAssertAssignableParameterCheck,
    kTagAssertAssignableInsertedByFrontend,
    kTagAssertAssignableFromSource,

    kTagCheckedEntry,
    kTagIntrinsics,

    kNumEntries,
  };
  // clang-format on

  CombinedCodeStatistics();

  void Begin(Instruction* instruction);
  void End(Instruction* instruction);

  void DumpStatistics();

  static EntryCounter SlowPathCounterFor(Instruction::Tag tag) {
    return static_cast<CombinedCodeStatistics::EntryCounter>(
        CombinedCodeStatistics::kTagGraphEntrySlowPath + tag);
  }

 private:
  friend class CodeStatistics;

  static int CompareEntries(const void* a, const void* b);

  typedef struct {
    const char* name;
    intptr_t bytes;
    intptr_t count;
  } Entry;

  Entry entries_[kNumEntries];
  intptr_t unaccounted_bytes_;
  intptr_t alignment_bytes_;
  intptr_t object_header_bytes_;
  intptr_t return_const_count_;
  intptr_t return_const_with_load_field_count_;
};

class CodeStatistics {
 public:
  explicit CodeStatistics(Assembler* assembler);

  void Begin(Instruction* instruction);
  void End(Instruction* instruction);

  void SpecialBegin(intptr_t tag);
  void SpecialEnd(intptr_t tag);

  void AppendTo(CombinedCodeStatistics* stat);

  void Finalize();

 private:
  static const int kStackSize = 8;

  Assembler* assembler_;

  typedef struct {
    intptr_t bytes;
    intptr_t count;
  } Entry;

  Entry entries_[CombinedCodeStatistics::kNumEntries];
  intptr_t instruction_bytes_;
  intptr_t unaccounted_bytes_;
  intptr_t alignment_bytes_;

  intptr_t stack_[kStackSize];
  intptr_t stack_index_;
};

}  // namespace dart

#endif  // RUNTIME_VM_COMPILER_BACKEND_CODE_STATISTICS_H_
