diff --git a/src/check_decl.cpp b/src/check_decl.cpp index f571c7401..b74a43d62 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1485,6 +1485,11 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { e->deprecated_message = ac.deprecated_message; e->warning_message = ac.warning_message; ac.link_name = handle_link_name(ctx, e->token, ac.link_name, ac.link_prefix, ac.link_suffix); + + if (ac.link_section.len > 0) { + e->Procedure.link_section = ac.link_section; + } + if (ac.has_disabled_proc) { if (ac.disabled_proc) { e->flags |= EntityFlag_Disabled; diff --git a/src/checker.cpp b/src/checker.cpp index 1b668eff5..ca457fa21 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4179,6 +4179,17 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } } return true; + } else if (name == "link_section") { + ExactValue ev = check_decl_attribute_value(c, value); + if (ev.kind == ExactValue_String) { + ac->link_section = ev.value_string; + if (!is_foreign_name_valid(ac->link_section)) { + error(elem, "Invalid link section: %.*s", LIT(ac->link_section)); + } + } else { + error(elem, "Expected a string value for '%.*s'", LIT(name)); + } + return true; } return false; } diff --git a/src/entity.cpp b/src/entity.cpp index 1879e9d05..31f90023b 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -249,6 +249,7 @@ struct Entity { String link_name; String link_prefix; String link_suffix; + String link_section; String objc_selector_name; Entity *objc_class; DeferredProcedure deferred_procedure; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 63ca868ec..606ef9c29 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -253,6 +253,9 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_set_wasm_procedure_import_attributes(p->value, entity, p->name); } + if (entity->Procedure.link_section.len > 0) { + LLVMSetSection(p->value, alloc_cstring(permanent_allocator(), entity->Procedure.link_section)); + } // NOTE(bill): offset==0 is the return value isize offset = 1;