[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b

Török Edvin edwin at clamav.net
Sun Apr 4 01:27:36 UTC 2010


The following commit has been merged in the debian/unstable branch:
commit 5b3a41e04d5a9f5d59499e9ec10f46655a2e65f6
Author: Török Edvin <edwin at clamav.net>
Date:   Tue Mar 30 13:09:10 2010 +0300

    Merge LLVM SVN r99881 to fix some more VNInfo leaks.
    
    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).

diff --git a/libclamav/c++/llvm/include/llvm/Support/Allocator.h b/libclamav/c++/llvm/include/llvm/Support/Allocator.h
index b0ed33d..a8e4d2d 100644
--- a/libclamav/c++/llvm/include/llvm/Support/Allocator.h
+++ b/libclamav/c++/llvm/include/llvm/Support/Allocator.h
@@ -131,6 +131,7 @@ class BumpPtrAllocator {
   static MallocSlabAllocator DefaultSlabAllocator;
 
 public:
+  typedef void (*DTorFunction)(void*);
   BumpPtrAllocator(size_t size = 4096, size_t threshold = 4096,
                    SlabAllocator &allocator = DefaultSlabAllocator);
   ~BumpPtrAllocator();
@@ -139,6 +140,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/libclamav/c++/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/libclamav/c++/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
index 2b6b82a..ba7805b 100644
--- a/libclamav/c++/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
+++ b/libclamav/c++/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp
@@ -82,18 +82,21 @@ 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(),
-       E = r2iMap_.end(); I != E; ++I) {
-    I->second->clear();
+       E = r2iMap_.end(); I != E; ++I)
     delete I->second;
-  }
-  
+
   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/libclamav/c++/llvm/lib/Support/Allocator.cpp b/libclamav/c++/llvm/lib/Support/Allocator.cpp
index 31b45c8..7433247 100644
--- a/libclamav/c++/llvm/lib/Support/Allocator.cpp
+++ b/libclamav/c++/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) {

-- 
Debian repository for ClamAV



More information about the Pkg-clamav-commits mailing list