aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_general.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-11-01 12:56:17 +0000
committergingerBill <bill@gingerbill.org>2022-11-01 12:56:17 +0000
commit4812601e78c10d656ab53ec80fa3fb496a8da5b2 (patch)
tree5ccf0d680daca0ca84a261a5bdb4bc7be9315ffd /src/llvm_backend_general.cpp
parent2d5779b66046c8cd75d969bdeb7192cb83f56b90 (diff)
Fix #2167 `context.assertion_failure_proc = nil` (context field assignments)
Diffstat (limited to 'src/llvm_backend_general.cpp')
-rw-r--r--src/llvm_backend_general.cpp27
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);
}