annotate include/llvm/ExecutionEngine/Orc/IndirectionUtils.h @ 120:1172e4bd9c6f

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