blob: af4777a8efc45247438fa3dc840a0471656c5a4e [file] [log] [blame]
// 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/base/platform/wrappers.h"
#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_) base::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