Compiler projects using llvm
/// These tests make sure that options passed to the assembler
/// via -Wa or -Xassembler are applied correctly to assembler inputs.
/// Also we check that the same priority rules apply to compiler and
/// assembler options.
///
/// Note that the cortex-a8 is armv7-a, the cortex-a32 is armv8-a
/// and clang's default Arm architecture is armv4t.

/// Basic correctness check for how the options behave when passed to the compiler
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv7-a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv7-a+crc %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,EXT-CRC %s

/// -Wa/-Xassembler doesn't apply to non assembly files
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-march=armv7-a \
// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TRIPLE-ARMV4 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -march=armv7-a \
// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TRIPLE-ARMV4 %s

/// -Wa/-Xassembler does apply to assembler input
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-march=armv7-a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-march=armv7-a+crc %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,EXT-CRC %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -march=armv7-a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -march=armv7-a+crc %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,EXT-CRC %s

/// Check that arch name is still canonicalised
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-march=armv7a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -march=armv7 %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s

/// march to compiler and assembler, we choose the one suited to the input file type
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv8-a -Wa,-march=armv7a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv7-a -Wa,-march=armv8-a \
// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TRIPLE-ARMV7 %s

/// mcpu to compiler and march to assembler, we use the assembler's architecture for assembly files.
/// We use the target CPU for both.
// RUN: %clang -target arm-linux-gnueabi -### -c -mcpu=cortex-a8 -Wa,-march=armv8a %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV8,CPU-A8 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -mcpu=cortex-a8 -Wa,-march=armv8-a \
// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s

/// march to compiler and mcpu to assembler, we use the one that matches the file type
/// (again both get the target-cpu option either way)
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv8a -Wa,-mcpu=cortex-a8 %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv8a -Wa,-mcpu=cortex-a8 \
// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefix=TRIPLE-ARMV8 %s

/// march and mcpu to the compiler, mcpu wins
// RUN: %clang -target arm-linux-gnueabi -### -c -mcpu=cortex-a8 -march=armv8-a %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s
/// not dependent on order
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv8-a -mcpu=cortex-a8 %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s
/// or file type
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv8a -mcpu=cortex-a8 \
// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s

/// If we pass mcpu and march to the assembler then mcpu's arch wins
/// (matches the compiler behaviour)
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-mcpu=cortex-a8 -Wa,-march=armv8-a %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-mcpu=cortex-a8,-march=armv8-a %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -march=armv8-a -Xassembler -mcpu=cortex-a8 \
// RUN: %s 2>&1 | FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s

/// Last mcpu to assembler wins
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-mcpu=cortex-a32,-mcpu=cortex-a8 %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-mcpu=cortex-a32 -Wa,-mcpu=cortex-a8 %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 --check-prefix=CPU-A8 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -mcpu=cortex-a32 -Xassembler -mcpu=cortex-a8 \
// RUN: %s 2>&1 | FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s

/// Last mcpu to compiler wins
// RUN: %clang -target arm-linux-gnueabi -### -c -mcpu=cortex-a32 -mcpu=cortex-a8 %s 2>&1 | \
// RUN: FileCheck --check-prefixes=TRIPLE-ARMV7,CPU-A8 %s

/// Last march to assembler wins
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-march=armv8-a,-march=armv7-a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Wa,-march=armv8-a -Wa,-march=armv7-a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s
// RUN: %clang -target arm-linux-gnueabi -### -c -Xassembler -march=armv8-a -Xassembler -march=armv7-a \
// RUN: %s 2>&1 | FileCheck --check-prefix=TRIPLE-ARMV7 %s

/// Last march to compiler wins
// RUN: %clang -target arm-linux-gnueabi -### -c -march=armv8-a -march=armv7-a %s 2>&1 | \
// RUN: FileCheck --check-prefix=TRIPLE-ARMV7 %s

// TRIPLE-ARMV4: "-triple" "armv4t-unknown-linux-gnueabi"
// TRIPLE-ARMV7: "-triple" "armv7-unknown-linux-gnueabi"
// TRIPLE-ARMV8: "-triple" "armv8-unknown-linux-gnueabi"
// CPU-A8: "-target-cpu" "cortex-a8"
// EXT-CRC: "-target-feature" "+crc"