annotate lib/CodeGen/ParallelCG.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents 7d135dc70f03
children 3a76565eade5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===-- ParallelCG.cpp ----------------------------------------------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This file defines functions that can be used for parallel code generation.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #include "llvm/CodeGen/ParallelCG.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
15 #include "llvm/Bitcode/BitcodeReader.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
16 #include "llvm/Bitcode/BitcodeWriter.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 #include "llvm/IR/LLVMContext.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/IR/LegacyPassManager.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include "llvm/IR/Module.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include "llvm/Support/ErrorOr.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "llvm/Support/MemoryBuffer.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "llvm/Support/TargetRegistry.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
23 #include "llvm/Support/ThreadPool.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 #include "llvm/Target/TargetMachine.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 #include "llvm/Transforms/Utils/SplitModule.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 using namespace llvm;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 static void codegen(Module *M, llvm::raw_pwrite_stream &OS,
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
30 function_ref<std::unique_ptr<TargetMachine>()> TMFactory,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
31 TargetMachine::CodeGenFileType FileType) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
32 std::unique_ptr<TargetMachine> TM = TMFactory();
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 legacy::PassManager CodeGenPasses;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
34 if (TM->addPassesToEmitFile(CodeGenPasses, OS, FileType))
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 report_fatal_error("Failed to setup codegen");
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 CodeGenPasses.run(*M);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
39 std::unique_ptr<Module> llvm::splitCodeGen(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
40 std::unique_ptr<Module> M, ArrayRef<llvm::raw_pwrite_stream *> OSs,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
41 ArrayRef<llvm::raw_pwrite_stream *> BCOSs,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
42 const std::function<std::unique_ptr<TargetMachine>()> &TMFactory,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
43 TargetMachine::CodeGenFileType FileType, bool PreserveLocals) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
44 assert(BCOSs.empty() || BCOSs.size() == OSs.size());
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 if (OSs.size() == 1) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
47 if (!BCOSs.empty())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
48 WriteBitcodeToFile(M.get(), *BCOSs[0]);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
49 codegen(M.get(), *OSs[0], TMFactory, FileType);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 return M;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
53 // Create ThreadPool in nested scope so that threads will be joined
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
54 // on destruction.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
55 {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
56 ThreadPool CodegenThreadPool(OSs.size());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
57 int ThreadCount = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
58
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
59 SplitModule(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
60 std::move(M), OSs.size(),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
61 [&](std::unique_ptr<Module> MPart) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
62 // We want to clone the module in a new context to multi-thread the
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
63 // codegen. We do it by serializing partition modules to bitcode
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
64 // (while still on the main thread, in order to avoid data races) and
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
65 // spinning up new threads which deserialize the partitions into
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
66 // separate contexts.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
67 // FIXME: Provide a more direct way to do this in LLVM.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
68 SmallString<0> BC;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
69 raw_svector_ostream BCOS(BC);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
70 WriteBitcodeToFile(MPart.get(), BCOS);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
72 if (!BCOSs.empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
73 BCOSs[ThreadCount]->write(BC.begin(), BC.size());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
74 BCOSs[ThreadCount]->flush();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
75 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
77 llvm::raw_pwrite_stream *ThreadOS = OSs[ThreadCount++];
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
78 // Enqueue the task
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
79 CodegenThreadPool.async(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
80 [TMFactory, FileType, ThreadOS](const SmallString<0> &BC) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
81 LLVMContext Ctx;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
82 Expected<std::unique_ptr<Module>> MOrErr = parseBitcodeFile(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
83 MemoryBufferRef(StringRef(BC.data(), BC.size()),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
84 "<split-module>"),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
85 Ctx);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
86 if (!MOrErr)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
87 report_fatal_error("Failed to read bitcode");
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
88 std::unique_ptr<Module> MPartInCtx = std::move(MOrErr.get());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
89
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
90 codegen(MPartInCtx.get(), *ThreadOS, TMFactory, FileType);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
91 },
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
92 // Pass BC using std::move to ensure that it get moved rather than
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
93 // copied into the thread's context.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
94 std::move(BC));
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 },
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
96 PreserveLocals);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
97 }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 return {};
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 }