diff --git a/tools/llvm-prof/llvm-prof.cpp b/tools/llvm-prof/llvm-prof.cpp
index 2cff296..d5dae76 100644
--- a/tools/llvm-prof/llvm-prof.cpp
+++ b/tools/llvm-prof/llvm-prof.cpp
@@ -16,7 +16,9 @@
 #include "llvm/InstrTypes.h"
 #include "llvm/LLVMContext.h"
 #include "llvm/Module.h"
+#include "llvm/PassManager.h"
 #include "llvm/Assembly/AsmAnnotationWriter.h"
+#include "llvm/Analysis/ProfileInfo.h"
 #include "llvm/Analysis/ProfileInfoLoader.h"
 #include "llvm/Bitcode/ReaderWriter.h"
 #include "llvm/Support/CommandLine.h"
@@ -113,6 +115,141 @@
   };
 }
 
+namespace {
+  /// ProfileInfoPrinterPass - Helper pass to dump the profile information for
+  /// a module.
+  //
+  // FIXME: This should move elsewhere.
+  class ProfileInfoPrinterPass : public ModulePass {
+    ProfileInfoLoader &PIL;
+  public:
+    static char ID; // Class identification, replacement for typeinfo.
+    explicit ProfileInfoPrinterPass(ProfileInfoLoader &_PIL) 
+      : ModulePass(&ID), PIL(_PIL) {}
+
+    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+      AU.setPreservesAll();
+      AU.addRequired<ProfileInfo>();
+    }
+
+    bool runOnModule(Module &M);
+  };
+}
+
+char ProfileInfoPrinterPass::ID = 0;
+
+bool ProfileInfoPrinterPass::runOnModule(Module &M) {
+  std::map<const Function  *, unsigned> FuncFreqs;
+  std::map<const BasicBlock*, unsigned> BlockFreqs;
+  std::map<ProfileInfoLoader::Edge, unsigned> EdgeFreqs;
+
+  // Output a report. Eventually, there will be multiple reports selectable on
+  // the command line, for now, just keep things simple.
+
+  // Emit the most frequent function table...
+  std::vector<std::pair<Function*, unsigned> > FunctionCounts;
+  PIL.getFunctionCounts(FunctionCounts);
+  FuncFreqs.insert(FunctionCounts.begin(), FunctionCounts.end());
+
+  // Sort by the frequency, backwards.
+  sort(FunctionCounts.begin(), FunctionCounts.end(),
+            PairSecondSortReverse<Function*>());
+
+  uint64_t TotalExecutions = 0;
+  for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i)
+    TotalExecutions += FunctionCounts[i].second;
+
+  std::cout << "===" << std::string(73, '-') << "===\n"
+            << "LLVM profiling output for execution";
+  if (PIL.getNumExecutions() != 1) std::cout << "s";
+  std::cout << ":\n";
+
+  for (unsigned i = 0, e = PIL.getNumExecutions(); i != e; ++i) {
+    std::cout << "  ";
+    if (e != 1) std::cout << i+1 << ". ";
+    std::cout << PIL.getExecution(i) << "\n";
+  }
+
+  std::cout << "\n===" << std::string(73, '-') << "===\n";
+  std::cout << "Function execution frequencies:\n\n";
+
+  // Print out the function frequencies...
+  std::cout << " ##   Frequency\n";
+  for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i) {
+    if (FunctionCounts[i].second == 0) {
+      std::cout << "\n  NOTE: " << e-i << " function" <<
+             (e-i-1 ? "s were" : " was") << " never executed!\n";
+      break;
+    }
+
+    std::cout << std::setw(3) << i+1 << ". " 
+      << std::setw(5) << FunctionCounts[i].second << "/"
+      << TotalExecutions << " "
+      << FunctionCounts[i].first->getName().c_str() << "\n";
+  }
+
+  std::set<Function*> FunctionsToPrint;
+
+  // If we have block count information, print out the LLVM module with
+  // frequency annotations.
+  if (PIL.hasAccurateBlockCounts()) {
+    std::vector<std::pair<BasicBlock*, unsigned> > Counts;
+    PIL.getBlockCounts(Counts);
+
+    TotalExecutions = 0;
+    for (unsigned i = 0, e = Counts.size(); i != e; ++i)
+      TotalExecutions += Counts[i].second;
+
+    // Sort by the frequency, backwards.
+    sort(Counts.begin(), Counts.end(),
+              PairSecondSortReverse<BasicBlock*>());
+
+    std::cout << "\n===" << std::string(73, '-') << "===\n";
+    std::cout << "Top 20 most frequently executed basic blocks:\n\n";
+
+    // Print out the function frequencies...
+    std::cout <<" ##      %% \tFrequency\n";
+    unsigned BlocksToPrint = Counts.size();
+    if (BlocksToPrint > 20) BlocksToPrint = 20;
+    for (unsigned i = 0; i != BlocksToPrint; ++i) {
+      if (Counts[i].second == 0) break;
+      Function *F = Counts[i].first->getParent();
+      std::cout << std::setw(3) << i+1 << ". " 
+        << std::setw(5) << std::setprecision(2) 
+        << Counts[i].second/(double)TotalExecutions*100 << "% "
+        << std::setw(5) << Counts[i].second << "/"
+        << TotalExecutions << "\t"
+        << F->getName().c_str() << "() - "
+        << Counts[i].first->getName().c_str() << "\n";
+      FunctionsToPrint.insert(F);
+    }
+
+    BlockFreqs.insert(Counts.begin(), Counts.end());
+  }
+
+  if (PIL.hasAccurateEdgeCounts()) {
+    std::vector<std::pair<ProfileInfoLoader::Edge, unsigned> > Counts;
+    PIL.getEdgeCounts(Counts);
+    EdgeFreqs.insert(Counts.begin(), Counts.end());
+  }
+
+  if (PrintAnnotatedLLVM || PrintAllCode) {
+    std::cout << "\n===" << std::string(73, '-') << "===\n";
+    std::cout << "Annotated LLVM code for the module:\n\n";
+
+    ProfileAnnotator PA(FuncFreqs, BlockFreqs, EdgeFreqs);
+
+    if (FunctionsToPrint.empty() || PrintAllCode)
+      M.print(std::cout, &PA);
+    else
+      // Print just a subset of the functions.
+      for (std::set<Function*>::iterator I = FunctionsToPrint.begin(),
+             E = FunctionsToPrint.end(); I != E; ++I)
+        (*I)->print(std::cout, &PA);
+  }
+
+  return false;
+}
 
 int main(int argc, char **argv) {
   // Print a stack trace if we signal out.
@@ -138,117 +275,17 @@
       return 1;
     }
 
