remove tag id from data bytes for non-recursive tags

This commit is contained in:
Folkert 2021-06-26 17:01:23 +02:00
parent 98db393587
commit 98a9dc0945
24 changed files with 188 additions and 170 deletions

View file

@ -1,5 +1,5 @@
use crate::llvm::build::Env;
use crate::llvm::build::{cast_block_of_memory_to_tag, complex_bitcast, FAST_CALL_CONV};
use crate::llvm::build::{cast_block_of_memory_to_tag, FAST_CALL_CONV};
use crate::llvm::build_list::{list_len, load_list_ptr};
use crate::llvm::build_str::str_equal;
use crate::llvm::convert::basic_type_from_layout;
@ -846,9 +846,10 @@ fn build_tag_eq_help<'a, 'ctx, 'env>(
match union_layout {
NonRecursive(tags) => {
// SAFETY we know that non-recursive tags cannot be NULL
let id1 = nonrec_tag_id(env, tag1.into_struct_value());
let id2 = nonrec_tag_id(env, tag2.into_struct_value());
let id1 =
crate::llvm::build::get_tag_id(env, parent, union_layout, tag1).into_int_value();
let id2 =
crate::llvm::build::get_tag_id(env, parent, union_layout, tag2).into_int_value();
let compare_tag_fields = ctx.append_basic_block(parent, "compare_tag_fields");
@ -1212,19 +1213,6 @@ fn eq_ptr_to_struct<'a, 'ctx, 'env>(
.into_int_value()
}
fn nonrec_tag_id<'a, 'ctx, 'env>(
env: &Env<'a, 'ctx, 'env>,
tag: StructValue<'ctx>,
) -> IntValue<'ctx> {
complex_bitcast(
env.builder,
tag.into(),
env.context.i64_type().into(),
"load_tag_id",
)
.into_int_value()
}
unsafe fn rec_tag_id_unsafe<'a, 'ctx, 'env>(
env: &Env<'a, 'ctx, 'env>,
tag: PointerValue<'ctx>,