cppgc: Revise WeakContainerTest.*
For some reason the compiler was optimizing away the reference to the object in WeakContainerTest.ConservativeGCTracesWeakContainer and thus not finding it conservatively. This CL revises the tests such that the compiler is no longer able to optimize references away. Bug: v8:12824 Change-Id: Ie598a1cf1124c2983a6c61fd4e990734d36f5832 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3610627 Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Commit-Queue: Omer Katz <omerkatz@chromium.org> Reviewed-by: Anton Bikineev <bikineev@chromium.org> Cr-Commit-Position: refs/heads/main@{#80257}
This commit is contained in:
parent
42138ac2e9
commit
cf6ad387ff
@ -56,24 +56,17 @@ class TraceableGCed : public GarbageCollected<TraceableGCed> {
|
||||
reinterpret_cast<std::atomic<size_t>*>(&n_trace_calls)
|
||||
->fetch_add(1, std::memory_order_relaxed);
|
||||
}
|
||||
static size_t n_trace_calls;
|
||||
mutable size_t n_trace_calls = 0;
|
||||
};
|
||||
size_t TraceableGCed::n_trace_calls = 0u;
|
||||
|
||||
class NonTraceableGCed : public GarbageCollected<NonTraceableGCed> {
|
||||
public:
|
||||
void Trace(cppgc::Visitor*) const { n_trace_calls++; }
|
||||
static size_t n_trace_calls;
|
||||
mutable size_t n_trace_calls = 0;
|
||||
};
|
||||
size_t NonTraceableGCed::n_trace_calls = 0u;
|
||||
|
||||
void EmptyWeakCallback(const LivenessBroker&, const void*) {}
|
||||
|
||||
template <typename T>
|
||||
V8_NOINLINE T access(volatile const T& t) {
|
||||
return t;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
} // namespace internal
|
||||
@ -99,61 +92,56 @@ namespace internal {
|
||||
TEST_F(WeakContainerTest, TraceableGCedTraced) {
|
||||
TraceableGCed* obj =
|
||||
MakeGarbageCollected<TraceableGCed>(GetAllocationHandle());
|
||||
TraceableGCed::n_trace_calls = 0u;
|
||||
obj->n_trace_calls = 0u;
|
||||
StartMarking();
|
||||
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
|
||||
FinishMarking(Config::StackState::kNoHeapPointers);
|
||||
EXPECT_NE(0u, TraceableGCed::n_trace_calls);
|
||||
EXPECT_NE(0u, obj->n_trace_calls);
|
||||
EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
|
||||
access(obj);
|
||||
}
|
||||
|
||||
TEST_F(WeakContainerTest, NonTraceableGCedNotTraced) {
|
||||
NonTraceableGCed* obj =
|
||||
MakeGarbageCollected<NonTraceableGCed>(GetAllocationHandle());
|
||||
NonTraceableGCed::n_trace_calls = 0u;
|
||||
obj->n_trace_calls = 0u;
|
||||
StartMarking();
|
||||
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
|
||||
FinishMarking(Config::StackState::kNoHeapPointers);
|
||||
EXPECT_EQ(0u, NonTraceableGCed::n_trace_calls);
|
||||
EXPECT_EQ(0u, obj->n_trace_calls);
|
||||
EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
|
||||
access(obj);
|
||||
}
|
||||
|
||||
TEST_F(WeakContainerTest, NonTraceableGCedNotTracedConservatively) {
|
||||
NonTraceableGCed* obj =
|
||||
MakeGarbageCollected<NonTraceableGCed>(GetAllocationHandle());
|
||||
NonTraceableGCed::n_trace_calls = 0u;
|
||||
obj->n_trace_calls = 0u;
|
||||
StartMarking();
|
||||
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
|
||||
FinishMarking(Config::StackState::kMayContainHeapPointers);
|
||||
EXPECT_NE(0u, NonTraceableGCed::n_trace_calls);
|
||||
EXPECT_NE(0u, obj->n_trace_calls);
|
||||
EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
|
||||
access(obj);
|
||||
}
|
||||
|
||||
TEST_F(WeakContainerTest, PreciseGCTracesWeakContainerWhenTraced) {
|
||||
TraceableGCed* obj =
|
||||
MakeGarbageCollected<TraceableGCed>(GetAllocationHandle());
|
||||
TraceableGCed::n_trace_calls = 0u;
|
||||
obj->n_trace_calls = 0u;
|
||||
StartMarking();
|
||||
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
|
||||
FinishMarking(Config::StackState::kNoHeapPointers);
|
||||
EXPECT_EQ(1u, TraceableGCed::n_trace_calls);
|
||||
EXPECT_EQ(1u, obj->n_trace_calls);
|
||||
EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
|
||||
access(obj);
|
||||
}
|
||||
|
||||
TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainer) {
|
||||
TraceableGCed* obj =
|
||||
MakeGarbageCollected<TraceableGCed>(GetAllocationHandle());
|
||||
TraceableGCed::n_trace_calls = 0u;
|
||||
obj->n_trace_calls = 0u;
|
||||
StartMarking();
|
||||
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
|
||||
FinishMarking(Config::StackState::kMayContainHeapPointers);
|
||||
EXPECT_EQ(2u, TraceableGCed::n_trace_calls);
|
||||
EXPECT_EQ(2u, obj->n_trace_calls);
|
||||
EXPECT_EQ(SizeOf<TraceableGCed>(), GetMarkedBytes());
|
||||
access(obj);
|
||||
}
|
||||
|
||||
TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) {
|
||||
@ -163,13 +151,12 @@ TEST_F(WeakContainerTest, ConservativeGCTracesWeakContainerOnce) {
|
||||
USE(copy_obj);
|
||||
NonTraceableGCed* another_copy_obj = obj;
|
||||
USE(another_copy_obj);
|
||||
NonTraceableGCed::n_trace_calls = 0u;
|
||||
obj->n_trace_calls = 0u;
|
||||
StartMarking();
|
||||
GetMarkerRef()->Visitor().TraceWeakContainer(obj, EmptyWeakCallback, nullptr);
|
||||
FinishMarking(Config::StackState::kMayContainHeapPointers);
|
||||
EXPECT_EQ(1u, NonTraceableGCed::n_trace_calls);
|
||||
EXPECT_EQ(1u, obj->n_trace_calls);
|
||||
EXPECT_EQ(SizeOf<NonTraceableGCed>(), GetMarkedBytes());
|
||||
access(obj);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
Loading…
Reference in New Issue
Block a user