llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-backend-arm Author: Austin (Zhenhang1213) <details> <summary>Changes</summary> This adds a new value auto to the possible values of the existing -mtp= clang option which controls how the thread pointer is found. auto means the same as soft if the target architecture doesn't support a hardware thread pointer at all; otherwise it means the same as cp15. This behavior is the default in gcc version 7.3.0 and later. The new auto option is therefore also the default in clang, so this change aligns clang with gcc. --- Full diff: https://github.com/llvm/llvm-project/pull/128901.diff 4 Files Affected: - (modified) clang/include/clang/Driver/Options.td (+1-1) - (modified) clang/lib/Driver/ToolChains/Arch/ARM.cpp (+5-1) - (modified) clang/lib/Driver/ToolChains/Arch/ARM.h (+1) - (modified) clang/test/Driver/arm-thread-pointer.c (+5-1) ``````````diff diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index e521cbf678d93..2bd6076bea5d4 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4711,7 +4711,7 @@ def mexecute_only : Flag<["-"], "mexecute-only">, Group<m_arm_Features_Group>, def mno_execute_only : Flag<["-"], "mno-execute-only">, Group<m_arm_Features_Group>, HelpText<"Allow generation of data access to code sections (ARM only)">; let Flags = [TargetSpecific] in { -def mtp_mode_EQ : Joined<["-"], "mtp=">, Group<m_arm_Features_Group>, Values<"soft,cp15,tpidrurw,tpidruro,tpidrprw,el0,el1,el2,el3,tpidr_el0,tpidr_el1,tpidr_el2,tpidr_el3,tpidrro_el0">, +def mtp_mode_EQ : Joined<["-"], "mtp=">, Group<m_arm_Features_Group>, Values<"soft,cp15,tpidrurw,tpidruro,tpidrprw,el0,el1,el2,el3,tpidr_el0,tpidr_el1,tpidr_el2,tpidr_el3,tpidrro_el0,auto">, HelpText<"Thread pointer access method. " "For AArch32: 'soft' uses a function call, or 'tpidrurw', 'tpidruro' or 'tpidrprw' use the three CP15 registers. 'cp15' is an alias for 'tpidruro'. " "For AArch64: 'tpidr_el0', 'tpidr_el1', 'tpidr_el2', 'tpidr_el3' or 'tpidrro_el0' use the five system registers. 'elN' is an alias for 'tpidr_elN'.">; diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp index 3aee540d501be..ec0be8f9dc587 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -223,6 +223,7 @@ arm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args, .Case("tpidruro", ReadTPMode::TPIDRURO) .Case("tpidrprw", ReadTPMode::TPIDRPRW) .Case("soft", ReadTPMode::Soft) + .Case("auto", ReadTPMode::Auto) .Default(ReadTPMode::Invalid); if ((ThreadPointer == ReadTPMode::TPIDRURW || ThreadPointer == ReadTPMode::TPIDRURO || @@ -239,7 +240,7 @@ arm::ReadTPMode arm::getReadTPMode(const Driver &D, const ArgList &Args, D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); return ReadTPMode::Invalid; } - return ReadTPMode::Soft; + return ReadTPMode::Auto; } void arm::setArchNameInTriple(const Driver &D, const ArgList &Args, @@ -580,6 +581,9 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver &D, Features.push_back("+read-tp-tpidruro"); if (getReadTPMode(D, Args, Triple, ForAS) == ReadTPMode::TPIDRPRW) Features.push_back("+read-tp-tpidrprw"); + if (getReadTPMode(D, Args, Triple, ForAS) == ReadTPMode::Auto && + isHardTPSupported(Triple) && !ForAS) + Features.push_back("+read-tp-tpidruro"); const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ); const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ); diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.h b/clang/lib/Driver/ToolChains/Arch/ARM.h index a23a8793a89e2..622383cf0025d 100644 --- a/clang/lib/Driver/ToolChains/Arch/ARM.h +++ b/clang/lib/Driver/ToolChains/Arch/ARM.h @@ -41,6 +41,7 @@ enum class ReadTPMode { TPIDRURW, TPIDRURO, TPIDRPRW, + Auto, }; enum class FloatABI { diff --git a/clang/test/Driver/arm-thread-pointer.c b/clang/test/Driver/arm-thread-pointer.c index 5521e1865b276..985c5046f6d26 100644 --- a/clang/test/Driver/arm-thread-pointer.c +++ b/clang/test/Driver/arm-thread-pointer.c @@ -42,4 +42,8 @@ // RUN: %clang --target=armv7-linux -### -S %s 2>&1 | \ // RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_NON %s -// ARMv7_THREAD_POINTER_NON-NOT: "-target-feature" "+read-tp-tpidruro" +// ARMv7_THREAD_POINTER_NON: "-target-feature" "+read-tp-tpidruro" + +// RUN: %clang --target=armv7-linux -mtp=auto -### -S %s 2>&1 | \ +// RUN: FileCheck -check-prefix=ARMv7_THREAD_POINTER_Auto %s +// ARMv7_THREAD_POINTER_Auto: "-target-feature" "+read-tp-tpidruro" `````````` </details> https://github.com/llvm/llvm-project/pull/128901 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits