annotate unittests/ExecutionEngine/Orc/OrcCAPITest.cpp @ 131:f476a9ba4795

http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
author mir3636
date Fri, 16 Feb 2018 21:02:11 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===--------------- OrcCAPITest.cpp - Unit tests Orc C API ---------------===//
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "OrcTestCommon.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
11 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 #include "llvm-c/Core.h"
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 #include "llvm-c/OrcBindings.h"
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 #include "llvm-c/Target.h"
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "llvm-c/TargetMachine.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
16 #include "gtest/gtest.h"
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include <stdio.h>
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 #include <stdlib.h>
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 #include <string.h>
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 namespace llvm {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 class OrcCAPIExecutionTest : public testing::Test, public OrcExecutionTest {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 protected:
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 std::unique_ptr<Module> createTestModule(const Triple &TT) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
29 ModuleBuilder MB(Context, TT.str(), "");
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 Function *TestFunc = MB.createFunctionDecl<int()>("testFunc");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 Function *Main = MB.createFunctionDecl<int(int, char*[])>("main");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
33 Main->getBasicBlockList().push_back(BasicBlock::Create(Context));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 IRBuilder<> B(&Main->back());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 Value* Result = B.CreateCall(TestFunc);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 B.CreateRet(Result);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 return MB.takeModule();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41 std::shared_ptr<object::OwningBinary<object::ObjectFile>>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 createTestObject() {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 orc::SimpleCompiler IRCompiler(*TM);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 auto M = createTestModule(TM->getTargetTriple());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
45 M->setDataLayout(TM->createDataLayout());
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
46 return std::make_shared<object::OwningBinary<object::ObjectFile>>(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
47 IRCompiler(*M));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
48 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
49
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 typedef int (*MainFnTy)();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 static int myTestFuncImpl() {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 return 42;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 static char *testFuncName;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 static uint64_t myResolver(const char *Name, void *Ctx) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 if (!strncmp(Name, testFuncName, 8))
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 return (uint64_t)&myTestFuncImpl;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 return 0;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 struct CompileContext {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 CompileContext() : Compiled(false) { }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 OrcCAPIExecutionTest* APIExecTest;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 std::unique_ptr<Module> M;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 LLVMOrcModuleHandle H;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 bool Compiled;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 };
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 static LLVMOrcTargetAddress myCompileCallback(LLVMOrcJITStackRef JITStack,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 void *Ctx) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 CompileContext *CCtx = static_cast<CompileContext*>(Ctx);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 auto *ET = CCtx->APIExecTest;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 CCtx->M = ET->createTestModule(ET->TM->getTargetTriple());
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
78 LLVMSharedModuleRef SM = LLVMOrcMakeSharedModule(wrap(CCtx->M.release()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
79 LLVMOrcAddEagerlyCompiledIR(JITStack, &CCtx->H, SM, myResolver, nullptr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
80 LLVMOrcDisposeSharedModuleRef(SM);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 CCtx->Compiled = true;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
82 LLVMOrcTargetAddress MainAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
83 LLVMOrcGetSymbolAddress(JITStack, &MainAddr, "main");
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 LLVMOrcSetIndirectStubPointer(JITStack, "foo", MainAddr);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 return MainAddr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 };
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 char *OrcCAPIExecutionTest::testFuncName = nullptr;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 TEST_F(OrcCAPIExecutionTest, TestEagerIRCompilation) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 if (!TM)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 return;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 LLVMOrcJITStackRef JIT =
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 LLVMOrcCreateInstance(wrap(TM.get()));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 std::unique_ptr<Module> M = createTestModule(TM->getTargetTriple());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
102 LLVMSharedModuleRef SM = LLVMOrcMakeSharedModule(wrap(M.release()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
103 LLVMOrcModuleHandle H;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
104 LLVMOrcAddEagerlyCompiledIR(JIT, &H, SM, myResolver, nullptr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
105 LLVMOrcDisposeSharedModuleRef(SM);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
106 LLVMOrcTargetAddress MainAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
107 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
108 MainFnTy MainFn = (MainFnTy)MainAddr;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 int Result = MainFn();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 EXPECT_EQ(Result, 42)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 << "Eagerly JIT'd code did not return expected result";
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 LLVMOrcRemoveModule(JIT, H);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 LLVMOrcDisposeMangledSymbol(testFuncName);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 LLVMOrcDisposeInstance(JIT);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 TEST_F(OrcCAPIExecutionTest, TestLazyIRCompilation) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120 if (!TM)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 return;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 LLVMOrcJITStackRef JIT =
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 LLVMOrcCreateInstance(wrap(TM.get()));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 std::unique_ptr<Module> M = createTestModule(TM->getTargetTriple());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
130 LLVMSharedModuleRef SM = LLVMOrcMakeSharedModule(wrap(M.release()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
131 LLVMOrcModuleHandle H;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
132 LLVMOrcAddLazilyCompiledIR(JIT, &H, SM, myResolver, nullptr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
133 LLVMOrcDisposeSharedModuleRef(SM);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
134 LLVMOrcTargetAddress MainAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
135 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
136 MainFnTy MainFn = (MainFnTy)MainAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
137 int Result = MainFn();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
138 EXPECT_EQ(Result, 42)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
139 << "Lazily JIT'd code did not return expected result";
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
140
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
141 LLVMOrcRemoveModule(JIT, H);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
142
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
143 LLVMOrcDisposeMangledSymbol(testFuncName);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
144 LLVMOrcDisposeInstance(JIT);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
145 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
146
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
147 TEST_F(OrcCAPIExecutionTest, TestAddObjectFile) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
148 if (!TM)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
149 return;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
150
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
151 std::unique_ptr<MemoryBuffer> ObjBuffer;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
152 {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
153 auto OwningObj = createTestObject();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
154 auto ObjAndBuffer = OwningObj->takeBinary();
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
155 ObjBuffer = std::move(ObjAndBuffer.second);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
156 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
157
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
158 LLVMOrcJITStackRef JIT =
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
159 LLVMOrcCreateInstance(wrap(TM.get()));
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
160 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
161
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
162 LLVMOrcModuleHandle H;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
163 LLVMOrcAddObjectFile(JIT, &H, wrap(ObjBuffer.release()), myResolver, nullptr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
164 LLVMOrcTargetAddress MainAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
165 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "main");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
166 MainFnTy MainFn = (MainFnTy)MainAddr;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 int Result = MainFn();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 EXPECT_EQ(Result, 42)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 << "Lazily JIT'd code did not return expected result";
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 LLVMOrcRemoveModule(JIT, H);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 LLVMOrcDisposeMangledSymbol(testFuncName);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 LLVMOrcDisposeInstance(JIT);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 TEST_F(OrcCAPIExecutionTest, TestDirectCallbacksAPI) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 if (!TM)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 return;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 LLVMOrcJITStackRef JIT =
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182 LLVMOrcCreateInstance(wrap(TM.get()));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 LLVMOrcGetMangledSymbol(JIT, &testFuncName, "testFunc");
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186 CompileContext C;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 C.APIExecTest = this;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
188 LLVMOrcTargetAddress CCAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
189 LLVMOrcCreateLazyCompileCallback(JIT, &CCAddr, myCompileCallback, &C);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
190 LLVMOrcCreateIndirectStub(JIT, "foo", CCAddr);
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
191 LLVMOrcTargetAddress MainAddr;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
192 LLVMOrcGetSymbolAddress(JIT, &MainAddr, "foo");
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
193 MainFnTy FooFn = (MainFnTy)MainAddr;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 int Result = FooFn();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 EXPECT_TRUE(C.Compiled)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 << "Function wasn't lazily compiled";
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 EXPECT_EQ(Result, 42)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 << "Direct-callback JIT'd code did not return expected result";
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 C.Compiled = false;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 FooFn();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 EXPECT_FALSE(C.Compiled)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 << "Direct-callback JIT'd code was JIT'd twice";
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 LLVMOrcRemoveModule(JIT, C.H);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207 LLVMOrcDisposeMangledSymbol(testFuncName);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 LLVMOrcDisposeInstance(JIT);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
209 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
210
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents:
diff changeset
211 } // namespace llvm