mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-13 22:03:42 +00:00
Multithread RTTI generation in backend
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user