[llvm] r266390 - [LTO] Add a new splitCodeGen() API which takes a TargetMachineFactory.
Rafael EspĂndola via llvm-commits
llvm-commits at lists.llvm.org
Sat Apr 16 19:39:44 PDT 2016
We should probably convert the existing users too, no?
On Apr 14, 2016 8:12 PM, "Davide Italiano via llvm-commits" <
llvm-commits at lists.llvm.org> wrote:
> Author: davide
> Date: Thu Apr 14 19:07:28 2016
> New Revision: 266390
>
> URL: http://llvm.org/viewvc/llvm-project?rev=266390&view=rev
> Log:
> [LTO] Add a new splitCodeGen() API which takes a TargetMachineFactory.
>
> This will be used in lld to avoid creating TargetMachine in two
> different places. See D18999 for a more detailed discussion.
>
> Differential Revision: http://reviews.llvm.org/D19139
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/ParallelCG.h
> llvm/trunk/lib/CodeGen/ParallelCG.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/ParallelCG.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/ParallelCG.h?rev=266390&r1=266389&r2=266390&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/ParallelCG.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/ParallelCG.h Thu Apr 14 19:07:28 2016
> @@ -43,6 +43,19 @@ splitCodeGen(std::unique_ptr<Module> M,
> TargetMachine::CodeGenFileType FT =
> TargetMachine::CGFT_ObjectFile,
> bool PreserveLocals = false);
>
> +/// Split M into OSs.size() partitions, and generate code for each.
> +/// It is a variant that takes a factory function for the TargetMachine
> +/// TMFactory. TMFactory needs to be thread safe on the client side.
> +/// See the other splitCodeGen() for a more detailed description.
> +///
> +/// \returns M if OSs.size() == 1, otherwise returns
> std::unique_ptr<Module>().
> +std::unique_ptr<Module>
> +splitCodeGen(std::unique_ptr<Module> M, ArrayRef<raw_pwrite_stream *> OSs,
> + ArrayRef<llvm::raw_pwrite_stream *> BCOSs,
> + const std::function<std::unique_ptr<TargetMachine>()>
> &TMFactory,
> + TargetMachine::CodeGenFileType FT =
> TargetMachine::CGFT_ObjectFile,
> + bool PreserveLocals = false);
> +
> } // namespace llvm
>
> #endif
>
> Modified: llvm/trunk/lib/CodeGen/ParallelCG.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ParallelCG.cpp?rev=266390&r1=266389&r2=266390&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/ParallelCG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/ParallelCG.cpp Thu Apr 14 19:07:28 2016
> @@ -25,39 +25,47 @@
>
> using namespace llvm;
>
> -static void codegen(Module *M, llvm::raw_pwrite_stream &OS,
> - const Target *TheTarget, StringRef CPU, StringRef
> Features,
> - const TargetOptions &Options, Reloc::Model RM,
> - CodeModel::Model CM, CodeGenOpt::Level OL,
> - TargetMachine::CodeGenFileType FileType) {
> - std::unique_ptr<TargetMachine> TM(TheTarget->createTargetMachine(
> - M->getTargetTriple(), CPU, Features, Options, RM, CM, OL));
> -
> +static void
> +codegen(Module *M, llvm::raw_pwrite_stream &OS,
> + const std::function<std::unique_ptr<TargetMachine>()> &TMFactory,
> + TargetMachine::CodeGenFileType FileType) {
> + std::unique_ptr<TargetMachine> TM = TMFactory();
> legacy::PassManager CodeGenPasses;
> if (TM->addPassesToEmitFile(CodeGenPasses, OS, FileType))
> report_fatal_error("Failed to setup codegen");
> CodeGenPasses.run(*M);
> }
>
> -std::unique_ptr<Module> llvm::splitCodeGen(
> - std::unique_ptr<Module> M, ArrayRef<llvm::raw_pwrite_stream *> OSs,
> - ArrayRef<llvm::raw_pwrite_stream *> BCOSs, StringRef CPU,
> - StringRef Features, const TargetOptions &Options, Reloc::Model RM,
> - CodeModel::Model CM, CodeGenOpt::Level OL,
> - TargetMachine::CodeGenFileType FileType, bool PreserveLocals) {
> +std::unique_ptr<Module>
> +llvm::splitCodeGen(std::unique_ptr<Module> M, ArrayRef<raw_pwrite_stream
> *> OSs,
> + ArrayRef<llvm::raw_pwrite_stream *> BCOSs, StringRef
> CPU,
> + StringRef Features, const TargetOptions &Options,
> + Reloc::Model RM, CodeModel::Model CM,
> CodeGenOpt::Level OL,
> + TargetMachine::CodeGenFileType FileType,
> + bool PreserveLocals) {
> StringRef TripleStr = M->getTargetTriple();
> std::string ErrMsg;
> +
> const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr,
> ErrMsg);
> if (!TheTarget)
> report_fatal_error(Twine("Target not found: ") + ErrMsg);
> + return splitCodeGen(std::move(M), OSs, BCOSs, [&]() {
> + return std::unique_ptr<TargetMachine>(TheTarget->createTargetMachine(
> + TripleStr, CPU, Features, Options, RM, CM, OL));
> + }, FileType, PreserveLocals);
> +}
>
> +std::unique_ptr<Module> llvm::splitCodeGen(
> + std::unique_ptr<Module> M, ArrayRef<llvm::raw_pwrite_stream *> OSs,
> + ArrayRef<llvm::raw_pwrite_stream *> BCOSs,
> + const std::function<std::unique_ptr<TargetMachine>()> &TMFactory,
> + TargetMachine::CodeGenFileType FileType, bool PreserveLocals) {
> assert(BCOSs.empty() || BCOSs.size() == OSs.size());
>
> if (OSs.size() == 1) {
> if (!BCOSs.empty())
> WriteBitcodeToFile(M.get(), *BCOSs[0]);
> - codegen(M.get(), *OSs[0], TheTarget, CPU, Features, Options, RM, CM,
> OL,
> - FileType);
> + codegen(M.get(), *OSs[0], TMFactory, FileType);
> return M;
> }
>
> @@ -88,8 +96,7 @@ std::unique_ptr<Module> llvm::splitCodeG
> llvm::raw_pwrite_stream *ThreadOS = OSs[ThreadCount++];
> // Enqueue the task
> CodegenThreadPool.async(
> - [TheTarget, CPU, Features, Options, RM, CM, OL, FileType,
> - ThreadOS](const SmallVector<char, 0> &BC) {
> + [&TMFactory, FileType, ThreadOS](const SmallVector<char, 0>
> &BC) {
> LLVMContext Ctx;
> ErrorOr<std::unique_ptr<Module>> MOrErr =
> parseBitcodeFile(
> MemoryBufferRef(StringRef(BC.data(), BC.size()),
> @@ -99,8 +106,7 @@ std::unique_ptr<Module> llvm::splitCodeG
> report_fatal_error("Failed to read bitcode");
> std::unique_ptr<Module> MPartInCtx =
> std::move(MOrErr.get());
>
> - codegen(MPartInCtx.get(), *ThreadOS, TheTarget, CPU,
> Features,
> - Options, RM, CM, OL, FileType);
> + codegen(MPartInCtx.get(), *ThreadOS, TMFactory, FileType);
> },
> // Pass BC using std::move to ensure that it get moved
> rather than
> // copied into the thread's context.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160416/ae4c194e/attachment.html>
More information about the llvm-commits
mailing list