Commit e1a309f7 authored by Michael Lippautz's avatar Michael Lippautz Committed by V8 LUCI CQ

[heap] Adjust cppgc heap statistics

- Avoid adding an Invalid type that can never be reached during
  traversal;
- Expose class names as object names;

Bug: chromium:1321620
Change-Id: Ie3d9f78d97703535ecf67d56235d564ab6a9a7e8
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3763866
Commit-Queue: Michael Lippautz <mlippautz@chromium.org>
Reviewed-by: 's avatarOmer Katz <omerkatz@chromium.org>
Cr-Commit-Position: refs/heads/main@{#81758}
parent 21e5dbda
...@@ -298,5 +298,16 @@ HeapStatistics HeapBase::CollectStatistics( ...@@ -298,5 +298,16 @@ HeapStatistics HeapBase::CollectStatistics(
return HeapStatisticsCollector().CollectDetailedStatistics(this); return HeapStatisticsCollector().CollectDetailedStatistics(this);
} }
ClassNameAsHeapObjectNameScope::ClassNameAsHeapObjectNameScope(HeapBase& heap)
: heap_(heap),
saved_heap_object_name_value_(heap_.name_of_unnamed_object()) {
heap_.set_name_of_unnamed_object(
HeapObjectNameForUnnamedObject::kUseClassNameIfSupported);
}
ClassNameAsHeapObjectNameScope::~ClassNameAsHeapObjectNameScope() {
heap_.set_name_of_unnamed_object(saved_heap_object_name_value_);
}
} // namespace internal } // namespace internal
} // namespace cppgc } // namespace cppgc
...@@ -310,6 +310,16 @@ class V8_EXPORT_PRIVATE HeapBase : public cppgc::HeapHandle { ...@@ -310,6 +310,16 @@ class V8_EXPORT_PRIVATE HeapBase : public cppgc::HeapHandle {
friend class cppgc::testing::OverrideEmbedderStackStateScope; friend class cppgc::testing::OverrideEmbedderStackStateScope;
}; };
class V8_NODISCARD V8_EXPORT_PRIVATE ClassNameAsHeapObjectNameScope final {
public:
explicit ClassNameAsHeapObjectNameScope(HeapBase& heap);
~ClassNameAsHeapObjectNameScope();
private:
HeapBase& heap_;
const HeapObjectNameForUnnamedObject saved_heap_object_name_value_;
};
} // namespace internal } // namespace internal
} // namespace cppgc } // namespace cppgc
......
...@@ -97,11 +97,7 @@ HeapStatistics HeapStatisticsCollector::CollectDetailedStatistics( ...@@ -97,11 +97,7 @@ HeapStatistics HeapStatisticsCollector::CollectDetailedStatistics(
stats.detail_level = HeapStatistics::DetailLevel::kDetailed; stats.detail_level = HeapStatistics::DetailLevel::kDetailed;
current_stats_ = &stats; current_stats_ = &stats;
if (NameProvider::SupportsCppClassNamesAsObjectNames()) { ClassNameAsHeapObjectNameScope class_names_scope(*heap);
// Add a dummy type so that a type index of zero has a valid mapping but
// shows an invalid type.
type_name_to_index_map_.insert({"Invalid type", 0});
}
Traverse(heap->raw_heap()); Traverse(heap->raw_heap());
FinalizeSpace(current_stats_, &current_space_stats_, &current_page_stats_); FinalizeSpace(current_stats_, &current_space_stats_, &current_page_stats_);
......
...@@ -7580,16 +7580,11 @@ EmbedderStackStateScope::~EmbedderStackStateScope() { ...@@ -7580,16 +7580,11 @@ EmbedderStackStateScope::~EmbedderStackStateScope() {
CppClassNamesAsHeapObjectNameScope::CppClassNamesAsHeapObjectNameScope( CppClassNamesAsHeapObjectNameScope::CppClassNamesAsHeapObjectNameScope(
v8::CppHeap* heap) v8::CppHeap* heap)
: cpp_heap_(CppHeap::From(heap)), : scope_(std::make_unique<cppgc::internal::ClassNameAsHeapObjectNameScope>(
saved_heap_object_name_value_(cpp_heap_->name_of_unnamed_object()) { *CppHeap::From(heap))) {}
cpp_heap_->set_name_of_unnamed_object(
cppgc::internal::HeapObjectNameForUnnamedObject::
kUseClassNameIfSupported);
}
CppClassNamesAsHeapObjectNameScope::~CppClassNamesAsHeapObjectNameScope() { CppClassNamesAsHeapObjectNameScope::~CppClassNamesAsHeapObjectNameScope() =
cpp_heap_->set_name_of_unnamed_object(saved_heap_object_name_value_); default;
}
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
...@@ -46,6 +46,7 @@ namespace cppgc { ...@@ -46,6 +46,7 @@ namespace cppgc {
namespace internal { namespace internal {
enum class HeapObjectNameForUnnamedObject : uint8_t; enum class HeapObjectNameForUnnamedObject : uint8_t;
class ClassNameAsHeapObjectNameScope;
} // namespace internal } // namespace internal
} // namespace cppgc } // namespace cppgc
...@@ -2909,9 +2910,7 @@ class V8_NODISCARD CppClassNamesAsHeapObjectNameScope final { ...@@ -2909,9 +2910,7 @@ class V8_NODISCARD CppClassNamesAsHeapObjectNameScope final {
~CppClassNamesAsHeapObjectNameScope(); ~CppClassNamesAsHeapObjectNameScope();
private: private:
CppHeap* const cpp_heap_; std::unique_ptr<cppgc::internal::ClassNameAsHeapObjectNameScope> scope_;
const cppgc::internal::HeapObjectNameForUnnamedObject
saved_heap_object_name_value_;
}; };
} // namespace internal } // namespace internal
......
...@@ -120,8 +120,7 @@ TEST(NameTraitTest, ParsingPrettyFunction) { ...@@ -120,8 +120,7 @@ TEST(NameTraitTest, ParsingPrettyFunction) {
class HeapObjectHeaderNameTest : public testing::TestWithHeap {}; class HeapObjectHeaderNameTest : public testing::TestWithHeap {};
TEST_F(HeapObjectHeaderNameTest, LookupNameThroughGCInfo) { TEST_F(HeapObjectHeaderNameTest, LookupNameThroughGCInfo) {
Heap::From(GetHeap())->set_name_of_unnamed_object( ClassNameAsHeapObjectNameScope class_names_scope(*Heap::From(GetHeap()));
HeapObjectNameForUnnamedObject::kUseClassNameIfSupported);
auto* no_name = MakeGarbageCollected<NoName>(GetAllocationHandle()); auto* no_name = MakeGarbageCollected<NoName>(GetAllocationHandle());
auto no_name_tuple = HeapObjectHeader::FromObject(no_name).GetName(); auto no_name_tuple = HeapObjectHeader::FromObject(no_name).GetName();
if (NameProvider::SupportsCppClassNamesAsObjectNames()) { if (NameProvider::SupportsCppClassNamesAsObjectNames()) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment