Browse Source

Use `heap_allocator()` with `-debug`; Reinstate the arena guards

gingerBill 2 years ago
parent
commit
55176e52fc
5 changed files with 39 additions and 21 deletions
  1. 5 0
      src/build_settings.cpp
  2. 15 8
      src/common_memory.cpp
  3. 1 1
      src/exact_value.cpp
  4. 12 5
      src/llvm_backend.cpp
  5. 6 7
      src/llvm_backend_debug.cpp

+ 5 - 0
src/build_settings.cpp

@@ -330,6 +330,11 @@ struct BuildContext {
 
 
 gb_global BuildContext build_context = {0};
 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) {
 gb_internal bool global_warnings_as_errors(void) {
 	return build_context.warnings_as_errors;
 	return build_context.warnings_as_errors;
 }
 }

+ 15 - 8
src/common_memory.cpp

@@ -254,6 +254,8 @@ struct ArenaTemp {
 
 
 ArenaTemp arena_temp_begin(Arena *arena) {
 ArenaTemp arena_temp_begin(Arena *arena) {
 	GB_ASSERT(arena);
 	GB_ASSERT(arena);
+	MUTEX_GUARD(&arena->mutex);
+
 	ArenaTemp temp = {};
 	ArenaTemp temp = {};
 	temp.arena = arena;
 	temp.arena = arena;
 	temp.block = arena->curr_block;
 	temp.block = arena->curr_block;
@@ -267,6 +269,8 @@ ArenaTemp arena_temp_begin(Arena *arena) {
 void arena_temp_end(ArenaTemp const &temp) {
 void arena_temp_end(ArenaTemp const &temp) {
 	GB_ASSERT(temp.arena);
 	GB_ASSERT(temp.arena);
 	Arena *arena = temp.arena;
 	Arena *arena = temp.arena;
+	MUTEX_GUARD(&arena->mutex);
+
 	bool memory_block_found = false;
 	bool memory_block_found = false;
 	for (MemoryBlock *block = arena->curr_block; block != nullptr; block = block->prev) {
 	for (MemoryBlock *block = arena->curr_block; block != nullptr; block = block->prev) {
 		if (block == temp.block) {
 		if (block == temp.block) {
@@ -359,23 +363,26 @@ gb_internal gbAllocator temporary_allocator() {
 	return arena_allocator(&temporary_arena);
 	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 GB_ALLOCATOR_PROC(heap_allocator_proc);
 
 
 gb_internal gbAllocator heap_allocator(void) {
 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);
 	return arena_allocator(&permanent_arena);
-	// gbAllocator a;
-	// a.proc = heap_allocator_proc;
-	// a.data = nullptr;
-	// return a;
 }
 }
 
 
 
 

+ 1 - 1
src/exact_value.cpp

@@ -60,7 +60,7 @@ gb_internal uintptr hash_exact_value(ExactValue v) {
 	case ExactValue_Bool:
 	case ExactValue_Bool:
 		return gb_fnv32a(&v.value_bool, gb_size_of(v.value_bool));
 		return gb_fnv32a(&v.value_bool, gb_size_of(v.value_bool));
 	case ExactValue_String:
 	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:
 	case ExactValue_Integer:
 		{
 		{
 			u32 key = gb_fnv32a(v.value_integer.dp, gb_size_of(*v.value_integer.dp) * v.value_integer.used);
 			u32 key = gb_fnv32a(v.value_integer.dp, gb_size_of(*v.value_integer.dp) * v.value_integer.used);

+ 12 - 5
src/llvm_backend.cpp

@@ -1446,6 +1446,11 @@ gb_internal void lb_debug_info_complete_types_and_finalize(lbGenerator *gen) {
 		lbModule *m = entry.value;
 		lbModule *m = entry.value;
 		if (m->debug_builder != nullptr) {
 		if (m->debug_builder != nullptr) {
 			lb_debug_complete_types(m);
 			lb_debug_complete_types(m);
+		}
+	}
+	for (auto const &entry : gen->modules) {
+		lbModule *m = entry.value;
+		if (m->debug_builder != nullptr) {
 			LLVMDIBuilderFinalize(m->debug_builder);
 			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);
 			array_add(&gen->output_object_paths, filepath_obj);
 
 
 			String short_name = remove_directory_from_path(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);
 			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));
 			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"));
 		lbValue runner = lb_find_package_value(m, str_lit("testing"), str_lit("runner"));
 
 
-		auto args = array_make<lbValue>(heap_allocator(), 1);
+		auto args = array_make<lbValue>(permanent_allocator(), 1);
 		args[0] = lb_addr_load(p, all_tests_slice);
 		args[0] = lb_addr_load(p, all_tests_slice);
 		lb_emit_call(p, runner, args);
 		lb_emit_call(p, runner, args);
 	} else {
 	} else {
@@ -2028,7 +2033,9 @@ gb_internal bool lb_generate_code(lbGenerator *gen) {
 				lb_set_llvm_metadata(m, f, res);
 				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));
 			// producer = gb_string_append_fmt(producer, " version %.*s", LIT(ODIN_VERSION));
 			// #ifdef NIGHTLY
 			// #ifdef NIGHTLY
 			// producer = gb_string_appendc(producer, "-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);
 			// producer = gb_string_append_fmt(producer, "-%s", GIT_SHA);
 			// #endif
 			// #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;
 			LLVMBool is_optimized = build_context.optimization_level > 0;
 			AstFile *init_file = m->info->init_package->files[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");
 	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");
 	TIME_SECTION("LLVM Module Pass");
 	lb_llvm_module_passes(gen, do_threading);
 	lb_llvm_module_passes(gen, do_threading);

+ 6 - 7
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);
 	unsigned const word_bits = cast(unsigned)(8*build_context.word_size);
 
 
 	for_array(debug_incomplete_type_index, m->debug_incomplete_types) {
 	for_array(debug_incomplete_type_index, m->debug_incomplete_types) {
+		TEMPORARY_ALLOCATOR_GUARD();
+
 		auto const &idt = m->debug_incomplete_types[debug_incomplete_type_index];
 		auto const &idt = m->debug_incomplete_types[debug_incomplete_type_index];
 		GB_ASSERT(idt.type != nullptr);
 		GB_ASSERT(idt.type != nullptr);
 		GB_ASSERT(idt.metadata != 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;
 	String name = e->token.string;
 	if (e->pkg && e->pkg->name.len > 0) {
 	if (e->pkg && e->pkg->name.len > 0) {
 		// NOTE(bill): C++ NONSENSE FOR DEBUG SHITE!
 		// 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;
 		if (did_allocate_) *did_allocate_ = true;
 	}
 	}
 	return name;
 	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) {
 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);
 	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);
 	add_debug_info_global_variable_expr(m, name, dtype, expr);
 	if ((e->pkg && e->pkg->kind == Package_Init) ||
 	if ((e->pkg && e->pkg->kind == Package_Init) ||