Author: Jian Cai Date: 2021-06-07T10:15:53-07:00 New Revision: fd11a26d368c5a909fb88548fef2cee7a6c2c931
URL: https://github.com/llvm/llvm-project/commit/fd11a26d368c5a909fb88548fef2cee7a6c2c931 DIFF: https://github.com/llvm/llvm-project/commit/fd11a26d368c5a909fb88548fef2cee7a6c2c931.diff LOG: [AArch64] handle -Wa,-march= This fixed PR#48894 for AArch64. The issue has been fixed for Arm in https://reviews.llvm.org/D95872 The following rules apply to -Wa,-march with this change: - Only compiler options apply to non assembly files - Compiler and assembler options apply to assembly files - For assembly files, we prefer the assembler option(s) if we have both kinds of option - Of the options that apply (or are preferred), the last value wins (it's not additive) Reviewed By: DavidSpickett, nickdesaulniers Differential Revision: https://reviews.llvm.org/D103184 Added: clang/test/Driver/aarch64-target-as-march.s Modified: clang/lib/Driver/ToolChains/Arch/AArch64.cpp clang/lib/Driver/ToolChains/Arch/AArch64.h clang/lib/Driver/ToolChains/Clang.cpp Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index 503685ab533a0..cb98d423ed2b0 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -185,12 +185,20 @@ getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu, void aarch64::getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, - std::vector<StringRef> &Features) { + std::vector<StringRef> &Features, + bool ForAS) { Arg *A; bool success = true; // Enable NEON by default. Features.push_back("+neon"); - if ((A = Args.getLastArg(options::OPT_march_EQ))) + if (ForAS && + (A = Args.getLastArg(options::OPT_Wa_COMMA, options::OPT_Xassembler))) { + llvm::StringRef WaMArch; + for (StringRef Value : A->getValues()) + if (Value.startswith("-march=")) + WaMArch = Value.substr(7); + success = getAArch64ArchFeaturesFromMarch(D, WaMArch, Args, Features); + } else if ((A = Args.getLastArg(options::OPT_march_EQ))) success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features); else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features); diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.h b/clang/lib/Driver/ToolChains/Arch/AArch64.h index 713af870d69fb..d47c402d4a42d 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.h +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.h @@ -22,7 +22,8 @@ namespace aarch64 { void getAArch64TargetFeatures(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args, - std::vector<llvm::StringRef> &Features); + std::vector<llvm::StringRef> &Features, + bool ForAS); std::string getAArch64TargetCPU(const llvm::opt::ArgList &Args, const llvm::Triple &Triple, llvm::opt::Arg *&A); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a0e1208fd709c..6fdd7e2dd21e7 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -344,7 +344,7 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, case llvm::Triple::aarch64: case llvm::Triple::aarch64_32: case llvm::Triple::aarch64_be: - aarch64::getAArch64TargetFeatures(D, Triple, Args, Features); + aarch64::getAArch64TargetFeatures(D, Triple, Args, Features, ForAS); break; case llvm::Triple::x86: case llvm::Triple::x86_64: diff --git a/clang/test/Driver/aarch64-target-as-march.s b/clang/test/Driver/aarch64-target-as-march.s new file mode 100644 index 0000000000000..a9301ade43351 --- /dev/null +++ b/clang/test/Driver/aarch64-target-as-march.s @@ -0,0 +1,46 @@ +/// These tests make sure that options passed to the assembler +/// via -Wa or -Xassembler are applied correctly to assembler inputs. + +/// Does not apply to non assembly files +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.1-a \ +// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TARGET-FEATURE-1 %s +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Xassembler -march=armv8.1-a \ +// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TARGET-FEATURE-1 %s + +// TARGET-FEATURE-1-NOT: "-target-feature" "+v8.1a" + +/// Does apply to assembler input +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.2-a %s 2>&1 | \ +// RUN: FileCheck --check-prefix=TARGET-FEATURE-2 %s +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Xassembler -march=armv8.2-a %s 2>&1 | \ +// RUN: FileCheck --check-prefix=TARGET-FEATURE-2 %s + +// TARGET-FEATURE-2: "-target-feature" "+v8.2a" + +/// No unused argument warnings when there are multiple values +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.1-a -Wa,-march=armv8.2-a %s 2>&1 | \ +// RUN: FileCheck --check-prefix=UNUSED-WARNING %s + +// UNUSED-WARNING-NOT: warning: argument unused during compilation + +/// Last march to assembler wins +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.2-a -Wa,-march=armv8.1-a %s 2>&1 | \ +// RUN: FileCheck --check-prefix=MULTIPLE-VALUES %s +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.2-a,-march=armv8.1-a %s 2>&1 | \ +// RUN: FileCheck --check-prefix=MULTIPLE-VALUES %s +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Xassembler -march=armv8.2-a -Xassembler \ +// RUN: -march=armv8.1-a %s 2>&1 | FileCheck --check-prefix=MULTIPLE-VALUES %s + +// MULTIPLE-VALUES: "-target-feature" "+v8.1a +// MULTIPLE-VALUES-NOT: "-target-feature" "+v8.2a + +/// march to compiler and assembler, we choose the one suited to the input file type +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.3-a -march=armv8.4-a %s 2>&1 | \ +// RUN: FileCheck --check-prefix=TARGET-FEATURE-3 %s +// RUN: %clang --target=aarch64-linux-gnueabi -### -c -Wa,-march=armv8.3-a -march=armv8.4-a \ +// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TARGET-FEATURE-4 %s + +// TARGET-FEATURE-3: "-target-feature" "+v8.3a" +// TARGET-FEATURE-3-NOT: "-target-feature" "+v8.4a" +// TARGET-FEATURE-4: "-target-feature" "+v8.4a" +// TARGET-FEATURE-4-NOT: "-target-feature" "+v8.3a" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits