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