diff options
author | Dimitry Andric <dimitry@andric.com> | 2021-11-28 18:09:06 +0100 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2022-01-05 10:21:56 -0800 |
commit | d31f8cc6884ba3cc3e088fd57c4c533868e8a8b2 (patch) | |
tree | af378e65604537b879d8eabf66e335a357855318 | |
parent | 67b5bc26bde81a60688ae5c049a001ffbc6dd614 (diff) | |
download | llvm-d31f8cc6884ba3cc3e088fd57c4c533868e8a8b2.zip llvm-d31f8cc6884ba3cc3e088fd57c4c533868e8a8b2.tar.gz llvm-d31f8cc6884ba3cc3e088fd57c4c533868e8a8b2.tar.bz2 |
[AArch64] Avoid crashing on invalid -Wa,-march= values
As reported in https://bugs.freebsd.org/260078, the gnutls Makefiles
pass -Wa,-march=all to compile a number of assembly files. Clang does
not support this -march value, but because of a mistake in handling
the arguments, an unitialized Arg pointer is dereferenced, which can
cause a segfault.
Work around this by adding a check if the local WaMArch variable is
initialized, and if so, using its value in the diagnostic message.
Reviewed By: tschuett
Differential Revision: https://reviews.llvm.org/D114677
(cherry picked from commit df08b2fe8b35cb63dfb3b49738a3494b9b4e6f8e)
-rw-r--r-- | clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 15 | ||||
-rw-r--r-- | clang/test/Driver/aarch64-target-as-march.s | 9 |
2 files changed, 20 insertions, 4 deletions
diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index ed8c7e9..0e354a4 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -191,7 +191,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, bool success = true; // Enable NEON by default. Features.push_back("+neon"); - llvm::StringRef WaMArch = ""; + llvm::StringRef WaMArch; if (ForAS) for (const auto *A : Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) @@ -201,7 +201,7 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, // Call getAArch64ArchFeaturesFromMarch only if "-Wa,-march=" or // "-Xassembler -march" is detected. Otherwise it may return false // and causes Clang to error out. - if (WaMArch.size()) + if (!WaMArch.empty()) success = getAArch64ArchFeaturesFromMarch(D, WaMArch, Args, Features); else if ((A = Args.getLastArg(options::OPT_march_EQ))) success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features); @@ -222,8 +222,15 @@ void aarch64::getAArch64TargetFeatures(const Driver &D, success = getAArch64MicroArchFeaturesFromMcpu( D, getAArch64TargetCPU(Args, Triple, A), Args, Features); - if (!success) - D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); + if (!success) { + auto Diag = D.Diag(diag::err_drv_clang_unsupported); + // If "-Wa,-march=" is used, 'WaMArch' will contain the argument's value, + // while 'A' is uninitialized. Only dereference 'A' in the other case. + if (!WaMArch.empty()) + Diag << "-march=" + WaMArch.str(); + else + Diag << A->getAsString(Args); + } if (Args.getLastArg(options::OPT_mgeneral_regs_only)) { Features.push_back("-fp-armv8"); diff --git a/clang/test/Driver/aarch64-target-as-march.s b/clang/test/Driver/aarch64-target-as-march.s index a9301ad..03c3e39 100644 --- a/clang/test/Driver/aarch64-target-as-march.s +++ b/clang/test/Driver/aarch64-target-as-march.s @@ -44,3 +44,12 @@ // TARGET-FEATURE-3-NOT: "-target-feature" "+v8.4a" // TARGET-FEATURE-4: "-target-feature" "+v8.4a" // TARGET-FEATURE-4-NOT: "-target-feature" "+v8.3a" + +// Invalid -march settings +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=all %s 2>&1 | \ +// RUN: FileCheck --check-prefix=INVALID-ARCH-1 %s +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=foobar %s 2>&1 | \ +// RUN: FileCheck --check-prefix=INVALID-ARCH-2 %s + +// INVALID-ARCH-1: error: the clang compiler does not support '-march=all' +// INVALID-ARCH-2: error: the clang compiler does not support '-march=foobar' |