diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 72f66416fbd17444405c8f258086a6a3481ff898..e4d86144afd345dd6a9e5ece7bcdd0404e76565f 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -3973,12 +3973,12 @@ public: StringRef CPUProfile = getCPUProfile(CPU); if (!CPUProfile.empty()) Builder.defineMacro("__ARM_ARCH_PROFILE", CPUProfile); - + // Subtarget options. // FIXME: It's more complicated than this and we don't really support // interworking. - if (5 <= CPUArchVer && CPUArchVer <= 7) + if (5 <= CPUArchVer && CPUArchVer <= 8) Builder.defineMacro("__THUMB_INTERWORK__"); if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") { @@ -4000,7 +4000,11 @@ public: if (IsThumb) { Builder.defineMacro("__THUMBEL__"); Builder.defineMacro("__thumb__"); - if (CPUArch == "6T2" || CPUArchVer == 7) + // We check both CPUArchVer and ArchName because when only triple is + // specified, the default CPU is arm1136j-s. + StringRef ArchName = getTriple().getArchName(); + if (CPUArch == "6T2" || CPUArchVer >= 7 || ArchName.endswith("v6t2") || + ArchName.endswith("v7") || ArchName.endswith("v8")) Builder.defineMacro("__thumb2__"); } if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb)) @@ -4018,7 +4022,7 @@ public: if (FPU & VFP4FPU) Builder.defineMacro("__ARM_VFPV4__"); } - + // This only gets set when Neon instructions are actually available, unlike // the VFP define, hence the soft float and arch check. This is subtly // different from gcc, we follow the intent which was that it should be set diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index 8486e94b3a73c9a99c8be1eb1661f9015b681bc8..8d776b3561ad444e5b586ef14fa23580429a4f48 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -539,6 +539,26 @@ // RUN: %clang -target arm -mthumb -mhwdiv=arm -x c -E -dM %s -o - | FileCheck --check-prefix=ARMHWDIV-THUMB-FALSE %s // ARMHWDIV-THUMB-FALSE-NOT:#define __ARM_ARCH_EXT_IDIV__ +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=armv8-none-none < /dev/null | FileCheck -check-prefix ARMv8 %s +// ARMv8: #define __THUMB_INTERWORK__ 1 +// ARMv8-NOT: #define __thumb2__ + +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=thumbv8 < /dev/null | FileCheck -check-prefix Thumbv8 %s +// Thumbv8: #define __THUMB_INTERWORK__ 1 +// Thumbv8: #define __thumb2__ + +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=thumbv5 < /dev/null | FileCheck -check-prefix Thumbv5 %s +// Thumbv5: #define __THUMB_INTERWORK__ 1 +// Thumbv5-NOT: #define __thumb2__ + +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=thumbv6t2 < /dev/null | FileCheck -check-prefix Thumbv6t2 %s +// Thumbv6t2: #define __THUMB_INTERWORK__ 1 +// Thumbv6t2: #define __thumb2__ + +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=thumbv7 < /dev/null | FileCheck -check-prefix Thumbv7 %s +// Thumbv7: #define __THUMB_INTERWORK__ 1 +// Thumbv7: #define __thumb2__ + // // RUN: %clang_cc1 -E -dM -ffreestanding -triple=i386-none-none < /dev/null | FileCheck -check-prefix I386 %s //