diff options
| author | gingerBill <bill@gingerbill.org> | 2021-05-03 19:39:36 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-05-03 19:39:36 +0100 |
| commit | dfe1dedeb1f948bebd6121e3cc31fcd4562ab0cd (patch) | |
| tree | e5b6467beb36526075e58dfb60c22697cf9d8133 /src/llvm_backend.cpp | |
| parent | d027a5f1a470233a0307bcf3c7c4fe0b6494cd87 (diff) | |
Experimental support for `-use-separate-modules`
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 9649af6c9..2acbbcff8 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2721,6 +2721,7 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool ignore_body) if (ignore_body) { p->body = nullptr; + LLVMSetLinkage(p->value, LLVMExternalLinkage); } @@ -5762,7 +5763,7 @@ lbValue lb_find_value_from_entity(lbModule *m, Entity *e) { lbValue g = {}; g.value = LLVMAddGlobal(m->mod, lb_type(m, e->type), alloc_cstring(permanent_allocator(), name)); g.type = alloc_type_pointer(e->type); - LLVMSetExternallyInitialized(g.value, true); + LLVMSetLinkage(g.value, LLVMExternalLinkage); lb_add_entity(m, e, g); lb_add_member(m, name, g); @@ -11179,15 +11180,19 @@ lbValue lb_find_ident(lbProcedure *p, lbModule *m, Entity *e, Ast *expr) { return lb_addr_load(p, lb_build_addr(p, expr)); } + if (e->kind == Entity_Procedure) { + return lb_find_procedure_value_from_entity(m, e); + } if (USE_SEPARTE_MODULES) { lbModule *other_module = lb_pkg_module(m->gen, e->pkg); if (other_module != m) { + String name = lb_get_entity_name(other_module, e); lbValue g = {}; g.value = LLVMAddGlobal(m->mod, lb_type(m, e->type), alloc_cstring(permanent_allocator(), name)); g.type = alloc_type_pointer(e->type); - LLVMSetExternallyInitialized(g.value, true); + LLVMSetLinkage(g.value, LLVMExternalLinkage); lb_add_entity(m, e, g); lb_add_member(m, name, g); @@ -12995,13 +13000,15 @@ lbAddr lb_build_addr(lbProcedure *p, Ast *expr) { void lb_init_module(lbModule *m, Checker *c) { m->info = &c->info; - gbString module_name = nullptr; + gbString module_name = gb_string_make(heap_allocator(), "odin_package-"); if (m->pkg) { - module_name = gb_string_make(heap_allocator(), "odin_package-"); module_name = gb_string_append_length(module_name, m->pkg->name.text, m->pkg->name.len); + } else if (USE_SEPARTE_MODULES) { + module_name = gb_string_appendc(module_name, "builtin"); + } else { + module_name = "odin_package"; } - m->ctx = LLVMContextCreate(); m->mod = LLVMModuleCreateWithNameInContext(module_name ? module_name : "odin_package", m->ctx); // m->debug_builder = nullptr; @@ -13089,6 +13096,7 @@ bool lb_init_generator(lbGenerator *gen, Checker *c) { } gbAllocator ha = heap_allocator(); array_init(&gen->output_object_paths, ha); + array_init(&gen->output_temp_paths, ha); gen->output_base = path_to_full_path(ha, gen->output_base); @@ -14110,8 +14118,20 @@ lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *startup_runtime) lb_fill_slice(p, args, argv, argc); } + { + auto args = array_make<lbValue>(permanent_allocator(), 1); + args[0] = lb_const_string(p->module, str_lit("Here0\n")); + lb_emit_runtime_call(p, "print_string", args); + } + LLVMBuildCall2(p->builder, LLVMGetElementType(lb_type(m, startup_runtime->type)), startup_runtime->value, nullptr, 0, ""); + { + auto args = array_make<lbValue>(permanent_allocator(), 1); + args[0] = lb_const_string(p->module, str_lit("Here1\n")); + lb_emit_runtime_call(p, "print_string", args); + } + if (build_context.command_kind == Command_test) { Type *t_Internal_Test = find_type_in_pkg(m->info, str_lit("testing"), str_lit("Internal_Test")); Type *array_type = alloc_type_array(t_Internal_Test, m->info->testing_procedures.count); @@ -14189,6 +14209,8 @@ String lb_filepath_ll_for_module(lbModule *m) { String path = m->gen->output_base; if (m->pkg) { path = concatenate3_strings(permanent_allocator(), path, STR_LIT("-"), m->pkg->name); + } else if (USE_SEPARTE_MODULES) { + path = concatenate_strings(permanent_allocator(), path, STR_LIT("-builtin")); } path = concatenate_strings(permanent_allocator(), path, STR_LIT(".ll")); @@ -14522,6 +14544,7 @@ void lb_generate_code(lbGenerator *gen) { LLVMSetThreadLocalMode(g.value, mode); } if (is_foreign) { + LLVMSetLinkage(g.value, LLVMExternalLinkage); LLVMSetExternallyInitialized(g.value, true); lb_add_foreign_library_path(m, e->Variable.foreign_library); } else { @@ -14840,12 +14863,20 @@ void lb_generate_code(lbGenerator *gen) { for_array(j, gen->modules.entries) { lbModule *m = gen->modules.entries[j].value; + + if (LLVMGetFirstFunction(m->mod) == nullptr && + LLVMGetFirstGlobal(m->mod) == nullptr) { + continue; + } + String filepath_ll = lb_filepath_ll_for_module(m); if (LLVMPrintModuleToFile(m->mod, cast(char const *)filepath_ll.text, &llvm_error)) { gb_printf_err("LLVM Error: %s\n", llvm_error); gb_exit(1); return; } + array_add(&gen->output_temp_paths, filepath_ll); + } if (build_context.build_mode == BuildMode_LLVM_IR) { gb_exit(0); @@ -14857,6 +14888,16 @@ void lb_generate_code(lbGenerator *gen) { for_array(j, gen->modules.entries) { lbModule *m = gen->modules.entries[j].value; + for_array(i, m->info->required_foreign_imports_through_force) { + Entity *e = m->info->required_foreign_imports_through_force[i]; + lb_add_foreign_library_path(m, e); + } + + if (LLVMGetFirstFunction(m->mod) == nullptr && + LLVMGetFirstGlobal(m->mod) == nullptr) { + continue; + } + String filepath_obj = lb_filepath_obj_for_module(m); if (LLVMTargetMachineEmitToFile(target_machine, m->mod, cast(char *)filepath_obj.text, code_gen_file_type, &llvm_error)) { @@ -14866,10 +14907,7 @@ void lb_generate_code(lbGenerator *gen) { } array_add(&gen->output_object_paths, filepath_obj); - for_array(i, m->info->required_foreign_imports_through_force) { - Entity *e = m->info->required_foreign_imports_through_force[i]; - lb_add_foreign_library_path(m, e); - } + } |