mirror of
https://github.com/odin-lang/Odin.git
synced 2026-08-14 17:49:16 +00:00
llvm: handle #soa fixed compound literals for vars
This commit is contained in:
@@ -4924,6 +4924,11 @@ gb_internal void lb_build_addr_compound_lit_populate(lbProcedure *p, Slice<Ast *
|
||||
case Type_SimdVector: et = bt->SimdVector.elem; break;
|
||||
case Type_Matrix: et = bt->Matrix.elem; break;
|
||||
case Type_FixedCapacityDynamicArray: et = bt->FixedCapacityDynamicArray.elem; break;
|
||||
case Type_Struct:
|
||||
if (bt->Struct.soa_kind == StructSoa_Fixed) {
|
||||
et = bt->Struct.soa_elem;
|
||||
}
|
||||
break;
|
||||
}
|
||||
GB_ASSERT(et != nullptr);
|
||||
|
||||
@@ -5038,18 +5043,17 @@ gb_internal void lb_build_addr_compound_lit_populate(lbProcedure *p, Slice<Ast *
|
||||
}
|
||||
gb_internal void lb_build_addr_compound_lit_assign_array(lbProcedure *p, Array<lbCompoundLitElemTempData> const &temp_data) {
|
||||
for (auto const &td : temp_data) {
|
||||
if (td.value.value != nullptr) {
|
||||
if (td.elem_length > 0) {
|
||||
auto loop_data = lb_loop_start(p, cast(isize)td.elem_length, t_i32);
|
||||
{
|
||||
lbValue dst = td.gep;
|
||||
dst = lb_emit_ptr_offset(p, dst, loop_data.idx);
|
||||
lb_emit_store(p, dst, td.value);
|
||||
}
|
||||
lb_loop_end(p, loop_data);
|
||||
} else {
|
||||
lb_emit_store(p, td.gep, td.value);
|
||||
GB_ASSERT(td.value.value != nullptr);
|
||||
if (td.elem_length > 0) {
|
||||
auto loop_data = lb_loop_start(p, cast(isize)td.elem_length, t_i32);
|
||||
{
|
||||
lbValue dst = td.gep;
|
||||
dst = lb_emit_ptr_offset(p, dst, loop_data.idx);
|
||||
lb_emit_store(p, dst, td.value);
|
||||
}
|
||||
lb_loop_end(p, loop_data);
|
||||
} else {
|
||||
lb_emit_store(p, td.gep, td.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6120,7 +6124,35 @@ gb_internal lbAddr lb_build_addr_compound_lit(lbProcedure *p, Ast *expr) {
|
||||
}
|
||||
|
||||
case Type_Struct:
|
||||
lb_build_addr_struct_compound_lit_populate(p, expr, type, v);
|
||||
if (is_type_soa_struct(type)) {
|
||||
GB_ASSERT(bt->Struct.soa_kind == StructSoa_Fixed);
|
||||
if (cl->elems.count == 0) {
|
||||
break;
|
||||
}
|
||||
lb_addr_store(p, v, lb_const_value(p->module, type, exact_value_compound(expr)));
|
||||
|
||||
auto temp_data = array_make<lbCompoundLitElemTempData>(temporary_allocator(), 0, cl->elems.count);
|
||||
lb_build_addr_compound_lit_populate(p, cl->elems, &temp_data, type);
|
||||
for (auto const &td : temp_data) {
|
||||
GB_ASSERT(td.value.value != nullptr);
|
||||
lbValue offset = lb_const_int(p->module, t_i32, td.elem_index);
|
||||
if (td.elem_length > 0) {
|
||||
auto loop_data = lb_loop_start(p, cast(isize)td.elem_length, t_i32);
|
||||
{
|
||||
lbValue index = lb_emit_arith(p, Token_Add, offset, loop_data.idx, t_i32);
|
||||
lbAddr dst = lb_addr_soa_variable(v.addr, index, td.expr);
|
||||
lb_addr_store(p, dst, td.value);
|
||||
}
|
||||
lb_loop_end(p, loop_data);
|
||||
} else {
|
||||
lbValue index = offset;
|
||||
lbAddr dst = lb_addr_soa_variable(v.addr, index, td.expr);
|
||||
lb_addr_store(p, dst, td.value);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
lb_build_addr_struct_compound_lit_populate(p, expr, type, v);
|
||||
}
|
||||
break;
|
||||
|
||||
case Type_Map: {
|
||||
|
||||
Reference in New Issue
Block a user