aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2024-07-02 22:14:54 +0100
committerGitHub <noreply@github.com>2024-07-02 22:14:54 +0100
commit8b49549fd3cc7c7dc73dc79566b24c514392b4aa (patch)
tree25c343fd898de212f7bd84862c409ce7ea9952c9 /src
parent0ceae51223d58534343c3d428d611a4bd6123779 (diff)
parent5399093050f192c13ea494e69455be8e1052e06c (diff)
Merge pull request #3859 from laytan/wasm-stbtt-object-linking-preopens
wasm: support `vendor:stb/truetype` and `vendor:fontstash`
Diffstat (limited to 'src')
-rw-r--r--src/build_settings.cpp9
-rw-r--r--src/check_decl.cpp7
-rw-r--r--src/checker.cpp3
-rw-r--r--src/linker.cpp14
-rw-r--r--src/llvm_backend_utility.cpp6
-rw-r--r--src/parser.cpp3
6 files changed, 26 insertions, 16 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp
index c3b4f2506..9c93a5b69 100644
--- a/src/build_settings.cpp
+++ b/src/build_settings.cpp
@@ -860,15 +860,6 @@ gb_internal bool is_arch_x86(void) {
return false;
}
-gb_internal bool allow_check_foreign_filepath(void) {
- switch (build_context.metrics.arch) {
- case TargetArch_wasm32:
- case TargetArch_wasm64p32:
- return false;
- }
- return true;
-}
-
// TODO(bill): OS dependent versions for the BuildContext
// join_path
// is_dir
diff --git a/src/check_decl.cpp b/src/check_decl.cpp
index 883cfcba9..3c4a4b3de 100644
--- a/src/check_decl.cpp
+++ b/src/check_decl.cpp
@@ -1178,9 +1178,12 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) {
if (foreign_library->LibraryName.paths.count >= 1) {
module_name = foreign_library->LibraryName.paths[0];
}
- name = concatenate3_strings(permanent_allocator(), module_name, WASM_MODULE_NAME_SEPARATOR, name);
+
+ if (!string_ends_with(module_name, str_lit(".o"))) {
+ name = concatenate3_strings(permanent_allocator(), module_name, WASM_MODULE_NAME_SEPARATOR, name);
+ }
}
-
+
e->Procedure.is_foreign = true;
e->Procedure.link_name = name;
diff --git a/src/checker.cpp b/src/checker.cpp
index 734659510..c3d2ae5eb 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -5000,9 +5000,8 @@ gb_internal void check_foreign_import_fullpaths(Checker *c) {
String file_str = op.value.value_string;
file_str = string_trim_whitespace(file_str);
-
String fullpath = file_str;
- if (allow_check_foreign_filepath()) {
+ if (!is_arch_wasm() || string_ends_with(file_str, str_lit(".o"))) {
String foreign_path = {};
bool ok = determine_path_from_string(nullptr, decl, base_dir, file_str, &foreign_path, /*use error not syntax_error*/true);
if (ok) {
diff --git a/src/linker.cpp b/src/linker.cpp
index 371736743..34c0af7e5 100644
--- a/src/linker.cpp
+++ b/src/linker.cpp
@@ -85,6 +85,20 @@ gb_internal i32 linker_stage(LinkerData *gen) {
if (extra_linker_flags.len != 0) {
lib_str = gb_string_append_fmt(lib_str, " %.*s", LIT(extra_linker_flags));
}
+
+ for_array(i, e->LibraryName.paths) {
+ String lib = e->LibraryName.paths[i];
+
+ if (lib.len == 0) {
+ continue;
+ }
+
+ if (!string_ends_with(lib, str_lit(".o"))) {
+ continue;
+ }
+
+ inputs = gb_string_append_fmt(inputs, " \"%.*s\"", LIT(lib));
+ }
}
if (build_context.metrics.os == TargetOs_orca) {
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp
index 98ed0c57e..1165476be 100644
--- a/src/llvm_backend_utility.cpp
+++ b/src/llvm_backend_utility.cpp
@@ -2029,7 +2029,11 @@ gb_internal void lb_set_wasm_procedure_import_attributes(LLVMValueRef value, Ent
GB_ASSERT(foreign_library->LibraryName.paths.count == 1);
module_name = foreign_library->LibraryName.paths[0];
-
+
+ if (string_ends_with(module_name, str_lit(".o"))) {
+ return;
+ }
+
if (string_starts_with(import_name, module_name)) {
import_name = substring(import_name, module_name.len+WASM_MODULE_NAME_SEPARATOR.len, import_name.len);
}
diff --git a/src/parser.cpp b/src/parser.cpp
index 93889d1b2..37f9c35de 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -5824,7 +5824,6 @@ gb_internal bool determine_path_from_string(BlockingMutex *file_mutex, Ast *node
return false;
}
-
if (collection_name.len > 0) {
// NOTE(bill): `base:runtime` == `core:runtime`
if (collection_name == "core") {
@@ -5979,7 +5978,7 @@ gb_internal void parse_setup_file_decls(Parser *p, AstFile *f, String const &bas
Token fp_token = fp->BasicLit.token;
String file_str = string_trim_whitespace(string_value_from_token(f, fp_token));
String fullpath = file_str;
- if (allow_check_foreign_filepath()) {
+ if (!is_arch_wasm() || string_ends_with(fullpath, str_lit(".o"))) {
String foreign_path = {};
bool ok = determine_path_from_string(&p->file_decl_mutex, node, base_dir, file_str, &foreign_path);
if (!ok) {