Skip to content

Commit e7612b0

Browse files
committed
Updated JIT example to use lifetimes
1 parent 0d0e741 commit e7612b0

File tree

2 files changed

+66
-50
lines changed

2 files changed

+66
-50
lines changed

README.md

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,48 @@ use std::error::Error;
6363
/// do `unsafe` operations internally.
6464
type SumFunc = unsafe extern "C" fn(u64, u64, u64) -> u64;
6565

66-
fn main() -> Result<(), Box<Error>> {
66+
struct CodeGen<'ctx> {
67+
context: &'ctx Context,
68+
module: Module<'ctx>,
69+
builder: Builder<'ctx>,
70+
execution_engine: ExecutionEngine<'ctx>,
71+
}
72+
73+
impl<'ctx> CodeGen<'ctx> {
74+
fn jit_compile_sum(&self) -> Option<JitFunction<SumFunc>> {
75+
let i64_type = self.context.i64_type();
76+
let fn_type = i64_type.fn_type(&[i64_type.into(), i64_type.into(), i64_type.into()], false);
77+
let function = self.module.add_function("sum", fn_type, None);
78+
let basic_block = self.context.append_basic_block(function, "entry");
79+
80+
self.builder.position_at_end(&basic_block);
81+
82+
let x = function.get_nth_param(0)?.into_int_value();
83+
let y = function.get_nth_param(1)?.into_int_value();
84+
let z = function.get_nth_param(2)?.into_int_value();
85+
86+
let sum = self.builder.build_int_add(x, y, "sum");
87+
let sum = self.builder.build_int_add(sum, z, "sum");
88+
89+
self.builder.build_return(Some(&sum));
90+
91+
unsafe { self.execution_engine.get_function("sum").ok() }
92+
}
93+
}
94+
95+
96+
fn main() -> Result<(), Box<dyn Error>> {
6797
let context = Context::create();
6898
let module = context.create_module("sum");
69-
let builder = context.create_builder();
7099
let execution_engine = module.create_jit_execution_engine(OptimizationLevel::None)?;
100+
let codegen = CodeGen {
101+
context: &context,
102+
module,
103+
builder: context.create_builder(),
104+
execution_engine,
105+
};
71106

72-
let sum = jit_compile_sum(&context, &module, &builder, &execution_engine)
73-
.ok_or("Unable to JIT compile `sum`")?;
107+
let sum = codegen.jit_compile_sum().ok_or("Unable to JIT compile `sum`")?;
74108

75109
let x = 1u64;
76110
let y = 2u64;
@@ -83,32 +117,6 @@ fn main() -> Result<(), Box<Error>> {
83117

84118
Ok(())
85119
}
86-
87-
fn jit_compile_sum(
88-
context: &Context,
89-
module: &Module,
90-
builder: &Builder,
91-
execution_engine: &ExecutionEngine,
92-
) -> Option<JitFunction<SumFunc>> {
93-
let i64_type = context.i64_type();
94-
let fn_type = i64_type.fn_type(&[i64_type.into(), i64_type.into(), i64_type.into()], false);
95-
96-
let function = module.add_function("sum", fn_type, None);
97-
let basic_block = context.append_basic_block(&function, "entry");
98-
99-
builder.position_at_end(&basic_block);
100-
101-
let x = function.get_nth_param(0)?.into_int_value();
102-
let y = function.get_nth_param(1)?.into_int_value();
103-
let z = function.get_nth_param(2)?.into_int_value();
104-
105-
let sum = builder.build_int_add(x, y, "sum");
106-
let sum = builder.build_int_add(sum, z, "sum");
107-
108-
builder.build_return(Some(&sum));
109-
110-
unsafe { execution_engine.get_function("sum").ok() }
111-
}
112120
```
113121

114122
<sup>1</sup> There are two uses of `unsafe` in this example because the actual

examples/jit.rs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,40 +14,48 @@ use std::error::Error;
1414
/// do `unsafe` operations internally.
1515
type SumFunc = unsafe extern "C" fn(u64, u64, u64) -> u64;
1616

17-
fn jit_compile_sum<'ctx>(
17+
struct CodeGen<'ctx> {
1818
context: &'ctx Context,
19-
module: &Module<'ctx>,
20-
builder: &Builder<'ctx>,
21-
execution_engine: &ExecutionEngine<'ctx>,
22-
) -> Option<JitFunction<SumFunc>> {
23-
let i64_type = context.i64_type();
24-
let fn_type = i64_type.fn_type(&[i64_type.into(), i64_type.into(), i64_type.into()], false);
19+
module: Module<'ctx>,
20+
builder: Builder<'ctx>,
21+
execution_engine: ExecutionEngine<'ctx>,
22+
}
2523

26-
let function = module.add_function("sum", fn_type, None);
27-
let basic_block = context.append_basic_block(function, "entry");
24+
impl<'ctx> CodeGen<'ctx> {
25+
fn jit_compile_sum(&self) -> Option<JitFunction<SumFunc>> {
26+
let i64_type = self.context.i64_type();
27+
let fn_type = i64_type.fn_type(&[i64_type.into(), i64_type.into(), i64_type.into()], false);
28+
let function = self.module.add_function("sum", fn_type, None);
29+
let basic_block = self.context.append_basic_block(function, "entry");
2830

29-
builder.position_at_end(&basic_block);
31+
self.builder.position_at_end(&basic_block);
3032

31-
let x = function.get_nth_param(0)?.into_int_value();
32-
let y = function.get_nth_param(1)?.into_int_value();
33-
let z = function.get_nth_param(2)?.into_int_value();
33+
let x = function.get_nth_param(0)?.into_int_value();
34+
let y = function.get_nth_param(1)?.into_int_value();
35+
let z = function.get_nth_param(2)?.into_int_value();
3436

35-
let sum = builder.build_int_add(x, y, "sum");
36-
let sum = builder.build_int_add(sum, z, "sum");
37+
let sum = self.builder.build_int_add(x, y, "sum");
38+
let sum = self.builder.build_int_add(sum, z, "sum");
3739

38-
builder.build_return(Some(&sum));
40+
self.builder.build_return(Some(&sum));
3941

40-
unsafe { execution_engine.get_function("sum").ok() }
42+
unsafe { self.execution_engine.get_function("sum").ok() }
43+
}
4144
}
4245

46+
4347
fn main() -> Result<(), Box<dyn Error>> {
4448
let context = Context::create();
4549
let module = context.create_module("sum");
46-
let builder = context.create_builder();
4750
let execution_engine = module.create_jit_execution_engine(OptimizationLevel::None)?;
51+
let codegen = CodeGen {
52+
context: &context,
53+
module,
54+
builder: context.create_builder(),
55+
execution_engine,
56+
};
4857

49-
let sum = jit_compile_sum(&context, &module, &builder, &execution_engine)
50-
.ok_or("Unable to JIT compile `sum`")?;
58+
let sum = codegen.jit_compile_sum().ok_or("Unable to JIT compile `sum`")?;
5159

5260
let x = 1u64;
5361
let y = 2u64;

0 commit comments

Comments
 (0)