bsmith created this revision. bsmith added a reviewer: t.p.northover. bsmith added a subscriber: cfe-commits. bsmith set the repository for this revision to rL LLVM. Herald added subscribers: rengolin, aemerson.
This patch forms part of the ARMv8-M Baseline/Mainline support, adding Clang targeting for ARMv8-M Baseline/Mainline. ARMv8-M Mainline is a superset of ARMv7-M, containing all ARMv7-M instructions plus ARMv8-A semaphores and atomics and the ARMv8-M security extensions. ARMv8-M Baseline is a superset of ARMv6-M, containing all ARMv6-M instructions plus ARMv8-A semaphores and atomics, ARMv7-M exclusives, various code optimization instructions (wide branches, CBZ, hardware divide), MOVW/MOVT and the ARMv8-M security extensions. Repository: rL LLVM http://reviews.llvm.org/D15283 Files: lib/Basic/Targets.cpp lib/Driver/ToolChain.cpp lib/Driver/Tools.cpp test/Driver/arm-alignment.c test/Driver/arm-cortex-cpus.c test/Driver/arm-features.c test/Preprocessor/arm-target-features.c
Index: test/Preprocessor/arm-target-features.c =================================================================== --- test/Preprocessor/arm-target-features.c +++ test/Preprocessor/arm-target-features.c @@ -95,6 +95,43 @@ // 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__ 1 +// V8M_BASELINE: __ARM_ARCH_EXT_IDIV__ 1 +// V8M_BASELINE-NOT: __ARM_ARCH_ISA_ARM +// FIXME: ABI-85 might change __ARM_ARCH_ISA_THUMB +// V8M_BASELINE: __ARM_ARCH_ISA_THUMB 1 +// V8M_BASELINE: __ARM_ARCH_PROFILE 'B' +// 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__ 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__ 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 Index: test/Driver/arm-features.c =================================================================== --- test/Driver/arm-features.c +++ test/Driver/arm-features.c @@ -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" Index: test/Driver/arm-cortex-cpus.c =================================================================== --- test/Driver/arm-cortex-cpus.c +++ test/Driver/arm-cortex-cpus.c @@ -230,6 +230,24 @@ // RUN: %clang -target arm -march=armebv8.1-a -mbig-endian -mthumb -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V81A-THUMB %s // CHECK-BE-V81A-THUMB: "-cc1"{{.*}} "-triple" "thumbebv8.1a-{{.*}}" "-target-cpu" "generic" "-target-feature" "+v8.1a" +// 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' Index: test/Driver/arm-alignment.c =================================================================== --- test/Driver/arm-alignment.c +++ test/Driver/arm-alignment.c @@ -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 Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -547,7 +547,7 @@ static bool isARMMProfile(const llvm::Triple &Triple) { llvm::StringRef Arch = Triple.getArchName(); unsigned Profile = llvm::ARM::parseArchProfile(Arch); - return Profile == llvm::ARM::PK_M; + return Profile == llvm::ARM::PK_M || Profile == llvm::ARM::PK_B; } // Get Arch/CPU from args. @@ -890,6 +890,10 @@ // 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 { Index: lib/Driver/ToolChain.cpp =================================================================== --- lib/Driver/ToolChain.cpp +++ lib/Driver/ToolChain.cpp @@ -467,7 +467,8 @@ : tools::arm::getARMTargetCPU(MCPU, MArch, Triple); StringRef Suffix = tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); - bool IsMProfile = ARM::parseArchProfile(Suffix) == ARM::PK_M; + bool IsMProfile = ARM::parseArchProfile(Suffix) == ARM::PK_M || + ARM::parseArchProfile(Suffix) == ARM::PK_B; bool ThumbDefault = IsMProfile || (ARM::parseArchVersion(Suffix) == 7 && getTriple().isOSBinFormatMachO()); // FIXME: this is invalid for WindowsCE Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -4383,7 +4383,7 @@ (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) || (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7); // Cortex M does not support 8 byte atomics, while general Thumb2 does. - if (ArchProfile == llvm::ARM::PK_M) { + if (ArchProfile == llvm::ARM::PK_M || ArchProfile == llvm::ARM::PK_B) { MaxAtomicPromoteWidth = 32; if (ShouldUseInlineAtomic) MaxAtomicInlineWidth = 32; @@ -4404,7 +4404,8 @@ } bool supportsThumb2() const { - return CPUAttr.equals("6T2") || ArchVersion >= 7; + return CPUAttr.equals("6T2") || + (ArchVersion >= 7 && ArchProfile != llvm::ARM::PK_B); } StringRef getCPUAttr() const { @@ -4429,6 +4430,9 @@ return "8A"; case llvm::ARM::AK_ARMV8_1A: return "8_1A"; + case llvm::ARM::AK_ARMV8MBaseline: + case llvm::ARM::AK_ARMV8MMainline: + return "8M"; } } @@ -4440,6 +4444,8 @@ return "R"; case llvm::ARM::PK_M: return "M"; + case llvm::ARM::PK_B: + return "B"; default: return ""; } @@ -4718,13 +4724,16 @@ // __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' + const bool ThumbOnly = + (ArchProfile == llvm::ARM::PK_M || ArchProfile == llvm::ARM::PK_B); + if (CPUProfile.empty() || !ThumbOnly) 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()) @@ -4734,9 +4743,9 @@ // instruction set such as ARM or Thumb. Builder.defineMacro("__ARM_32BIT_STATE", "1"); - // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex) + // ACLE 6.4.2 Architectural Profile (A, R, M, B or pre-Cortex) - // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset. + // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M', 'B', 'S', or unset. if (!CPUProfile.empty()) Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'"); @@ -4844,7 +4853,7 @@ Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4"); - if (ArchVersion >= 6 && CPUAttr != "6M") { + if (ArchVersion >= 6 && CPUAttr != "6M" && ArchProfile != llvm::ARM::PK_B) { 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");
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits