From f05ae76ef9f4f47981cee2a19b7f28f214de0055 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 17 Mar 2026 15:14:49 +0000 Subject: [PATCH] Multithread RTTI generation in backend --- src/llvm_backend.cpp | 13 ++++++++++--- src/llvm_backend.hpp | 2 ++ src/llvm_backend_general.cpp | 9 +++++++++ src/llvm_backend_type.cpp | 22 ++++++++++++++-------- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index b2246c90e..638cbf695 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2079,8 +2079,6 @@ gb_internal bool lb_init_global_var(lbModule *m, lbProcedure *p, Entity *e, Ast gb_internal void lb_create_startup_runtime_generate_body(lbModule *m, lbProcedure *p) { lb_begin_procedure_body(p); - lb_setup_type_info_data(m); - if (p->objc_names) { LLVMBuildCall2(p->builder, lb_type_internal_for_procedures_raw(m, p->objc_names->type), p->objc_names->value, nullptr, 0, ""); } @@ -3028,6 +3026,8 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { lbModule *default_module = &gen->default_module; CheckerInfo *info = gen->info; + gen->rtti_module = &gen->default_module; + switch (build_context.metrics.arch) { case TargetArch_amd64: case TargetArch_i386: @@ -3256,7 +3256,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { TIME_SECTION("LLVM Global Variables"); if (!build_context.no_rtti) { - lbModule *m = default_module; + lbModule *m = gen->rtti_module; { // Add type info data // GB_ASSERT_MSG(info->minimum_dependency_type_info_index_map.count == info->type_info_types.count, "%tu vs %tu", info->minimum_dependency_type_info_index_map.count, info->type_info_types.count); @@ -3554,6 +3554,13 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { TIME_SECTION("LLVM Runtime Cleanup Creation & @(fini)"); gen->cleanup_runtime = lb_create_cleanup_runtime(default_module); + TIME_SECTION("LLVM Runtime Type Information (RTTI)"); + if (do_threading) { + thread_pool_add_task(lb_setup_type_info_data_worker, gen->rtti_module); + } else { + lb_setup_type_info_data_worker(gen->rtti_module); + } + if (build_context.ODIN_DEBUG) { for (auto const &entry : builtin_pkg->scope->elements) { diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e4297300f..38aed1c16 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -226,6 +226,8 @@ struct lbGenerator : LinkerData { PtrMap modules_through_ctx; lbModule default_module; + lbModule *rtti_module; + lbModule *equal_module; isize used_module_count; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index b15eb8333..6ee758993 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -249,6 +249,15 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) { map_set(&gen->modules, cast(void *)m, m); // point to itself just add it to the list lb_init_module(m, do_threading); } + + if (do_threading) { + lbModule *m = permanent_alloc_item(); + gen->rtti_module = m; + m->gen = gen; + m->checker = c; + map_set(&gen->modules, cast(void *)m, m); // point to itself just add it to the list + lb_init_module(m, do_threading); + } } gen->default_module.gen = gen; diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index b41ba2f15..c69f2aa09 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -127,35 +127,35 @@ gb_internal lbValue lb_const_array_epi(lbModule *m, lbValue value, isize index) gb_internal lbValue lb_type_info_member_types_offset(lbModule *m, isize count, i64 *offset_=nullptr) { - GB_ASSERT(m == &m->gen->default_module); + GB_ASSERT(m == m->gen->rtti_module); if (offset_) *offset_ = lb_global_type_info_member_types_index; lbValue offset = lb_const_array_epi(m, lb_global_type_info_member_types.addr, lb_global_type_info_member_types_index); lb_global_type_info_member_types_index += cast(i32)count; return offset; } gb_internal lbValue lb_type_info_member_names_offset(lbModule *m, isize count, i64 *offset_=nullptr) { - GB_ASSERT(m == &m->gen->default_module); + GB_ASSERT(m == m->gen->rtti_module); if (offset_) *offset_ = lb_global_type_info_member_names_index; lbValue offset = lb_const_array_epi(m, lb_global_type_info_member_names.addr, lb_global_type_info_member_names_index); lb_global_type_info_member_names_index += cast(i32)count; return offset; } gb_internal lbValue lb_type_info_member_offsets_offset(lbModule *m, isize count, i64 *offset_=nullptr) { - GB_ASSERT(m == &m->gen->default_module); + GB_ASSERT(m == m->gen->rtti_module); if (offset_) *offset_ = lb_global_type_info_member_offsets_index; lbValue offset = lb_const_array_epi(m, lb_global_type_info_member_offsets.addr, lb_global_type_info_member_offsets_index); lb_global_type_info_member_offsets_index += cast(i32)count; return offset; } gb_internal lbValue lb_type_info_member_usings_offset(lbModule *m, isize count, i64 *offset_=nullptr) { - GB_ASSERT(m == &m->gen->default_module); + GB_ASSERT(m == m->gen->rtti_module); if (offset_) *offset_ = lb_global_type_info_member_usings_index; lbValue offset = lb_const_array_epi(m, lb_global_type_info_member_usings.addr, lb_global_type_info_member_usings_index); lb_global_type_info_member_usings_index += cast(i32)count; return offset; } gb_internal lbValue lb_type_info_member_tags_offset(lbModule *m, isize count, i64 *offset_=nullptr) { - GB_ASSERT(m == &m->gen->default_module); + GB_ASSERT(m == m->gen->rtti_module); if (offset_) *offset_ = lb_global_type_info_member_tags_index; lbValue offset = lb_const_array_epi(m, lb_global_type_info_member_tags.addr, lb_global_type_info_member_tags_index); lb_global_type_info_member_tags_index += cast(i32)count; @@ -1131,9 +1131,7 @@ gb_internal void lb_setup_type_info_data(lbModule *m) { // NOTE(bill): Setup typ GB_ASSERT(type->kind == Type_Array); global_type_info_data_entity_count = type->Array.count; - if (true) { - lb_setup_type_info_data_giant_array(m, global_type_info_data_entity_count); - } + lb_setup_type_info_data_giant_array(m, global_type_info_data_entity_count); LLVMValueRef data = lb_global_type_info_data_ptr(m).value; data = LLVMConstPointerCast(data, lb_type(m, alloc_type_pointer(type->Array.elem))); @@ -1147,3 +1145,11 @@ gb_internal void lb_setup_type_info_data(lbModule *m) { // NOTE(bill): Setup typ // force it to be constant LLVMSetGlobalConstant(global_type_table.value, true); } + + +gb_internal WORKER_TASK_PROC(lb_setup_type_info_data_worker) { + lbModule *m = cast(lbModule *)data; + + lb_setup_type_info_data(m); + return 0; +} \ No newline at end of file