Skip to main content

luaur_code_gen/functions/
create_native_function.rs

1//! @interface-stub
2use 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}