From d8445fd9dfe5bcf9b694c2b83791c88cafcdf322 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 24 Jul 2023 12:53:16 +0100 Subject: Multithread tilde backend --- src/tilde.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 11 deletions(-) (limited to 'src/tilde.cpp') diff --git a/src/tilde.cpp b/src/tilde.cpp index 4fd891b17..8bd7e0b43 100644 --- a/src/tilde.cpp +++ b/src/tilde.cpp @@ -7,6 +7,13 @@ gb_internal TB_Arena *cg_arena(void) { return global_tb_arenas[current_thread_index()]; } +gb_internal void cg_global_arena_init(void) { + global_tb_arenas = slice_make(permanent_allocator(), global_thread_pool.threads.count); + for_array(i, global_tb_arenas) { + global_tb_arenas[i] = tb_default_arena(); + } +} + // returns TB_TYPE_VOID if not trivially possible gb_internal TB_DataType cg_data_type(Type *t) { GB_ASSERT(t != nullptr); @@ -535,7 +542,6 @@ gb_internal cgModule *cg_module_create(Checker *c) { tb_module_set_tls_index(m->mod, 10, "_tls_index"); map_init(&m->values); - array_init(&m->procedures_to_generate, heap_allocator()); map_init(&m->file_id_map); @@ -543,6 +549,8 @@ gb_internal cgModule *cg_module_create(Checker *c) { map_init(&m->proc_debug_type_map); map_init(&m->proc_proto_map); + array_init(&m->single_threaded_procedure_queue, heap_allocator()); + for_array(id, global_files) { if (AstFile *f = global_files[id]) { @@ -556,12 +564,13 @@ gb_internal cgModule *cg_module_create(Checker *c) { gb_internal void cg_module_destroy(cgModule *m) { map_destroy(&m->values); - array_free(&m->procedures_to_generate); map_destroy(&m->file_id_map); map_destroy(&m->debug_type_map); map_destroy(&m->proc_debug_type_map); map_destroy(&m->proc_proto_map); + array_free(&m->single_threaded_procedure_queue); + tb_module_destroy(m->mod); } @@ -772,6 +781,21 @@ gb_internal String cg_filepath_obj_for_module(cgModule *m) { } +gb_internal WORKER_TASK_PROC(cg_procedure_generate_worker_proc) { + cgProcedure *p = cast(cgProcedure *)data; + cg_procedure_generate(p); + return 0; +} + +gb_internal void cg_add_procedure_to_queue(cgProcedure *p) { + cgModule *m = p->module; + if (m->do_threading) { + thread_pool_add_task(cg_procedure_generate_worker_proc, p); + } else { + array_add(&m->single_threaded_procedure_queue, p); + } +} + gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { TIME_SECTION("Tilde Module Initializtion"); @@ -779,14 +803,13 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { linker_data_init(linker_data, info, c->parser->init_fullpath); - global_tb_arenas = slice_make(permanent_allocator(), global_thread_pool.threads.count); - for_array(i, global_tb_arenas) { - global_tb_arenas[i] = tb_default_arena(); - } + cg_global_arena_init(); cgModule *m = cg_module_create(c); defer (cg_module_destroy(m)); + m->do_threading = true; + TIME_SECTION("Tilde Global Variables"); bool already_has_entry_point = cg_global_variables_create(m); @@ -798,6 +821,7 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { p->is_startup = true; cg_procedure_begin(p); + tb_inst_ret(p->func, 0, nullptr); cg_procedure_end(p); } @@ -807,14 +831,19 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { p->is_startup = true; cg_procedure_begin(p); + tb_inst_ret(p->func, 0, nullptr); cg_procedure_end(p); } auto *min_dep_set = &info->minimum_dependency_set; + Array procedures_to_generate = {}; + array_init(&procedures_to_generate, heap_allocator()); + defer (array_free(&procedures_to_generate)); + for (Entity *e : info->entities) { - String name = e->token.string; - Scope * scope = e->scope; + String name = e->token.string; + Scope *scope = e->scope; if ((scope->flags & ScopeFlag_File) == 0) { continue; @@ -832,15 +861,24 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { continue; } if (cgProcedure *p = cg_procedure_create(m, e)) { - array_add(&m->procedures_to_generate, p); + array_add(&procedures_to_generate, p); } } + for (cgProcedure *p : procedures_to_generate) { + cg_add_procedure_to_queue(p); + } - for (isize i = 0; i < m->procedures_to_generate.count; i++) { - cg_procedure_generate(m->procedures_to_generate[i]); + if (!m->do_threading) { + for (isize i = 0; i < m->single_threaded_procedure_queue.count; i++) { + cgProcedure *p = m->single_threaded_procedure_queue[i]; + cg_procedure_generate(p); + } } + thread_pool_wait(); + + TB_DebugFormat debug_format = TB_DEBUGFMT_NONE; if (build_context.ODIN_DEBUG || true) { switch (build_context.metrics.os) { -- cgit v1.2.3