Skip to content

Commit 6deb2dc

Browse files
committed
[ARM] Using cp15 while mtp =auto and arch is arm_arch6k and support thumb2
We follow GCC mtp=auto when arch is arm_arch6k and support thumb2
1 parent f900dc7 commit 6deb2dc

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

clang/lib/Driver/ToolChains/Arch/ARM.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,10 +208,17 @@ bool arm::useAAPCSForMachO(const llvm::Triple &T) {
208208
bool arm::isHardTPSupported(const llvm::Triple &Triple) {
209209
int Ver = getARMSubArchVersionNumber(Triple);
210210
llvm::ARM::ArchKind AK = llvm::ARM::parseArch(Triple.getArchName());
211-
return Triple.isARM() || AK == llvm::ARM::ArchKind::ARMV6T2 ||
212-
(Ver >= 7 && AK != llvm::ARM::ArchKind::ARMV8MBaseline);
211+
return Triple.isARM() || (Ver >= 7 && AK != llvm::ARM::ArchKind::ARMV8MBaseline);
213212
}
214213

214+
215+
// We follow GCC mtp=auto when arch is arm_arch6k and support thumb2
216+
bool arm::isHardTPAndThumb2(const llvm::Triple &Triple) {
217+
llvm::ARM::ArchKind AK = llvm::ARM::parseArch(Triple.getArchName());
218+
return Triple.isARM() && AK >= llvm::ARM::ArchKind::ARMV6K && AK != llvm::ARM::ArchKind::ARMV8MBaseline;
219+
}
220+
221+
215222
// Select mode for reading thread pointer (-mtp=soft/cp15).
216223
arm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args,
217224
const llvm::Triple &Triple, bool ForAS) {
@@ -240,7 +247,7 @@ arm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args,
240247
D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args);
241248
return ReadTPMode::Invalid;
242249
}
243-
return (isHardTPSupported(Triple) ? ReadTPMode::TPIDRURO : ReadTPMode::Soft);
250+
return (isHardTPAndThumb2(Triple) ? ReadTPMode::TPIDRURO : ReadTPMode::Soft);
244251
}
245252

246253
void arm::setArchNameInTriple(const Driver &D, const ArgList &Args,

clang/lib/Driver/ToolChains/Arch/ARM.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ FloatABI getARMFloatABI(const Driver &D, const llvm::Triple &Triple,
5757
void setFloatABIInTriple(const Driver &D, const llvm::opt::ArgList &Args,
5858
llvm::Triple &triple);
5959
bool isHardTPSupported(const llvm::Triple &Triple);
60+
bool isHardTPAndThumb2(const llvm::Triple &Triple);
6061
ReadTPMode getReadTPMode(const Driver &D, const llvm::opt::ArgList &Args,
6162
const llvm::Triple &Triple, bool ForAS);
6263
void setArchNameInTriple(const Driver &D, const llvm::opt::ArgList &Args,

clang/test/Driver/arm-thread-pointer.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,19 @@
4747
// RUN: %clang --target=armv7-linux -mtp=auto -### -S %s 2>&1 | \
4848
// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_Auto %s
4949
// ARMv7_THREAD_POINTER_Auto: "-target-feature" "+read-tp-tpidruro"
50+
51+
// RUN: %clang --target=armv5t-linux -mtp=auto -### -S %s 2>&1 | \
52+
// RUN: FileCheck -check-prefix=ARMv5t_THREAD_POINTER_Auto %s
53+
// ARMv5t_THREAD_POINTER_Auto-NOT: "-target-feature" "+read-tp-tpidruro"
54+
55+
// RUN: %clang --target=armv6k-linux -mtp=auto -### -S %s 2>&1 | \
56+
// RUN: FileCheck -check-prefix=ARMv6k_THREAD_POINTER_Auto %s
57+
// ARMv6k_THREAD_POINTER_Auto: "-target-feature" "+read-tp-tpidruro"
58+
59+
// RUN: %clang --target=armv6-linux -mtp=auto -### -S %s 2>&1 | \
60+
// RUN: FileCheck -check-prefix=ARMv6_THREAD_POINTER_Auto %s
61+
// ARMv6_THREAD_POINTER_Auto-NOT: "-target-feature" "+read-tp-tpidruro"
62+
63+
// RUN: %clang --target=armv6kz-linux -mtp=auto -### -S %s 2>&1 | \
64+
// RUN: FileCheck -check-prefix=ARMv6kz_THREAD_POINTER_Auto %s
65+
// ARMv6kz_THREAD_POINTER_Auto: "-target-feature" "+read-tp-tpidruro"

0 commit comments

Comments
 (0)