[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