summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support
diff options
context:
space:
mode:
authorTorok Edwin <edwintorok@gmail.com>2010-03-30 10:08:26 +0000
committerTorok Edwin <edwintorok@gmail.com>2010-03-30 10:08:26 +0000
commitba6d13c0ea946ad1e41647b891f0adf229151073 (patch)
treede6ed8aa212e14ad824ace330d2c72bc62492c6c /llvm/lib/Support
parentcbcccce420dc01ad44dbe0d63ac55815d44d865d (diff)
downloadbcm5719-llvm-ba6d13c0ea946ad1e41647b891f0adf229151073.tar.gz
bcm5719-llvm-ba6d13c0ea946ad1e41647b891f0adf229151073.zip
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). llvm-svn: 99881
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r--llvm/lib/Support/Allocator.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Support/Allocator.cpp b/llvm/lib/Support/Allocator.cpp
index 31b45c8d4aa..7433247c237 100644
--- a/llvm/lib/Support/Allocator.cpp
+++ b/llvm/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) {
OpenPOWER on IntegriCloud