diff options
author | 2020-08-09 15:55:49 +0000 | |
---|---|---|
committer | 2020-08-09 15:55:49 +0000 | |
commit | 30215e59641831a8d178a9975d6a345d0ec9e4da (patch) | |
tree | 6c035abe86ae1893eb2c6dc8a9c6138de63ba787 | |
parent | Import LLVM 10.0.1 including clang, lld and lldb. (diff) | |
download | wireguard-openbsd-30215e59641831a8d178a9975d6a345d0ec9e4da.tar.xz wireguard-openbsd-30215e59641831a8d178a9975d6a345d0ec9e4da.zip |
Merge LLVM 10.0.1.
-rw-r--r-- | gnu/llvm/clang/lib/Driver/ToolChains/Arch/X86.cpp | 24 |
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, |