mirror of
https://github.com/Ed94/Odin.git
synced 2026-06-26 07:25:00 -07:00
remove misleading @(optimization_mode) values and make "none" inhibit optimizations
This commit is contained in:
@@ -1030,7 +1030,6 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) {
|
||||
|
||||
switch (e->Procedure.optimization_mode) {
|
||||
case ProcedureOptimizationMode_None:
|
||||
case ProcedureOptimizationMode_Minimal:
|
||||
if (pl->inlining == ProcInlining_inline) {
|
||||
error(e->token, "#force_inline cannot be used in conjunction with the attribute 'optimization_mode' with neither \"none\" nor \"minimal\"");
|
||||
}
|
||||
|
||||
+6
-6
@@ -3544,19 +3544,19 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
|
||||
String mode = ev.value_string;
|
||||
if (mode == "none") {
|
||||
ac->optimization_mode = ProcedureOptimizationMode_None;
|
||||
} else if (mode == "favor_size") {
|
||||
ac->optimization_mode = ProcedureOptimizationMode_FavorSize;
|
||||
} else if (mode == "minimal") {
|
||||
ac->optimization_mode = ProcedureOptimizationMode_Minimal;
|
||||
error(elem, "Invalid optimization_mode 'minimal' for '%.*s', mode has been removed due to confusion, but 'none' has the same behaviour", LIT(name));
|
||||
} else if (mode == "size") {
|
||||
ac->optimization_mode = ProcedureOptimizationMode_Size;
|
||||
error(elem, "Invalid optimization_mode 'size' for '%.*s', mode has been removed due to confusion, but 'favor_size' has the same behaviour", LIT(name));
|
||||
} else if (mode == "speed") {
|
||||
ac->optimization_mode = ProcedureOptimizationMode_Speed;
|
||||
error(elem, "Invalid optimization_mode 'speed' for '%.*s', mode has been removed due to confusion, but 'favor_size' has the same behaviour", LIT(name));
|
||||
} else {
|
||||
ERROR_BLOCK();
|
||||
error(elem, "Invalid optimization_mode for '%.*s'. Valid modes:", LIT(name));
|
||||
error_line("\tnone\n");
|
||||
error_line("\tminimal\n");
|
||||
error_line("\tsize\n");
|
||||
error_line("\tspeed\n");
|
||||
error_line("\tfavor_size\n");
|
||||
}
|
||||
} else {
|
||||
error(elem, "Expected a string for '%.*s'", LIT(name));
|
||||
|
||||
+1
-3
@@ -133,9 +133,7 @@ enum EntityConstantFlags : u32 {
|
||||
enum ProcedureOptimizationMode : u8 {
|
||||
ProcedureOptimizationMode_Default,
|
||||
ProcedureOptimizationMode_None,
|
||||
ProcedureOptimizationMode_Minimal,
|
||||
ProcedureOptimizationMode_Size,
|
||||
ProcedureOptimizationMode_Speed,
|
||||
ProcedureOptimizationMode_FavorSize,
|
||||
};
|
||||
|
||||
|
||||
|
||||
+5
-12
@@ -1486,10 +1486,6 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) {
|
||||
lb_populate_function_pass_manager(m, m->function_pass_managers[lbFunctionPassManager_default], false, build_context.optimization_level);
|
||||
lb_populate_function_pass_manager(m, m->function_pass_managers[lbFunctionPassManager_default_without_memcpy], true, build_context.optimization_level);
|
||||
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_none], -1);
|
||||
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_minimal], 0);
|
||||
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_size], 1);
|
||||
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_speed], 2);
|
||||
lb_populate_function_pass_manager_specific(m, m->function_pass_managers[lbFunctionPassManager_aggressive], 3);
|
||||
|
||||
for (i32 i = 0; i < lbFunctionPassManager_COUNT; i++) {
|
||||
LLVMFinalizeFunctionPassManager(m->function_pass_managers[i]);
|
||||
@@ -1513,15 +1509,12 @@ gb_internal WORKER_TASK_PROC(lb_llvm_function_pass_per_module) {
|
||||
if (p->entity && p->entity->kind == Entity_Procedure) {
|
||||
switch (p->entity->Procedure.optimization_mode) {
|
||||
case ProcedureOptimizationMode_None:
|
||||
case ProcedureOptimizationMode_Minimal:
|
||||
pass_manager_kind = lbFunctionPassManager_minimal;
|
||||
pass_manager_kind = lbFunctionPassManager_none;
|
||||
GB_ASSERT(lb_proc_has_attribute(p->module, p->value, "optnone"));
|
||||
GB_ASSERT(lb_proc_has_attribute(p->module, p->value, "noinline"));
|
||||
break;
|
||||
case ProcedureOptimizationMode_Size:
|
||||
pass_manager_kind = lbFunctionPassManager_size;
|
||||
lb_add_attribute_to_proc(p->module, p->value, "optsize");
|
||||
break;
|
||||
case ProcedureOptimizationMode_Speed:
|
||||
pass_manager_kind = lbFunctionPassManager_speed;
|
||||
case ProcedureOptimizationMode_FavorSize:
|
||||
GB_ASSERT(lb_proc_has_attribute(p->module, p->value, "optsize"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,11 +134,6 @@ enum lbFunctionPassManagerKind {
|
||||
lbFunctionPassManager_default,
|
||||
lbFunctionPassManager_default_without_memcpy,
|
||||
lbFunctionPassManager_none,
|
||||
lbFunctionPassManager_minimal,
|
||||
lbFunctionPassManager_size,
|
||||
lbFunctionPassManager_speed,
|
||||
lbFunctionPassManager_aggressive,
|
||||
|
||||
lbFunctionPassManager_COUNT
|
||||
};
|
||||
|
||||
|
||||
@@ -2522,6 +2522,12 @@ gb_internal void lb_add_proc_attribute_at_index(lbProcedure *p, isize index, cha
|
||||
gb_internal void lb_add_attribute_to_proc(lbModule *m, LLVMValueRef proc_value, char const *name, u64 value=0) {
|
||||
LLVMAddAttributeAtIndex(proc_value, LLVMAttributeIndex_FunctionIndex, lb_create_enum_attribute(m->ctx, name, value));
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
gb_internal void lb_add_attribute_to_proc_with_string(lbModule *m, LLVMValueRef proc_value, String const &name, String const &value) {
|
||||
LLVMAttributeRef attr = lb_create_string_attribute(m->ctx, name, value);
|
||||
LLVMAddAttributeAtIndex(proc_value, LLVMAttributeIndex_FunctionIndex, attr);
|
||||
|
||||
@@ -163,16 +163,10 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i
|
||||
|
||||
switch (entity->Procedure.optimization_mode) {
|
||||
case ProcedureOptimizationMode_None:
|
||||
break;
|
||||
case ProcedureOptimizationMode_Minimal:
|
||||
lb_add_attribute_to_proc(m, p->value, "optnone");
|
||||
lb_add_attribute_to_proc(m, p->value, "noinline");
|
||||
break;
|
||||
case ProcedureOptimizationMode_Size:
|
||||
lb_add_attribute_to_proc(m, p->value, "optsize");
|
||||
break;
|
||||
case ProcedureOptimizationMode_Speed:
|
||||
// TODO(bill): handle this correctly
|
||||
case ProcedureOptimizationMode_FavorSize:
|
||||
lb_add_attribute_to_proc(m, p->value, "optsize");
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user