ngrc version works?

This commit is contained in:
2024-04-03 20:55:49 -07:00
parent fab5a230f1
commit 5f2fc7cb34
8 changed files with 119 additions and 9 deletions

View File

@@ -406,12 +406,53 @@ impl<M: Module> Backend<M> {
}
}
Expression::Construct(_, ty, name, fields) => {
let Type::Structure(fields) = ty else {
Expression::Construct(_, ty, _, fields) => {
let Type::Structure(type_fields) = ty else {
panic!("Got to backend with non-structure type in structure construction?!");
};
unimplemented!()
let global_allocator = ArcIntern::new("__global_allocation_pointer__".to_string());
let Some(ReferenceBuilder::Global(_, allocator_variable)) =
variables.get(&global_allocator)
else {
panic!("Couldn't find global allocation pointer");
};
let pointer_to = self.module.target_config().pointer_type();
let allocator_pointer = builder.ins().symbol_value(pointer_to, *allocator_variable);
let structure =
builder
.ins()
.load(pointer_to, MemFlags::new(), allocator_pointer, 0);
let structure_size = builder
.ins()
.iconst(pointer_to, type_fields.object_size() as i64);
let updated_allocator_value = builder.ins().iadd(structure, structure_size);
builder.ins().store(
MemFlags::new(),
updated_allocator_value,
allocator_pointer,
0,
);
for (field_name, field_value) in fields.into_iter() {
let (field_value, field_cranelift_type) =
self.compile_value_or_ref(field_value, variables, builder)?;
let Some((field_internal_type, offset)) =
type_fields.field_type_and_offset(&field_name)
else {
panic!("Got to backend with mismatched construction and type definition");
};
assert_eq!(
field_cranelift_type,
self.translate_type(field_internal_type).value_type
);
builder
.ins()
.store(MemFlags::new(), field_value, structure, offset);
}
Ok((structure, self.module.target_config().pointer_type()))
}
Expression::FieldRef(_, _, struct_type, val, field) => {
@@ -427,7 +468,10 @@ impl<M: Module> Backend<M> {
let field_cranelift_type = self.translate_type(field_type).value_type;
let value = builder.ins().load(field_cranelift_type, MemFlags::new(), structure, offset);
let value =
builder
.ins()
.load(field_cranelift_type, MemFlags::new(), structure, offset);
Ok((value, field_cranelift_type))
}