summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2020-08-09 15:55:49 +0000
committerpatrick <patrick@openbsd.org>2020-08-09 15:55:49 +0000
commit30215e59641831a8d178a9975d6a345d0ec9e4da (patch)
tree6c035abe86ae1893eb2c6dc8a9c6138de63ba787
parentImport LLVM 10.0.1 including clang, lld and lldb. (diff)
downloadwireguard-openbsd-30215e59641831a8d178a9975d6a345d0ec9e4da.tar.xz
wireguard-openbsd-30215e59641831a8d178a9975d6a345d0ec9e4da.zip
Merge LLVM 10.0.1.
-rw-r--r--gnu/llvm/clang/lib/Driver/ToolChains/Arch/X86.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/gnu/llvm/clang/lib/Driver/ToolChains/Arch/X86.cpp b/gnu/llvm/clang/lib/Driver/ToolChains/Arch/X86.cpp
index bebcd87aad6..2dc4ec30f37 100644
--- a/gnu/llvm/clang/lib/Driver/ToolChains/Arch/X86.cpp
+++ b/gnu/llvm/clang/lib/Driver/ToolChains/Arch/X86.cpp
@@ -146,10 +146,12 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
// flags). This is a bit hacky but keeps existing usages working. We should
// consider deprecating this and instead warn if the user requests external
// retpoline thunks and *doesn't* request some form of retpolines.
+ auto SpectreOpt = clang::driver::options::ID::OPT_INVALID;
if (Triple.isOSOpenBSD() && Triple.getArch() == llvm::Triple::x86_64 &&
Args.hasFlag(options::OPT_mretpoline, options::OPT_mno_retpoline, true)) {
Features.push_back("+retpoline-indirect-calls");
Features.push_back("+retpoline-indirect-branches");
+ SpectreOpt = options::OPT_mretpoline;
} else
if (Args.hasArgNoClaim(options::OPT_mretpoline, options::OPT_mno_retpoline,
options::OPT_mspeculative_load_hardening,
@@ -158,12 +160,14 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
false)) {
Features.push_back("+retpoline-indirect-calls");
Features.push_back("+retpoline-indirect-branches");
+ SpectreOpt = options::OPT_mretpoline;
} else if (Args.hasFlag(options::OPT_mspeculative_load_hardening,
options::OPT_mno_speculative_load_hardening,
false)) {
// On x86, speculative load hardening relies on at least using retpolines
// for indirect calls.
Features.push_back("+retpoline-indirect-calls");
+ SpectreOpt = options::OPT_mspeculative_load_hardening;
}
} else if (Args.hasFlag(options::OPT_mretpoline_external_thunk,
options::OPT_mno_retpoline_external_thunk, false)) {
@@ -171,6 +175,26 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
// eventually switch to an error here.
Features.push_back("+retpoline-indirect-calls");
Features.push_back("+retpoline-indirect-branches");
+ SpectreOpt = options::OPT_mretpoline_external_thunk;
+ }
+
+ auto LVIOpt = clang::driver::options::ID::OPT_INVALID;
+ if (Args.hasFlag(options::OPT_mlvi_hardening, options::OPT_mno_lvi_hardening,
+ false)) {
+ Features.push_back("+lvi-load-hardening");
+ Features.push_back("+lvi-cfi"); // load hardening implies CFI protection
+ LVIOpt = options::OPT_mlvi_hardening;
+ } else if (Args.hasFlag(options::OPT_mlvi_cfi, options::OPT_mno_lvi_cfi,
+ false)) {
+ Features.push_back("+lvi-cfi");
+ LVIOpt = options::OPT_mlvi_cfi;
+ }
+
+ if (SpectreOpt != clang::driver::options::ID::OPT_INVALID &&
+ LVIOpt != clang::driver::options::ID::OPT_INVALID) {
+ D.Diag(diag::err_drv_argument_not_allowed_with)
+ << D.getOpts().getOptionName(SpectreOpt)
+ << D.getOpts().getOptionName(LVIOpt);
}
// Now add any that the user explicitly requested on the command line,