aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-15 23:33:48 +0000
committerChris Lattner <sabre@nondot.org>2004-02-15 23:33:48 +0000
commit8709927af8095c58cf2147d6d83fed9b7821a508 (patch)
tree380ab88e2fe4955ee94d35b72216d1d064db9a78
parent2e6fcafff228c44542dad804d4bd7269c7abd0f4 (diff)
downloadexternal_llvm-8709927af8095c58cf2147d6d83fed9b7821a508.zip
external_llvm-8709927af8095c58cf2147d6d83fed9b7821a508.tar.gz
external_llvm-8709927af8095c58cf2147d6d83fed9b7821a508.tar.bz2
Fix a bug in the recent rewrite of the leakdetector that caused all of the
nightly tests to be really messed up. The problem was that the new leakdetector was depending on undefined behavior: the order of destruction of static objects. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11488 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Support/LeakDetector.cpp17
-rw-r--r--lib/VMCore/LeakDetector.cpp17
2 files changed, 20 insertions, 14 deletions
diff --git a/lib/Support/LeakDetector.cpp b/lib/Support/LeakDetector.cpp
index a6d96df..d4e829f 100644
--- a/lib/Support/LeakDetector.cpp
+++ b/lib/Support/LeakDetector.cpp
@@ -17,7 +17,6 @@
using namespace llvm;
namespace {
-
template <typename T>
struct LeakDetectorImpl {
LeakDetectorImpl(const char* const name) : Cache(0), Name(name) { }
@@ -64,21 +63,25 @@ namespace {
private:
std::set<const T*> Ts;
- const T* Cache;
- const char* const Name;
+ const T* Cache;
+ const char* const Name;
};
typedef LeakDetectorImpl<void> Objects;
typedef LeakDetectorImpl<Value> LLVMObjects;
Objects& getObjects() {
- static Objects o("GENERIC");
- return o;
+ static Objects *o = 0;
+ if (o == 0)
+ o = new Objects("GENERIC");
+ return *o;
}
LLVMObjects& getLLVMObjects() {
- static LLVMObjects o("LLVM");
- return o;
+ static LLVMObjects *o = 0;
+ if (o == 0)
+ o = new LLVMObjects("LLVM");
+ return *o;
}
}
diff --git a/lib/VMCore/LeakDetector.cpp b/lib/VMCore/LeakDetector.cpp
index a6d96df..d4e829f 100644
--- a/lib/VMCore/LeakDetector.cpp
+++ b/lib/VMCore/LeakDetector.cpp
@@ -17,7 +17,6 @@
using namespace llvm;
namespace {
-
template <typename T>
struct LeakDetectorImpl {
LeakDetectorImpl(const char* const name) : Cache(0), Name(name) { }
@@ -64,21 +63,25 @@ namespace {
private:
std::set<const T*> Ts;
- const T* Cache;
- const char* const Name;
+ const T* Cache;
+ const char* const Name;
};
typedef LeakDetectorImpl<void> Objects;
typedef LeakDetectorImpl<Value> LLVMObjects;
Objects& getObjects() {
- static Objects o("GENERIC");
- return o;
+ static Objects *o = 0;
+ if (o == 0)
+ o = new Objects("GENERIC");
+ return *o;
}
LLVMObjects& getLLVMObjects() {
- static LLVMObjects o("LLVM");
- return o;
+ static LLVMObjects *o = 0;
+ if (o == 0)
+ o = new LLVMObjects("LLVM");
+ return *o;
}
}