annotate include/llvm/ExecutionEngine/Orc/LazyEmittingLayer.h @ 128:c347d3398279 default tip

fix
author mir3636
date Wed, 06 Dec 2017 14:37:17 +0900
parents 803732b1fca8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- LazyEmittingLayer.h - Lazily emit IR to lower JIT layers -*- C++ -*-===//
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // Contains the definition for a lazy-emitting layer for the JIT.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #ifndef LLVM_EXECUTIONENGINE_ORC_LAZYEMITTINGLAYER_H
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #define LLVM_EXECUTIONENGINE_ORC_LAZYEMITTINGLAYER_H
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
17 #include "llvm/ADT/STLExtras.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
18 #include "llvm/ADT/StringMap.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
19 #include "llvm/ADT/StringRef.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
20 #include "llvm/ExecutionEngine/JITSymbol.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #include "llvm/IR/GlobalValue.h"
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #include "llvm/IR/Mangler.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
23 #include "llvm/IR/Module.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
24 #include "llvm/Support/ErrorHandling.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
25 #include "llvm/Support/raw_ostream.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
26 #include <algorithm>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
27 #include <cassert>
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 #include <list>
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
29 #include <memory>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
30 #include <string>
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 namespace llvm {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
33 namespace orc {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 /// @brief Lazy-emitting IR layer.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 ///
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
37 /// This layer accepts LLVM IR Modules (via addModule), but does not
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
38 /// immediately emit them the layer below. Instead, emissing to the base layer
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 /// is deferred until the first time the client requests the address (via
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 /// JITSymbol::getAddress) for a symbol contained in this layer.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 template <typename BaseLayerT> class LazyEmittingLayer {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 using BaseLayerHandleT = typename BaseLayerT::ModuleHandleT;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 private:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
47 class EmissionDeferredModule {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
49 EmissionDeferredModule(std::shared_ptr<Module> M,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
50 std::shared_ptr<JITSymbolResolver> Resolver)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
51 : M(std::move(M)), Resolver(std::move(Resolver)) {}
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 JITSymbol find(StringRef Name, bool ExportedSymbolsOnly, BaseLayerT &B) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 switch (EmitState) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 case NotEmitted:
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
56 if (auto GV = searchGVs(Name, ExportedSymbolsOnly)) {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 // Create a std::string version of Name to capture here - the argument
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 // (a StringRef) may go away before the lambda is executed.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
59 // FIXME: Use capture-init when we move to C++14.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 std::string PName = Name;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
61 JITSymbolFlags Flags = JITSymbolFlags::fromGlobalValue(*GV);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
62 auto GetAddress =
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
63 [this, ExportedSymbolsOnly, PName, &B]() -> Expected<JITTargetAddress> {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
64 if (this->EmitState == Emitting)
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
65 return 0;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
66 else if (this->EmitState == NotEmitted) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
67 this->EmitState = Emitting;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
68 if (auto HandleOrErr = this->emitToBaseLayer(B))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
69 Handle = std::move(*HandleOrErr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
70 else
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
71 return HandleOrErr.takeError();
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
72 this->EmitState = Emitted;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
73 }
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
74 if (auto Sym = B.findSymbolIn(Handle, PName, ExportedSymbolsOnly))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
75 return Sym.getAddress();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
76 else if (auto Err = Sym.takeError())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
77 return std::move(Err);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 else
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79 llvm_unreachable("Successful symbol lookup should return "
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
80 "definition address here");
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
81 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
82 return JITSymbol(std::move(GetAddress), Flags);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 } else
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 return nullptr;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 case Emitting:
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
86 // Calling "emit" can trigger a recursive call to 'find' (e.g. to check
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
87 // for pre-existing definitions of common-symbol), but any symbol in
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
88 // this module would already have been found internally (in the
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
89 // RuntimeDyld that did the lookup), so just return a nullptr here.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 return nullptr;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 case Emitted:
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 return B.findSymbolIn(Handle, Name, ExportedSymbolsOnly);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 llvm_unreachable("Invalid emit-state.");
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
97 Error removeModuleFromBaseLayer(BaseLayerT& BaseLayer) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
98 return EmitState != NotEmitted ? BaseLayer.removeModule(Handle)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
99 : Error::success();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 void emitAndFinalize(BaseLayerT &BaseLayer) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 assert(EmitState != Emitting &&
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 "Cannot emitAndFinalize while already emitting");
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 if (EmitState == NotEmitted) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 EmitState = Emitting;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 Handle = emitToBaseLayer(BaseLayer);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 EmitState = Emitted;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 BaseLayer.emitAndFinalize(Handle);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
113 private:
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
115 const GlobalValue* searchGVs(StringRef Name,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
116 bool ExportedSymbolsOnly) const {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 // FIXME: We could clean all this up if we had a way to reliably demangle
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 // names: We could just demangle name and search, rather than
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 // mangling everything else.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 // If we have already built the mangled name set then just search it.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
122 if (MangledSymbols) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
123 auto VI = MangledSymbols->find(Name);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
124 if (VI == MangledSymbols->end())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
125 return nullptr;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
126 auto GV = VI->second;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
127 if (!ExportedSymbolsOnly || GV->hasDefaultVisibility())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
128 return GV;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
129 return nullptr;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 // If we haven't built the mangled name set yet, try to build it. As an
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 // optimization this will leave MangledNames set to nullptr if we find
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 // Name in the process of building the set.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
135 return buildMangledSymbols(Name, ExportedSymbolsOnly);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
136 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
137
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
138 Expected<BaseLayerHandleT> emitToBaseLayer(BaseLayerT &BaseLayer) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
139 // We don't need the mangled names set any more: Once we've emitted this
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
140 // to the base layer we'll just look for symbols there.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
141 MangledSymbols.reset();
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
142 return BaseLayer.addModule(std::move(M), std::move(Resolver));
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 // If the mangled name of the given GlobalValue matches the given search
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 // name (and its visibility conforms to the ExportedSymbolsOnly flag) then
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
147 // return the symbol. Otherwise, add the mangled name to the Names map and
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
148 // return nullptr.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
149 const GlobalValue* addGlobalValue(StringMap<const GlobalValue*> &Names,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
150 const GlobalValue &GV,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
151 const Mangler &Mang, StringRef SearchName,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
152 bool ExportedSymbolsOnly) const {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 // Modules don't "provide" decls or common symbols.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 if (GV.isDeclaration() || GV.hasCommonLinkage())
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
155 return nullptr;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 // Mangle the GV name.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 std::string MangledName;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 raw_string_ostream MangledNameStream(MangledName);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161 Mang.getNameWithPrefix(MangledNameStream, &GV, false);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 // Check whether this is the name we were searching for, and if it is then
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 // bail out early.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 if (MangledName == SearchName)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 if (!ExportedSymbolsOnly || GV.hasDefaultVisibility())
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
168 return &GV;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 // Otherwise add this to the map for later.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
171 Names[MangledName] = &GV;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
172 return nullptr;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
175 // Build the MangledSymbols map. Bails out early (with MangledSymbols left set
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 // to nullptr) if the given SearchName is found while building the map.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
177 const GlobalValue* buildMangledSymbols(StringRef SearchName,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
178 bool ExportedSymbolsOnly) const {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
179 assert(!MangledSymbols && "Mangled symbols map already exists?");
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
181 auto Symbols = llvm::make_unique<StringMap<const GlobalValue*>>();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
183 Mangler Mang;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
185 for (const auto &GO : M->global_objects())
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
186 if (auto GV = addGlobalValue(*Symbols, GO, Mang, SearchName,
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
187 ExportedSymbolsOnly))
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
188 return GV;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
190 MangledSymbols = std::move(Symbols);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
191 return nullptr;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
194 enum { NotEmitted, Emitting, Emitted } EmitState = NotEmitted;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
195 BaseLayerHandleT Handle;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
196 std::shared_ptr<Module> M;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
197 std::shared_ptr<JITSymbolResolver> Resolver;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
198 mutable std::unique_ptr<StringMap<const GlobalValue*>> MangledSymbols;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 };
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
201 using ModuleListT = std::list<std::unique_ptr<EmissionDeferredModule>>;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 BaseLayerT &BaseLayer;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
204 ModuleListT ModuleList;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
207
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
208 /// @brief Handle to a loaded module.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
209 using ModuleHandleT = typename ModuleListT::iterator;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 /// @brief Construct a lazy emitting layer.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
212 LazyEmittingLayer(BaseLayerT &BaseLayer) : BaseLayer(BaseLayer) {}
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
214 /// @brief Add the given module to the lazy emitting layer.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
215 Expected<ModuleHandleT>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
216 addModule(std::shared_ptr<Module> M,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
217 std::shared_ptr<JITSymbolResolver> Resolver) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
218 return ModuleList.insert(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
219 ModuleList.end(),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
220 llvm::make_unique<EmissionDeferredModule>(std::move(M),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 std::move(Resolver)));
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
222 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
223
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
224 /// @brief Remove the module represented by the given handle.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
225 ///
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
226 /// This method will free the memory associated with the given module, both
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
227 /// in this layer, and the base layer.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
228 Error removeModule(ModuleHandleT H) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
229 Error Err = (*H)->removeModuleFromBaseLayer(BaseLayer);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
230 ModuleList.erase(H);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
231 return Err;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
232 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
233
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 /// @brief Search for the given named symbol.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 /// @param Name The name of the symbol to search for.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 /// @param ExportedSymbolsOnly If true, search only for exported symbols.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 /// @return A handle for the given named symbol, if it exists.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 // Look for the symbol among existing definitions.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 if (auto Symbol = BaseLayer.findSymbol(Name, ExportedSymbolsOnly))
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 return Symbol;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
242
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
243 // If not found then search the deferred modules. If any of these contain a
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 // definition of 'Name' then they will return a JITSymbol that will emit
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 // the corresponding module when the symbol address is requested.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
246 for (auto &DeferredMod : ModuleList)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
247 if (auto Symbol = DeferredMod->find(Name, ExportedSymbolsOnly, BaseLayer))
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 return Symbol;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 // If no definition found anywhere return a null symbol.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 return nullptr;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
254 /// @brief Get the address of the given symbol in the context of the of
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 /// compiled modules represented by the handle H.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
256 JITSymbol findSymbolIn(ModuleHandleT H, const std::string &Name,
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 bool ExportedSymbolsOnly) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 return (*H)->find(Name, ExportedSymbolsOnly, BaseLayer);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
261 /// @brief Immediately emit and finalize the module represented by the given
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
262 /// handle.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
263 /// @param H Handle for module to emit/finalize.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
264 Error emitAndFinalize(ModuleHandleT H) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
265 return (*H)->emitAndFinalize(BaseLayer);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 };
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
269 } // end namespace orc
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
270 } // end namespace llvm
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
271
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 #endif // LLVM_EXECUTIONENGINE_ORC_LAZYEMITTINGLAYER_H