Author: Nick Desaulniers Date: 2021-12-06T11:31:23-08:00 New Revision: 73ee4e1cbd643028d63200f05199a128609aba5f
URL: https://github.com/llvm/llvm-project/commit/73ee4e1cbd643028d63200f05199a128609aba5f DIFF: https://github.com/llvm/llvm-project/commit/73ee4e1cbd643028d63200f05199a128609aba5f.diff LOG: [clang][ARM] only check -mtp=cp15 for non-asm sources This diagnostic is really to highlight lack of support for hard thread pointers in post-RA instruction scheduling for non-armv6k+ targets; something that isn't run for assembler sources. Fixes: https://github.com/ClangBuiltLinux/linux/issues/1502 Link: https://lore.kernel.org/all/814585495.6773.1636629846970@jenkins.jenkins/ Reviewed By: ardb Differential Revision: https://reviews.llvm.org/D114124 Added: Modified: clang/lib/Driver/ToolChains/Arch/ARM.cpp clang/lib/Driver/ToolChains/Arch/ARM.h clang/test/Driver/clang-translation.c Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index e03bed0a6de64..4013cf230026b 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -159,14 +159,15 @@ bool arm::isHardTPSupported(const llvm::Triple &Triple) { // Select mode for reading thread pointer (-mtp=soft/cp15). arm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args, - const llvm::Triple &Triple) { + const llvm::Triple &Triple, bool ForAS) { if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) { arm::ReadTPMode ThreadPointer = llvm::StringSwitch<arm::ReadTPMode>(A->getValue()) .Case("cp15", ReadTPMode::Cp15) .Case("soft", ReadTPMode::Soft) .Default(ReadTPMode::Invalid); - if (ThreadPointer == ReadTPMode::Cp15 && !isHardTPSupported(Triple)) { + if (ThreadPointer == ReadTPMode::Cp15 && !isHardTPSupported(Triple) && + !ForAS) { D.Diag(diag::err_target_unsupported_tp_hard) << Triple.getArchName(); return ReadTPMode::Invalid; } @@ -488,7 +489,7 @@ void arm::getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, } } - if (getReadTPMode(D, Args, Triple) == ReadTPMode::Cp15) + if (getReadTPMode(D, Args, Triple, ForAS) == ReadTPMode::Cp15) Features.push_back("+read-tp-hard"); const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.h b/clang/lib/Driver/ToolChains/Arch/ARM.h index fc5b8c87bef9d..881b63bd36b9c 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.h +++ b/clang/lib/Driver/ToolChains/Arch/ARM.h @@ -55,7 +55,7 @@ void setFloatABIInTriple(const Driver &D, const llvm::opt::ArgList &Args, llvm::Triple &triple); bool isHardTPSupported(const llvm::Triple &Triple); ReadTPMode getReadTPMode(const Driver &D, const llvm::opt::ArgList &Args, - const llvm::Triple &Triple); + const llvm::Triple &Triple, bool ForAS); void setArchNameInTriple(const Driver &D, const llvm::opt::ArgList &Args, types::ID InputType, llvm::Triple &Triple); diff --git a/clang/test/Driver/clang-translation.c b/clang/test/Driver/clang-translation.c index 32dd43b8352f9..7d24d4c9d51c2 100644 --- a/clang/test/Driver/clang-translation.c +++ b/clang/test/Driver/clang-translation.c @@ -126,6 +126,10 @@ // RUN: FileCheck -check-prefix=ARM_THREAD_POINTER-HARD %s // ARM_THREAD_POINTER-HARD: "-target-feature" "+read-tp-hard" +// RUN: %clang -target armv5t-linux -mtp=cp15 -x assembler -### %s 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv5_THREAD_POINTER_ASSEMBLER %s +// ARMv5_THREAD_POINTER_ASSEMBLER-NOT: hardware TLS register is not supported for the armv5 sub-architecture + // RUN: %clang -target armv6-linux -mthumb -mtp=cp15 -### -S %s 2>&1 | \ // RUN: FileCheck -check-prefix=THUMBv6_THREAD_POINTER_UNSUPP %s // RUN: %clang -target thumbv6-linux -mthumb -mtp=cp15 -### -S %s 2>&1 | \ _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits