diff options
| author | gingerBill <bill@gingerbill.org> | 2021-10-18 12:28:46 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-10-18 12:28:46 +0100 |
| commit | 7aac8df2f2ddb89ffa8b1d096f41d89e689a2293 (patch) | |
| tree | 1bb8f08b327bc518e008459e5817b70e78ebe2f7 | |
| parent | e98e62ec1304f6ba065870503ff6d558c85722d7 (diff) | |
Add `runtime._cleanup_runtime` internal call
| -rw-r--r-- | core/runtime/core.odin | 7 | ||||
| -rw-r--r-- | src/checker.cpp | 2 | ||||
| -rw-r--r-- | src/llvm_backend.cpp | 5 |
3 files changed, 11 insertions, 3 deletions
diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 542340e36..36a88a8b5 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -384,7 +384,12 @@ Raw_Cstring :: struct { // This is probably only useful for freestanding targets foreign { @(link_name="__$startup_runtime") - _startup_runtime :: proc "contextless" () --- + _startup_runtime :: proc() --- +} + +@(link_name="__$cleanup_runtime") +_cleanup_runtime :: proc() { + default_temp_allocator_destroy(&global_default_temp_allocator_data) } diff --git a/src/checker.cpp b/src/checker.cpp index cfe29b5ee..d3c0080de 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1967,6 +1967,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("__init_context"), str_lit("__type_info_of"), str_lit("cstring_to_string"), + str_lit("_cleanup_runtime"), // Pseudo-CRT required procedures str_lit("memset"), @@ -1993,7 +1994,6 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("gnu_h2f_ieee"), str_lit("gnu_f2h_ieee"), str_lit("extendhfsf2"), - }; for (isize i = 0; i < gb_count_of(required_runtime_entities); i++) { force_add_dependency_entity(c, c->info.runtime_package->scope, required_runtime_entities[i]); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 717768240..a72ddc646 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -879,7 +879,10 @@ lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *startup_runtime) } } - + + lbValue cleanup_runtime_value = lb_find_runtime_value(m, str_lit("_cleanup_runtime")); + lb_emit_call(p, cleanup_runtime_value, {}, ProcInlining_none, false); + if (is_dll_main) { LLVMBuildRet(p->builder, LLVMConstInt(lb_type(m, t_i32), 1, false)); |