It seems safer to have the SSANames map take trees to AssertingVH's
rather than Value*'s. It's still not completely clear to me whether
a value defining an SSAName can be deleted out from under us, so best
to check.
llvm-svn: 82691
diff --git a/dragonegg/llvm-backend.cpp b/dragonegg/llvm-backend.cpp
index e20d0cc..be76684 100644
--- a/dragonegg/llvm-backend.cpp
+++ b/dragonegg/llvm-backend.cpp
@@ -1788,8 +1788,11 @@
calculate_dominance_info(CDI_DOMINATORS);
// Convert the AST to raw/ugly LLVM code.
- TreeToLLVM Emitter(current_function_decl);
- Function *Fn = Emitter.EmitFunction();
+ Function *Fn;
+ {
+ TreeToLLVM Emitter(current_function_decl);
+ Fn = Emitter.EmitFunction();
+ }
// Free dominator and other ssa data structures.
execute_free_datastructures();
diff --git a/dragonegg/llvm-convert.cpp b/dragonegg/llvm-convert.cpp
index 8e443c3..ff87a30 100644
--- a/dragonegg/llvm-convert.cpp
+++ b/dragonegg/llvm-convert.cpp
@@ -38,6 +38,7 @@
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
+#include "llvm/Support/ValueHandle.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetLowering.h"
@@ -2106,7 +2107,7 @@
/// EmitSSA_NAME - Return the defining value of the given SSA_NAME.
Value *TreeToLLVM::EmitSSA_NAME(tree exp) {
- DenseMap<tree, Value*>::iterator I = SSANames.find(exp);
+ DenseMap<tree, AssertingVH<> >::iterator I = SSANames.find(exp);
if (I != SSANames.end())
return I->second;
diff --git a/dragonegg/llvm-internal.h b/dragonegg/llvm-internal.h
index 563bd3b..1e8ed8c 100644
--- a/dragonegg/llvm-internal.h
+++ b/dragonegg/llvm-internal.h
@@ -63,6 +63,7 @@
class TargetMachine;
class TargetData;
class DebugInfo;
+ template<typename> class AssertingVH;
}
using namespace llvm;
@@ -350,7 +351,7 @@
SmallVector<PhiRecord, 16> PendingPhis;
// SSANames - Map from GCC ssa names to the defining LLVM value.
- DenseMap<tree, Value*> SSANames;
+ DenseMap<tree, AssertingVH<> > SSANames;
//===---------------------- Exception Handling --------------------------===//