[Clang][ARM] Fix __ARM_FEATURE_LDREX on Armv8-M (#149538)

The Armv8-M architecture doesn't have the LDREXD and STREXD
instructions, for exclusive load/store of a 64-bit quantity split across
two registers. But the `__ARM_FEATURE_LDREX` macro was set to a value
that claims it does, because the case for Armv8 was missing a check for
M profile.

The Armv7 case got it right, so I've just made the two cases the same.
This commit is contained in:
Simon Tatham 2025-07-22 08:53:45 +01:00 committed by GitHub
parent a7a1df8f72
commit 34f59d7920
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 1 deletions

View File

@ -623,13 +623,15 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
LDREX = LDREX_W;
break;
case 7:
case 8:
if (ArchProfile == llvm::ARM::ProfileKind::M)
LDREX = LDREX_W | LDREX_H | LDREX_B;
else
LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
break;
case 8:
case 9:
assert(ArchProfile != llvm::ARM::ProfileKind::M &&
"No Armv9-M architectures defined");
LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
}

View File

@ -188,6 +188,37 @@
// RUN: %clang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-M-DSP
// RUN: %clang --target=arm-arm-none-eabi -march=armv8m.main+dsp -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-M-DSP
// RUN: %clang -target arm-none-linux-eabi -march=armv8m.base -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-V8M-BASE
// CHECK-V8M-BASE-NOT: __ARM_ARCH_ISA_ARM
// CHECK-V8M-BASE-NOT: __ARM_FEATURE_DSP
// CHECK-V8M-BASE-NOT: __ARM_FEATURE_SIMD32
// CHECK-V8M-BASE: __ARM_ARCH 8
// CHECK-V8M-BASE: __ARM_ARCH_ISA_THUMB 1
// CHECK-V8M-BASE: __ARM_ARCH_PROFILE 'M'
// CHECK-V8M-BASE: __ARM_FEATURE_CLZ 1
// CHECK-V8M-BASE: __ARM_FEATURE_IDIV 1
// CHECK-V8M-BASE: __ARM_FEATURE_LDREX 0x7
// CHECK-V8M-BASE: __ARM_FEATURE_QBIT 1
// CHECK-V8M-BASE: __ARM_FEATURE_SAT
// CHECK-V8M-BASE-NOT: __ARM_FEATURE_UNALIGNED
// RUN: %clang -target arm-none-linux-eabi -march=armv8m.main -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-V8M-MAIN
// RUN: %clang -target arm-none-linux-eabi -march=armv8.1m.main -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-V8M-MAIN
// CHECK-V8M-MAIN-NOT: __ARM_ARCH_ISA_ARM
// CHECK-V8M-MAIN-NOT: __ARM_FEATURE_DSP
// CHECK-V8M-MAIN-NOT: __ARM_FEATURE_SIMD32
// CHECK-V8M-MAIN: __ARM_ARCH 8
// CHECK-V8M-MAIN: __ARM_ARCH_ISA_THUMB 2
// CHECK-V8M-MAIN: __ARM_ARCH_PROFILE 'M'
// CHECK-V8M-MAIN: __ARM_FEATURE_CLZ 1
// CHECK-V8M-MAIN: __ARM_FEATURE_IDIV 1
// CHECK-V8M-MAIN: __ARM_FEATURE_LDREX 0x7
// CHECK-V8M-MAIN: __ARM_FEATURE_QBIT 1
// CHECK-V8M-MAIN: __ARM_FEATURE_SAT 1
// CHECK-V8M-MAIN: __ARM_FEATURE_UNALIGNED 1
// CHECK-M-DSP: __ARM_FEATURE_DSP 1
// CHECK-M-DSP: __ARM_FEATURE_SIMD32 1