Make load->store deletion a bit smarter. This allows us to compile this:
[oota-llvm.git] / lib / CodeGen / AsmPrinter.cpp
index fa685412491e72c6637cc45f1f41549fdc5718bd..bb66bd2ad5c3b0dbd3abce94d53ec5858c54785b 100644 (file)
 #include "llvm/DerivedTypes.h"
 #include "llvm/Constants.h"
 #include "llvm/Module.h"
+#include "llvm/CodeGen/Collector.h"
+#include "llvm/CodeGen/CollectorMetadata.h"
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineJumpTableInfo.h"
+#include "llvm/CodeGen/MachineModuleInfo.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Mangler.h"
 #include "llvm/Support/MathExtras.h"
@@ -93,9 +96,20 @@ void AsmPrinter::SwitchToDataSection(const char *NewSection,
 }
 
 
+void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
+  MachineFunctionPass::getAnalysisUsage(AU);
+  AU.addRequired<CollectorModuleMetadata>();
+}
+
 bool AsmPrinter::doInitialization(Module &M) {
   Mang = new Mangler(M, TAI->getGlobalPrefix());
   
+  CollectorModuleMetadata *CMM = getAnalysisToUpdate<CollectorModuleMetadata>();
+  assert(CMM && "AsmPrinter didn't require CollectorModuleMetadata?");
+  for (CollectorModuleMetadata::iterator I = CMM->begin(),
+                                         E = CMM->end(); I != E; ++I)
+    (*I)->beginAssembly(O, *this, *TAI);
+  
   if (!M.getModuleInlineAsm().empty())
     O << TAI->getCommentString() << " Start of file scope inline assembly\n"
       << M.getModuleInlineAsm()
@@ -157,6 +171,12 @@ bool AsmPrinter::doFinalization(Module &M) {
     }
   }
 
+  CollectorModuleMetadata *CMM = getAnalysisToUpdate<CollectorModuleMetadata>();
+  assert(CMM && "AsmPrinter didn't require CollectorModuleMetadata?");
+  for (CollectorModuleMetadata::iterator I = CMM->end(),
+                                         E = CMM->begin(); I != E; )
+    (*--I)->finishAssembly(O, *this, *TAI);
+
   delete Mang; Mang = 0;
   return false;
 }