luaur_compile_cli/functions/
serialize_lowering_stats.rs1use 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}