aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_general.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-11-23 23:43:00 +0000
committergingerBill <bill@gingerbill.org>2022-11-23 23:43:00 +0000
commitae81117f70ec2a7c7e99afd35f791e17ad267134 (patch)
tree209d3916663455335e0ce895aceac5b4304da38f /src/llvm_backend_general.cpp
parentb7b9a016d31e5738014d5659e126aa2c581b9519 (diff)
parentd6cb105d5f29506fc64abbccf8767a79539de1ae (diff)
Merge branch 'master' into multiple-return-abi-experiment
Diffstat (limited to 'src/llvm_backend_general.cpp')
-rw-r--r--src/llvm_backend_general.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 382c01042..9fef5b05e 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -1982,7 +1982,15 @@ LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
}
field_remapping[field_index] = cast(i32)fields.count;
- array_add(&fields, lb_type(m, field->type));
+
+ Type *field_type = field->type;
+ if (is_type_proc(field_type)) {
+ // NOTE(bill, 2022-11-23): Prevent type cycle declaration (e.g. vtable) of procedures
+ // because LLVM is dumb with procedure types
+ field_type = t_rawptr;
+ }
+
+ array_add(&fields, lb_type(m, field_type));
if (!type->Struct.is_packed) {
padding_offset = align_formula(padding_offset, type_align_of(field->type));