From 1fb5bf6bdbc236120e447080aab44a3ce09de1e1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 30 Apr 2024 12:31:15 +0100 Subject: [PATCH] Sort procedures in single threaded mode for tilde --- src/tilde.cpp | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/tilde.cpp b/src/tilde.cpp index 590a3f602..b7122f8f2 100644 --- a/src/tilde.cpp +++ b/src/tilde.cpp @@ -781,6 +781,33 @@ gb_internal void cg_add_procedure_to_queue(cgProcedure *p) { } } +gb_internal i32 cg_procedure_cmp(void const *a, void const *b) { + cgProcedure *x = *(cgProcedure **)a; + cgProcedure *y = *(cgProcedure **)b; + + if (x == y) { + return 0; + } + if (!x->parent && y->parent) { + return +1; + } + if (x->parent && !y->parent) { + return -1; + } + if (!x->entity && y->entity) { + return -1; + } + if (x->entity && !y->entity) { + return +1; + } + + if (x->entity && y->entity) { + return token_pos_cmp(x->entity->token.pos, y->entity->token.pos); + } + + return string_compare(x->name, y->name); +} + gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { TIME_SECTION("Tilde Module Initializtion"); @@ -854,14 +881,16 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) { } if (!m->do_threading) { + gb_sort_array(m->single_threaded_procedure_queue.data, m->single_threaded_procedure_queue.count, cg_procedure_cmp); + for (isize i = 0; i < m->single_threaded_procedure_queue.count; i++) { cgProcedure *p = m->single_threaded_procedure_queue[i]; cg_procedure_generate(p); } + } else { + thread_pool_wait(); } - thread_pool_wait(); - { // Create startup cgProcedure *p = cg_startup_runtime_proc; cg_procedure_begin(p);