diff options
| author | gingerBill <bill@gingerbill.org> | 2022-11-01 12:56:17 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2022-11-01 12:56:17 +0000 |
| commit | 4812601e78c10d656ab53ec80fa3fb496a8da5b2 (patch) | |
| tree | 5ccf0d680daca0ca84a261a5bdb4bc7be9315ffd /src | |
| parent | 2d5779b66046c8cd75d969bdeb7192cb83f56b90 (diff) | |
Fix #2167 `context.assertion_failure_proc = nil` (context field assignments)
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm_backend_general.cpp | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 18cdd196d..87f8afa05 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -383,16 +383,27 @@ Type *lb_addr_type(lbAddr const &addr) { if (addr.addr.value == nullptr) { return nullptr; } - if (addr.kind == lbAddr_Map) { - Type *t = base_type(addr.map.type); - GB_ASSERT(is_type_map(t)); - return t->Map.value; - } - if (addr.kind == lbAddr_Swizzle) { + switch (addr.kind) { + case lbAddr_Map: + { + Type *t = base_type(addr.map.type); + GB_ASSERT(is_type_map(t)); + return t->Map.value; + } + case lbAddr_Swizzle: return addr.swizzle.type; - } - if (addr.kind == lbAddr_SwizzleLarge) { + case lbAddr_SwizzleLarge: return addr.swizzle_large.type; + case lbAddr_Context: + if (addr.ctx.sel.index.count > 0) { + Type *t = t_context; + for_array(i, addr.ctx.sel.index) { + GB_ASSERT(is_type_struct(t)); + t = base_type(t)->Struct.fields[addr.ctx.sel.index[i]]->type; + } + return t; + } + break; } return type_deref(addr.addr.type); } |