Skip to main content

luaur_compile_cli/functions/
serialize_lowering_stats.rs

1use crate::functions::serialize_block_linearization_stats::{
2    serialize_block_linearization_stats, FILE,
3};
4use crate::functions::serialize_function_stats::serialize_function_stats;
5use crate::macros::write_name::WRITE_NAME;
6use crate::macros::write_pair::WRITE_PAIR;
7use luaur_code_gen::records::block_linearization_stats::BlockLinearizationStats;
8use luaur_code_gen::records::function_stats::FunctionStats;
9use luaur_code_gen::records::lowering_stats::LoweringStats;
10
11extern "C" {
12    pub fn fprintf(fp: *mut FILE, format: *const core::ffi::c_char, ...) -> core::ffi::c_int;
13}
14
15#[allow(non_camel_case_types)]
16pub mod libc {
17    pub use super::fprintf;
18}
19
20pub fn serialize_lowering_stats(fp: *mut core::ffi::c_void, stats: &LoweringStats) {
21    let fp_file = fp as *mut FILE;
22    unsafe {
23        fprintf(fp_file, c"{\n".as_ptr());
24
25        WRITE_PAIR!(fp_file, stats, "            ", total_functions, "%u,\n");
26        WRITE_PAIR!(fp_file, stats, "            ", skipped_functions, "%u,\n");
27        WRITE_PAIR!(fp_file, stats, "            ", spills_to_slot, "%d,\n");
28        WRITE_PAIR!(fp_file, stats, "            ", spills_to_restore, "%d,\n");
29        WRITE_PAIR!(
30            fp_file,
31            stats,
32            "            ",
33            max_spill_slots_used,
34            "%u,\n"
35        );
36        WRITE_PAIR!(fp_file, stats, "            ", blocks_pre_opt, "%u,\n");
37        WRITE_PAIR!(fp_file, stats, "            ", blocks_post_opt, "%u,\n");
38        WRITE_PAIR!(
39            fp_file,
40            stats,
41            "            ",
42            max_block_instructions,
43            "%u,\n"
44        );
45        WRITE_PAIR!(fp_file, stats, "            ", reg_alloc_errors, "%d,\n");
46        WRITE_PAIR!(fp_file, stats, "            ", lowering_errors, "%d,\n");
47
48        WRITE_NAME!(fp_file, "            ", block_linearization_stats);
49        serialize_block_linearization_stats(fp_file, &stats.block_linearization_stats);
50        fprintf(fp_file, c",\n".as_ptr());
51
52        WRITE_NAME!(fp_file, "            ", functions);
53        let function_count = stats.functions.len();
54
55        if function_count == 0 {
56            fprintf(fp_file, c"[]".as_ptr());
57        } else {
58            fprintf(fp_file, c"[\n".as_ptr());
59            for i in 0..function_count {
60                serialize_function_stats(fp, &stats.functions[i]);
61                if i < function_count - 1 {
62                    fprintf(fp_file, c",\n".as_ptr());
63                }
64            }
65            fprintf(fp_file, c"\n            ]".as_ptr());
66        }
67
68        fprintf(fp_file, c"\n        }".as_ptr());
69    }
70}