Skip to main content

luaur_code_gen/functions/
get_assembly.rs

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