aboutsummaryrefslogtreecommitdiffstats
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
commit2a22004f6857c57dc483ea6180f0e1f86854bd13 (patch)
treeb60e7f9e88b731340cacaa4539c27c6a795712df
parent28a1e486907104b85c5787345914917d74f0cf77 (diff)
downloadexternal_llvm-2a22004f6857c57dc483ea6180f0e1f86854bd13.zip
external_llvm-2a22004f6857c57dc483ea6180f0e1f86854bd13.tar.gz
external_llvm-2a22004f6857c57dc483ea6180f0e1f86854bd13.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
-rw-r--r--include/llvm/Support/Allocator.h6
-rw-r--r--lib/CodeGen/LiveIntervalAnalysis.cpp7
-rw-r--r--lib/Support/Allocator.cpp15
3 files changed, 27 insertions, 1 deletions
diff --git a/include/llvm/Support/Allocator.h b/include/llvm/Support/Allocator.h
index b1f59dc..a58b9db 100644
--- a/include/llvm/Support/Allocator.h
+++ b/include/llvm/Support/Allocator.h
@@ -134,6 +134,7 @@ class BumpPtrAllocator {
static MallocSlabAllocator DefaultSlabAllocator;
public:
+ typedef void (*DTorFunction)(void*);
BumpPtrAllocator(size_t size = 4096, size_t threshold = 4096,
SlabAllocator &allocator = DefaultSlabAllocator);
~BumpPtrAllocator();
@@ -142,6 +143,11 @@ public:
/// to the beginning of it, freeing all memory allocated so far.
void Reset();
+ /// Reset - like Reset(), but call DTorFunction for each allocated
+ /// object. This assumes that all objects allocated with this allocator
+ /// had the same size and alignment specified here.
+ void Reset(size_t Size, size_t Alignment, DTorFunction DTor);
+
/// Allocate - Allocate space at the specified alignment.
///
void *Allocate(size_t Size, size_t Alignment);
diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp
index e657c46..53366b9 100644
--- a/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -82,6 +82,11 @@ void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
MachineFunctionPass::getAnalysisUsage(AU);
}
+static void VNInfoDTor(void* Ptr)
+{
+ reinterpret_cast<VNInfo*>(Ptr)->~VNInfo();
+}
+
void LiveIntervals::releaseMemory() {
// Free the live intervals themselves.
for (DenseMap<unsigned, LiveInterval*>::iterator I = r2iMap_.begin(),
@@ -91,7 +96,7 @@ void LiveIntervals::releaseMemory() {
r2iMap_.clear();
// Release VNInfo memroy regions after all VNInfo objects are dtor'd.
- VNInfoAllocator.Reset();
+ VNInfoAllocator.Reset((unsigned)sizeof(VNInfo), alignof<VNInfo>(), VNInfoDTor);
while (!CloneMIs.empty()) {
MachineInstr *MI = CloneMIs.back();
CloneMIs.pop_back();
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) {