@@ -63,14 +63,48 @@ use std::error::Error;
63
63
/// do `unsafe` operations internally.
64
64
type SumFunc = unsafe extern " C" fn (u64 , u64 , u64 ) -> u64 ;
65
65
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 >> {
67
97
let context = Context :: create ();
68
98
let module = context . create_module (" sum" );
69
- let builder = context . create_builder ();
70
99
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
+ };
71
106
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`" )? ;
74
108
75
109
let x = 1u64 ;
76
110
let y = 2u64 ;
@@ -83,32 +117,6 @@ fn main() -> Result<(), Box<Error>> {
83
117
84
118
Ok (())
85
119
}
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
- }
112
120
```
113
121
114
122
<sup >1</sup > There are two uses of ` unsafe ` in this example because the actual
0 commit comments