From a0afb64cb07c99a288c527719c7a3ebfb5993017 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Fri, 24 Dec 2021 13:09:28 +0000 Subject: [PATCH] Fix bug storing linker data for generated procs --- compiler/mono/src/code_gen_help.rs | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/compiler/mono/src/code_gen_help.rs b/compiler/mono/src/code_gen_help.rs index 729768cb8f..ac0718d8f8 100644 --- a/compiler/mono/src/code_gen_help.rs +++ b/compiler/mono/src/code_gen_help.rs @@ -41,6 +41,7 @@ impl From<&ModifyRc> for HelperOp { } } +#[derive(Debug)] struct SpecializedProc<'a> { op: HelperOp, layout: Layout<'a>, @@ -285,8 +286,6 @@ impl<'a> CodeGenHelp<'a> { ) -> Symbol { use HelperOp::*; - let mut new_procs_info = Vec::new_in(self.arena); - let found = self .specialized_procs .iter() @@ -297,7 +296,7 @@ impl<'a> CodeGenHelp<'a> { } let (proc_symbol, proc_layout) = self.create_proc_symbol(ident_ids, ctx, &layout); - new_procs_info.push((proc_symbol, proc_layout)); + ctx.new_linker_data.push((proc_symbol, proc_layout)); // Generate the body of the Proc let (ret_layout, body) = match ctx.op { @@ -342,7 +341,7 @@ impl<'a> CodeGenHelp<'a> { ident_ids: &mut IdentIds, ctx: &mut Context<'a>, layout: &Layout<'a>, - ) -> (Symbol, Option>) { + ) -> (Symbol, ProcLayout<'a>) { let layout_name = layout_debug_name(layout); let debug_name = format!( "#help{:?}_{}_{}", @@ -353,19 +352,19 @@ impl<'a> CodeGenHelp<'a> { let proc_symbol: Symbol = self.create_symbol(ident_ids, &debug_name); let proc_layout = match ctx.op { - HelperOp::Inc => Some(ProcLayout { + HelperOp::Inc => ProcLayout { arguments: self.arena.alloc([*layout, self.layout_isize]), result: LAYOUT_UNIT, - }), - HelperOp::Dec => Some(ProcLayout { + }, + HelperOp::Dec => ProcLayout { arguments: self.arena.alloc([*layout]), result: LAYOUT_UNIT, - }), - HelperOp::DecRef => None, - HelperOp::Eq => Some(ProcLayout { + }, + HelperOp::DecRef => unreachable!("No generated Proc for DecRef"), + HelperOp::Eq => ProcLayout { arguments: self.arena.alloc([*layout, *layout]), result: LAYOUT_BOOL, - }), + }, }; (proc_symbol, proc_layout)