From 74ac336ef1905d487aee85536fb21a173afe2127 Mon Sep 17 00:00:00 2001 From: Mihail Moskov <28909106+corleypc@users.noreply.github.com> Date: Mon, 24 Aug 2026 12:53:05 +0300 Subject: [PATCH] fixes -o:size --- src/build_settings.cpp | 9 +++++++++ src/llvm_backend.cpp | 1 + src/llvm_backend_general.cpp | 4 ++++ src/llvm_backend_proc.cpp | 7 +++++++ 4 files changed, 21 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 453934949..714b8af8f 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -464,6 +464,15 @@ enum IntegerDivisionByZeroKind : u8 { IntegerDivisionByZero_AllBits, }; +// values of BuildContext.optimization_level; +// matches Odin_Optimization_Mode in checker.cpp +enum OptimizationLevel : i32 { + OptimizationLevel_None = -1, + OptimizationLevel_Minimal = 0, + OptimizationLevel_Size = 1, + OptimizationLevel_Speed = 2, + OptimizationLevel_Aggressive = 3, +}; // This stores the information for the specify architecture of this build struct BuildContext { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 07f118f20..e770ed90d 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2438,6 +2438,7 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) { lbFunctionPassManagerKind pass_manager_kind = lbFunctionPassManager_default; if (p->flags & lbProcedureFlag_WithoutMemcpyPass) { pass_manager_kind = lbFunctionPassManager_default_without_memcpy; + lb_remove_attribute_from_proc(p->module, p->value, "optsize"); // incompatible with optnone lb_add_attribute_to_proc(p->module, p->value, "optnone"); lb_add_attribute_to_proc(p->module, p->value, "noinline"); } else { diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 5c77e58df..17b41cfad 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -3033,6 +3033,10 @@ gb_internal void lb_add_attribute_to_proc(lbModule *m, LLVMValueRef proc_value, LLVMAddAttributeAtIndex(proc_value, LLVMAttributeIndex_FunctionIndex, lb_create_enum_attribute(m->ctx, name, value)); } +gb_internal void lb_remove_attribute_from_proc(lbModule *m, LLVMValueRef proc_value, char const *name) { + LLVMRemoveEnumAttributeAtIndex(proc_value, LLVMAttributeIndex_FunctionIndex, LLVMGetEnumAttributeKindForName(name, gb_strlen(name))); +} + gb_internal bool lb_proc_has_attribute(lbModule *m, LLVMValueRef proc_value, char const *name) { LLVMAttributeRef ref = LLVMGetEnumAttributeAtIndex(proc_value, LLVMAttributeIndex_FunctionIndex, LLVMGetEnumAttributeKindForName(name, gb_strlen(name))); return ref != nullptr; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 4c7a0fb44..42c2f8653 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -213,6 +213,13 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i case ProcedureOptimizationMode_FavorSize: lb_add_attribute_to_proc(m, p->value, "optsize"); break; + default: + // need optsize per proc for -o:size; + // (inliner, unroller, vectorizer, etc check it) + if (build_context.optimization_level == OptimizationLevel_Size) { + lb_add_attribute_to_proc(m, p->value, "optsize"); + } + break; } if (pt->Proc.enable_target_feature.len != 0) {