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

Reply via email to