aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Analysis/Support/BumpVector.h19
1 files changed, 17 insertions, 2 deletions
diff --git a/include/clang/Analysis/Support/BumpVector.h b/include/clang/Analysis/Support/BumpVector.h
index 243332fec0..a5e11a1006 100644
--- a/include/clang/Analysis/Support/BumpVector.h
+++ b/include/clang/Analysis/Support/BumpVector.h
@@ -21,14 +21,29 @@
#include "llvm/Support/type_traits.h"
#include "llvm/Support/Allocator.h"
+#include "llvm/ADT/PointerIntPair.h"
#include <algorithm>
namespace clang {
class BumpVectorContext {
- llvm::BumpPtrAllocator Alloc;
+ llvm::PointerIntPair<llvm::BumpPtrAllocator*, 1, bool> Alloc;
public:
- llvm::BumpPtrAllocator &getAllocator() { return Alloc; }
+ /// Construct a new BumpVectorContext that creates a new BumpPtrAllocator
+ /// and destroys it when the BumpVectorContext object is destroyed.
+ BumpVectorContext() : Alloc(new llvm::BumpPtrAllocator(), true) {}
+
+ /// Construct a new BumpVectorContext that reuses an existing
+ /// BumpPtrAllocator. This BumpPtrAllocator is not destroyed when the
+ /// BumpVectorContext object is destroyed.
+ BumpVectorContext(llvm::BumpPtrAllocator &A) : Alloc(&A, false) {}
+
+ ~BumpVectorContext() {
+ if (Alloc.getInt())
+ delete Alloc.getPointer();
+ }
+
+ llvm::BumpPtrAllocator &getAllocator() { return *Alloc.getPointer(); }
};
template<typename T>