Skip to content

Commit 3f9f8ef

Browse files
authored
ObjcRuntime.h: Add mips64, aarch64, and riscv64 to non-legacy dispatch (#76694)
This PR updates the list of architectures for which libobjc2 has fast-path objc_msgSend implementations. Related to: gnustep/libobjc2#261
1 parent c414612 commit 3f9f8ef

File tree

3 files changed

+58
-11
lines changed

3 files changed

+58
-11
lines changed

clang/include/clang/Basic/ObjCRuntime.h

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -100,16 +100,24 @@ class ObjCRuntime {
100100
bool isLegacyDispatchDefaultForArch(llvm::Triple::ArchType Arch) {
101101
// The GNUstep runtime uses a newer dispatch method by default from
102102
// version 1.6 onwards
103-
if (getKind() == GNUstep && getVersion() >= VersionTuple(1, 6)) {
104-
if (Arch == llvm::Triple::arm ||
105-
Arch == llvm::Triple::x86 ||
106-
Arch == llvm::Triple::x86_64)
107-
return false;
108-
}
109-
else if ((getKind() == MacOSX) && isNonFragile() &&
110-
(getVersion() >= VersionTuple(10, 0)) &&
111-
(getVersion() < VersionTuple(10, 6)))
112-
return Arch != llvm::Triple::x86_64;
103+
if (getKind() == GNUstep) {
104+
switch (Arch) {
105+
case llvm::Triple::arm:
106+
case llvm::Triple::x86:
107+
case llvm::Triple::x86_64:
108+
return !(getVersion() >= VersionTuple(1, 6));
109+
case llvm::Triple::aarch64:
110+
case llvm::Triple::mips64:
111+
return !(getVersion() >= VersionTuple(1, 9));
112+
case llvm::Triple::riscv64:
113+
return !(getVersion() >= VersionTuple(2, 2));
114+
default:
115+
return true;
116+
}
117+
} else if ((getKind() == MacOSX) && isNonFragile() &&
118+
(getVersion() >= VersionTuple(10, 0)) &&
119+
(getVersion() < VersionTuple(10, 6)))
120+
return Arch != llvm::Triple::x86_64;
113121
// Except for deployment target of 10.5 or less,
114122
// Mac runtimes use legacy dispatch everywhere now.
115123
return true;

clang/test/CodeGenObjC/messages.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
// RUN: %clang_cc1 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-MAC
22
// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-MAC-NF
33
// RUN: %clang_cc1 -fobjc-runtime=gcc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-GNU
4-
// RUN: %clang_cc1 -fobjc-runtime=gnustep -emit-llvm -o - %s | FileCheck %s -check-prefix CHECK-GNU-NF
4+
// RUN: %clang_cc1 -fobjc-runtime=gnustep -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-GNU-NF
5+
// RUN: %clang_cc1 -fobjc-runtime=gnustep-2.2 -fobjc-dispatch-method=non-legacy -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-MAC
56

67
typedef struct {
78
int x;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// DEFINE: %{triple} =
2+
// DEFINE: %{ver} = 1.6
3+
// DEFINE: %{prefix} = CHECK-MSGSEND
4+
// DEFINE: %{check} = %clang --target=%{triple} -fobjc-runtime=gnustep-%{ver} -### -c %s 2>&1 | FileCheck -check-prefix=%{prefix} %s
5+
6+
// REDEFINE: %{ver} = 1.6
7+
// REDEFINE: %{triple} = i386-unknown-freebsd
8+
// RUN: %{check}
9+
// REDEFINE: %{triple} = x86_64-unknown-freebsd
10+
// RUN: %{check}
11+
// REDEFINE: %{triple} = arm-unknown-freebsd
12+
// RUN: %{check}
13+
// REDEFINE: %{prefix} = CHECK-MSGLOOKUP
14+
// REDEFINE: %{triple} = aarch64-unknown-freebsd
15+
// RUN: %{check}
16+
// REDEFINE: %{triple} = mips64-unknown-freebsd
17+
// RUN: %{check}
18+
// REDEFINE: %{triple} = riscv64-unknown-freebsd
19+
// RUN: %{check}
20+
21+
// REDEFINE: %{ver} = 1.9
22+
// REDEFINE: %{prefix} = CHECK-MSGSEND
23+
// REDEFINE: %{triple} = aarch64-unknown-freebsd
24+
// RUN: %{check}
25+
// REDEFINE: %{triple} = mips64-unknown-freebsd
26+
// RUN: %{check}
27+
// REDEFINE: %{prefix} = CHECK-MSGLOOKUP
28+
// REDEFINE: %{triple} = riscv64-unknown-freebsd
29+
// RUN: %{check}
30+
31+
// REDEFINE: %{ver} = 2.2
32+
// REDEFINE: %{prefix} = CHECK-MSGSEND
33+
// REDEFINE: %{triple} = riscv64-unknown-freebsd
34+
// RUN: %{check}
35+
36+
37+
// CHECK-MSGSEND: "-cc1"{{.*}} "-fobjc-dispatch-method=non-legacy"
38+
// CHECK-MSGLOOKUP-NOT: "-cc1"{{.*}} "-fobjc-dispatch-method=non-legacy"

0 commit comments

Comments
 (0)