diff options
| author | gingerBill <bill@gingerbill.org> | 2023-09-22 14:39:51 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2023-09-22 14:39:51 +0100 |
| commit | 082324d7b97e521f5d8dada40629da4e689197c9 (patch) | |
| tree | 6a7e993cd7a7d9428732db3568ae755b73d428c9 /src/llvm_backend.cpp | |
| parent | 5e99289d7afd34cf785b15f727ed2f2d61aa6ffc (diff) | |
Begin work on making the type info table be constantly initialized
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 439140901..db5af0647 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2225,10 +2225,16 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { { // Add type info data isize max_type_info_count = info->minimum_dependency_type_info_set.count+1; - // gb_printf_err("max_type_info_count: %td\n", max_type_info_count); Type *t = alloc_type_array(t_type_info, max_type_info_count); - LLVMValueRef g = LLVMAddGlobal(m->mod, lb_type(m, t), LB_TYPE_INFO_DATA_NAME); - LLVMSetInitializer(g, LLVMConstNull(lb_type(m, t))); + + // IMPORTANT NOTE(bill): As LLVM does not have a union type, an array of unions cannot be initialized + // at compile time without cheating in some way. This means to emulate an array of unions is to use + // a giant packed struct of "corrected" data types. + + LLVMTypeRef internal_llvm_type = lb_setup_type_info_data_internal_type(m, max_type_info_count); + + LLVMValueRef g = LLVMAddGlobal(m->mod, internal_llvm_type, LB_TYPE_INFO_DATA_NAME); + LLVMSetInitializer(g, LLVMConstNull(internal_llvm_type)); LLVMSetLinkage(g, USE_SEPARATE_MODULES ? LLVMExternalLinkage : LLVMInternalLinkage); lbValue value = {}; |