diff options
| author | gingerBill <bill@gingerbill.org> | 2020-05-13 22:30:38 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2020-05-13 22:30:38 +0100 |
| commit | de8c1165c264439eb2375b4edd0653f60230c95f (patch) | |
| tree | 45d8721cf74c9f651cd277ddba895beca4811746 /src/llvm_backend.cpp | |
| parent | d51b98a8d2801706c65ee7ab4d166edfb01b7d35 (diff) | |
Fix procedure literal declarations at file scope with `-llvm-api`
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 94 |
1 files changed, 49 insertions, 45 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 40ba1bcd5..816d81f33 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -4406,7 +4406,7 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value) { } if (value.kind == ExactValue_Procedure) { - Ast *expr = value.value_procedure; + Ast *expr = unparen_expr(value.value_procedure); if (expr->kind == Ast_ProcLit) { return lb_generate_anonymous_proc_lit(m, str_lit("_proclit"), expr); } @@ -11532,40 +11532,8 @@ void lb_generate_code(lbGenerator *gen) { } } - TIME_SECTION("LLVM Procedure Generation"); - for_array(i, m->procedures_to_generate) { - lbProcedure *p = m->procedures_to_generate[i]; - if (p->is_done) { - continue; - } - if (p->body != nullptr) { // Build Procedure - lb_begin_procedure_body(p); - lb_build_stmt(p, p->body); - lb_end_procedure_body(p); - p->is_done = true; - } - lb_end_procedure(p); - - // Add Flags - if (p->body != nullptr) { - if (p->name == "memcpy" || p->name == "memmove" || - p->name == "runtime.mem_copy" || p->name == "mem_copy_non_overlapping" || - string_starts_with(p->name, str_lit("llvm.memcpy")) || - string_starts_with(p->name, str_lit("llvm.memmove"))) { - p->flags |= lbProcedureFlag_WithoutMemcpyPass; - } - } - if (LLVMVerifyFunction(p->value, LLVMReturnStatusAction)) { - gb_printf_err("LLVM CODE GEN FAILED FOR PROCEDURE: %.*s\n", LIT(p->name)); - LLVMDumpValue(p->value); - gb_printf_err("\n\n\n\n"); - LLVMVerifyFunction(p->value, LLVMAbortProcessAction); - } - } - - - TIME_SECTION("LLVM Function Pass"); + TIME_SECTION("LLVM Registry Initializtion"); LLVMPassRegistryRef pass_registry = LLVMGetGlobalPassRegistry(); @@ -11596,17 +11564,6 @@ void lb_generate_code(lbGenerator *gen) { // LLVMAddUnifyFunctionExitNodesPass(default_function_pass_manager_without_memcpy); } - for_array(i, m->procedures_to_generate) { - lbProcedure *p = m->procedures_to_generate[i]; - if (p->body != nullptr) { // Build Procedure - if (p->flags & lbProcedureFlag_WithoutMemcpyPass) { - LLVMRunFunctionPassManager(default_function_pass_manager_without_memcpy, p->value); - } else { - LLVMRunFunctionPassManager(default_function_pass_manager, p->value); - } - } - } - TIME_SECTION("LLVM Runtime Creation"); lbProcedure *startup_type_info = nullptr; @@ -11783,6 +11740,53 @@ void lb_generate_code(lbGenerator *gen) { LLVMRunFunctionPassManager(default_function_pass_manager, p->value); } + TIME_SECTION("LLVM Procedure Generation"); + for_array(i, m->procedures_to_generate) { + lbProcedure *p = m->procedures_to_generate[i]; + if (p->is_done) { + continue; + } + if (p->body != nullptr) { // Build Procedure + lb_begin_procedure_body(p); + lb_build_stmt(p, p->body); + lb_end_procedure_body(p); + p->is_done = true; + } + lb_end_procedure(p); + + // Add Flags + if (p->body != nullptr) { + if (p->name == "memcpy" || p->name == "memmove" || + p->name == "runtime.mem_copy" || p->name == "mem_copy_non_overlapping" || + string_starts_with(p->name, str_lit("llvm.memcpy")) || + string_starts_with(p->name, str_lit("llvm.memmove"))) { + p->flags |= lbProcedureFlag_WithoutMemcpyPass; + } + } + + if (LLVMVerifyFunction(p->value, LLVMReturnStatusAction)) { + gb_printf_err("LLVM CODE GEN FAILED FOR PROCEDURE: %.*s\n", LIT(p->name)); + LLVMDumpValue(p->value); + gb_printf_err("\n\n\n\n"); + LLVMVerifyFunction(p->value, LLVMAbortProcessAction); + } + } + + + + TIME_SECTION("LLVM Function Pass"); + + for_array(i, m->procedures_to_generate) { + lbProcedure *p = m->procedures_to_generate[i]; + if (p->body != nullptr) { // Build Procedure + if (p->flags & lbProcedureFlag_WithoutMemcpyPass) { + LLVMRunFunctionPassManager(default_function_pass_manager_without_memcpy, p->value); + } else { + LLVMRunFunctionPassManager(default_function_pass_manager, p->value); + } + } + } + TIME_SECTION("LLVM Module Pass"); |