This commit is contained in:
Folkert 2021-11-11 23:38:45 +01:00
parent 38da99b1ac
commit 65a9febe7d

View file

@ -1724,19 +1724,15 @@ fn modify_refcount_union_help<'a, 'ctx, 'env>(
if let Layout::RecursivePointer = field_layout { if let Layout::RecursivePointer = field_layout {
panic!("non-recursive tag unions cannot contain naked recursion pointers!"); panic!("non-recursive tag unions cannot contain naked recursion pointers!");
} else if field_layout.contains_refcounted() { } else if field_layout.contains_refcounted() {
// crazy hack // crazy hack: inlining this function when it decrements a list or string results
match field_layout { // in many, many valgrind errors in `--optimize` mode. We do not know why.
Layout::Builtin(Builtin::Str | Builtin::List(_)) => { if let Layout::Builtin(Builtin::Str | Builtin::List(_)) = field_layout {
use inkwell::attributes::{Attribute, AttributeLoc}; use inkwell::attributes::{Attribute, AttributeLoc};
let kind_id = Attribute::get_named_enum_kind_id("noinline"); let kind_id = Attribute::get_named_enum_kind_id("noinline");
debug_assert!(kind_id > 0); debug_assert!(kind_id > 0);
let enum_attr = env.context.create_enum_attribute(kind_id, 1); let enum_attr = env.context.create_enum_attribute(kind_id, 1);
fn_val.add_attribute(AttributeLoc::Function, enum_attr); fn_val.add_attribute(AttributeLoc::Function, enum_attr);
}
_ => {
// do nothing
}
} }
let field_ptr = env let field_ptr = env