summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShuxin Yang <shuxin.llvm@gmail.com>2013-07-22 18:40:34 +0000
committerShuxin Yang <shuxin.llvm@gmail.com>2013-07-22 18:40:34 +0000
commit1e6d80e2b46923ee21bc451d1d31bfb1062e73cd (patch)
treeee03ea642a36d8d67480127585555461f06838f7
parent745f8ffa3e65deba43b60df0aaf0d6af98645866 (diff)
downloadbcm5719-llvm-1e6d80e2b46923ee21bc451d1d31bfb1062e73cd.tar.gz
bcm5719-llvm-1e6d80e2b46923ee21bc451d1d31bfb1062e73cd.zip
Initialize/Register LTO passes to enable flags like -print-after=<lto-pass>
There already have two "dead" functions, initialize{IPO|IPA}, defined for similar purpose. I decide not to call these two functions for two reasons: o. they don't cover all LTO passes (which will soon be separated into IPO and post-IPO passes) o. We have not yet figured out the right passes and the ordering for IPO and post-IPO stages, meaning this change is only for the time being. Since LTO passes are registered, we are now able to print IR before and after particular point. For OSX users: -------------- "...-Wl,-mllvm -Wl,-print-after=<pass-name>" will print IR after the specified pass. For Other UNIX with GNU gold linker: ------------------------------------ "-Wl,-plugin-opt=-print-after=<pass-name>" should work. (NOTE: no need for "-Wl,-mllvm") Strip "-Wl," if flags are fed directly to linker instead of clang/clang++. llvm-svn: 186853
-rw-r--r--llvm/tools/lto/LTOCodeGenerator.cpp32
-rw-r--r--llvm/tools/lto/LTOCodeGenerator.h2
2 files changed, 34 insertions, 0 deletions
diff --git a/llvm/tools/lto/LTOCodeGenerator.cpp b/llvm/tools/lto/LTOCodeGenerator.cpp
index c7d14afcf34..6db4f31a4e7 100644
--- a/llvm/tools/lto/LTOCodeGenerator.cpp
+++ b/llvm/tools/lto/LTOCodeGenerator.cpp
@@ -24,6 +24,7 @@
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
+#include "llvm/InitializePasses.h"
#include "llvm/Linker.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCContext.h"
@@ -77,6 +78,7 @@ LTOCodeGenerator::LTOCodeGenerator()
InitializeAllTargets();
InitializeAllTargetMCs();
InitializeAllAsmPrinters();
+ initializeLTOPasses();
}
LTOCodeGenerator::~LTOCodeGenerator() {
@@ -89,6 +91,36 @@ LTOCodeGenerator::~LTOCodeGenerator() {
free(*I);
}
+// Initialize LTO passes. Please keep this funciton in sync with
+// PassManagerBuilder::populateLTOPassManager(), and make sure all LTO
+// passes are initialized.
+//
+void LTOCodeGenerator::initializeLTOPasses() {
+ PassRegistry &R = *PassRegistry::getPassRegistry();
+
+ initializeInternalizePassPass(R);
+ initializeIPSCCPPass(R);
+ initializeGlobalOptPass(R);
+ initializeConstantMergePass(R);
+ initializeDAHPass(R);
+ initializeInstCombinerPass(R);
+ initializeSimpleInlinerPass(R);
+ initializePruneEHPass(R);
+ initializeGlobalDCEPass(R);
+ initializeArgPromotionPass(R);
+ initializeJumpThreadingPass(R);
+ initializeSROAPass(R);
+ initializeSROA_DTPass(R);
+ initializeSROA_SSAUpPass(R);
+ initializeFunctionAttrsPass(R);
+ initializeGlobalsModRefPass(R);
+ initializeLICMPass(R);
+ initializeGVNPass(R);
+ initializeMemCpyOptPass(R);
+ initializeDCEPass(R);
+ initializeCFGSimplifyPassPass(R);
+}
+
bool LTOCodeGenerator::addModule(LTOModule* mod, std::string& errMsg) {
bool ret = _linker.linkInModule(mod->getLLVVMModule(), &errMsg);
diff --git a/llvm/tools/lto/LTOCodeGenerator.h b/llvm/tools/lto/LTOCodeGenerator.h
index a4ade9fd26c..bbe32397fbc 100644
--- a/llvm/tools/lto/LTOCodeGenerator.h
+++ b/llvm/tools/lto/LTOCodeGenerator.h
@@ -56,6 +56,8 @@ struct LTOCodeGenerator {
void setCodeGenDebugOptions(const char *opts);
private:
+ void initializeLTOPasses();
+
bool generateObjectFile(llvm::raw_ostream &out, std::string &errMsg);
void applyScopeRestrictions();
void applyRestriction(llvm::GlobalValue &GV,
OpenPOWER on IntegriCloud