-
Notifications
You must be signed in to change notification settings - Fork 0
/
warmup.cpp
57 lines (42 loc) · 1.23 KB
/
warmup.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "llvm.h"
#include <iostream>
#include <functional>
using namespace llvm;
llvm::Module* makeLLVMModule();
void * compile(llvm::Module * m) {
ExecutionEngine * engine =
EngineBuilder(std::unique_ptr<Module>(m))
.create();
engine->finalizeObject();
return engine->getPointerToFunction(
m->getFunction("aFun"));
}
llvm::Module* makeLLVMModule() {
Module* mod = new Module("mod", getGlobalContext());
FunctionType* fTy = FunctionType::get(
IntegerType::get(mod->getContext(), 32),
{IntegerType::get(mod->getContext(), 32)},
false);
Function* fun = Function::Create(
fTy,
GlobalValue::ExternalLinkage,
"aFun",
mod);
Function::arg_iterator args = fun->arg_begin();
Value* int32_n = args++;
int32_n->setName("n");
BasicBlock* b = BasicBlock::Create(mod->getContext(),"entry",fun,0);
ReturnInst::Create(mod->getContext(), int32_n, b);
return mod;
}
int main() {
// initialize the JIT
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();
LLVMInitializeNativeAsmParser();
auto m = makeLLVMModule();
auto f = compile(m);
int res = ((int(*)(int))f)(22);
std::cout << "Result : " << res << "\n";
return 0;
}