// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifdef V8_ENABLE_PRECISE_ZONE_STATS

#if defined(__clang__) || defined(__GLIBCXX__)
#include <cxxabi.h>
#endif  // __GLIBCXX__
#include <cinttypes>
#include <cstdio>

#include "src/utils/utils.h"
#include "src/zone/type-stats.h"

namespace v8 {
namespace internal {

void TypeStats::MergeWith(const TypeStats& other) {
  for (auto const& item : other.map_) {
    Add(item.first, item.second);
  }
}

class Demangler {
 public:
  Demangler() = default;
  ~Demangler() {
    if (buffer_) free(buffer_);
    USE(buffer_len_);  // In case demangling is not supported.
  }

  const char* demangle(std::type_index type_id) {
#if defined(__clang__) || defined(__GLIBCXX__)
    int status = -1;
    char* result =
        abi::__cxa_demangle(type_id.name(), buffer_, &buffer_len_, &status);
    if (status == 0) {
      // Upon success, the buffer_ may be reallocated.
      buffer_ = result;
      return buffer_;
    }
#endif
    return type_id.name();
  }

 private:
  char* buffer_ = nullptr;
  size_t buffer_len_ = 0;
};

void TypeStats::Dump() const {
  Demangler d;
  PrintF("===== TypeStats =====\n");
  PrintF("-------------+--------------+------------+--------+--------------\n");
  PrintF("       alloc |      dealloc |      count | sizeof | name\n");
  PrintF("-------------+--------------+------------+--------+--------------\n");
  uint64_t total_allocation_count = 0;
  uint64_t total_allocated_bytes = 0;
  uint64_t total_deallocated_bytes = 0;
  for (auto const& item : map_) {
    const StatsEntry& entry = item.second;
    total_allocation_count += entry.allocation_count;
    total_allocated_bytes += entry.allocated_bytes;
    total_deallocated_bytes += entry.deallocated_bytes;
    PrintF("%12zu | %12zu | %10zu | %6zu | %s\n", entry.allocated_bytes,
           entry.deallocated_bytes, entry.allocation_count, entry.instance_size,
           d.demangle(item.first));
  }
  PrintF("%12" PRIu64 " | %12" PRIu64 " | %10" PRIu64
         " | ===== TOTAL STATS =====\n",
         total_allocated_bytes, total_deallocated_bytes,
         total_allocation_count);
}

}  // namespace internal
}  // namespace v8

#endif  // V8_ENABLE_PRECISE_ZONE_STATS
