Skip to content

Commit

Permalink
Reland "[AArch64] handle -Wa,-march="
Browse files Browse the repository at this point in the history
This reverts commit fd11a26, which was
reverted by 9145a3d due to a test
failure on aarch64 backend, e.g.
https://lab.llvm.org/buildbot/#/builders/43/builds/7031. This patch
fixed the test failure.

Reviewed By: DavidSpickett, nickdesaulniers

Differential Revision: https://reviews.llvm.org/D103184
  • Loading branch information
jcai19 committed Jun 23, 2021
1 parent 7a38a75 commit 0eac975
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 4 deletions.
17 changes: 15 additions & 2 deletions clang/lib/Driver/ToolChains/Arch/AArch64.cpp
Expand Up @@ -185,12 +185,25 @@ 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)))
llvm::StringRef WaMArch = "";
if (ForAS)
for (const auto *A :
Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler))
for (StringRef Value : A->getValues())
if (Value.startswith("-march="))
WaMArch = Value.substr(7);
// 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())
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);
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Driver/ToolChains/Arch/AArch64.h
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Driver/ToolChains/Clang.cpp
Expand Up @@ -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:
Expand Down
46 changes: 46 additions & 0 deletions 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"

0 comments on commit 0eac975

Please sign in to comment.