diff --git a/CMakeLists.txt b/CMakeLists.txt
index 97d31fec5772186106597092c15c6b96ba7df3e7..0e071a752525d1ed03d32e6bc1235b8ffd5ec5bf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -3,7 +3,7 @@ set(METRICS_TEST_DIR ${CMAKE_BINARY_DIR}/tools/find-inputs)
 configure_lit_site_cfg(${CMAKE_CURRENT_SOURCE_DIR}/test/lit.site.cfg.in
   ${METRICS_TEST_DIR}/lit.site.cfg)
 
-set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} bitreader asmparser irreader)
+set(LLVM_LINK_COMPONENTS ${LLVM_TARGETS_TO_BUILD} analysis core bitreader asmparser irreader passes support option libdriver)
 
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
 
diff --git a/bin/calc-mccabe.cpp b/bin/calc-mccabe.cpp
index c1dba60fce0d0c663f6d0c31387f3f118d4a6387..89913faa85ffaf8731bde0bbb715f1e262f23bbf 100644
--- a/bin/calc-mccabe.cpp
+++ b/bin/calc-mccabe.cpp
@@ -27,6 +27,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -76,25 +77,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::FunctionPassManager FPM(M.get());
diff --git a/bin/call-stack.cpp b/bin/call-stack.cpp
index 9e8f1fd36bd72c5eb9c3363f850eb8bcbd34ea02..1bda73e0b06d96978f3054f4a136e18a036ea4e0 100644
--- a/bin/call-stack.cpp
+++ b/bin/call-stack.cpp
@@ -20,7 +20,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/IR/Function.h"
@@ -30,6 +29,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -62,7 +62,7 @@ struct CallStackPrinter : ModulePass {
 
   CallStackPrinter(raw_ostream &out, const Function *Func)
       : ModulePass(ID), Out(out), F(Func) {
-    initializeCallGraphPass(*PassRegistry::getPassRegistry());
+    initializeCallGraphWrapperPassPass(*PassRegistry::getPassRegistry());
   }
   bool runOnModule(Module &M) override {
     getRecursions(F);
@@ -110,11 +110,11 @@ struct CallStackPrinter : ModulePass {
 
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
-    AU.addRequired<CallGraph>();
+    AU.addRequired<CallGraphWrapperPass>();
   }
 
   void getRecursions(const Function *F) {
-    const auto CGN = getAnalysis<CallGraph>()[F];
+    const auto CGN = getAnalysis<CallGraphWrapperPass>().getCallGraph()[F];
 
     for (auto SI = scc_begin(CGN), SE = scc_end(CGN); SI != SE; ++SI)
       if (SI.hasLoop()) {
@@ -141,25 +141,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::PassManager PM;
diff --git a/bin/find-inputs.cpp b/bin/find-inputs.cpp
index b5d2a7650a5b9f97ef2c185c6bc8a486097c781a..54d947daa28443d88f03d32ac8b1e4059b314f2b 100644
--- a/bin/find-inputs.cpp
+++ b/bin/find-inputs.cpp
@@ -20,7 +20,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
@@ -29,6 +28,7 @@
 #include "llvm/IR/Value.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -135,25 +135,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::FunctionPassManager FPM(M.get());
diff --git a/bin/is-recursive.cpp b/bin/is-recursive.cpp
index 708c431ddcf3877fc28cbdadb28e08fedbdf1800..62bc99c598204743a37e0e92cbc3d25e785a8ff4 100644
--- a/bin/is-recursive.cpp
+++ b/bin/is-recursive.cpp
@@ -18,7 +18,6 @@
  */
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/IR/Function.h"
@@ -28,6 +27,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -59,7 +59,7 @@ struct RecursionPrinter : ModulePass {
 
   RecursionPrinter(raw_ostream &out, const Function *Func)
       : ModulePass(ID), Out(out), F(Func) {
-    initializeCallGraphPass(*PassRegistry::getPassRegistry());
+    initializeCallGraphWrapperPassPass(*PassRegistry::getPassRegistry());
   }
   bool runOnModule(Module &M) override {
     getRecursions(F);
@@ -90,11 +90,11 @@ struct RecursionPrinter : ModulePass {
 
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
-    AU.addRequired<CallGraph>();
+    AU.addRequired<CallGraphWrapperPass>();
   }
 
   void getRecursions(const Function *F) {
-    const auto CGN = getAnalysis<CallGraph>()[F];
+    const auto CGN = getAnalysis<CallGraphWrapperPass>().getCallGraph()[F];
 
     for (auto SI = scc_begin(CGN), SE = scc_end(CGN); SI != SE; ++SI)
       if (SI.hasLoop()) {
@@ -121,25 +121,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::PassManager PM;
diff --git a/bin/loop-stats.cpp b/bin/loop-stats.cpp
index 5c4d36fc75272619601969deeecc6defd645ab04..878a0f40e1f34636ccfd3fb844a84ec2c3603b4b 100644
--- a/bin/loop-stats.cpp
+++ b/bin/loop-stats.cpp
@@ -20,7 +20,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
@@ -28,6 +27,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -85,25 +85,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::PassManager PM;
diff --git a/bin/metrics.cpp b/bin/metrics.cpp
index 2805aaac492b6355d8733440b18a38370312f240..20f827437d6c47e462f095f269bf43c3f9973fd7 100644
--- a/bin/metrics.cpp
+++ b/bin/metrics.cpp
@@ -29,7 +29,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
@@ -38,6 +37,7 @@
 #include "llvm/IR/Value.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -105,25 +105,25 @@ int main(int argc, char **argv) {
   if (debug::opt::DumpRegisteredPasses)
     debug::DumpRegisteredPasses();
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::PassManager PM;
diff --git a/bin/uses-fptr.cpp b/bin/uses-fptr.cpp
index e8aedcd9171cdd84b2e50fb8a7b49a2c3e0d7599..073c0ad309c5ebab4ddc87c45745ac0252e5f9de 100644
--- a/bin/uses-fptr.cpp
+++ b/bin/uses-fptr.cpp
@@ -20,7 +20,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
@@ -28,6 +27,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -59,7 +59,7 @@ struct FunctionPointerPrinter : ModulePass {
 
   FunctionPointerPrinter(raw_ostream &out, const Function *Func)
       : ModulePass(ID), Out(out), F(Func) {
-    initializeCallGraphPass(*PassRegistry::getPassRegistry());
+    initializeCallGraphWrapperPassPass(*PassRegistry::getPassRegistry());
   }
   bool runOnModule(Module &M) override {
 
@@ -115,25 +115,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::PassManager PM;
diff --git a/bin/uses-fpu.cpp b/bin/uses-fpu.cpp
index bc3e9dae7e72f6e7fda52ed8b9f589d63a6a556a..a009f49dd3a4d60717996c49fc00d676d1af0ed5 100644
--- a/bin/uses-fpu.cpp
+++ b/bin/uses-fpu.cpp
@@ -28,6 +28,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/IRReader/IRReader.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormattedStream.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
@@ -115,25 +116,25 @@ int main(int argc, char **argv) {
 
   cl::ParseCommandLineOptions(argc, argv);
 
-  std::string ErrorInfo;
-  OwningPtr<tool_output_file> Out;
-  Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
-                                 sys::fs::F_Append));
+  std::error_code ErrorInfo;
+  auto Out = std::unique_ptr<tool_output_file>(
+    new tool_output_file(OutputFilename, ErrorInfo, sys::fs::F_Append)
+  );
 
-  if (!ErrorInfo.empty()) {
-    errs() << ErrorInfo << "\n";
+  if (ErrorInfo) {
+    errs() << ErrorInfo.message() << "\n";
     exit(EXIT_FAILURE);
   }
 
   SMDiagnostic Err;
-  OwningPtr<Module> M;
+  std::unique_ptr<Module> M;
 
   if (!sys::fs::exists(InputFilename)) {
     errs() << "File '" << InputFilename << "' not found.\n";
     exit(EXIT_FAILURE);
   }
 
-  M.reset(ParseIRFile(InputFilename, Err, Context));
+  M = parseIRFile(InputFilename, Err, Context);
   assert(M.get() != nullptr && "Could not initialize module");
 
   legacy::FunctionPassManager FPM(M.get());
diff --git a/lib/FInputsPass.cpp b/lib/FInputsPass.cpp
index eb73bb52690bc2926a209ecc7ee6d9cccb4dac51..84d95bd7527ff642623a12077e9a01d6ea17804f 100644
--- a/lib/FInputsPass.cpp
+++ b/lib/FInputsPass.cpp
@@ -19,12 +19,14 @@
 #include "lib/FInputsPass.h"
 #include "lib/Util.h"
 
+#include "llvm-c/Core.h"
+
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/Operator.h"
 #include "llvm/IR/User.h"
-#include "llvm/Support/CFG.h"
+#include "llvm/Analysis/CFG.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/FormattedStream.h"
 
diff --git a/lib/FInputsPass.h b/lib/FInputsPass.h
index ecc5bf98c9f61afc0a7f78f4bb3cf62a793f3d3b..42214e9c277be47eaa010b8878bf5261ce968c67 100644
--- a/lib/FInputsPass.h
+++ b/lib/FInputsPass.h
@@ -20,7 +20,7 @@
 
 #include "FInputsResult.h"
 
-#include "llvm/InstVisitor.h"
+#include "llvm/IR/InstVisitor.h"
 #include "llvm/Pass.h"
 //#include "llvm/Analysis/AliasAnalysis.h"
 #include "llvm/IR/Function.h"
diff --git a/lib/LoopStatsPass.cpp b/lib/LoopStatsPass.cpp
index 67bc3a95add7500d8bf5ce0bd6e3c3a537244bb2..c09e0eea80bb1bc22766d1b6ad59ade916c3d871 100644
--- a/lib/LoopStatsPass.cpp
+++ b/lib/LoopStatsPass.cpp
@@ -62,7 +62,7 @@ LoopStats LoopStatsPass::examineFunction(Function &F,
   visited.insert(&F);
 
   std::map<unsigned, unsigned> depths;
-  LoopInfo &LI = getAnalysis<LoopInfo>(F);
+  LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>(F).getLoopInfo();
   auto It = LI.begin();
   auto Et = LI.end();
   unsigned int loops = std::distance(It, Et);
diff --git a/lib/LoopStatsPass.h b/lib/LoopStatsPass.h
index 7d4587a3f353255aa72c64018219b35f71ce401d..2e643b43f36b519e2feeb2dcbd8c996ceb5f424f 100644
--- a/lib/LoopStatsPass.h
+++ b/lib/LoopStatsPass.h
@@ -33,13 +33,13 @@ class LoopStatsPass : public ModulePass {
 public:
   static char ID;
   LoopStatsPass() : ModulePass(ID) {
-    initializeLoopInfoPass(*PassRegistry::getPassRegistry());
+    initializeLoopInfoWrapperPassPass(*PassRegistry::getPassRegistry());
   }
 
   bool runOnModule(Module &M) override;
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
-    AU.addRequired<LoopInfo>();
+    AU.addRequired<LoopInfoWrapperPass>();
   }
 
   LoopStats loopStats(Function &F);
diff --git a/lib/McCabePass.cpp b/lib/McCabePass.cpp
index b4d786319de5635e0cf77f5ad169c20a53cea80b..92ff51f3396dde9c7c9e73ba3346a92ad313d224 100644
--- a/lib/McCabePass.cpp
+++ b/lib/McCabePass.cpp
@@ -21,7 +21,7 @@
 
 #include "llvm/IR/BasicBlock.h"
 #include "llvm/IR/Instructions.h"
-#include "llvm/Support/CFG.h"
+#include "llvm/Analysis/CFG.h"
 #include "llvm/Support/FormattedStream.h"
 
 using namespace llvm;
diff --git a/lib/printing/CallStackPrinter.h b/lib/printing/CallStackPrinter.h
index a1478d7239f9b38f4d17598d071cbfab2b629a8f..e53a974be917a931afc5554059c60fc386219906 100644
--- a/lib/printing/CallStackPrinter.h
+++ b/lib/printing/CallStackPrinter.h
@@ -20,7 +20,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/IR/Function.h"
@@ -51,7 +50,7 @@ struct CallStackPrinter : ModulePass {
 
   CallStackPrinter(raw_ostream &out, const Function *Func)
       : ModulePass(ID), Out(out), F(Func) {
-    initializeCallGraphPass(*PassRegistry::getPassRegistry());
+    initializeCallGraphWrapperPassPass(*PassRegistry::getPassRegistry());
   }
   bool runOnModule(Module &M) override {
     getRecursions(F);
@@ -99,11 +98,11 @@ struct CallStackPrinter : ModulePass {
 
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
-    AU.addRequired<CallGraph>();
+    AU.addRequired<CallGraphWrapperPass>();
   }
 
   void getRecursions(const Function *F) {
-    const auto CGN = getAnalysis<CallGraph>()[F];
+    const auto CGN = getAnalysis<CallGraphWrapperPass>().getCallGraph()[F];
 
     for (auto SI = scc_begin(CGN), SE = scc_end(CGN); SI != SE; ++SI)
       if (SI.hasLoop()) {
diff --git a/lib/printing/FInputPrinter.h b/lib/printing/FInputPrinter.h
index edcfa0cf78eee971931d9e0ad9d0f2326886faf7..44d675cfaf92537f660ee620c714796a10dcd259 100644
--- a/lib/printing/FInputPrinter.h
+++ b/lib/printing/FInputPrinter.h
@@ -18,7 +18,6 @@
  */
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
diff --git a/lib/printing/FunctionPointerPrinter.h b/lib/printing/FunctionPointerPrinter.h
index 3307e05695091789133f87ffed742b50f7d3f2d9..6704ca637c4eef00eda9e8a53522f562c90405ec 100644
--- a/lib/printing/FunctionPointerPrinter.h
+++ b/lib/printing/FunctionPointerPrinter.h
@@ -20,7 +20,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
@@ -48,7 +47,7 @@ struct FunctionPointerPrinter : ModulePass {
 
   FunctionPointerPrinter(raw_ostream &out, const Function *Func)
       : ModulePass(ID), Out(out), F(Func) {
-    initializeCallGraphPass(*PassRegistry::getPassRegistry());
+    initializeCallGraphWrapperPassPass(*PassRegistry::getPassRegistry());
   }
   bool runOnModule(Module &M) override {
 
diff --git a/lib/printing/LoopStatsPrinter.h b/lib/printing/LoopStatsPrinter.h
index 44459b9e421b5101f5c216ffbba9e2354aa77aef..5d557e30693c292518dc99914358a78f65b07ef8 100644
--- a/lib/printing/LoopStatsPrinter.h
+++ b/lib/printing/LoopStatsPrinter.h
@@ -22,7 +22,6 @@
 
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/LegacyPassManagers.h"
diff --git a/lib/printing/RecursionPrinter.h b/lib/printing/RecursionPrinter.h
index 1e15b86e61f13966091e459564a035b2ac68caba..ea5b30e82fd12d3f2eb36929d81acfcd2fd88708 100644
--- a/lib/printing/RecursionPrinter.h
+++ b/lib/printing/RecursionPrinter.h
@@ -18,7 +18,6 @@
  */
 #include "llvm/Pass.h"
 #include "llvm/PassRegistry.h"
-#include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SCCIterator.h"
 #include "llvm/Analysis/CallGraph.h"
 #include "llvm/IR/Function.h"
@@ -48,7 +47,7 @@ struct RecursionPrinter : ModulePass {
 
   RecursionPrinter(raw_ostream &out, const Function *Func)
       : ModulePass(ID), Out(out), F(Func) {
-    initializeCallGraphPass(*PassRegistry::getPassRegistry());
+    initializeCallGraphWrapperPassPass(*PassRegistry::getPassRegistry());
   }
   bool runOnModule(Module &M) override {
     getRecursions(F);
@@ -80,11 +79,11 @@ struct RecursionPrinter : ModulePass {
 
   void getAnalysisUsage(AnalysisUsage &AU) const override {
     AU.setPreservesAll();
-    AU.addRequired<CallGraph>();
+    AU.addRequired<CallGraphWrapperPass>();
   }
 
   void getRecursions(const Function *F) {
-    const auto CGN = getAnalysis<CallGraph>()[F];
+    const auto CGN = getAnalysis<CallGraphWrapperPass>().getCallGraph()[F];
 
     for (auto SI = scc_begin(CGN), SE = scc_end(CGN); SI != SE; ++SI)
       if (SI.hasLoop()) {