aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-11-08 12:18:36 +0000
committergingerBill <bill@gingerbill.org>2022-11-08 12:18:36 +0000
commited58374964889db91b38fe95db409111819790ca (patch)
tree6607cf40b0685fd9c71c0871c04f01cbbd3f42fb /src/llvm_backend.cpp
parent6dd4d1a9244cb7ba1c819e457d7aef493d5eb482 (diff)
Make `Map_Info` store pointers to cell info rather than inline
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index fa9727106..960ef84f6 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -502,6 +502,11 @@ lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, A
LLVMValueRef lb_gen_map_cell_info(lbModule *m, Type *type) {
+ lbAddr *found = map_get(&m->map_cell_info_map, type);
+ if (found) {
+ return found->addr.value;
+ }
+
i64 size = 0, len = 0;
map_cell_size_and_len(type, &size, &len);
@@ -510,8 +515,15 @@ LLVMValueRef lb_gen_map_cell_info(lbModule *m, Type *type) {
const_values[1] = lb_const_int(m, t_uintptr, type_align_of(type)).value;
const_values[2] = lb_const_int(m, t_uintptr, size).value;
const_values[3] = lb_const_int(m, t_uintptr, len).value;
- return llvm_const_named_struct(m, t_map_cell_info, const_values, gb_count_of(const_values));
+ LLVMValueRef llvm_res = llvm_const_named_struct(m, t_map_cell_info, const_values, gb_count_of(const_values));
+ lbValue res = {llvm_res, t_map_cell_info};
+
+ lbAddr addr = lb_add_global_generated(m, t_map_cell_info, res, nullptr);
+ lb_make_global_private_const(addr);
+
+ map_set(&m->map_cell_info_map, type, addr);
+ return addr.addr.value;
}
lbValue lb_gen_map_info_ptr(lbModule *m, Type *map_type) {
map_type = base_type(map_type);