aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-05-13 22:30:38 +0100
committergingerBill <bill@gingerbill.org>2020-05-13 22:30:38 +0100
commitde8c1165c264439eb2375b4edd0653f60230c95f (patch)
tree45d8721cf74c9f651cd277ddba895beca4811746 /src/llvm_backend.cpp
parentd51b98a8d2801706c65ee7ab4d166edfb01b7d35 (diff)
Fix procedure literal declarations at file scope with `-llvm-api`
Diffstat (limited to 'src/llvm_backend.cpp')
-rw-r--r--src/llvm_backend.cpp94
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");