100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===--------------- OrcCAPITest.cpp - Unit tests Orc C API ---------------===//
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
147
|
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
4 // See https://llvm.org/LICENSE.txt for license information.
|
|
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 //
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //===----------------------------------------------------------------------===//
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 #include "OrcTestCommon.h"
|
121
|
10 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 #include "llvm-c/Core.h"
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 #include "llvm-c/OrcBindings.h"
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 #include "llvm-c/Target.h"
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 #include "llvm-c/TargetMachine.h"
|
121
|
15 #include "gtest/gtest.h"
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 #include <stdio.h>
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 #include <stdlib.h>
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 #include <string.h>
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 namespace llvm {
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 class OrcCAPIExecutionTest : public testing::Test, public OrcExecutionTest {
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 protected:
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 std::unique_ptr<Module> createTestModule(const Triple &TT) {
|
120
|
28 ModuleBuilder MB(Context, TT.str(), "");
|
147
|
29 Type *IntTy = Type::getScalarTy<int>(Context);
|
|
30 Function *TestFunc =
|
|
31 MB.createFunctionDecl(FunctionType::get(IntTy, {}, false), "testFunc");
|
|
32 Function *Main = MB.createFunctionDecl(
|
|
33 FunctionType::get(
|
|
34 IntTy,
|
|
35 {IntTy, Type::getInt8PtrTy(Context)->getPointerTo()},
|
|
36 false),
|
|
37 "main");
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38
|
120
|
39 Main->getBasicBlockList().push_back(BasicBlock::Create(Context));
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 IRBuilder<> B(&Main->back());
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 Value* Result = B.CreateCall(TestFunc);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 B.CreateRet(Result);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 return MB.takeModule();
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46
|
147
|
47 std::unique_ptr<MemoryBuffer> createTestObject() {
|
121
|
48 orc::SimpleCompiler IRCompiler(*TM);
|
|
49 auto M = createTestModule(TM->getTargetTriple());
|
|
50 M->setDataLayout(TM->createDataLayout());
|
147
|
51 return IRCompiler(*M);
|
121
|
52 }
|
|
53
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
54 typedef int (*MainFnTy)();
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
55
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
56 static int myTestFuncImpl() {
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
57 return 42;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
58 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
59
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
60 static char *testFuncName;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 static uint64_t myResolver(const char *Name, void *Ctx) {
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 if (!strncmp(Name, testFuncName, 8))
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 return (uint64_t)&myTestFuncImpl;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
65 return 0;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 struct CompileContext {
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 CompileContext() : Compiled(false) { }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
70
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 OrcCAPIExecutionTest* APIExecTest;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 std::unique_ptr<Module> M;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 LLVMOrcModuleHandle H;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 bool Compiled;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 };
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
76
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
77 static LLVMOrcTargetAddress myCompileCallback(LLVMOrcJITStackRef JITStack,
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78 void *Ctx) {
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
79 CompileContext *CCtx = static_cast<CompileContext*>(Ctx);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
80 auto *ET = CCtx->APIExecTest;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
81 CCtx->M = ET->createTestModule(ET->TM->getTargetTriple());
|
147
|
82 LLVMOrcAddEagerlyCompiledIR(JITStack, &CCtx->H, wrap(CCtx->M.release()),
|
|
83 myResolver, nullptr);
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
84 CCtx->Compiled = true;
|
121
|
85 LLVMOrcTargetAddress MainAddr;
|
|
86 LLVMOrcGetSymbolAddress(JITStack, &MainAddr, "main");
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
87 LLVMOrcSetIndirectStubPointer(JITStack, "foo", MainAddr);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
88 return MainAddr;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
89 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
90 };
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
91
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
92 char *OrcCAPIExecutionTest::testFuncName = nullptr;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
93
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
94 TEST_F(OrcCAPIExecutionTest, TestEagerIRCompilation) {
|
147
|
95 if (!SupportsJIT)
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
96 return;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
97
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
98 LLVMOrcJITStackRef JIT =
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
99 LLVMOrcCreateInstance(wrap(TM.get()));
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
100
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
101 std::unique_ptr<Module> M = createTestModule(TM->getTargetTriple());
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
102
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
103 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
104
|
121
|
105 LLVMOrcModuleHandle H;
|
147
|
106 LLVMOrcAddEagerlyCompiledIR(JIT, &H, wrap(M.release()), myResolver, nullptr);
|
|
107
|
|
108 // get symbol address searching the entire stack
|
|
109 {
|
|
110 LLVMOrcTargetAddress MainAddr;
|
|
111 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
|
|
112 MainFnTy MainFn = (MainFnTy)MainAddr;
|
|
113 int Result = MainFn();
|
|
114 EXPECT_EQ(Result, 42)
|
|
115 << "Eagerly JIT'd code did not return expected result";
|
|
116 }
|
|
117
|
|
118 // and then just searching a single handle
|
|
119 {
|
|
120 LLVMOrcTargetAddress MainAddr;
|
|
121 LLVMOrcGetSymbolAddressIn(JIT, &MainAddr, H, "main");
|
|
122 MainFnTy MainFn = (MainFnTy)MainAddr;
|
|
123 int Result = MainFn();
|
|
124 EXPECT_EQ(Result, 42)
|
|
125 << "Eagerly JIT'd code did not return expected result";
|
|
126 }
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
127
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
128 LLVMOrcRemoveModule(JIT, H);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
129
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
130 LLVMOrcDisposeMangledSymbol(testFuncName);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
131 LLVMOrcDisposeInstance(JIT);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
132 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
133
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 TEST_F(OrcCAPIExecutionTest, TestLazyIRCompilation) {
|
147
|
135 if (!SupportsIndirection)
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 return;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 LLVMOrcJITStackRef JIT =
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139 LLVMOrcCreateInstance(wrap(TM.get()));
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
141 std::unique_ptr<Module> M = createTestModule(TM->getTargetTriple());
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
142
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
143 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
144
|
121
|
145 LLVMOrcModuleHandle H;
|
147
|
146 LLVMOrcAddLazilyCompiledIR(JIT, &H, wrap(M.release()), myResolver, nullptr);
|
121
|
147 LLVMOrcTargetAddress MainAddr;
|
|
148 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
|
|
149 MainFnTy MainFn = (MainFnTy)MainAddr;
|
|
150 int Result = MainFn();
|
|
151 EXPECT_EQ(Result, 42)
|
|
152 << "Lazily JIT'd code did not return expected result";
|
|
153
|
|
154 LLVMOrcRemoveModule(JIT, H);
|
|
155
|
|
156 LLVMOrcDisposeMangledSymbol(testFuncName);
|
|
157 LLVMOrcDisposeInstance(JIT);
|
|
158 }
|
|
159
|
|
160 TEST_F(OrcCAPIExecutionTest, TestAddObjectFile) {
|
147
|
161 if (!SupportsJIT)
|
121
|
162 return;
|
|
163
|
147
|
164 auto ObjBuffer = createTestObject();
|
121
|
165
|
|
166 LLVMOrcJITStackRef JIT =
|
|
167 LLVMOrcCreateInstance(wrap(TM.get()));
|
|
168 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
|
|
169
|
|
170 LLVMOrcModuleHandle H;
|
|
171 LLVMOrcAddObjectFile(JIT, &H, wrap(ObjBuffer.release()), myResolver, nullptr);
|
|
172 LLVMOrcTargetAddress MainAddr;
|
|
173 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
|
|
174 MainFnTy MainFn = (MainFnTy)MainAddr;
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
175 int Result = MainFn();
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
176 EXPECT_EQ(Result, 42)
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
177 << "Lazily JIT'd code did not return expected result";
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
178
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
179 LLVMOrcRemoveModule(JIT, H);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
180
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
181 LLVMOrcDisposeMangledSymbol(testFuncName);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
182 LLVMOrcDisposeInstance(JIT);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
183 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
184
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
185 TEST_F(OrcCAPIExecutionTest, TestDirectCallbacksAPI) {
|
147
|
186 if (!SupportsIndirection)
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
187 return;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
188
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
189 LLVMOrcJITStackRef JIT =
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
190 LLVMOrcCreateInstance(wrap(TM.get()));
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
191
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
192 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
193
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
194 CompileContext C;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
195 C.APIExecTest = this;
|
121
|
196 LLVMOrcTargetAddress CCAddr;
|
|
197 LLVMOrcCreateLazyCompileCallback(JIT, &CCAddr, myCompileCallback, &C);
|
|
198 LLVMOrcCreateIndirectStub(JIT, "foo", CCAddr);
|
|
199 LLVMOrcTargetAddress MainAddr;
|
|
200 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "foo");
|
|
201 MainFnTy FooFn = (MainFnTy)MainAddr;
|
100
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
202 int Result = FooFn();
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
203 EXPECT_TRUE(C.Compiled)
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
204 << "Function wasn't lazily compiled";
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
205 EXPECT_EQ(Result, 42)
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
206 << "Direct-callback JIT'd code did not return expected result";
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
207
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
208 C.Compiled = false;
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
209 FooFn();
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
210 EXPECT_FALSE(C.Compiled)
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211 << "Direct-callback JIT'd code was JIT'd twice";
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 LLVMOrcRemoveModule(JIT, C.H);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
215 LLVMOrcDisposeMangledSymbol(testFuncName);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
216 LLVMOrcDisposeInstance(JIT);
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
217 }
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
218
|
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 } // namespace llvm
|