diff options
| author | gingerBill <gingerBill@users.noreply.github.com> | 2022-07-24 22:27:45 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-24 22:27:45 +0100 |
| commit | 02a8bba02e6d5a499781dcb362803533c34ab1f1 (patch) | |
| tree | 5aa0c61eed5fc1f6ed25d735641fb56246f6c806 /src/llvm_backend_opt.cpp | |
| parent | 6ea68869c934807f1ecdc411e58bdce6b64ee7e2 (diff) | |
| parent | a3afe617c218736563723fd1ab343f403bdd33f0 (diff) | |
Merge branch 'master' into fix/freebsd-syscall
Diffstat (limited to 'src/llvm_backend_opt.cpp')
| -rw-r--r-- | src/llvm_backend_opt.cpp | 78 |
1 files changed, 54 insertions, 24 deletions
diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index de925655f..6b80b21d6 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -48,12 +48,6 @@ LLVMBool lb_must_preserve_predicate_callback(LLVMValueRef value, void *user_data return LLVMIsAAllocaInst(value) != nullptr; } -void lb_add_must_preserve_predicate_pass(lbModule *m, LLVMPassManagerRef fpm, i32 optimization_level) { - if (false && optimization_level == 0 && m->debug_builder) { - // LLVMAddInternalizePassWithMustPreservePredicate(fpm, m, lb_must_preserve_predicate_callback); - } -} - #if LLVM_VERSION_MAJOR < 12 #define LLVM_ADD_CONSTANT_VALUE_PASS(fpm) LLVMAddConstantPropagationPass(fpm) @@ -61,16 +55,15 @@ void lb_add_must_preserve_predicate_pass(lbModule *m, LLVMPassManagerRef fpm, i3 #define LLVM_ADD_CONSTANT_VALUE_PASS(fpm) #endif -void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm) { - LLVMAddPromoteMemoryToRegisterPass(fpm); - LLVMAddMergedLoadStoreMotionPass(fpm); - LLVM_ADD_CONSTANT_VALUE_PASS(fpm); - LLVMAddEarlyCSEPass(fpm); - - // LLVM_ADD_CONSTANT_VALUE_PASS(fpm); - // LLVMAddMergedLoadStoreMotionPass(fpm); - // LLVMAddPromoteMemoryToRegisterPass(fpm); - // LLVMAddCFGSimplificationPass(fpm); +void lb_basic_populate_function_pass_manager(LLVMPassManagerRef fpm, i32 optimization_level) { + if (false && optimization_level == 0 && build_context.ODIN_DEBUG) { + LLVMAddMergedLoadStoreMotionPass(fpm); + } else { + LLVMAddPromoteMemoryToRegisterPass(fpm); + LLVMAddMergedLoadStoreMotionPass(fpm); + LLVM_ADD_CONSTANT_VALUE_PASS(fpm); + LLVMAddEarlyCSEPass(fpm); + } } void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool ignore_memcpy_pass, i32 optimization_level) { @@ -78,14 +71,12 @@ void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool // TODO(bill): Determine which opt definitions should exist in the first place optimization_level = gb_clamp(optimization_level, 0, 2); - lb_add_must_preserve_predicate_pass(m, fpm, optimization_level); - if (ignore_memcpy_pass) { - lb_basic_populate_function_pass_manager(fpm); + lb_basic_populate_function_pass_manager(fpm, optimization_level); return; } else if (optimization_level == 0) { LLVMAddMemCpyOptPass(fpm); - lb_basic_populate_function_pass_manager(fpm); + lb_basic_populate_function_pass_manager(fpm, optimization_level); return; } @@ -96,7 +87,7 @@ void lb_populate_function_pass_manager(lbModule *m, LLVMPassManagerRef fpm, bool LLVMPassManagerBuilderPopulateFunctionPassManager(pmb, fpm); #else LLVMAddMemCpyOptPass(fpm); - lb_basic_populate_function_pass_manager(fpm); + lb_basic_populate_function_pass_manager(fpm, optimization_level); LLVMAddSCCPPass(fpm); @@ -114,11 +105,9 @@ void lb_populate_function_pass_manager_specific(lbModule *m, LLVMPassManagerRef // TODO(bill): Determine which opt definitions should exist in the first place optimization_level = gb_clamp(optimization_level, 0, 2); - lb_add_must_preserve_predicate_pass(m, fpm, optimization_level); - if (optimization_level == 0) { LLVMAddMemCpyOptPass(fpm); - lb_basic_populate_function_pass_manager(fpm); + lb_basic_populate_function_pass_manager(fpm, optimization_level); return; } @@ -191,6 +180,9 @@ void lb_populate_module_pass_manager(LLVMTargetMachineRef target_machine, LLVMPa // 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) { + return; + } LLVMAddAlwaysInlinerPass(mpm); LLVMAddStripDeadPrototypesPass(mpm); @@ -388,6 +380,43 @@ void llvm_delete_function(LLVMValueRef func) { LLVMDeleteFunction(func); } +void lb_append_to_compiler_used(lbModule *m, LLVMValueRef func) { + LLVMValueRef global = LLVMGetNamedGlobal(m->mod, "llvm.compiler.used"); + + LLVMValueRef *constants; + int operands = 1; + + if (global != NULL) { + GB_ASSERT(LLVMIsAGlobalVariable(global)); + LLVMValueRef initializer = LLVMGetInitializer(global); + + GB_ASSERT(LLVMIsAConstantArray(initializer)); + operands = LLVMGetNumOperands(initializer) + 1; + constants = gb_alloc_array(temporary_allocator(), LLVMValueRef, operands); + + for (int i = 0; i < operands - 1; i++) { + LLVMValueRef operand = LLVMGetOperand(initializer, i); + GB_ASSERT(LLVMIsAConstant(operand)); + constants[i] = operand; + } + + LLVMDeleteGlobal(global); + } else { + constants = gb_alloc_array(temporary_allocator(), LLVMValueRef, 1); + } + + LLVMTypeRef Int8PtrTy = LLVMPointerType(LLVMInt8TypeInContext(m->ctx), 0); + LLVMTypeRef ATy = LLVMArrayType(Int8PtrTy, operands); + + constants[operands - 1] = LLVMConstBitCast(func, Int8PtrTy); + LLVMValueRef initializer = LLVMConstArray(Int8PtrTy, constants, operands); + + global = LLVMAddGlobal(m->mod, ATy, "llvm.compiler.used"); + LLVMSetLinkage(global, LLVMAppendingLinkage); + LLVMSetSection(global, "llvm.metadata"); + LLVMSetInitializer(global, initializer); +} + void lb_run_remove_unused_function_pass(lbModule *m) { isize removal_count = 0; isize pass_count = 0; @@ -423,6 +452,7 @@ void lb_run_remove_unused_function_pass(lbModule *m) { Entity *e = *found; bool is_required = (e->flags & EntityFlag_Require) == EntityFlag_Require; if (is_required) { + lb_append_to_compiler_used(m, curr_func); continue; } } |