luaur_code_gen/functions/
get_assembly.rs1use alloc::string::String;
3use alloc::vec::Vec;
4
5use crate::enums::abix_64::ABIX64;
6use crate::enums::features_a_64::FeaturesA64;
7use crate::enums::target::Target;
8use crate::functions::get_assembly_impl::{get_assembly_impl_a_64, get_assembly_impl_x_64};
9use crate::functions::get_cpu_features_a_64::get_cpu_features_a_64;
10use crate::functions::get_cpu_features_x_64::get_cpu_features_x_64;
11use crate::records::assembly_builder_a_64::AssemblyBuilderA64;
12use crate::records::assembly_builder_x_64::AssemblyBuilderX64;
13use crate::records::assembly_options::AssemblyOptions;
14use crate::records::lowering_stats::LoweringStats;
15use luaur_vm::functions::lua_a_toobject::luaA_toobject;
16use luaur_vm::functions::lua_is_lfunction::lua_is_lfunction;
17use luaur_vm::type_aliases::lua_state::lua_State;
18
19pub unsafe fn get_assembly(
20 l: *mut lua_State,
21 idx: i32,
22 options: AssemblyOptions,
23 stats: *mut LoweringStats,
24) -> String {
25 debug_assert!(lua_is_lfunction(l, idx) != 0);
26 let func = luaA_toobject(l, idx);
27
28 match options.target {
29 Target::Host => {
30 #[cfg(target_arch = "aarch64")]
31 {
32 let cpu_features = get_cpu_features_a_64();
33 let mut build = AssemblyBuilderA64 {
34 data: Vec::new(),
35 code: Vec::new(),
36 text: String::new(),
37 log_text: false,
38 features: 0,
39 next_label: 1,
40 pending_labels: Vec::new(),
41 label_locations: Vec::new(),
42 finalized: false,
43 overflowed: false,
44 data_pos: 0,
45 code_pos: core::ptr::null_mut(),
46 code_end: core::ptr::null_mut(),
47 };
48 build.assembly_builder_a_64_assembly_builder_a_64(
49 options.include_assembly,
50 cpu_features,
51 );
52
53 get_assembly_impl_a_64(&mut build, func, options, stats)
54 }
55
56 #[cfg(not(target_arch = "aarch64"))]
57 {
58 let cpu_features = get_cpu_features_x_64();
59 let mut build = AssemblyBuilderX64::assembly_builder_x_64_bool_i32(
60 options.include_assembly,
61 cpu_features,
62 );
63
64 get_assembly_impl_x_64(&mut build, func, options, stats)
65 }
66 }
67
68 Target::A64 => {
69 let mut build = AssemblyBuilderA64 {
70 data: Vec::new(),
71 code: Vec::new(),
72 text: String::new(),
73 log_text: false,
74 features: 0,
75 next_label: 1,
76 pending_labels: Vec::new(),
77 label_locations: Vec::new(),
78 finalized: false,
79 overflowed: false,
80 data_pos: 0,
81 code_pos: core::ptr::null_mut(),
82 code_end: core::ptr::null_mut(),
83 };
84 build.assembly_builder_a_64_assembly_builder_a_64(
85 options.include_assembly,
86 FeaturesA64::Feature_JSCVT as u32,
87 );
88
89 get_assembly_impl_a_64(&mut build, func, options, stats)
90 }
91
92 Target::A64_NoFeatures => {
93 let mut build = AssemblyBuilderA64 {
94 data: Vec::new(),
95 code: Vec::new(),
96 text: String::new(),
97 log_text: false,
98 features: 0,
99 next_label: 1,
100 pending_labels: Vec::new(),
101 label_locations: Vec::new(),
102 finalized: false,
103 overflowed: false,
104 data_pos: 0,
105 code_pos: core::ptr::null_mut(),
106 code_end: core::ptr::null_mut(),
107 };
108 build.assembly_builder_a_64_assembly_builder_a_64(options.include_assembly, 0);
109
110 get_assembly_impl_a_64(&mut build, func, options, stats)
111 }
112
113 Target::X64_Windows => {
114 let mut build = AssemblyBuilderX64::assembly_builder_x_64_bool_abix_64_i32(
115 options.include_assembly,
116 ABIX64::Windows,
117 0,
118 );
119
120 get_assembly_impl_x_64(&mut build, func, options, stats)
121 }
122
123 Target::X64_SystemV => {
124 let mut build = AssemblyBuilderX64::assembly_builder_x_64_bool_abix_64_i32(
125 options.include_assembly,
126 ABIX64::SystemV,
127 0,
128 );
129
130 get_assembly_impl_x_64(&mut build, func, options, stats)
131 }
132 }
133}