Browse Source

Add `-o:none` optimization mode (useful for `-debug` builds)

gingerBill 2 years ago
parent
commit
085db569f1
3 changed files with 25 additions and 14 deletions
  1. 1 1
      src/build_settings.cpp
  2. 20 12
      src/llvm_backend_opt.cpp
  3. 4 1
      src/main.cpp

+ 1 - 1
src/build_settings.cpp

@@ -1255,7 +1255,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target) {
 		gb_exit(1);
 	}
 
-	bc->optimization_level = gb_clamp(bc->optimization_level, 0, 3);
+	bc->optimization_level = gb_clamp(bc->optimization_level, -1, 2);
 
 	// ENFORCE DYNAMIC MAP CALLS
 	bc->dynamic_map_calls = true;

+ 20 - 12
src/llvm_backend_opt.cpp

@@ -55,8 +55,17 @@ gb_internal void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPas
 #define LLVM_ADD_CONSTANT_VALUE_PASS(fpm) 
 #endif
 
+gb_internal bool lb_opt_ignore(i32 optimization_level) {
+	optimization_level = gb_clamp(optimization_level, -1, 2);
+	return optimization_level == -1;
+}
+
 gb_internal void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) {
-	if (false && optimization_level == 0 && build_context.ODIN_DEBUG) {
+	if (lb_opt_ignore(optimization_level)) {
+		return;
+	}
+
+	if (false && optimization_level <= 0 && build_context.ODIN_DEBUG) {
 		LLVMAddMergedLoadStoreMotionPass(fpm);
 	} else {
 		LLVMAddPromoteMemoryToRegisterPass(fpm);
@@ -69,14 +78,14 @@ gb_internal void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm,
 }
 
 gb_internal void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) {
-	// NOTE(bill): Treat -opt:3 as if it was -opt:2
-	// TODO(bill): Determine which opt definitions should exist in the first place
-	optimization_level = gb_clamp(optimization_level, 0, 2);
+	if (lb_opt_ignore(optimization_level)) {
+		return;
+	}
 
 	if (ignore_memcpy_pass) {
 		lb_basic_populate_function_pass_manager(fpm, optimization_level);
 		return;
-	} else if (optimization_level == 0) {
+	} else if (optimization_level <= 0) {
 		LLVMAddMemCpyOptPass(fpm);
 		lb_basic_populate_function_pass_manager(fpm, optimization_level);
 		return;
@@ -103,11 +112,11 @@ gb_internal void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerR
 }
 
 gb_internal void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef fpm, i32 optimization_level) {
-	// NOTE(bill): Treat -opt:3 as if it was -opt:2
-	// TODO(bill): Determine which opt definitions should exist in the first place
-	optimization_level = gb_clamp(optimization_level, 0, 2);
+	if (lb_opt_ignore(optimization_level)) {
+		return;
+	}
 
-	if (optimization_level == 0) {
+	if (optimization_level <= 0) {
 		LLVMAddMemCpyOptPass(fpm);
 		lb_basic_populate_function_pass_manager(fpm, optimization_level);
 		return;
@@ -181,8 +190,7 @@ gb_internal void lb_populate_module_pass_manager(LLVMTargetMachineRef target_mac
 
 	// NOTE(bill): Treat -opt:3 as if it was -opt:2
 	// TODO(bill): Determine which opt definitions should exist in the first place
-	optimization_level = gb_clamp(optimization_level, 0, 2);
-	if (optimization_level == 0 && build_context.ODIN_DEBUG) {
+	if (optimization_level <= 0 && build_context.ODIN_DEBUG) {
 		return;
 	}
 
@@ -190,7 +198,7 @@ gb_internal void lb_populate_module_pass_manager(LLVMTargetMachineRef target_mac
 	LLVMAddStripDeadPrototypesPass(mpm);
 	LLVMAddAnalysisPasses(target_machine, mpm);
 	LLVMAddPruneEHPass(mpm);
-	if (optimization_level == 0) {
+	if (optimization_level <= 0) {
 		return;
 	}
 

+ 4 - 1
src/main.cpp

@@ -1002,7 +1002,9 @@ gb_internal bool parse_build_flags(Array<String> args) {
 						}
 						case BuildFlag_OptimizationMode: {
 							GB_ASSERT(value.kind == ExactValue_String);
-							if (value.value_string == "minimal") {
+							if (value.value_string == "none") {
+								build_context.optimization_level = -1;
+							} else if (value.value_string == "minimal") {
 								build_context.optimization_level = 0;
 							} else if (value.value_string == "size") {
 								build_context.optimization_level = 1;
@@ -1014,6 +1016,7 @@ gb_internal bool parse_build_flags(Array<String> args) {
 								gb_printf_err("\tminimal\n");
 								gb_printf_err("\tsize\n");
 								gb_printf_err("\tspeed\n");
+								gb_printf_err("\tnone (useful for -debug builds)\n");
 								bad_flags = true;
 							}
 							break;