Author: Simon Tatham Date: 2021-04-21T11:20:05+01:00 New Revision: 77e170db8678e582af986ffe27e12df196e4357b
URL: https://github.com/llvm/llvm-project/commit/77e170db8678e582af986ffe27e12df196e4357b DIFF: https://github.com/llvm/llvm-project/commit/77e170db8678e582af986ffe27e12df196e4357b.diff LOG: [ARM][Driver][Windows] Allow command-line upgrade to Armv8. If you gave clang the options `--target=arm-pc-windows-msvc` and `-march=armv8-a+crypto` together, the crypto extension would not be enabled in the compilation, and you'd see the following warning message suggesting that the 'armv8-a' had been ignored: clang: warning: ignoring extension 'crypto' because the 'armv7-a' architecture does not support it [-Winvalid-command-line-argument] This happens because Triple::getARMCPUForArch(), for the Win32 OS, unconditionally returns "cortex-a9" (an Armv7 CPU) regardless of MArch, which overrides the architecture setting on the command line. I don't think that the combination of Windows and AArch32 _should_ unconditionally outlaw the use of the crypto extension. MSVC itself doesn't think so: you can perfectly well compile Thumb crypto code using its AArch32-targeted compiler. All the other default CPUs in the same switch statement are conditional on a particular MArch setting; this is the only one that returns a particular CPU _regardless_ of MArch. So I've fixed this one by adding a condition, so that if you ask for an architecture *above* v7, the default of Cortex-A9 no longer overrides it. Reviewed By: mstorsjo Differential Revision: https://reviews.llvm.org/D100937 Added: clang/test/Driver/woa-crypto.c Modified: llvm/lib/Support/Triple.cpp llvm/unittests/ADT/TripleTest.cpp Removed: ################################################################################ diff --git a/clang/test/Driver/woa-crypto.c b/clang/test/Driver/woa-crypto.c new file mode 100644 index 0000000000000..5670f2417b09e --- /dev/null +++ b/clang/test/Driver/woa-crypto.c @@ -0,0 +1,6 @@ +// RUN: %clang -target arm-windows-msvc -### -S %s -O0 -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-DEFAULT +// RUN: %clang -target arm-windows-msvc -march=armv8-a+crypto -### -S %s -O0 -o /dev/null 2>&1 | FileCheck %s -check-prefix CHECK-CRYPTO + +// CHECK-DEFAULT: "-target-cpu" "cortex-a9" +// CHECK-CRYPTO: "-target-cpu" "generic" +// CHECK-CRYPTO: "-target-feature" "+crypto" diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp index 3c2182ecb09a0..88311546354b6 100644 --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp @@ -1716,7 +1716,9 @@ StringRef Triple::getARMCPUForArch(StringRef MArch) const { break; case llvm::Triple::Win32: // FIXME: this is invalid for WindowsCE - return "cortex-a9"; + if (ARM::parseArchVersion(MArch) <= 7) + return "cortex-a9"; + break; case llvm::Triple::IOS: case llvm::Triple::MacOSX: case llvm::Triple::TvOS: diff --git a/llvm/unittests/ADT/TripleTest.cpp b/llvm/unittests/ADT/TripleTest.cpp index 2e3c78aa4f640..eeba4d8895d78 100644 --- a/llvm/unittests/ADT/TripleTest.cpp +++ b/llvm/unittests/ADT/TripleTest.cpp @@ -1511,6 +1511,7 @@ TEST(TripleTest, getARMCPUForArch) { { llvm::Triple Triple("arm--win32"); EXPECT_EQ("cortex-a9", Triple.getARMCPUForArch()); + EXPECT_EQ("generic", Triple.getARMCPUForArch("armv8-a")); } // Some alternative architectures { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits