mirror of https://github.com/microsoft/clang.git
[ARM] Add Clang targeting for ARMv8-M Baseline/Mainline
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262619 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ce0a52503e
commit
dd4c4d4e50
|
@ -4536,7 +4536,8 @@ class ARMTargetInfo : public TargetInfo {
|
|||
}
|
||||
|
||||
bool supportsThumb2() const {
|
||||
return CPUAttr.equals("6T2") || ArchVersion >= 7;
|
||||
return CPUAttr.equals("6T2") ||
|
||||
(ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
|
||||
}
|
||||
|
||||
StringRef getCPUAttr() const {
|
||||
|
@ -4563,6 +4564,10 @@ class ARMTargetInfo : public TargetInfo {
|
|||
return "8_1A";
|
||||
case llvm::ARM::AK_ARMV8_2A:
|
||||
return "8_2A";
|
||||
case llvm::ARM::AK_ARMV8MBaseline:
|
||||
return "8M_BASE";
|
||||
case llvm::ARM::AK_ARMV8MMainline:
|
||||
return "8M_MAIN";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4852,13 +4857,14 @@ public:
|
|||
|
||||
// __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
|
||||
// is not defined for the M-profile.
|
||||
// NOTE that the deffault profile is assumed to be 'A'
|
||||
if (CPUProfile.empty() || CPUProfile != "M")
|
||||
// NOTE that the default profile is assumed to be 'A'
|
||||
if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
|
||||
Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
|
||||
|
||||
// __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
|
||||
// Thumb ISA (including v6-M). It is set to 2 if the core supports the
|
||||
// Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
|
||||
// __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
|
||||
// Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
|
||||
// core supports the Thumb-2 ISA as found in the v6T2 architecture and all
|
||||
// v7 and v8 architectures excluding v8-M Baseline.
|
||||
if (supportsThumb2())
|
||||
Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
|
||||
else if (supportsThumb())
|
||||
|
@ -4978,7 +4984,7 @@ public:
|
|||
Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
|
||||
Opts.ShortEnums ? "1" : "4");
|
||||
|
||||
if (ArchVersion >= 6 && CPUAttr != "6M") {
|
||||
if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
|
||||
|
|
|
@ -963,6 +963,10 @@ static void getARMTargetFeatures(const ToolChain &TC,
|
|||
// No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
|
||||
if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
|
||||
D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
|
||||
// v8M Baseline follows on from v6M, so doesn't support unaligned memory
|
||||
// access either.
|
||||
else if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8m_baseline)
|
||||
D.Diag(diag::err_target_unsupported_unaligned) << "v8m.base";
|
||||
} else
|
||||
Features.push_back("+strict-align");
|
||||
} else {
|
||||
|
|
|
@ -83,11 +83,13 @@
|
|||
// CHECK-ALIGNED-ARM: "-target-feature" "+strict-align"
|
||||
// CHECK-ALIGNED-AARCH64: "-target-feature" "+strict-align"
|
||||
|
||||
// Make sure that v6M cores always trigger the unsupported aligned accesses error
|
||||
// for all supported architecture triples.
|
||||
// Make sure that v6M cores and v8M Baseline always trigger the unsupported
|
||||
// aligned accesses error for all supported architecture triples.
|
||||
// RUN: not %clang -c -target thumbv6m-none-gnueabi -mcpu=cortex-m0 -munaligned-access %s 2>&1 | \
|
||||
// RUN: FileCheck --check-prefix CHECK-UNALIGN-NOT-SUPPORTED %s
|
||||
// RUN: not %clang -c -target thumb-none-gnueabi -mcpu=cortex-m0 -munaligned-access %s 2>&1 | \
|
||||
// RUN: FileCheck --check-prefix CHECK-UNALIGN-NOT-SUPPORTED %s
|
||||
// RUN: not %clang -c -target thumbv8m.base-none-gnueabi -munaligned-access %s 2>&1 | \
|
||||
// RUN: FileCheck --check-prefix CHECK-UNALIGN-NOT-SUPPORTED %s
|
||||
|
||||
// CHECK-UNALIGN-NOT-SUPPORTED: error: the v6m sub-architecture does not support unaligned accesses
|
||||
// CHECK-UNALIGN-NOT-SUPPORTED: error: the {{.*}} sub-architecture does not support unaligned accesses
|
||||
|
|
|
@ -273,6 +273,24 @@
|
|||
// CHECK-CORTEX-A53-FP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "+fullfp16"
|
||||
// CHECK-CORTEX-A53-NOFP16: "-cc1" {{.*}}"-target-cpu" "cortex-a53" {{.*}}"-target-feature" "-fullfp16"
|
||||
|
||||
// RUN: %clang -target armv8m.base %s -### -c 2>&1 | FileCheck %s --check-prefix=V8M_BASELINE
|
||||
// RUN: %clang -target arm -march=armv8-m.base %s -### -c 2>&1 | FileCheck %s --check-prefix=V8M_BASELINE
|
||||
// RUN: %clang -target arm -march=armv8m.base %s -### -c 2>&1 | FileCheck %s --check-prefix=V8M_BASELINE
|
||||
// RUN: %clang -target armv8m.base -mbig-endian %s -### -c 2>&1 | FileCheck %s --check-prefix=EBV8M_BASELINE
|
||||
// RUN: %clang -target arm -march=armv8-m.base -mbig-endian %s -### -c 2>&1 | FileCheck %s --check-prefix=EBV8M_BASELINE
|
||||
// RUN: %clang -target arm -march=armv8m.base -mbig-endian %s -### -c 2>&1 | FileCheck %s --check-prefix=EBV8M_BASELINE
|
||||
// V8M_BASELINE: "-cc1"{{.*}} "-triple" "thumbv8m.base-{{.*}} "-target-cpu" "generic"
|
||||
// EBV8M_BASELINE: "-cc1"{{.*}} "-triple" "thumbebv8m.base-{{.*}} "-target-cpu" "generic"
|
||||
|
||||
// RUN: %clang -target armv8m.main %s -### -c 2>&1 | FileCheck %s --check-prefix=V8M_MAINLINE
|
||||
// RUN: %clang -target arm -march=armv8-m.main %s -### -c 2>&1 | FileCheck %s --check-prefix=V8M_MAINLINE
|
||||
// RUN: %clang -target arm -march=armv8m.main %s -### -c 2>&1 | FileCheck %s --check-prefix=V8M_MAINLINE
|
||||
// RUN: %clang -target armv8m.main -mbig-endian %s -### -c 2>&1 | FileCheck %s --check-prefix=EBV8M_MAINLINE
|
||||
// RUN: %clang -target arm -march=armv8-m.main -mbig-endian %s -### -c 2>&1 | FileCheck %s --check-prefix=EBV8M_MAINLINE
|
||||
// RUN: %clang -target arm -march=armv8m.main -mbig-endian %s -### -c 2>&1 | FileCheck %s --check-prefix=EBV8M_MAINLINE
|
||||
// V8M_MAINLINE: "-cc1"{{.*}} "-triple" "thumbv8m.main-{{.*}} "-target-cpu" "generic"
|
||||
// EBV8M_MAINLINE: "-cc1"{{.*}} "-triple" "thumbebv8m.main-{{.*}} "-target-cpu" "generic"
|
||||
|
||||
// ================== Check that a bogus architecture gives an error
|
||||
// RUN: %clang -target arm -march=armbogusv6 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BOGUS %s
|
||||
// CHECK-BOGUS: error: {{.*}} does not support '-march=armbogusv6'
|
||||
|
|
|
@ -4,6 +4,9 @@
|
|||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic+crypto -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CRYPTO %s
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8a+crypto -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CRYPTO %s
|
||||
// CHECK-CRYPTO: "-cc1"{{.*}} "-triple" "armv8-{{.*}} "-target-cpu" "generic"{{.*}} "-target-feature" "+crypto"
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic+dsp -march=armv8m.main -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-DSP %s
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8m.main+dsp -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-DSP %s
|
||||
// CHECK-DSP: "-cc1"{{.*}} "-triple" "thumbv8m.main-{{.*}} "-target-cpu" "generic"{{.*}} "-target-feature" "+dsp"
|
||||
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic+nocrc -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRC %s
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8a+nocrc -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRC %s
|
||||
|
@ -11,3 +14,6 @@
|
|||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic+nocrypto -march=armv8a -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRYPTO %s
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8a+nocrypto -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NOCRYPTO %s
|
||||
// CHECK-NOCRYPTO: "-cc1"{{.*}} "-triple" "armv8-{{.*}} "-target-cpu" "generic"{{.*}} "-target-feature" "-crypto"
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic+nodsp -march=armv8m.main -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NODSP %s
|
||||
// RUN: %clang -target arm-none-none-eabi -mcpu=generic -march=armv8m.main+nodsp -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-NODSP %s
|
||||
// CHECK-NODSP: "-cc1"{{.*}} "-triple" "thumbv8m.main-{{.*}} "-target-cpu" "generic"{{.*}} "-target-feature" "-dsp"
|
||||
|
|
|
@ -95,6 +95,42 @@
|
|||
// THUMBV8A-EABI:#define __ARM_ARCH_EXT_IDIV__ 1
|
||||
// THUMBV8A-EABI: #define __ARM_FP 0xE
|
||||
|
||||
// RUN: %clang -target armv8m.base-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=V8M_BASELINE %s
|
||||
// V8M_BASELINE: __ARM_ARCH 8
|
||||
// V8M_BASELINE: __ARM_ARCH_8M_BASE__ 1
|
||||
// V8M_BASELINE: __ARM_ARCH_EXT_IDIV__ 1
|
||||
// V8M_BASELINE-NOT: __ARM_ARCH_ISA_ARM
|
||||
// V8M_BASELINE: __ARM_ARCH_ISA_THUMB 1
|
||||
// V8M_BASELINE: __ARM_ARCH_PROFILE 'M'
|
||||
// V8M_BASELINE-NOT: __ARM_FEATURE_CRC32
|
||||
// V8M_BASELINE-NOT: __ARM_FEATURE_DSP
|
||||
// V8M_BASELINE-NOT: __ARM_FP 0x{{.*}}
|
||||
// V8M_BASELINE-NOT: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
|
||||
|
||||
// RUN: %clang -target armv8m.main-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=V8M_MAINLINE %s
|
||||
// V8M_MAINLINE: __ARM_ARCH 8
|
||||
// V8M_MAINLINE: __ARM_ARCH_8M_MAIN__ 1
|
||||
// V8M_MAINLINE: __ARM_ARCH_EXT_IDIV__ 1
|
||||
// V8M_MAINLINE-NOT: __ARM_ARCH_ISA_ARM
|
||||
// V8M_MAINLINE: __ARM_ARCH_ISA_THUMB 2
|
||||
// V8M_MAINLINE: __ARM_ARCH_PROFILE 'M'
|
||||
// V8M_MAINLINE-NOT: __ARM_FEATURE_CRC32
|
||||
// V8M_MAINLINE-NOT: __ARM_FEATURE_DSP
|
||||
// V8M_MAINLINE: __ARM_FP 0xE
|
||||
// V8M_MAINLINE: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
|
||||
|
||||
// RUN: %clang -target arm-none-linux-gnu -march=armv8-m.main+dsp -x c -E -dM %s -o - | FileCheck --check-prefix=V8M_MAINLINE_DSP %s
|
||||
// V8M_MAINLINE_DSP: __ARM_ARCH 8
|
||||
// V8M_MAINLINE_DSP: __ARM_ARCH_8M_MAIN__ 1
|
||||
// V8M_MAINLINE_DSP: __ARM_ARCH_EXT_IDIV__ 1
|
||||
// V8M_MAINLINE_DSP-NOT: __ARM_ARCH_ISA_ARM
|
||||
// V8M_MAINLINE_DSP: __ARM_ARCH_ISA_THUMB 2
|
||||
// V8M_MAINLINE_DSP: __ARM_ARCH_PROFILE 'M'
|
||||
// V8M_MAINLINE_DSP-NOT: __ARM_FEATURE_CRC32
|
||||
// V8M_MAINLINE_DSP: __ARM_FEATURE_DSP 1
|
||||
// V8M_MAINLINE_DSP: __ARM_FP 0xE
|
||||
// V8M_MAINLINE_DSP: __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
|
||||
|
||||
// RUN: %clang -target arm-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-DEFS %s
|
||||
// CHECK-DEFS:#define __ARM_PCS 1
|
||||
// CHECK-DEFS:#define __ARM_SIZEOF_MINIMAL_ENUM 4
|
||||
|
|
Loading…
Reference in New Issue