-    // Read the profiling information
-    ProfileInfoLoader PI(argv[0], ProfileDataFile, *M);
+    // Read the profiling information. This is redundant since we load it again
+    // using the standard profile info provider pass, but for now this gives us
+    // access to additional information not exposed via the ProfileInfo
+    // interface.
+    ProfileInfoLoader PIL(argv[0], ProfileDataFile, *M);
 
-    std::map<const Function  *, unsigned> FuncFreqs;
-    std::map<const BasicBlock*, unsigned> BlockFreqs;
-    std::map<ProfileInfoLoader::Edge, unsigned> EdgeFreqs;
-
-    // Output a report. Eventually, there will be multiple reports selectable on
-    // the command line, for now, just keep things simple.
-
-    // Emit the most frequent function table...
-    std::vector<std::pair<Function*, unsigned> > FunctionCounts;
-    PI.getFunctionCounts(FunctionCounts);
-    FuncFreqs.insert(FunctionCounts.begin(), FunctionCounts.end());
-
-    // Sort by the frequency, backwards.
-    sort(FunctionCounts.begin(), FunctionCounts.end(),
-              PairSecondSortReverse<Function*>());
-
-    uint64_t TotalExecutions = 0;
-    for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i)
-      TotalExecutions += FunctionCounts[i].second;
-
-    std::cout << "===" << std::string(73, '-') << "===\n"
-              << "LLVM profiling output for execution";
-    if (PI.getNumExecutions() != 1) std::cout << "s";
-    std::cout << ":\n";
-
-    for (unsigned i = 0, e = PI.getNumExecutions(); i != e; ++i) {
-      std::cout << "  ";
-      if (e != 1) std::cout << i+1 << ". ";
-      std::cout << PI.getExecution(i) << "\n";
-    }
-
-    std::cout << "\n===" << std::string(73, '-') << "===\n";
-    std::cout << "Function execution frequencies:\n\n";
-
-    // Print out the function frequencies...
-    std::cout << " ##   Frequency\n";
-    for (unsigned i = 0, e = FunctionCounts.size(); i != e; ++i) {
-      if (FunctionCounts[i].second == 0) {
-        std::cout << "\n  NOTE: " << e-i << " function" <<
-               (e-i-1 ? "s were" : " was") << " never executed!\n";
-        break;
-      }
-
-      std::cout << std::setw(3) << i+1 << ". " 
-        << std::setw(5) << FunctionCounts[i].second << "/"
-        << TotalExecutions << " "
-        << FunctionCounts[i].first->getName().c_str() << "\n";
-    }
-
-    std::set<Function*> FunctionsToPrint;
-
-    // If we have block count information, print out the LLVM module with
-    // frequency annotations.
-    if (PI.hasAccurateBlockCounts()) {
-      std::vector<std::pair<BasicBlock*, unsigned> > Counts;
-      PI.getBlockCounts(Counts);
-
-      TotalExecutions = 0;
-      for (unsigned i = 0, e = Counts.size(); i != e; ++i)
-        TotalExecutions += Counts[i].second;
-
-      // Sort by the frequency, backwards.
-      sort(Counts.begin(), Counts.end(),
-                PairSecondSortReverse<BasicBlock*>());
-
-      std::cout << "\n===" << std::string(73, '-') << "===\n";
-      std::cout << "Top 20 most frequently executed basic blocks:\n\n";
-
-      // Print out the function frequencies...
-      std::cout <<" ##      %% \tFrequency\n";
-      unsigned BlocksToPrint = Counts.size();
-      if (BlocksToPrint > 20) BlocksToPrint = 20;
-      for (unsigned i = 0; i != BlocksToPrint; ++i) {
-        if (Counts[i].second == 0) break;
-        Function *F = Counts[i].first->getParent();
-        std::cout << std::setw(3) << i+1 << ". " 
-          << std::setw(5) << std::setprecision(2) 
-          << Counts[i].second/(double)TotalExecutions*100 << "% "
-          << std::setw(5) << Counts[i].second << "/"
-          << TotalExecutions << "\t"
-          << F->getName().c_str() << "() - "
-          << Counts[i].first->getName().c_str() << "\n";
-        FunctionsToPrint.insert(F);
-      }
-
-      BlockFreqs.insert(Counts.begin(), Counts.end());
-    }
-
-    if (PI.hasAccurateEdgeCounts()) {
-      std::vector<std::pair<ProfileInfoLoader::Edge, unsigned> > Counts;
-      PI.getEdgeCounts(Counts);
-      EdgeFreqs.insert(Counts.begin(), Counts.end());
-    }
-
-    if (PrintAnnotatedLLVM || PrintAllCode) {
-      std::cout << "\n===" << std::string(73, '-') << "===\n";
-      std::cout << "Annotated LLVM code for the module:\n\n";
-
-      ProfileAnnotator PA(FuncFreqs, BlockFreqs, EdgeFreqs);
-
-      if (FunctionsToPrint.empty() || PrintAllCode)
-        M->print(std::cout, &PA);
-      else
-        // Print just a subset of the functions.
-        for (std::set<Function*>::iterator I = FunctionsToPrint.begin(),
-               E = FunctionsToPrint.end(); I != E; ++I)
-          (*I)->print(std::cout, &PA);
-    }
+    // Run the printer pass.
+    PassManager PassMgr;
+    PassMgr.add(createProfileLoaderPass(ProfileDataFile));
+    PassMgr.add(new ProfileInfoPrinterPass(PIL));
+    PassMgr.run(*M);
 
     return 0;
   } catch (const std::string& msg) {
@@ -256,5 +293,6 @@
   } catch (...) {
     std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
   }
+  
   return 1;
 }
