MiraclePtr: Rewrite dawn/common (linux)
1. Run the clang rewriter:
./tools/clang/rewrite_raw_ptr_fields/rewrite.sh
2. Add manually the missing AllowPtrArithmetic and DanglingUntriaged.
3. Split the patch
This is step 6 of using MiraclePtr in third_party/dawn project:
https://docs.google.com/document/d/1wz45t0alQthsIU9P7_rQcfQyqnrBMXzrOjSzdQo-V-A/edit#heading=h.vn4i6wy373x7
Bug: chromium:1464560
Change-Id: I3bb837fb517fbb39ee3c58528651c0c74e76110d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/165501
Commit-Queue: Arthur Sonzogni <arthursonzogni@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/common/BUILD.gn b/src/dawn/common/BUILD.gn
index 775fde7..48f594b 100644
--- a/src/dawn/common/BUILD.gn
+++ b/src/dawn/common/BUILD.gn
@@ -305,6 +305,7 @@
public_deps = [
":dawn_gpu_info_gen",
":dawn_version_gen",
+ "${dawn_root}/src/dawn/partition_alloc:raw_ptr",
]
if (is_apple) {
diff --git a/src/dawn/common/CMakeLists.txt b/src/dawn/common/CMakeLists.txt
index cfbcce8..740d5e3 100644
--- a/src/dawn/common/CMakeLists.txt
+++ b/src/dawn/common/CMakeLists.txt
@@ -122,7 +122,11 @@
)
endif()
-target_link_libraries(dawn_common PUBLIC dawncpp_headers PRIVATE dawn_internal_config)
+target_link_libraries(dawn_common
+ PUBLIC dawncpp_headers
+ PUBLIC partition_alloc
+ PRIVATE dawn_internal_config
+)
# TODO Android Log support
# TODO Vulkan headers support
diff --git a/src/dawn/common/ContentLessObjectCache.h b/src/dawn/common/ContentLessObjectCache.h
index 2f6b8fe..8a7a755 100644
--- a/src/dawn/common/ContentLessObjectCache.h
+++ b/src/dawn/common/ContentLessObjectCache.h
@@ -40,6 +40,7 @@
#include "dawn/common/RefCounted.h"
#include "dawn/common/StackContainer.h"
#include "dawn/common/WeakRef.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -55,7 +56,7 @@
template <typename RefCountedT>
struct ForErase {
explicit ForErase(RefCountedT* value) : mValue(value) {}
- RefCountedT* mValue;
+ raw_ptr<RefCountedT> mValue;
};
// All cached WeakRefs must have an immutable hash value determined at insertion. This ensures that
@@ -165,7 +166,7 @@
return result;
}
- ContentLessObjectCache<RefCountedT>* mCache = nullptr;
+ raw_ptr<ContentLessObjectCache<RefCountedT>> mCache = nullptr;
};
};
@@ -284,7 +285,7 @@
// deadlocks on the mutex. Since the default max_load_factor of most std::unordered_set
// implementations should be 1.0 (roughly 1 element per bucket), a StackVector of length 4
// should be enough space in most cases. See dawn:1993 for more details.
- StackVector<Ref<RefCountedT>, 4>* mTemporaryRefs = nullptr;
+ raw_ptr<StackVector<Ref<RefCountedT>, 4>> mTemporaryRefs = nullptr;
};
} // namespace dawn
diff --git a/src/dawn/common/ContentLessObjectCacheable.h b/src/dawn/common/ContentLessObjectCacheable.h
index e732e3d..e19d39c 100644
--- a/src/dawn/common/ContentLessObjectCacheable.h
+++ b/src/dawn/common/ContentLessObjectCacheable.h
@@ -29,6 +29,7 @@
#define SRC_DAWN_COMMON_CONTENTLESSOBJECTCACHEABLE_H_
#include "dawn/common/WeakRefSupport.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -68,7 +69,7 @@
// Pointer to the owning cache if we were inserted at any point. This is set via the
// Insert/Erase functions on the cache.
- ContentLessObjectCache<RefCountedT>* mCache = nullptr;
+ raw_ptr<ContentLessObjectCache<RefCountedT>> mCache = nullptr;
};
} // namespace dawn
diff --git a/src/dawn/common/Enumerator.h b/src/dawn/common/Enumerator.h
index 7227ca1..1121e4f 100644
--- a/src/dawn/common/Enumerator.h
+++ b/src/dawn/common/Enumerator.h
@@ -31,6 +31,8 @@
#include <type_traits>
#include <utility>
+#include "partition_alloc/pointers/raw_ptr.h"
+
namespace dawn {
// An iterator over a range that gives both the index and the value. It can be used like so:
@@ -59,17 +61,17 @@
private:
Index mIndex;
- Value* mValue;
+ raw_ptr<Value, AllowPtrArithmetic> mValue;
};
- Iterator begin() const { return Iterator(Index{}, mBegin); }
+ Iterator begin() const { return Iterator(Index{}, mBegin.get()); }
// Note that iterator comparison only uses mIndex, so we can save the computation of mValue for
// the end() iterator.
Iterator end() const { return Iterator(mSize, nullptr); }
private:
Index mSize;
- Value* mBegin;
+ raw_ptr<Value> mBegin;
};
template <typename T,
diff --git a/src/dawn/common/HashUtils.h b/src/dawn/common/HashUtils.h
index 9bf5c1a..1fb679e 100644
--- a/src/dawn/common/HashUtils.h
+++ b/src/dawn/common/HashUtils.h
@@ -34,6 +34,7 @@
#include "dawn/common/Platform.h"
#include "dawn/common/TypedInteger.h"
#include "dawn/common/ityp_bitset.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -44,6 +45,11 @@
return std::hash<T>()(value);
}
+template <typename T, partition_alloc::internal::RawPtrTraits Traits>
+size_t Hash(const raw_ptr<T, Traits>& value) {
+ return Hash(value.get());
+}
+
// Add hashing of TypedIntegers
template <typename Tag, typename T>
size_t Hash(const TypedInteger<Tag, T>& value) {
diff --git a/src/dawn/common/LinkedList.h b/src/dawn/common/LinkedList.h
index 16c710a..02ef59c 100644
--- a/src/dawn/common/LinkedList.h
+++ b/src/dawn/common/LinkedList.h
@@ -12,6 +12,7 @@
#define SRC_DAWN_COMMON_LINKEDLIST_H_
#include "dawn/common/Assert.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -171,8 +172,8 @@
private:
friend class LinkedList<T>;
- LinkNode<T>* previous_;
- LinkNode<T>* next_;
+ raw_ptr<LinkNode<T>> previous_;
+ raw_ptr<LinkNode<T>> next_;
};
template <typename T>
@@ -233,8 +234,8 @@
LinkNode<T>* operator*() const { return current_; }
private:
- LinkNode<T>* current_;
- LinkNode<T>* next_;
+ raw_ptr<LinkNode<T>> current_;
+ raw_ptr<LinkNode<T>> next_;
};
template <typename T>
diff --git a/src/dawn/common/Math.h b/src/dawn/common/Math.h
index 88083cc..7ef28b5 100644
--- a/src/dawn/common/Math.h
+++ b/src/dawn/common/Math.h
@@ -37,6 +37,7 @@
#include <type_traits>
#include "dawn/common/Assert.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -105,6 +106,11 @@
~(alignment - 1));
}
+template <typename T, partition_alloc::internal::RawPtrTraits Traits>
+DAWN_FORCE_INLINE T* AlignPtr(raw_ptr<T, Traits> ptr, size_t alignment) {
+ return AlignPtr(ptr.get(), alignment);
+}
+
template <typename T>
DAWN_FORCE_INLINE const T* AlignPtr(const T* ptr, size_t alignment) {
DAWN_ASSERT(IsPowerOfTwo(alignment));
diff --git a/src/dawn/common/MutexProtected.h b/src/dawn/common/MutexProtected.h
index 051822e..171c3c6 100644
--- a/src/dawn/common/MutexProtected.h
+++ b/src/dawn/common/MutexProtected.h
@@ -33,6 +33,7 @@
#include "dawn/common/Mutex.h"
#include "dawn/common/Ref.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -73,8 +74,8 @@
using ReturnType = typename UnwrapRef<T>::type;
// It's the programmer's burden to not save the pointer/reference and reuse it without the lock.
- ReturnType* operator->() { return Traits::GetObj(mObj); }
- ReturnType& operator*() { return *Traits::GetObj(mObj); }
+ ReturnType* operator->() { return Traits::GetObj(mObj.get()); }
+ ReturnType& operator*() { return *Traits::GetObj(mObj.get()); }
const ReturnType* operator->() const { return Traits::GetObj(mObj); }
const ReturnType& operator*() const { return *Traits::GetObj(mObj); }
@@ -85,7 +86,7 @@
Guard(T* obj, typename Traits::MutexType& mutex) : mLock(Traits::GetMutex(mutex)), mObj(obj) {}
typename Traits::LockType mLock;
- T* const mObj;
+ const raw_ptr<T> mObj;
};
} // namespace detail
diff --git a/src/dawn/common/SerialStorage.h b/src/dawn/common/SerialStorage.h
index 13b6c7d..f7dc526 100644
--- a/src/dawn/common/SerialStorage.h
+++ b/src/dawn/common/SerialStorage.h
@@ -32,6 +32,7 @@
#include <utility>
#include "dawn/common/Assert.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -62,7 +63,7 @@
// Special case the mSerialIterator when it should be equal to mStorageIterator.begin()
// otherwise we could ask mStorageIterator.begin() when mStorageIterator is mStorage.end()
// which is invalid. mStorageIterator.begin() is tagged with a nullptr.
- Value* mSerialIterator;
+ raw_ptr<Value, AllowPtrArithmetic> mSerialIterator;
};
class ConstIterator {
@@ -76,7 +77,7 @@
private:
ConstStorageIterator mStorageIterator;
- const Value* mSerialIterator;
+ raw_ptr<const Value, AllowPtrArithmetic> mSerialIterator;
};
class BeginEnd {
diff --git a/src/dawn/common/SlabAllocator.h b/src/dawn/common/SlabAllocator.h
index 4b73524..a20718f 100644
--- a/src/dawn/common/SlabAllocator.h
+++ b/src/dawn/common/SlabAllocator.h
@@ -34,6 +34,7 @@
#include "dawn/common/Numeric.h"
#include "dawn/common/PlacementAllocated.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -98,10 +99,16 @@
void Splice();
- char* allocation;
- IndexLinkNode* freeList;
- Slab* prev;
- Slab* next;
+ // TODO(crbug.com/dawn/2341): Both pointer are dangling in
+ // `dawn_perf_tests`, and `this` is not released before the end of the
+ // test. A side effect from one test to the next might cause difficult
+ // to reproduce flakes. Test:
+ // DrawCallPerf.Run/Vulkan_llvmpipe__LLVM_16_0_6__256_bits__MultipleVertexBuffers
+ raw_ptr<char, LeakedDanglingUntriaged> allocation;
+ raw_ptr<IndexLinkNode, LeakedDanglingUntriaged> freeList;
+
+ raw_ptr<Slab, DanglingUntriaged> prev;
+ raw_ptr<Slab, DanglingUntriaged> next;
Index blocksInUse;
};
diff --git a/src/dawn/common/StackContainer.h b/src/dawn/common/StackContainer.h
index 2e03749..19d6806 100644
--- a/src/dawn/common/StackContainer.h
+++ b/src/dawn/common/StackContainer.h
@@ -12,6 +12,7 @@
#include <vector>
#include "dawn/common/Compiler.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -113,7 +114,7 @@
}
private:
- Source* source_;
+ raw_ptr<Source> source_;
};
// A wrapper around STL containers that maintains a stack-sized buffer that the
diff --git a/src/dawn/common/WeakRefSupport.cpp b/src/dawn/common/WeakRefSupport.cpp
index 7bbb79b..35f89bd 100644
--- a/src/dawn/common/WeakRefSupport.cpp
+++ b/src/dawn/common/WeakRefSupport.cpp
@@ -38,7 +38,7 @@
if (!mValue || !mValue->mRefCount.TryIncrement()) {
return nullptr;
}
- return AcquireRef(mValue);
+ return AcquireRef(mValue.get());
}
RefCounted* WeakRefData::UnsafeGet() const {
diff --git a/src/dawn/common/WeakRefSupport.h b/src/dawn/common/WeakRefSupport.h
index 173222b..b318fc5 100644
--- a/src/dawn/common/WeakRefSupport.h
+++ b/src/dawn/common/WeakRefSupport.h
@@ -30,6 +30,7 @@
#include "dawn/common/Compiler.h"
#include "dawn/common/Ref.h"
+#include "partition_alloc/pointers/raw_ptr.h"
namespace dawn {
@@ -54,7 +55,7 @@
private:
std::mutex mMutex;
- RefCounted* mValue = nullptr;
+ raw_ptr<RefCounted> mValue = nullptr;
};
// Interface base class used to enable compile-time verification of WeakRefSupport functions.
diff --git a/src/dawn/partition_alloc/partition_alloc/pointers/raw_ptr.h b/src/dawn/partition_alloc/partition_alloc/pointers/raw_ptr.h
index fd19b53..f61f04f 100644
--- a/src/dawn/partition_alloc/partition_alloc/pointers/raw_ptr.h
+++ b/src/dawn/partition_alloc/partition_alloc/pointers/raw_ptr.h
@@ -348,6 +348,7 @@
using partition_alloc::internal::RawPtrTraits;
constexpr RawPtrTraits DisableDanglingPtrDetection = 0;
constexpr RawPtrTraits DanglingUntriaged = 0;
+constexpr RawPtrTraits LeakedDanglingUntriaged = 0;
constexpr RawPtrTraits AllowPtrArithmetic = 0;
namespace std {