aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-07-24 12:01:23 +0100
committergingerBill <bill@gingerbill.org>2023-07-24 12:01:23 +0100
commitb09cdc0f256bca71ffcb5960c75127e8aaa55b87 (patch)
treed578e7ac78aebbc572e2c97cbe1174425295e1d8 /src
parentbd81c6f5b4bbcdb0c65cda5bedf1f3c5e0c0371e (diff)
Hook up Tilde to the linker code
Diffstat (limited to 'src')
-rw-r--r--src/linker.cpp33
-rw-r--r--src/llvm_backend_general.cpp36
-rw-r--r--src/main.cpp18
-rw-r--r--src/tilde.cpp11
-rw-r--r--src/tilde.hpp1
5 files changed, 55 insertions, 44 deletions
diff --git a/src/linker.cpp b/src/linker.cpp
index dc6e072d1..c0fbf596f 100644
--- a/src/linker.cpp
+++ b/src/linker.cpp
@@ -11,6 +11,39 @@ struct LinkerData {
gb_internal i32 system_exec_command_line_app(char const *name, char const *fmt, ...);
+gb_internal void linker_data_init(LinkerData *ld, CheckerInfo *info, String const &init_fullpath) {
+ gbAllocator ha = heap_allocator();
+ array_init(&ld->output_object_paths, ha);
+ array_init(&ld->output_temp_paths, ha);
+ array_init(&ld->foreign_libraries, ha, 0, 1024);
+ ptr_set_init(&ld->foreign_libraries_set, 1024);
+
+ if (build_context.out_filepath.len == 0) {
+ ld->output_name = remove_directory_from_path(init_fullpath);
+ ld->output_name = remove_extension_from_path(ld->output_name);
+ ld->output_name = string_trim_whitespace(ld->output_name);
+ if (ld->output_name.len == 0) {
+ ld->output_name = info->init_scope->pkg->name;
+ }
+ ld->output_base = ld->output_name;
+ } else {
+ ld->output_name = build_context.out_filepath;
+ ld->output_name = string_trim_whitespace(ld->output_name);
+ if (ld->output_name.len == 0) {
+ ld->output_name = info->init_scope->pkg->name;
+ }
+ isize pos = string_extension_position(ld->output_name);
+ if (pos < 0) {
+ ld->output_base = ld->output_name;
+ } else {
+ ld->output_base = substring(ld->output_name, 0, pos);
+ }
+ }
+
+ ld->output_base = path_to_full_path(ha, ld->output_base);
+
+}
+
gb_internal i32 linker_stage(LinkerData *gen) {
i32 result = 0;
Timings *timings = &global_timings;
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index ad8a1816a..f9c6de77d 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -103,37 +103,7 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) {
}
String init_fullpath = c->parser->init_fullpath;
-
- if (build_context.out_filepath.len == 0) {
- gen->output_name = remove_directory_from_path(init_fullpath);
- gen->output_name = remove_extension_from_path(gen->output_name);
- gen->output_name = string_trim_whitespace(gen->output_name);
- if (gen->output_name.len == 0) {
- gen->output_name = c->info.init_scope->pkg->name;
- }
- gen->output_base = gen->output_name;
- } else {
- gen->output_name = build_context.out_filepath;
- gen->output_name = string_trim_whitespace(gen->output_name);
- if (gen->output_name.len == 0) {
- gen->output_name = c->info.init_scope->pkg->name;
- }
- isize pos = string_extension_position(gen->output_name);
- if (pos < 0) {
- gen->output_base = gen->output_name;
- } else {
- gen->output_base = substring(gen->output_name, 0, pos);
- }
- }
- 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);
-
- gbString output_file_path = gb_string_make_length(ha, gen->output_base.text, gen->output_base.len);
- output_file_path = gb_string_appendc(output_file_path, ".obj");
- defer (gb_string_free(output_file_path));
+ linker_data_init(gen, &c->info, init_fullpath);
gen->info = &c->info;
@@ -141,10 +111,6 @@ gb_internal bool lb_init_generator(lbGenerator *gen, Checker *c) {
map_init(&gen->modules_through_ctx, gen->info->packages.count*2);
map_init(&gen->anonymous_proc_lits, 1024);
-
- array_init(&gen->foreign_libraries, heap_allocator(), 0, 1024);
- ptr_set_init(&gen->foreign_libraries_set, 1024);
-
if (USE_SEPARATE_MODULES) {
for (auto const &entry : gen->info->packages) {
AstPackage *pkg = entry.value;
diff --git a/src/main.cpp b/src/main.cpp
index 70e887b9f..9f8530b04 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2489,16 +2489,24 @@ int main(int arg_count, char const **arg_ptr) {
#if defined(GB_SYSTEM_WINDOWS)
if (build_context.tilde_backend) {
+ LinkerData linker_data = {};
MAIN_TIME_SECTION("Tilde Code Gen");
- if (!cg_generate_code(checker)) {
+ if (!cg_generate_code(checker, &linker_data)) {
return 1;
}
- if (build_context.show_timings) {
- show_timings(checker, &global_timings);
+ switch (build_context.build_mode) {
+ case BuildMode_Executable:
+ case BuildMode_DynamicLibrary:
+ i32 result = linker_stage(&linker_data);
+ if (result) {
+ if (build_context.show_timings) {
+ show_timings(checker, &global_timings);
+ }
+ return result;
+ }
+ break;
}
-
- return 0;
} else
#endif
{
diff --git a/src/tilde.cpp b/src/tilde.cpp
index ff2a540f5..2fa7ced53 100644
--- a/src/tilde.cpp
+++ b/src/tilde.cpp
@@ -717,11 +717,12 @@ gb_internal String cg_get_entity_name(cgModule *m, Entity *e) {
#include "tilde_stmt.cpp"
-gb_internal bool cg_generate_code(Checker *c) {
+gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) {
TIME_SECTION("Tilde Module Initializtion");
CheckerInfo *info = &c->info;
- gb_unused(info);
+
+ linker_data_init(linker_data, info, c->parser->init_fullpath);
global_tb_arenas = slice_make<TB_Arena *>(permanent_allocator(), global_thread_pool.threads.count);
for_array(i, global_tb_arenas) {
@@ -803,8 +804,10 @@ gb_internal bool cg_generate_code(Checker *c) {
TB_ExportBuffer export_buffer = tb_module_object_export(m->mod, debug_format);
defer (tb_export_buffer_free(export_buffer));
- char const *path = "W:/Odin/tilde_main.obj";
- GB_ASSERT(tb_export_buffer_to_file(export_buffer, path));
+ char const *filepath_obj = "W:/Odin/tilde_main.obj";
+
+ array_add(&linker_data->output_object_paths, make_string_c(filepath_obj));
+ GB_ASSERT(tb_export_buffer_to_file(export_buffer, filepath_obj));
return true;
}
diff --git a/src/tilde.hpp b/src/tilde.hpp
index 8a29d4c90..44da86c35 100644
--- a/src/tilde.hpp
+++ b/src/tilde.hpp
@@ -208,6 +208,7 @@ struct cgModule {
TB_Module * mod;
Checker * checker;
CheckerInfo *info;
+ LinkerData * linker_data;
RwMutex values_mutex;
PtrMap<Entity *, cgValue> values;