diff --git a/clang/include/clang/Basic/ObjCRuntime.h b/clang/include/clang/Basic/ObjCRuntime.h index 500b2462f0077..f05debe6fea51 100644 --- a/clang/include/clang/Basic/ObjCRuntime.h +++ b/clang/include/clang/Basic/ObjCRuntime.h @@ -100,16 +100,24 @@ class ObjCRuntime { bool isLegacyDispatchDefaultForArch(llvm::Triple::ArchType Arch) { // The GNUstep runtime uses a newer dispatch method by default from // version 1.6 onwards - if (getKind() == GNUstep && getVersion() >= VersionTuple(1, 6)) { - if (Arch == llvm::Triple::arm || - Arch == llvm::Triple::x86 || - Arch == llvm::Triple::x86_64) - return false; - } - else if ((getKind() == MacOSX) && isNonFragile() && - (getVersion() >= VersionTuple(10, 0)) && - (getVersion() < VersionTuple(10, 6))) - return Arch != llvm::Triple::x86_64; + if (getKind() == GNUstep) { + switch (Arch) { + case llvm::Triple::arm: + case llvm::Triple::x86: + case llvm::Triple::x86_64: + return !(getVersion() >= VersionTuple(1, 6)); + case llvm::Triple::aarch64: + case llvm::Triple::mips64: + return !(getVersion() >= VersionTuple(1, 9)); + case llvm::Triple::riscv64: + return !(getVersion() >= VersionTuple(2, 2)); + default: + return true; + } + } else if ((getKind() == MacOSX) && isNonFragile() && + (getVersion() >= VersionTuple(10, 0)) && + (getVersion() < VersionTuple(10, 6))) + return Arch != llvm::Triple::x86_64; // Except for deployment target of 10.5 or less, // Mac runtimes use legacy dispatch everywhere now. return true; diff --git a/clang/test/CodeGenObjC/messages.m b/clang/test/CodeGenObjC/messages.m index f93d35a8d60c1..41f9d2fbc284c 100644 --- a/clang/test/CodeGenObjC/messages.m +++ b/clang/test/CodeGenObjC/messages.m @@ -1,7 +1,8 @@ // RUN: %clang_cc1 -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-MAC // RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-MAC-NF // RUN: %clang_cc1 -fobjc-runtime=gcc -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-GNU -// RUN: %clang_cc1 -fobjc-runtime=gnustep -emit-llvm -o - %s | FileCheck %s -check-prefix CHECK-GNU-NF +// RUN: %clang_cc1 -fobjc-runtime=gnustep -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-GNU-NF +// RUN: %clang_cc1 -fobjc-runtime=gnustep-2.2 -fobjc-dispatch-method=non-legacy -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK-MAC typedef struct { int x; diff --git a/clang/test/Driver/gnustep-dispatch-method.m b/clang/test/Driver/gnustep-dispatch-method.m new file mode 100644 index 0000000000000..6cd043fb27204 --- /dev/null +++ b/clang/test/Driver/gnustep-dispatch-method.m @@ -0,0 +1,38 @@ +// DEFINE: %{triple} = +// DEFINE: %{ver} = 1.6 +// DEFINE: %{prefix} = CHECK-MSGSEND +// DEFINE: %{check} = %clang --target=%{triple} -fobjc-runtime=gnustep-%{ver} -### -c %s 2>&1 | FileCheck -check-prefix=%{prefix} %s + +// REDEFINE: %{ver} = 1.6 +// REDEFINE: %{triple} = i386-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{triple} = x86_64-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{triple} = arm-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{prefix} = CHECK-MSGLOOKUP +// REDEFINE: %{triple} = aarch64-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{triple} = mips64-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{triple} = riscv64-unknown-freebsd +// RUN: %{check} + +// REDEFINE: %{ver} = 1.9 +// REDEFINE: %{prefix} = CHECK-MSGSEND +// REDEFINE: %{triple} = aarch64-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{triple} = mips64-unknown-freebsd +// RUN: %{check} +// REDEFINE: %{prefix} = CHECK-MSGLOOKUP +// REDEFINE: %{triple} = riscv64-unknown-freebsd +// RUN: %{check} + +// REDEFINE: %{ver} = 2.2 +// REDEFINE: %{prefix} = CHECK-MSGSEND +// REDEFINE: %{triple} = riscv64-unknown-freebsd +// RUN: %{check} + + +// CHECK-MSGSEND: "-cc1"{{.*}} "-fobjc-dispatch-method=non-legacy" +// CHECK-MSGLOOKUP-NOT: "-cc1"{{.*}} "-fobjc-dispatch-method=non-legacy"