Skip to content

Commit 595ade3

Browse files
committed
Add a C++ counterpart of the sum example.
1 parent d0684e1 commit 595ade3

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

examples/sum.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// C++ counterpart of sum.jl
2+
3+
#include <string>
4+
#include <vector>
5+
6+
#include <llvm/ExecutionEngine/ExecutionEngine.h>
7+
#include <llvm/ExecutionEngine/GenericValue.h>
8+
#include <llvm/ExecutionEngine/Interpreter.h>
9+
#include <llvm/IR/IRBuilder.h>
10+
#include <llvm/IR/LLVMContext.h>
11+
#include <llvm/IR/Module.h>
12+
#include <llvm/IR/Verifier.h>
13+
14+
static llvm::LLVMContext context;
15+
16+
int main(int argc, char *argv[]) {
17+
std::unique_ptr<llvm::Module> mod =
18+
llvm::make_unique<llvm::Module>("module", context);
19+
20+
auto T_int32 = llvm::IntegerType::get(context, 32);
21+
auto fun_type = llvm::FunctionType::get(T_int32, {T_int32, T_int32}, false);
22+
auto sum = llvm::Function::Create(fun_type, llvm::Function::ExternalLinkage,
23+
"sum", mod.get());
24+
25+
// generate IR
26+
llvm::IRBuilder<> builder(context);
27+
{
28+
auto *entry = llvm::BasicBlock::Create(context, "entry", sum);
29+
builder.SetInsertPoint(entry);
30+
31+
auto args = sum->arg_begin();
32+
llvm::Value *arg1 = &(*args);
33+
args = std::next(args);
34+
llvm::Value *arg2 = &(*args);
35+
auto *tmp = builder.CreateAdd(arg1, arg2, "tmp");
36+
builder.CreateRet(tmp);
37+
38+
mod->dump();
39+
verifyFunction(*sum);
40+
}
41+
42+
// execute
43+
auto engine = llvm::EngineBuilder(std::move(mod))
44+
.setEngineKind(llvm::EngineKind::Interpreter)
45+
.create();
46+
{
47+
std::vector<llvm::GenericValue> args(2);
48+
args[0].IntVal = llvm::APInt(32, 1, /*isSigned=*/true);
49+
args[1].IntVal = llvm::APInt(32, 2, /*isSigned=*/true);
50+
51+
auto res = engine->runFunction(sum, args);
52+
res.IntVal.dump();
53+
}
54+
55+
return 0;
56+
}

0 commit comments

Comments
 (0)