Add a doFinalization method to the DataLayout pass.
authorPete Cooper <peter_cooper@apple.com>
Tue, 12 Mar 2013 17:37:31 +0000 (17:37 +0000)
committerPete Cooper <peter_cooper@apple.com>
Tue, 12 Mar 2013 17:37:31 +0000 (17:37 +0000)
This pass is meant to be immutable, however it holds mutable state to cache StructLayouts.
This method will allow the pass manager to clear the mutable state between runs.

Note that unfortunately it is still necessary to have the destructor, even though it does the
same thing as doFinalization.  This is because most TargetMachines embed a DataLayout on which
doFinalization isn't run as its never added to the pass manager.

I also didn't think it was necessary to complication things with a deInit method for which
doFinalization and ~DataLayout both call as there's only one field of mutable state.  If we had
more fields to finalize i'd have added this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176877 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/DataLayout.h
lib/IR/DataLayout.cpp

index 5eb186d53185ba9bac72a2820edd9e82d7099ccb..4d3016c72f22f15525411ef61f650fe1d51937d4 100644 (file)
@@ -181,6 +181,10 @@ public:
 
   ~DataLayout();  // Not virtual, do not subclass this class
 
+  /// DataLayout is an immutable pass, but holds state.  This allows the pass
+  /// manager to clear its mutable state.
+  bool doFinalization(Module &M);
+
   /// Parse a data layout string (with fallback to default values). Ensure that
   /// the data layout pass is registered.
   void init(StringRef LayoutDescription);
index f09de3a73198ac1431efd6a261c5b3838c59d2dc..4100c4ff614b62a81fb38b702af34b85d559f7cd 100644 (file)
@@ -438,6 +438,12 @@ DataLayout::~DataLayout() {
   delete static_cast<StructLayoutMap*>(LayoutMap);
 }
 
+bool DataLayout::doFinalization(Module &M) {
+  delete static_cast<StructLayoutMap*>(LayoutMap);
+  LayoutMap = 0;
+  return false;
+}
+
 const StructLayout *DataLayout::getStructLayout(StructType *Ty) const {
   if (!LayoutMap)
     LayoutMap = new StructLayoutMap();