[llvm] 77e170d - [ARM][Driver][Windows] Allow command-line upgrade to Armv8.

Simon Tatham via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 21 03:20:20 PDT 2021


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
   {


        


More information about the llvm-commits mailing list