diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 12 | ||||
-rw-r--r-- | clang/test/Preprocessor/init.c | 20 |
2 files changed, 28 insertions, 4 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 72f66416fbd..e4d86144afd 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/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/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c index 8486e94b3a7..8d776b3561a 100644 --- a/clang/test/Preprocessor/init.c +++ b/clang/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 // |