https://github.com/folkertdev created https://github.com/llvm/llvm-project/pull/211539
fixes https://github.com/llvm/llvm-project/issues/71001 Since https://github.com/llvm/llvm-project/pull/198148 defining a weak alias using `#pragma` works, this PR additionally adds support for the `__attribute__` form. Builds on https://github.com/llvm/llvm-project/pull/211499 which should be merged first. >From 0a6b3e71f918f046c850ff8629ad26fc46e7ae9d Mon Sep 17 00:00:00 2001 From: syhhyl <[email protected]> Date: Thu, 23 Jul 2026 16:48:53 +0800 Subject: [PATCH 1/2] [clang][test] Add Darwin pragma weak alias IR coverage --- clang/test/CodeGen/pragma-weak-darwin.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 clang/test/CodeGen/pragma-weak-darwin.c diff --git a/clang/test/CodeGen/pragma-weak-darwin.c b/clang/test/CodeGen/pragma-weak-darwin.c new file mode 100644 index 0000000000000..1ab8c96ec3066 --- /dev/null +++ b/clang/test/CodeGen/pragma-weak-darwin.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple arm64-apple-macosx -emit-llvm -o - %s | FileCheck %s + +void strong_target(void) {} + +#pragma weak weak_alias = strong_target + +void use_alias(void) { + weak_alias(); +} + +// CHECK-DAG: @weak_alias = weak alias void (), ptr @strong_target +// CHECK-LABEL: define{{.*}} void @strong_target() +// CHECK-LABEL: define{{.*}} void @use_alias() +// CHECK: call void @weak_alias() >From 7c1ba3b75f08c49dac950835385dbdfbb3d27dd2 Mon Sep 17 00:00:00 2001 From: Folkert de Vries <[email protected]> Date: Thu, 23 Jul 2026 14:47:46 +0200 Subject: [PATCH 2/2] support `__attribute__((weak, alias("...")))` on darwin --- clang/lib/Sema/SemaDeclAttr.cpp | 4 +++- clang/test/CodeGen/pragma-weak-darwin.c | 14 ------------- clang/test/CodeGen/weak-alias-darwin.c | 28 +++++++++++++++++++++++++ clang/test/Sema/attr-alias.c | 3 +++ 4 files changed, 34 insertions(+), 15 deletions(-) delete mode 100644 clang/test/CodeGen/pragma-weak-darwin.c create mode 100644 clang/test/CodeGen/weak-alias-darwin.c diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 1b272b5416860..81923ecfd39a5 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -1787,7 +1787,9 @@ static void handleAliasAttr(Sema &S, Decl *D, const ParsedAttr &AL) { if (!S.checkStringLiteralArgumentAttr(AL, 0, Str)) return; - if (S.Context.getTargetInfo().getTriple().isOSDarwin()) { + // Mach-O does not support general aliases, but it does support weak aliases. + if (S.Context.getTargetInfo().getTriple().isOSDarwin() && + !D->hasAttr<WeakAttr>()) { S.Diag(AL.getLoc(), diag::err_alias_not_supported_on_darwin); return; } diff --git a/clang/test/CodeGen/pragma-weak-darwin.c b/clang/test/CodeGen/pragma-weak-darwin.c deleted file mode 100644 index 1ab8c96ec3066..0000000000000 --- a/clang/test/CodeGen/pragma-weak-darwin.c +++ /dev/null @@ -1,14 +0,0 @@ -// RUN: %clang_cc1 -triple arm64-apple-macosx -emit-llvm -o - %s | FileCheck %s - -void strong_target(void) {} - -#pragma weak weak_alias = strong_target - -void use_alias(void) { - weak_alias(); -} - -// CHECK-DAG: @weak_alias = weak alias void (), ptr @strong_target -// CHECK-LABEL: define{{.*}} void @strong_target() -// CHECK-LABEL: define{{.*}} void @use_alias() -// CHECK: call void @weak_alias() diff --git a/clang/test/CodeGen/weak-alias-darwin.c b/clang/test/CodeGen/weak-alias-darwin.c new file mode 100644 index 0000000000000..9f10849f1d46d --- /dev/null +++ b/clang/test/CodeGen/weak-alias-darwin.c @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 -triple arm64-apple-macosx -emit-llvm -o - %s | FileCheck %s + +// Mach-O supports weak aliases: test that the alias is emitted with weak linkage, +// and that calls reference the alias, not the aliasee. Regression test for: +// +// - https://github.com/llvm/llvm-project/issues/71001 +// - https://github.com/llvm/llvm-project/issues/111321 + +// CHECK-DAG: @pragma_weak_alias = weak alias void (), ptr @strong_target +#pragma weak pragma_weak_alias = strong_target + +// CHECK-DAG: @attr_weak_alias = weak alias void (), ptr @strong_target +void attr_weak_alias(void) __attribute__((weak, alias("strong_target"))); + +// CHECK-LABEL: define{{.*}} void @strong_target() +void strong_target(void) {} + +// CHECK-LABEL: define{{.*}} void @use_alias() +void use_alias(void) { + // CHECK: call void @pragma_weak_alias() + pragma_weak_alias(); +} + +// CHECK-LABEL: define{{.*}} void @use_attr_alias() +void use_attr_alias(void) { + // CHECK: call void @attr_weak_alias() + attr_weak_alias(); +} diff --git a/clang/test/Sema/attr-alias.c b/clang/test/Sema/attr-alias.c index 05e626f7debc5..30451871cc8be 100644 --- a/clang/test/Sema/attr-alias.c +++ b/clang/test/Sema/attr-alias.c @@ -3,3 +3,6 @@ void g(void) {} void f(void) __attribute__((alias("g"))); //expected-error {{aliases are not supported on darwin}} + +// Weak aliases are supported on Darwin. +void w(void) __attribute__((weak, alias("g"))); // no-error _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
