Created
December 23, 2021 21:51
-
-
Save nickdesaulniers/402fd60842dafdbc89d43d4e4c3099ee to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp | |
index 4013cf230026..400b7fafd6d7 100644 | |
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp | |
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp | |
@@ -160,26 +160,44 @@ 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, bool ForAS) { | |
+ // Default to Soft. | |
+ ReadTPMode Mode = ReadTPMode::Soft; | |
+ | |
+ // -mstack-protector-guard=tls implies -mtp=cp15. | |
+ if (Arg *A = Args.getLastArg(options::OPT_mstack_protector_guard_EQ)) | |
+ if (StringRef(A->getValue()) == "tls") | |
+ Mode = ReadTPMode::Cp15; | |
+ | |
+ // -mtp= overrides previous settings. | |
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) && | |
- !ForAS) { | |
- D.Diag(diag::err_target_unsupported_tp_hard) << Triple.getArchName(); | |
- return ReadTPMode::Invalid; | |
+ ReadTPMode MTP = llvm::StringSwitch<arm::ReadTPMode>(A->getValue()) | |
+ .Case("cp15", ReadTPMode::Cp15) | |
+ .Case("soft", ReadTPMode::Soft) | |
+ .Default(ReadTPMode::Invalid); | |
+ | |
+ // Diagnose unexpected values for -mtp=. | |
+ if (MTP == ReadTPMode::Invalid) { | |
+ if (StringRef(A->getValue()).empty()) | |
+ D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); | |
+ else | |
+ D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); | |
} | |
- if (ThreadPointer != ReadTPMode::Invalid) | |
- return ThreadPointer; | |
- if (StringRef(A->getValue()).empty()) | |
- D.Diag(diag::err_drv_missing_arg_mtp) << A->getAsString(Args); | |
- else | |
- D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args); | |
- return ReadTPMode::Invalid; | |
+ | |
+ // Check if -mtp= is being used to override -mstack-protector-guard=. | |
+ if (Mode == ReadTPMode::Cp15 && MTP != Mode) { | |
+ D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args) | |
+ << "-mstack-protector-guard=tls"; | |
+ Mode = ReadTPMode::Invalid; | |
+ } else | |
+ Mode = MTP; | |
+ } | |
+ | |
+ // Diagnose if hardware TLS was requested but isn't supported by this triple. | |
+ if (Mode == ReadTPMode::Cp15 && !isHardTPSupported(Triple) && !ForAS) { | |
+ D.Diag(diag::err_target_unsupported_tp_hard) << Triple.getArchName(); | |
+ Mode = ReadTPMode::Invalid; | |
} | |
- return ReadTPMode::Soft; | |
+ return Mode; | |
} | |
void arm::setArchNameInTriple(const Driver &D, const ArgList &Args, | |
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp | |
index 2a3723975568..e75143229ad3 100644 | |
--- a/clang/lib/Driver/ToolChains/Clang.cpp | |
+++ b/clang/lib/Driver/ToolChains/Clang.cpp | |
@@ -3217,22 +3217,9 @@ static void RenderSSPOptions(const Driver &D, const ToolChain &TC, | |
return; | |
} | |
// Check whether the target subarch supports the hardware TLS register | |
- if (arm::getARMSubArchVersionNumber(EffectiveTriple) < 7 && | |
- llvm::ARM::parseArch(EffectiveTriple.getArchName()) != | |
- llvm::ARM::ArchKind::ARMV6T2) { | |
- D.Diag(diag::err_target_unsupported_tp_hard) | |
- << EffectiveTriple.getArchName(); | |
+ // then check whether the user asked for something other than -mtp=cp15. | |
+ if (arm::getReadTPMode(D, Args, EffectiveTriple, false) != arm::ReadTPMode::Cp15) | |
return; | |
- } | |
- // Check whether the user asked for something other than -mtp=cp15 | |
- if (Arg *A = Args.getLastArg(options::OPT_mtp_mode_EQ)) { | |
- StringRef Value = A->getValue(); | |
- if (Value != "cp15") { | |
- D.Diag(diag::err_drv_argument_not_allowed_with) | |
- << A->getAsString(Args) << "-mstack-protector-guard=tls"; | |
- return; | |
- } | |
- } | |
CmdArgs.push_back("-target-feature"); | |
CmdArgs.push_back("+read-tp-hard"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment