Multithread RTTI generation in backend

This commit is contained in:
gingerBill
2026-03-17 15:14:49 +00:00
parent 85c05b238e
commit f05ae76ef9
4 changed files with 35 additions and 11 deletions

View File

@@ -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) {

View File

@@ -226,6 +226,8 @@ struct lbGenerator : LinkerData {
PtrMap<LLVMContextRef, lbModule *> modules_through_ctx;
lbModule default_module;
lbModule *rtti_module;
lbModule *equal_module;
isize used_module_count;

View File

@@ -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<lbModule>();
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;

View File

@@ -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;
}