aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support
diff options
context:
space:
mode:
authorEdwin Török <edwintorok@gmail.com>2010-03-30 10:08:26 +0000
committerEdwin Török <edwintorok@gmail.com>2010-03-30 10:08:26 +0000
commit5697fa998e62ff77965b4a7878ec102ea1245da8 (patch)
treeb60e7f9e88b731340cacaa4539c27c6a795712df /lib/Support
parent20d2e38aa9ba1a833c58f85efbf1283e1aa7c44a (diff)
downloadexternal_llvm-5697fa998e62ff77965b4a7878ec102ea1245da8.zip
external_llvm-5697fa998e62ff77965b4a7878ec102ea1245da8.tar.gz
external_llvm-5697fa998e62ff77965b4a7878ec102ea1245da8.tar.bz2
Introduce another Reset() method in BumpPtrAllocator that calls a destructor
on all objects it has allocated, if they are all of the same size and alignment. Use this to destruct all VNInfos allocated in LiveIntervalAnalysis (PR6653). valnos is not reliable for this purpose, as seen in r99400 (which still leaked, and sometimes caused double frees). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99881 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r--lib/Support/Allocator.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/Support/Allocator.cpp b/lib/Support/Allocator.cpp
index 31b45c8..7433247 100644
--- a/lib/Support/Allocator.cpp
+++ b/lib/Support/Allocator.cpp
@@ -78,6 +78,21 @@ void BumpPtrAllocator::Reset() {
End = ((char*)CurSlab) + CurSlab->Size;
}
+void BumpPtrAllocator::Reset(size_t Size, size_t Alignment, DTorFunction DTor) {
+ if (Alignment == 0) Alignment = 1;
+ MemSlab *Slab = CurSlab;
+ while (Slab) {
+ char *End = Slab == CurSlab ? CurPtr : (char*)Slab + Slab->Size;
+ for (char *Ptr = (char*)Slab+1; Ptr < End; Ptr += Size) {
+ Ptr = AlignPtr(Ptr, Alignment);
+ if (Ptr + Size <= End)
+ DTor(Ptr);
+ }
+ Slab = Slab->NextPtr;
+ }
+ Reset();
+}
+
/// Allocate - Allocate space at the specified alignment.
///
void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {