annotate include/llvm/ExecutionEngine/Orc/IndirectionUtils.h @ 121:803732b1fca8

LLVM 5.0
author kono
date Fri, 27 Oct 2017 17:07:41 +0900
parents 1172e4bd9c6f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
1 //===- IndirectionUtils.h - Utilities for adding indirections ---*- C++ -*-===//
83
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 utilities for adding indirections and breaking up modules.
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_INDIRECTIONUTILS_H
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #define LLVM_EXECUTIONENGINE_ORC_INDIRECTIONUTILS_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/StringMap.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
18 #include "llvm/ADT/StringRef.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
19 #include "llvm/ADT/Twine.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
20 #include "llvm/ExecutionEngine/JITSymbol.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
21 #include "llvm/Support/Error.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
22 #include "llvm/Support/Memory.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
23 #include "llvm/Support/Process.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
24 #include "llvm/Transforms/Utils/ValueMapper.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
25 #include <algorithm>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
26 #include <cassert>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
27 #include <cstdint>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
28 #include <functional>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
29 #include <map>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
30 #include <memory>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
31 #include <system_error>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
32 #include <utility>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
33 #include <vector>
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 namespace llvm {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
36
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
37 class Constant;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
38 class Function;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 class FunctionType;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 class GlobalAlias;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41 class GlobalVariable;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 class Module;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 class PointerType;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 class Triple;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
45 class Value;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
46
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
47 namespace orc {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
49 /// @brief Target-independent base class for compile callback management.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
50 class JITCompileCallbackManager {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 public:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
52 using CompileFtor = std::function<JITTargetAddress()>;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
53
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
54 /// @brief Handle to a newly created compile callback. Can be used to get an
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
55 /// IR constant representing the address of the trampoline, and to set
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
56 /// the compile action for the callback.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
57 class CompileCallbackInfo {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
58 public:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
59 CompileCallbackInfo(JITTargetAddress Addr, CompileFtor &Compile)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
60 : Addr(Addr), Compile(Compile) {}
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
61
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
62 JITTargetAddress getAddress() const { return Addr; }
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
63 void setCompileAction(CompileFtor Compile) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
64 this->Compile = std::move(Compile);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
65 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
66
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
67 private:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
68 JITTargetAddress Addr;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
69 CompileFtor &Compile;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
70 };
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
71
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
72 /// @brief Construct a JITCompileCallbackManager.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 /// @param ErrorHandlerAddress The address of an error handler in the target
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 /// process to be used if a compile callback fails.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
75 JITCompileCallbackManager(JITTargetAddress ErrorHandlerAddress)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
76 : ErrorHandlerAddress(ErrorHandlerAddress) {}
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
78 virtual ~JITCompileCallbackManager() = default;
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
79
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 /// @brief Execute the callback for the given trampoline id. Called by the JIT
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 /// to compile functions on demand.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
82 JITTargetAddress executeCompileCallback(JITTargetAddress TrampolineAddr) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
83 auto I = ActiveTrampolines.find(TrampolineAddr);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 // FIXME: Also raise an error in the Orc error-handler when we finally have
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 // one.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 if (I == ActiveTrampolines.end())
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 return ErrorHandlerAddress;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 // Found a callback handler. Yank this trampoline out of the active list and
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 // put it back in the available trampolines list, then try to run the
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 // handler's compile and update actions.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
92 // Moving the trampoline ID back to the available list first means there's
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
93 // at
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
94 // least one available trampoline if the compile action triggers a request
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
95 // for
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 // a new one.
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
97 auto Compile = std::move(I->second);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 ActiveTrampolines.erase(I);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
99 AvailableTrampolines.push_back(TrampolineAddr);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
100
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
101 if (auto Addr = Compile())
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
102 return Addr;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
103
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
104 return ErrorHandlerAddress;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
105 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
106
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
107 /// @brief Reserve a compile callback.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
108 Expected<CompileCallbackInfo> getCompileCallback() {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
109 if (auto TrampolineAddrOrErr = getAvailableTrampolineAddr()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
110 const auto &TrampolineAddr = *TrampolineAddrOrErr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
111 auto &Compile = this->ActiveTrampolines[TrampolineAddr];
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
112 return CompileCallbackInfo(TrampolineAddr, Compile);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
113 } else
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
114 return TrampolineAddrOrErr.takeError();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
115 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
117 /// @brief Get a CompileCallbackInfo for an existing callback.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
118 CompileCallbackInfo getCompileCallbackInfo(JITTargetAddress TrampolineAddr) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
119 auto I = ActiveTrampolines.find(TrampolineAddr);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
120 assert(I != ActiveTrampolines.end() && "Not an active trampoline.");
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
121 return CompileCallbackInfo(I->first, I->second);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
122 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
123
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
124 /// @brief Release a compile callback.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
125 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
126 /// Note: Callbacks are auto-released after they execute. This method should
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
127 /// only be called to manually release a callback that is not going to
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
128 /// execute.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
129 void releaseCompileCallback(JITTargetAddress TrampolineAddr) {
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
130 auto I = ActiveTrampolines.find(TrampolineAddr);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
131 assert(I != ActiveTrampolines.end() && "Not an active trampoline.");
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
132 ActiveTrampolines.erase(I);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
133 AvailableTrampolines.push_back(TrampolineAddr);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 protected:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
137 JITTargetAddress ErrorHandlerAddress;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
139 using TrampolineMapT = std::map<JITTargetAddress, CompileFtor>;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 TrampolineMapT ActiveTrampolines;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
141 std::vector<JITTargetAddress> AvailableTrampolines;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 private:
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
144 Expected<JITTargetAddress> getAvailableTrampolineAddr() {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 if (this->AvailableTrampolines.empty())
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
146 if (auto Err = grow())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
147 return std::move(Err);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 assert(!this->AvailableTrampolines.empty() &&
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 "Failed to grow available trampolines.");
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
150 JITTargetAddress TrampolineAddr = this->AvailableTrampolines.back();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 this->AvailableTrampolines.pop_back();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 return TrampolineAddr;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
155 // Create new trampolines - to be implemented in subclasses.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
156 virtual Error grow() = 0;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
157
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
158 virtual void anchor();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
159 };
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
160
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
161 /// @brief Manage compile callbacks for in-process JITs.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
162 template <typename TargetT>
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
163 class LocalJITCompileCallbackManager : public JITCompileCallbackManager {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
164 public:
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
165 /// @brief Construct a InProcessJITCompileCallbackManager.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
166 /// @param ErrorHandlerAddress The address of an error handler in the target
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
167 /// process to be used if a compile callback fails.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
168 LocalJITCompileCallbackManager(JITTargetAddress ErrorHandlerAddress)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
169 : JITCompileCallbackManager(ErrorHandlerAddress) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
170 /// Set up the resolver block.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
171 std::error_code EC;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
172 ResolverBlock = sys::OwningMemoryBlock(sys::Memory::allocateMappedMemory(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
173 TargetT::ResolverCodeSize, nullptr,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
174 sys::Memory::MF_READ | sys::Memory::MF_WRITE, EC));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
175 assert(!EC && "Failed to allocate resolver block");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
176
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
177 TargetT::writeResolverCode(static_cast<uint8_t *>(ResolverBlock.base()),
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
178 &reenter, this);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
179
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
180 EC = sys::Memory::protectMappedMemory(ResolverBlock.getMemoryBlock(),
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
181 sys::Memory::MF_READ |
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
182 sys::Memory::MF_EXEC);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
183 assert(!EC && "Failed to mprotect resolver block");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
184 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
185
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
186 private:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
187 static JITTargetAddress reenter(void *CCMgr, void *TrampolineId) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
188 JITCompileCallbackManager *Mgr =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
189 static_cast<JITCompileCallbackManager *>(CCMgr);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
190 return Mgr->executeCompileCallback(
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
191 static_cast<JITTargetAddress>(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
192 reinterpret_cast<uintptr_t>(TrampolineId)));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
193 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
194
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
195 Error grow() override {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 assert(this->AvailableTrampolines.empty() && "Growing prematurely?");
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
197
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
198 std::error_code EC;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
199 auto TrampolineBlock =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
200 sys::OwningMemoryBlock(sys::Memory::allocateMappedMemory(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
201 sys::Process::getPageSize(), nullptr,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
202 sys::Memory::MF_READ | sys::Memory::MF_WRITE, EC));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
203 if (EC)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
204 return errorCodeToError(EC);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
205
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
206 unsigned NumTrampolines =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
207 (sys::Process::getPageSize() - TargetT::PointerSize) /
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
208 TargetT::TrampolineSize;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
209
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
210 uint8_t *TrampolineMem = static_cast<uint8_t *>(TrampolineBlock.base());
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
211 TargetT::writeTrampolines(TrampolineMem, ResolverBlock.base(),
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
212 NumTrampolines);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
213
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
214 for (unsigned I = 0; I < NumTrampolines; ++I)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
215 this->AvailableTrampolines.push_back(
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
216 static_cast<JITTargetAddress>(reinterpret_cast<uintptr_t>(
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
217 TrampolineMem + (I * TargetT::TrampolineSize))));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
218
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
219 if (auto EC = sys::Memory::protectMappedMemory(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
220 TrampolineBlock.getMemoryBlock(),
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
221 sys::Memory::MF_READ | sys::Memory::MF_EXEC))
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
222 return errorCodeToError(EC);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
223
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
224 TrampolineBlocks.push_back(std::move(TrampolineBlock));
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
225 return Error::success();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
226 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
227
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
228 sys::OwningMemoryBlock ResolverBlock;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
229 std::vector<sys::OwningMemoryBlock> TrampolineBlocks;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
230 };
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
231
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
232 /// @brief Base class for managing collections of named indirect stubs.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
233 class IndirectStubsManager {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
234 public:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
235 /// @brief Map type for initializing the manager. See init.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
236 using StubInitsMap = StringMap<std::pair<JITTargetAddress, JITSymbolFlags>>;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
237
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
238 virtual ~IndirectStubsManager() = default;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
239
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
240 /// @brief Create a single stub with the given name, target address and flags.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
241 virtual Error createStub(StringRef StubName, JITTargetAddress StubAddr,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
242 JITSymbolFlags StubFlags) = 0;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
243
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
244 /// @brief Create StubInits.size() stubs with the given names, target
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
245 /// addresses, and flags.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
246 virtual Error createStubs(const StubInitsMap &StubInits) = 0;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
247
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
248 /// @brief Find the stub with the given name. If ExportedStubsOnly is true,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
249 /// this will only return a result if the stub's flags indicate that it
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
250 /// is exported.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
251 virtual JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) = 0;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
252
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
253 /// @brief Find the implementation-pointer for the stub.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
254 virtual JITSymbol findPointer(StringRef Name) = 0;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
255
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
256 /// @brief Change the value of the implementation pointer for the stub.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
257 virtual Error updatePointer(StringRef Name, JITTargetAddress NewAddr) = 0;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
258
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
259 private:
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
260 virtual void anchor();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
261 };
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
262
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
263 /// @brief IndirectStubsManager implementation for the host architecture, e.g.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
264 /// OrcX86_64. (See OrcArchitectureSupport.h).
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
265 template <typename TargetT>
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
266 class LocalIndirectStubsManager : public IndirectStubsManager {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
267 public:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
268 Error createStub(StringRef StubName, JITTargetAddress StubAddr,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
269 JITSymbolFlags StubFlags) override {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
270 if (auto Err = reserveStubs(1))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
271 return Err;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
272
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
273 createStubInternal(StubName, StubAddr, StubFlags);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
274
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
275 return Error::success();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
276 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
277
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
278 Error createStubs(const StubInitsMap &StubInits) override {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
279 if (auto Err = reserveStubs(StubInits.size()))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
280 return Err;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
281
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
282 for (auto &Entry : StubInits)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
283 createStubInternal(Entry.first(), Entry.second.first,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
284 Entry.second.second);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
285
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
286 return Error::success();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
287 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
288
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
289 JITSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
290 auto I = StubIndexes.find(Name);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
291 if (I == StubIndexes.end())
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
292 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
293 auto Key = I->second.first;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
294 void *StubAddr = IndirectStubsInfos[Key.first].getStub(Key.second);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
295 assert(StubAddr && "Missing stub address");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
296 auto StubTargetAddr =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
297 static_cast<JITTargetAddress>(reinterpret_cast<uintptr_t>(StubAddr));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
298 auto StubSymbol = JITSymbol(StubTargetAddr, I->second.second);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
299 if (ExportedStubsOnly && !StubSymbol.getFlags().isExported())
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
300 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
301 return StubSymbol;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
302 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
303
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
304 JITSymbol findPointer(StringRef Name) override {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
305 auto I = StubIndexes.find(Name);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
306 if (I == StubIndexes.end())
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
307 return nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
308 auto Key = I->second.first;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
309 void *PtrAddr = IndirectStubsInfos[Key.first].getPtr(Key.second);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
310 assert(PtrAddr && "Missing pointer address");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
311 auto PtrTargetAddr =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
312 static_cast<JITTargetAddress>(reinterpret_cast<uintptr_t>(PtrAddr));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
313 return JITSymbol(PtrTargetAddr, I->second.second);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
314 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
315
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
316 Error updatePointer(StringRef Name, JITTargetAddress NewAddr) override {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
317 auto I = StubIndexes.find(Name);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
318 assert(I != StubIndexes.end() && "No stub pointer for symbol");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
319 auto Key = I->second.first;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
320 *IndirectStubsInfos[Key.first].getPtr(Key.second) =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
321 reinterpret_cast<void *>(static_cast<uintptr_t>(NewAddr));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
322 return Error::success();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
323 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
324
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
325 private:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
326 Error reserveStubs(unsigned NumStubs) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
327 if (NumStubs <= FreeStubs.size())
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
328 return Error::success();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
329
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
330 unsigned NewStubsRequired = NumStubs - FreeStubs.size();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
331 unsigned NewBlockId = IndirectStubsInfos.size();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
332 typename TargetT::IndirectStubsInfo ISI;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
333 if (auto Err =
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
334 TargetT::emitIndirectStubsBlock(ISI, NewStubsRequired, nullptr))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
335 return Err;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
336 for (unsigned I = 0; I < ISI.getNumStubs(); ++I)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
337 FreeStubs.push_back(std::make_pair(NewBlockId, I));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
338 IndirectStubsInfos.push_back(std::move(ISI));
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
339 return Error::success();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
340 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
341
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
342 void createStubInternal(StringRef StubName, JITTargetAddress InitAddr,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
343 JITSymbolFlags StubFlags) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
344 auto Key = FreeStubs.back();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
345 FreeStubs.pop_back();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
346 *IndirectStubsInfos[Key.first].getPtr(Key.second) =
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
347 reinterpret_cast<void *>(static_cast<uintptr_t>(InitAddr));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
348 StubIndexes[StubName] = std::make_pair(Key, StubFlags);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
349 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
350
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
351 std::vector<typename TargetT::IndirectStubsInfo> IndirectStubsInfos;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
352 using StubKey = std::pair<uint16_t, uint16_t>;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
353 std::vector<StubKey> FreeStubs;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
354 StringMap<std::pair<StubKey, JITSymbolFlags>> StubIndexes;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 };
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
356
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
357 /// @brief Create a local compile callback manager.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
358 ///
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
359 /// The given target triple will determine the ABI, and the given
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
360 /// ErrorHandlerAddress will be used by the resulting compile callback
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
361 /// manager if a compile callback fails.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
362 std::unique_ptr<JITCompileCallbackManager>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
363 createLocalCompileCallbackManager(const Triple &T,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
364 JITTargetAddress ErrorHandlerAddress);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
365
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
366 /// @brief Create a local indriect stubs manager builder.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
367 ///
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
368 /// The given target triple will determine the ABI.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
369 std::function<std::unique_ptr<IndirectStubsManager>()>
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
370 createLocalIndirectStubsManagerBuilder(const Triple &T);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
371
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
372 /// @brief Build a function pointer of FunctionType with the given constant
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
373 /// address.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
374 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
375 /// Usage example: Turn a trampoline address into a function pointer constant
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
376 /// for use in a stub.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
377 Constant *createIRTypedAddress(FunctionType &FT, JITTargetAddress Addr);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
378
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
379 /// @brief Create a function pointer with the given type, name, and initializer
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
380 /// in the given Module.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
381 GlobalVariable *createImplPointer(PointerType &PT, Module &M, const Twine &Name,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
382 Constant *Initializer);
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
383
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
384 /// @brief Turn a function declaration into a stub function that makes an
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
385 /// indirect call using the given function pointer.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
386 void makeStub(Function &F, Value &ImplPointer);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
387
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
388 /// @brief Raise linkage types and rename as necessary to ensure that all
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
389 /// symbols are accessible for other modules.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
390 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
391 /// This should be called before partitioning a module to ensure that the
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
392 /// partitions retain access to each other's symbols.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
393 void makeAllSymbolsExternallyAccessible(Module &M);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
395 /// @brief Clone a function declaration into a new module.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
396 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
397 /// This function can be used as the first step towards creating a callback
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
398 /// stub (see makeStub), or moving a function body (see moveFunctionBody).
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
399 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
400 /// If the VMap argument is non-null, a mapping will be added between F and
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
401 /// the new declaration, and between each of F's arguments and the new
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
402 /// declaration's arguments. This map can then be passed in to moveFunction to
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
403 /// move the function body if required. Note: When moving functions between
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
404 /// modules with these utilities, all decls should be cloned (and added to a
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
405 /// single VMap) before any bodies are moved. This will ensure that references
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
406 /// between functions all refer to the versions in the new module.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
407 Function *cloneFunctionDecl(Module &Dst, const Function &F,
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
408 ValueToValueMapTy *VMap = nullptr);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
409
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
410 /// @brief Move the body of function 'F' to a cloned function declaration in a
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
411 /// different module (See related cloneFunctionDecl).
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
412 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
413 /// If the target function declaration is not supplied via the NewF parameter
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
414 /// then it will be looked up via the VMap.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
415 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
416 /// This will delete the body of function 'F' from its original parent module,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
417 /// but leave its declaration.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
418 void moveFunctionBody(Function &OrigF, ValueToValueMapTy &VMap,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
419 ValueMaterializer *Materializer = nullptr,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
420 Function *NewF = nullptr);
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
421
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
422 /// @brief Clone a global variable declaration into a new module.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
423 GlobalVariable *cloneGlobalVariableDecl(Module &Dst, const GlobalVariable &GV,
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
424 ValueToValueMapTy *VMap = nullptr);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
426 /// @brief Move global variable GV from its parent module to cloned global
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
427 /// declaration in a different module.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
428 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
429 /// If the target global declaration is not supplied via the NewGV parameter
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
430 /// then it will be looked up via the VMap.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
431 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
432 /// This will delete the initializer of GV from its original parent module,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
433 /// but leave its declaration.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
434 void moveGlobalVariableInitializer(GlobalVariable &OrigGV,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
435 ValueToValueMapTy &VMap,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
436 ValueMaterializer *Materializer = nullptr,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
437 GlobalVariable *NewGV = nullptr);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
439 /// @brief Clone a global alias declaration into a new module.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
440 GlobalAlias *cloneGlobalAliasDecl(Module &Dst, const GlobalAlias &OrigA,
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
441 ValueToValueMapTy &VMap);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
443 /// @brief Clone module flags metadata into the destination module.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
444 void cloneModuleFlagsMetadata(Module &Dst, const Module &Src,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
445 ValueToValueMapTy &VMap);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
446
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
447 } // end namespace orc
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
448
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
449 } // end namespace llvm
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 #endif // LLVM_EXECUTIONENGINE_ORC_INDIRECTIONUTILS_H