aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_expr.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-02-22 17:24:42 +0000
committergingerBill <bill@gingerbill.org>2024-02-22 17:24:42 +0000
commit5a84a0822596fac47dd35bf1c2f1d9bb60bbe5c1 (patch)
tree5e8f06646054cd3512e7738a5b8059a1bb057156 /src/llvm_backend_expr.cpp
parenta4b8c1ea1779ce93349b203aaf56c5aeca316b61 (diff)
Add general support for `bit_field`s
Diffstat (limited to 'src/llvm_backend_expr.cpp')
-rw-r--r--src/llvm_backend_expr.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp
index 0c06c8c1b..6bef21822 100644
--- a/src/llvm_backend_expr.cpp
+++ b/src/llvm_backend_expr.cpp
@@ -4627,6 +4627,22 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) {
Selection sel = lookup_field(type, selector, false);
GB_ASSERT(sel.entity != nullptr);
+ if (sel.is_bit_field) {
+ lbAddr addr = lb_build_addr(p, se->expr);
+ Type *bf_type = base_type(type_deref(lb_addr_type(addr)));
+ GB_ASSERT(bf_type->kind == Type_BitField);
+
+ lbValue a = lb_addr_get_ptr(p, addr);
+ Selection sub_sel = sel;
+ sub_sel.index.count -= 1;
+ i32 index = sel.index[sel.index.count-1];
+
+ Entity *f = bf_type->BitField.fields[index];
+ u8 bit_size = bf_type->BitField.bit_sizes[index];
+ i64 bit_offset = bf_type->BitField.bit_offsets[index];
+
+ return lb_addr_bit_field(a, f->type, index, bit_offset, bit_size);
+ }
if (sel.pseudo_field) {
GB_ASSERT(sel.entity->kind == Entity_Procedure || sel.entity->kind == Entity_ProcGroup);
Entity *e = entity_of_node(sel_node);