summaryrefslogtreecommitdiffstats
path: root/llvm/lib/LTO
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2015-08-27 23:37:36 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2015-08-27 23:37:36 +0000
commitc269ed511584d9044a4e28a25fa6a0d24df68a9f (patch)
treeeb8ec1c70b5fc9d78ab61aacaffab6d9ab1bb16d /llvm/lib/LTO
parent0e2882345daead6cd9368eda4107e860d9141e35 (diff)
downloadbcm5719-llvm-c269ed511584d9044a4e28a25fa6a0d24df68a9f.tar.gz
bcm5719-llvm-c269ed511584d9044a4e28a25fa6a0d24df68a9f.zip
CodeGen: Introduce splitCodeGen and teach LTOCodeGenerator to use it.
llvm::splitCodeGen is a function that implements the core of parallel LTO code generation. It uses llvm::SplitModule to split the module into linkable partitions and spawning one code generation thread per partition. The function produces multiple object files which can be linked in the usual way. This has been threaded through to LTOCodeGenerator (and llvm-lto for testing purposes). Separate patches will add parallel LTO support to the gold plugin and lld. Differential Revision: http://reviews.llvm.org/D12260 llvm-svn: 246236
Diffstat (limited to 'llvm/lib/LTO')
-rw-r--r--llvm/lib/LTO/LTOCodeGenerator.cpp28
1 files changed, 15 insertions, 13 deletions
diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp
index 60ce4f67e03..eaec47ee682 100644
--- a/llvm/lib/LTO/LTOCodeGenerator.cpp
+++ b/llvm/lib/LTO/LTOCodeGenerator.cpp
@@ -18,6 +18,7 @@
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/CodeGen/ParallelCG.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/Config/config.h"
#include "llvm/IR/Constants.h"
@@ -218,7 +219,7 @@ bool LTOCodeGenerator::compileOptimizedToFile(const char **name,
// generate object file
tool_output_file objFile(Filename.c_str(), FD);
- bool genResult = compileOptimized(objFile.os(), errMsg);
+ bool genResult = compileOptimized(&objFile.os(), errMsg);
objFile.os().close();
if (objFile.os().has_error()) {
objFile.os().clear_error();
@@ -495,25 +496,26 @@ bool LTOCodeGenerator::optimize(bool DisableInline,
return true;
}
-bool LTOCodeGenerator::compileOptimized(raw_pwrite_stream &out,
+bool LTOCodeGenerator::compileOptimized(ArrayRef<raw_pwrite_stream *> out,
std::string &errMsg) {
if (!this->determineTarget(errMsg))
return false;
- legacy::PassManager codeGenPasses;
+ legacy::PassManager preCodeGenPasses;
// If the bitcode files contain ARC code and were compiled with optimization,
// the ObjCARCContractPass must be run, so do it unconditionally here.
- codeGenPasses.add(createObjCARCContractPass());
-
- if (TargetMach->addPassesToEmitFile(codeGenPasses, out,
- TargetMachine::CGFT_ObjectFile)) {
- errMsg = "target file type not supported";
- return false;
- }
-
- // Run the code generator, and write object file
- codeGenPasses.run(*MergedModule);
+ preCodeGenPasses.add(createObjCARCContractPass());
+ preCodeGenPasses.run(*MergedModule);
+
+ // Do code generation. We need to preserve the module in case the client calls
+ // writeMergedModules() after compilation, but we only need to allow this at
+ // parallelism level 1. This is achieved by having splitCodeGen return the
+ // original module at parallelism level 1 which we then assign back to
+ // MergedModule.
+ MergedModule =
+ splitCodeGen(std::move(MergedModule), out, MCpu, FeatureStr, Options,
+ RelocModel, CodeModel::Default, CGOptLevel);
return true;
}
OpenPOWER on IntegriCloud