Skip to content

Commit 34f59d7

Browse files
authored
[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.
1 parent a7a1df8 commit 34f59d7

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

clang/lib/Basic/Targets/ARM.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,13 +623,15 @@ bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
623623
LDREX = LDREX_W;
624624
break;
625625
case 7:
626+
case 8:
626627
if (ArchProfile == llvm::ARM::ProfileKind::M)
627628
LDREX = LDREX_W | LDREX_H | LDREX_B;
628629
else
629630
LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
630631
break;
631-
case 8:
632632
case 9:
633+
assert(ArchProfile != llvm::ARM::ProfileKind::M &&
634+
"No Armv9-M architectures defined");
633635
LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
634636
}
635637

clang/test/Preprocessor/arm-acle-6.4.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,37 @@
188188
// RUN: %clang --target=arm-arm-none-eabi -mcpu=cortex-m33 -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-M-DSP
189189
// RUN: %clang --target=arm-arm-none-eabi -march=armv8m.main+dsp -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-M-DSP
190190

191+
// RUN: %clang -target arm-none-linux-eabi -march=armv8m.base -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-V8M-BASE
192+
193+
// CHECK-V8M-BASE-NOT: __ARM_ARCH_ISA_ARM
194+
// CHECK-V8M-BASE-NOT: __ARM_FEATURE_DSP
195+
// CHECK-V8M-BASE-NOT: __ARM_FEATURE_SIMD32
196+
// CHECK-V8M-BASE: __ARM_ARCH 8
197+
// CHECK-V8M-BASE: __ARM_ARCH_ISA_THUMB 1
198+
// CHECK-V8M-BASE: __ARM_ARCH_PROFILE 'M'
199+
// CHECK-V8M-BASE: __ARM_FEATURE_CLZ 1
200+
// CHECK-V8M-BASE: __ARM_FEATURE_IDIV 1
201+
// CHECK-V8M-BASE: __ARM_FEATURE_LDREX 0x7
202+
// CHECK-V8M-BASE: __ARM_FEATURE_QBIT 1
203+
// CHECK-V8M-BASE: __ARM_FEATURE_SAT
204+
// CHECK-V8M-BASE-NOT: __ARM_FEATURE_UNALIGNED
205+
206+
// RUN: %clang -target arm-none-linux-eabi -march=armv8m.main -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-V8M-MAIN
207+
// RUN: %clang -target arm-none-linux-eabi -march=armv8.1m.main -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-V8M-MAIN
208+
209+
// CHECK-V8M-MAIN-NOT: __ARM_ARCH_ISA_ARM
210+
// CHECK-V8M-MAIN-NOT: __ARM_FEATURE_DSP
211+
// CHECK-V8M-MAIN-NOT: __ARM_FEATURE_SIMD32
212+
// CHECK-V8M-MAIN: __ARM_ARCH 8
213+
// CHECK-V8M-MAIN: __ARM_ARCH_ISA_THUMB 2
214+
// CHECK-V8M-MAIN: __ARM_ARCH_PROFILE 'M'
215+
// CHECK-V8M-MAIN: __ARM_FEATURE_CLZ 1
216+
// CHECK-V8M-MAIN: __ARM_FEATURE_IDIV 1
217+
// CHECK-V8M-MAIN: __ARM_FEATURE_LDREX 0x7
218+
// CHECK-V8M-MAIN: __ARM_FEATURE_QBIT 1
219+
// CHECK-V8M-MAIN: __ARM_FEATURE_SAT 1
220+
// CHECK-V8M-MAIN: __ARM_FEATURE_UNALIGNED 1
221+
191222
// CHECK-M-DSP: __ARM_FEATURE_DSP 1
192223
// CHECK-M-DSP: __ARM_FEATURE_SIMD32 1
193224

0 commit comments

Comments
 (0)