luaur_code_gen/functions/
create_native_function.rs1use crate::enums::code_gen_compilation_result::CodeGenCompilationResult;
3use crate::enums::include_cfg_info::IncludeCfgInfo;
4use crate::enums::include_ir_prefix::IncludeIrPrefix;
5use crate::enums::include_reg_flow_info::IncludeRegFlowInfo;
6use crate::enums::include_use_info::IncludeUseInfo;
7use crate::enums::target::Target;
8use crate::functions::create_native_proto_exec_data_code_gen_context::create_native_proto_exec_data;
9use crate::functions::lower_function::{lower_function_a_64, lower_function_x_64};
10use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
11use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
12use crate::records::assembly_options::AssemblyOptions;
13use crate::records::compilation_options::CompilationOptions;
14use crate::records::ir_builder::IrBuilder;
15use crate::records::module_helpers::ModuleHelpers;
16use crate::type_aliases::native_proto_exec_data_ptr::NativeProtoExecDataPtr;
17use luaur_vm::records::proto::Proto;
18
19pub unsafe fn create_native_function_x_64(
20 build: &mut AssemblyBuilderX64,
21 helpers: &mut ModuleHelpers,
22 proto: *mut Proto,
23 total_ir_inst_count: &mut u32,
24 options: &CompilationOptions,
25 result: &mut CodeGenCompilationResult,
26) -> Option<NativeProtoExecDataPtr> {
27 let mut ir = IrBuilder::ir_builder_ir_builder(&options.hooks);
28 ir.build_function_ir(proto);
29
30 let inst_count = ir.function.instructions.len() as u32;
31
32 if total_ir_inst_count.wrapping_add(inst_count)
33 >= luaur_common::FInt::CodegenHeuristicsInstructionLimit.get() as u32
34 {
35 *result = CodeGenCompilationResult::CodeGenOverflowInstructionLimit;
36 return None;
37 }
38
39 *total_ir_inst_count = total_ir_inst_count.wrapping_add(inst_count);
40
41 let assembly_options = AssemblyOptions {
42 target: Target::default(),
43 compilation_options: options.clone(),
44 output_binary: false,
45 include_assembly: false,
46 include_ir: false,
47 include_outlined_code: false,
48 include_ir_types: false,
49 include_ir_prefix: IncludeIrPrefix::default(),
50 include_use_info: IncludeUseInfo::default(),
51 include_cfg_info: IncludeCfgInfo::default(),
52 include_reg_flow_info: IncludeRegFlowInfo::default(),
53 annotator: None,
54 annotator_context: core::ptr::null_mut(),
55 };
56
57 if !lower_function_x_64(
58 &mut ir,
59 build,
60 helpers,
61 proto,
62 assembly_options,
63 core::ptr::null_mut(),
64 result,
65 ) {
66 return None;
67 }
68
69 Some(create_native_proto_exec_data(proto, &ir))
70}
71
72pub unsafe fn create_native_function_a_64(
73 build: &mut AssemblyBuilderA64,
74 helpers: &mut ModuleHelpers,
75 proto: *mut Proto,
76 total_ir_inst_count: &mut u32,
77 options: &CompilationOptions,
78 result: &mut CodeGenCompilationResult,
79) -> Option<NativeProtoExecDataPtr> {
80 let mut ir = IrBuilder::ir_builder_ir_builder(&options.hooks);
81 ir.build_function_ir(proto);
82
83 let inst_count = ir.function.instructions.len() as u32;
84
85 if total_ir_inst_count.wrapping_add(inst_count)
86 >= luaur_common::FInt::CodegenHeuristicsInstructionLimit.get() as u32
87 {
88 *result = CodeGenCompilationResult::CodeGenOverflowInstructionLimit;
89 return None;
90 }
91
92 *total_ir_inst_count = total_ir_inst_count.wrapping_add(inst_count);
93
94 let assembly_options = AssemblyOptions {
95 target: Target::default(),
96 compilation_options: options.clone(),
97 output_binary: false,
98 include_assembly: false,
99 include_ir: false,
100 include_outlined_code: false,
101 include_ir_types: false,
102 include_ir_prefix: IncludeIrPrefix::default(),
103 include_use_info: IncludeUseInfo::default(),
104 include_cfg_info: IncludeCfgInfo::default(),
105 include_reg_flow_info: IncludeRegFlowInfo::default(),
106 annotator: None,
107 annotator_context: core::ptr::null_mut(),
108 };
109
110 if !lower_function_a_64(
111 &mut ir,
112 build,
113 helpers,
114 proto,
115 assembly_options,
116 core::ptr::null_mut(),
117 result,
118 ) {
119 return None;
120 }
121
122 Some(create_native_proto_exec_data(proto, &ir))
123}