mirror of
https://github.com/Ed94/Odin.git
synced 2026-06-23 22:25:00 -07:00
Merge pull request #4611 from tf2spi/4491-max-field-align-pack
Add packing + aligned access w/ field_align
This commit is contained in:
@@ -1200,9 +1200,22 @@ gb_internal lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index) {
|
||||
lbValue gep = lb_emit_struct_ep_internal(p, s, index, result_type);
|
||||
|
||||
Type *bt = base_type(t);
|
||||
if (bt->kind == Type_Struct && bt->Struct.is_packed) {
|
||||
lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED, 1);
|
||||
GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED) == 1);
|
||||
if (bt->kind == Type_Struct) {
|
||||
if (bt->Struct.is_packed) {
|
||||
lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED, 1);
|
||||
GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED) == 1);
|
||||
}
|
||||
u64 align_max = bt->Struct.custom_max_field_align;
|
||||
u64 align_min = bt->Struct.custom_min_field_align;
|
||||
GB_ASSERT(align_min == 0 || align_max == 0 || align_min <= align_max);
|
||||
if (align_max) {
|
||||
lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MAX_ALIGN, align_max);
|
||||
GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MAX_ALIGN) == align_max);
|
||||
}
|
||||
if (align_min) {
|
||||
lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MIN_ALIGN, align_min);
|
||||
GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MIN_ALIGN) == align_min);
|
||||
}
|
||||
}
|
||||
|
||||
return gep;
|
||||
|
||||
Reference in New Issue
Block a user