Skip to content

Instantly share code, notes, and snippets.

@nickdesaulniers
Created December 23, 2021 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nickdesaulniers/402fd60842dafdbc89d43d4e4c3099ee to your computer and use it in GitHub Desktop.
Save nickdesaulniers/402fd60842dafdbc89d43d4e4c3099ee to your computer and use it in GitHub Desktop.
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