From 55176e52fcb977268625cfc7f7afaaaa6bf5d06f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 23 Jan 2023 11:38:18 +0000 Subject: [PATCH] Use `heap_allocator()` with `-debug`; Reinstate the arena guards --- src/build_settings.cpp | 5 +++++ src/common_memory.cpp | 23 +++++++++++++++-------- src/exact_value.cpp | 2 +- src/llvm_backend.cpp | 17 ++++++++++++----- src/llvm_backend_debug.cpp | 13 ++++++------- 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 9f3c81c8f..90e6512c5 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -330,6 +330,11 @@ struct BuildContext { gb_global BuildContext build_context = {0}; +gb_internal bool IS_ODIN_DEBUG(void) { + return build_context.ODIN_DEBUG; +} + + gb_internal bool global_warnings_as_errors(void) { return build_context.warnings_as_errors; } diff --git a/src/common_memory.cpp b/src/common_memory.cpp index e07276aa1..07c3ba48f 100644 --- a/src/common_memory.cpp +++ b/src/common_memory.cpp @@ -254,6 +254,8 @@ struct ArenaTemp { ArenaTemp arena_temp_begin(Arena *arena) { GB_ASSERT(arena); + MUTEX_GUARD(&arena->mutex); + ArenaTemp temp = {}; temp.arena = arena; temp.block = arena->curr_block; @@ -267,6 +269,8 @@ ArenaTemp arena_temp_begin(Arena *arena) { void arena_temp_end(ArenaTemp const &temp) { GB_ASSERT(temp.arena); Arena *arena = temp.arena; + MUTEX_GUARD(&arena->mutex); + bool memory_block_found = false; for (MemoryBlock *block = arena->curr_block; block != nullptr; block = block->prev) { if (block == temp.block) { @@ -359,23 +363,26 @@ gb_internal gbAllocator temporary_allocator() { return arena_allocator(&temporary_arena); } -#define TEMPORARY_ALLOCATOR_GUARD() -#define PERMANENT_ALLOCATOR_GUARD() +// #define TEMPORARY_ALLOCATOR_GUARD() +// #define PERMANENT_ALLOCATOR_GUARD() -// #define TEMPORARY_ALLOCATOR_GUARD() ArenaTempGuard GB_DEFER_3(_arena_guard_){&temporary_arena} -// #define PERMANENT_ALLOCATOR_GUARD() ArenaTempGuard GB_DEFER_3(_arena_guard_){&permanent_arena} +#define TEMPORARY_ALLOCATOR_GUARD() ArenaTempGuard GB_DEFER_3(_arena_guard_){&temporary_arena} +#define PERMANENT_ALLOCATOR_GUARD() ArenaTempGuard GB_DEFER_3(_arena_guard_){&permanent_arena} +gb_internal bool IS_ODIN_DEBUG(void); gb_internal GB_ALLOCATOR_PROC(heap_allocator_proc); gb_internal gbAllocator heap_allocator(void) { + if (IS_ODIN_DEBUG()) { + gbAllocator a; + a.proc = heap_allocator_proc; + a.data = nullptr; + return a; + } return arena_allocator(&permanent_arena); - // gbAllocator a; - // a.proc = heap_allocator_proc; - // a.data = nullptr; - // return a; } diff --git a/src/exact_value.cpp b/src/exact_value.cpp index f4c85505d..fc4ae2155 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -60,7 +60,7 @@ gb_internal uintptr hash_exact_value(ExactValue v) { case ExactValue_Bool: return gb_fnv32a(&v.value_bool, gb_size_of(v.value_bool)); case ExactValue_String: - return ptr_map_hash_key(string_intern(v.value_string)); + return gb_fnv32a(v.value_string.text, v.value_string.len); case ExactValue_Integer: { u32 key = gb_fnv32a(v.value_integer.dp, gb_size_of(*v.value_integer.dp) * v.value_integer.used); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 084c27635..c718aa519 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1446,6 +1446,11 @@ gb_internal void lb_debug_info_complete_types_and_finalize(lbGenerator *gen) { lbModule *m = entry.value; if (m->debug_builder != nullptr) { lb_debug_complete_types(m); + } + } + for (auto const &entry : gen->modules) { + lbModule *m = entry.value; + if (m->debug_builder != nullptr) { LLVMDIBuilderFinalize(m->debug_builder); } } @@ -1649,7 +1654,7 @@ gb_internal bool lb_llvm_object_generation(lbGenerator *gen, bool do_threading) array_add(&gen->output_object_paths, filepath_obj); String short_name = remove_directory_from_path(filepath_obj); - gbString section_name = gb_string_make(heap_allocator(), "LLVM Generate Object: "); + gbString section_name = gb_string_make(permanent_allocator(), "LLVM Generate Object: "); section_name = gb_string_append_length(section_name, short_name.text, short_name.len); TIME_SECTION_WITH_LEN(section_name, gb_string_length(section_name)); @@ -1774,7 +1779,7 @@ gb_internal lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *star lbValue runner = lb_find_package_value(m, str_lit("testing"), str_lit("runner")); - auto args = array_make(heap_allocator(), 1); + auto args = array_make(permanent_allocator(), 1); args[0] = lb_addr_load(p, all_tests_slice); lb_emit_call(p, runner, args); } else { @@ -2028,7 +2033,9 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { lb_set_llvm_metadata(m, f, res); } - gbString producer = gb_string_make(heap_allocator(), "odin"); + TEMPORARY_ALLOCATOR_GUARD(); + + gbString producer = gb_string_make(temporary_allocator(), "odin"); // producer = gb_string_append_fmt(producer, " version %.*s", LIT(ODIN_VERSION)); // #ifdef NIGHTLY // producer = gb_string_appendc(producer, "-nightly"); @@ -2037,7 +2044,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { // producer = gb_string_append_fmt(producer, "-%s", GIT_SHA); // #endif - gbString split_name = gb_string_make(heap_allocator(), ""); + gbString split_name = gb_string_make(temporary_allocator(), ""); LLVMBool is_optimized = build_context.optimization_level > 0; AstFile *init_file = m->info->init_package->files[0]; @@ -2374,7 +2381,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { TIME_SECTION("LLVM Function Pass"); - lb_llvm_function_passes(gen, do_threading); + lb_llvm_function_passes(gen, do_threading && !build_context.ODIN_DEBUG); TIME_SECTION("LLVM Module Pass"); lb_llvm_module_passes(gen, do_threading); diff --git a/src/llvm_backend_debug.cpp b/src/llvm_backend_debug.cpp index fc9e63274..f65656494 100644 --- a/src/llvm_backend_debug.cpp +++ b/src/llvm_backend_debug.cpp @@ -620,6 +620,8 @@ gb_internal void lb_debug_complete_types(lbModule *m) { unsigned const word_bits = cast(unsigned)(8*build_context.word_size); for_array(debug_incomplete_type_index, m->debug_incomplete_types) { + TEMPORARY_ALLOCATOR_GUARD(); + auto const &idt = m->debug_incomplete_types[debug_incomplete_type_index]; GB_ASSERT(idt.type != nullptr); GB_ASSERT(idt.metadata != nullptr); @@ -1125,11 +1127,11 @@ gb_internal void lb_add_debug_context_variable(lbProcedure *p, lbAddr const &ctx } -gb_internal String debug_info_mangle_constant_name(Entity *e, bool *did_allocate_) { +gb_internal String debug_info_mangle_constant_name(Entity *e, gbAllocator const &allocator, bool *did_allocate_) { String name = e->token.string; if (e->pkg && e->pkg->name.len > 0) { // NOTE(bill): C++ NONSENSE FOR DEBUG SHITE! - name = concatenate3_strings(heap_allocator(), e->pkg->name, str_lit("::"), name); + name = concatenate3_strings(allocator, e->pkg->name, str_lit("::"), name); if (did_allocate_) *did_allocate_ = true; } return name; @@ -1154,11 +1156,8 @@ gb_internal void add_debug_info_global_variable_expr(lbModule *m, String const & gb_internal void add_debug_info_for_global_constant_internal_i64(lbModule *m, Entity *e, LLVMMetadataRef dtype, i64 v) { LLVMMetadataRef expr = LLVMDIBuilderCreateConstantValueExpression(m->debug_builder, v); - bool did_allocate = false; - String name = debug_info_mangle_constant_name(e, &did_allocate); - defer (if (did_allocate) { - gb_free(heap_allocator(), name.text); - }); + TEMPORARY_ALLOCATOR_GUARD(); + String name = debug_info_mangle_constant_name(e, temporary_allocator(), nullptr); add_debug_info_global_variable_expr(m, name, dtype, expr); if ((e->pkg && e->pkg->kind == Package_Init) ||