aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-05-04 16:40:12 +0100
committergingerBill <bill@gingerbill.org>2022-05-04 16:40:12 +0100
commite4743b15b15ea5f1b2611bbc1718274ebb03bf03 (patch)
treed038cfb4a01b8cd910ed153a5a2205412c2ff8f2 /src
parent9f95d6fa6568b83072a8fbe49846390c014a00a1 (diff)
Add `@(priority_index=<int>)` for `foreign import`
Diffstat (limited to 'src')
-rw-r--r--src/checker.cpp11
-rw-r--r--src/checker.hpp1
-rw-r--r--src/entity.cpp1
-rw-r--r--src/llvm_backend.cpp7
4 files changed, 20 insertions, 0 deletions
diff --git a/src/checker.cpp b/src/checker.cpp
index 1e33c6e9d..fdd75126f 100644
--- a/src/checker.cpp
+++ b/src/checker.cpp
@@ -4414,6 +4414,14 @@ DECL_ATTRIBUTE_PROC(foreign_import_decl_attribute) {
}
ac->require_declaration = true;
return true;
+ } else if (name == "priority_index") {
+ ExactValue ev = check_decl_attribute_value(c, value);
+ if (ev.kind != ExactValue_Integer) {
+ error(elem, "Expected an integer value for '%.*s'", LIT(name));
+ } else {
+ ac->foreign_import_priority_index = exact_value_to_i64(ev);
+ }
+ return true;
}
return false;
}
@@ -4470,6 +4478,9 @@ void check_add_foreign_import_decl(CheckerContext *ctx, Ast *decl) {
mpmc_enqueue(&ctx->info->required_foreign_imports_through_force_queue, e);
add_entity_use(ctx, nullptr, e);
}
+ if (ac.foreign_import_priority_index != 0) {
+ e->LibraryName.priority_index = ac.foreign_import_priority_index;
+ }
if (has_asm_extension(fullpath)) {
if (build_context.metrics.arch != TargetArch_amd64 ||
diff --git a/src/checker.hpp b/src/checker.hpp
index 552e6aca7..1c9ffd8c7 100644
--- a/src/checker.hpp
+++ b/src/checker.hpp
@@ -118,6 +118,7 @@ struct AttributeContext {
bool init : 1;
bool set_cold : 1;
u32 optimization_mode; // ProcedureOptimizationMode
+ i64 foreign_import_priority_index;
String objc_class;
String objc_name;
diff --git a/src/entity.cpp b/src/entity.cpp
index 1f87f7af6..904a630fb 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -252,6 +252,7 @@ struct Entity {
struct {
Slice<String> paths;
String name;
+ i64 priority_index;
} LibraryName;
i32 Nil;
struct {
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 267431551..7cf588853 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -43,6 +43,13 @@ GB_COMPARE_PROC(foreign_library_cmp) {
if (x == y) {
return 0;
}
+ GB_ASSERT(x->kind == Entity_LibraryName);
+ GB_ASSERT(y->kind == Entity_LibraryName);
+
+ cmp = i64_cmp(x->LibraryName.priority_index, y->LibraryName.priority_index);
+ if (cmp) {
+ return cmp;
+ }
if (x->pkg != y->pkg) {
isize order_x = x->pkg ? x->pkg->order : 0;