mirror of https://github.com/microsoft/clang.git
This patch aims to match the changes introduced
in gcc by https://gcc.gnu.org/ml/gcc-cvs/2018-04/msg00534.html. The -mibt feature flag is being removed, and the -fcf-protection option now also defines a CET macro and causes errors when used on non-X86 targets, while X86 targets no longer check for -mibt and -mshstk to determine if -fcf-protection is supported. -mshstk is now used only to determine availability of shadow stack intrinsics. Comes with an LLVM patch (D46882). Patch by mike.dvoretsky Differential Revision: https://reviews.llvm.org/D46881 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@332704 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9d9b33c898
commit
4fb03d7680
|
@ -2486,8 +2486,6 @@ X86
|
|||
|
||||
.. option:: -mgfni, -mno-gfni
|
||||
|
||||
.. option:: -mibt, -mno-ibt
|
||||
|
||||
.. option:: -mlwp, -mno-lwp
|
||||
|
||||
.. option:: -mlzcnt, -mno-lzcnt
|
||||
|
|
|
@ -206,6 +206,8 @@ def err_opt_not_valid_with_opt : Error<
|
|||
"option '%0' cannot be specified with '%1'">;
|
||||
def err_opt_not_valid_without_opt : Error<
|
||||
"option '%0' cannot be specified without '%1'">;
|
||||
def err_opt_not_valid_on_target : Error<
|
||||
"option '%0' cannot be specified on this target">;
|
||||
|
||||
// Source manager
|
||||
def err_cannot_open_file : Error<"cannot open file '%0': %1">, DefaultFatal;
|
||||
|
|
|
@ -1075,15 +1075,11 @@ public:
|
|||
|
||||
/// Check if the target supports CFProtection branch.
|
||||
virtual bool
|
||||
checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const {
|
||||
return false;
|
||||
}
|
||||
checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const;
|
||||
|
||||
/// Check if the target supports CFProtection branch.
|
||||
virtual bool
|
||||
checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const {
|
||||
return false;
|
||||
}
|
||||
checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const;
|
||||
|
||||
/// Whether target allows to overalign ABI-specified preferred alignment
|
||||
virtual bool allowsLargerPreferedTypeAlignment() const { return true; }
|
||||
|
|
|
@ -2747,8 +2747,6 @@ def mxsaves : Flag<["-"], "mxsaves">, Group<m_x86_Features_Group>;
|
|||
def mno_xsaves : Flag<["-"], "mno-xsaves">, Group<m_x86_Features_Group>;
|
||||
def mshstk : Flag<["-"], "mshstk">, Group<m_x86_Features_Group>;
|
||||
def mno_shstk : Flag<["-"], "mno-shstk">, Group<m_x86_Features_Group>;
|
||||
def mibt : Flag<["-"], "mibt">, Group<m_x86_Features_Group>;
|
||||
def mno_ibt : Flag<["-"], "mno-ibt">, Group<m_x86_Features_Group>;
|
||||
def mretpoline : Flag<["-"], "mretpoline">, Group<m_x86_Features_Group>;
|
||||
def mno_retpoline : Flag<["-"], "mno-retpoline">, Group<m_x86_Features_Group>;
|
||||
def mretpoline_external_thunk : Flag<["-"], "mretpoline-external-thunk">, Group<m_x86_Features_Group>;
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include "clang/Basic/TargetInfo.h"
|
||||
#include "clang/Basic/AddressSpaces.h"
|
||||
#include "clang/Basic/CharInfo.h"
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/LangOptions.h"
|
||||
#include "llvm/ADT/APFloat.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
|
@ -115,6 +116,18 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) {
|
|||
// Out of line virtual dtor for TargetInfo.
|
||||
TargetInfo::~TargetInfo() {}
|
||||
|
||||
bool
|
||||
TargetInfo::checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const {
|
||||
Diags.Report(diag::err_opt_not_valid_on_target) << "cf-protection=branch";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
TargetInfo::checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const {
|
||||
Diags.Report(diag::err_opt_not_valid_on_target) << "cf-protection=return";
|
||||
return false;
|
||||
}
|
||||
|
||||
/// getTypeName - Return the user string for the specified integer type enum.
|
||||
/// For example, SignedShort -> "short".
|
||||
const char *TargetInfo::getTypeName(IntType T) {
|
||||
|
|
|
@ -102,26 +102,6 @@ bool X86TargetInfo::setFPMath(StringRef Name) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool X86TargetInfo::checkCFProtectionReturnSupported(
|
||||
DiagnosticsEngine &Diags) const {
|
||||
if (HasSHSTK)
|
||||
return true;
|
||||
|
||||
Diags.Report(diag::err_opt_not_valid_without_opt) << "cf-protection=return"
|
||||
<< "-mshstk";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool X86TargetInfo::checkCFProtectionBranchSupported(
|
||||
DiagnosticsEngine &Diags) const {
|
||||
if (HasIBT)
|
||||
return true;
|
||||
|
||||
Diags.Report(diag::err_opt_not_valid_without_opt) << "cf-protection=branch"
|
||||
<< "-mibt";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool X86TargetInfo::initFeatureMap(
|
||||
llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
|
||||
const std::vector<std::string> &FeaturesVec) const {
|
||||
|
@ -781,8 +761,6 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
|
|||
HasMPX = true;
|
||||
} else if (Feature == "+shstk") {
|
||||
HasSHSTK = true;
|
||||
} else if (Feature == "+ibt") {
|
||||
HasIBT = true;
|
||||
} else if (Feature == "+movbe") {
|
||||
HasMOVBE = true;
|
||||
} else if (Feature == "+sgx") {
|
||||
|
@ -1175,8 +1153,6 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
|
|||
Builder.defineMacro("__MPX__");
|
||||
if (HasSHSTK)
|
||||
Builder.defineMacro("__SHSTK__");
|
||||
if (HasIBT)
|
||||
Builder.defineMacro("__IBT__");
|
||||
if (HasSGX)
|
||||
Builder.defineMacro("__SGX__");
|
||||
if (HasPREFETCHWT1)
|
||||
|
@ -1394,7 +1370,6 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const {
|
|||
.Case("fsgsbase", HasFSGSBASE)
|
||||
.Case("fxsr", HasFXSR)
|
||||
.Case("gfni", HasGFNI)
|
||||
.Case("ibt", HasIBT)
|
||||
.Case("lwp", HasLWP)
|
||||
.Case("lzcnt", HasLZCNT)
|
||||
.Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
|
||||
|
|
|
@ -81,7 +81,6 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {
|
|||
bool HasSHA = false;
|
||||
bool HasMPX = false;
|
||||
bool HasSHSTK = false;
|
||||
bool HasIBT = false;
|
||||
bool HasSGX = false;
|
||||
bool HasCX16 = false;
|
||||
bool HasFXSR = false;
|
||||
|
@ -171,10 +170,15 @@ public:
|
|||
bool validateInputSize(StringRef Constraint, unsigned Size) const override;
|
||||
|
||||
virtual bool
|
||||
checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const override;
|
||||
checkCFProtectionReturnSupported(DiagnosticsEngine &Diags) const override {
|
||||
return true;
|
||||
};
|
||||
|
||||
virtual bool
|
||||
checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const override;
|
||||
checkCFProtectionBranchSupported(DiagnosticsEngine &Diags) const override {
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
|
||||
|
||||
|
|
|
@ -2829,6 +2829,17 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
|
|||
}
|
||||
}
|
||||
|
||||
// Add the __CET__ macro if a CFProtection option is set.
|
||||
if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
|
||||
StringRef Name = A->getValue();
|
||||
if (Name == "branch")
|
||||
Opts.addMacroDef("__CET__=1");
|
||||
else if (Name == "return")
|
||||
Opts.addMacroDef("__CET__=2");
|
||||
else if (Name == "full")
|
||||
Opts.addMacroDef("__CET__=3");
|
||||
}
|
||||
|
||||
// Add macros from the command line.
|
||||
for (const auto *A : Args.filtered(OPT_D, OPT_U)) {
|
||||
if (A->getOption().matches(OPT_D))
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -emit-llvm -fcf-protection=branch -target-feature +ibt -triple i386-linux-gnu -o %t %s
|
||||
// RUN: %clang_cc1 -emit-llvm -fcf-protection=branch -triple i386-linux-gnu -o %t %s
|
||||
// RUN: FileCheck --input-file=%t %s
|
||||
|
||||
// CHECK: @t5 = weak global i32 2
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: %clang_cc1 -DUSE_64 -triple x86_64-unknown-unknown -target-feature +fxsr -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -target-feature +mwaitx -target-feature +clzero -target-feature +ibt -target-feature +shstk -target-feature +wbnoinvd -target-feature +cldemote -emit-llvm -o %t %s
|
||||
// RUN: %clang_cc1 -DUSE_ALL -triple x86_64-unknown-unknown -target-feature +fxsr -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -target-feature +mwaitx -target-feature +ibt -target-feature +shstk -target-feature +clzero -target-feature +wbnoinvd -target-feature +cldemote -fsyntax-only -o %t %s
|
||||
// RUN: %clang_cc1 -DUSE_64 -triple x86_64-unknown-unknown -target-feature +fxsr -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -target-feature +mwaitx -target-feature +clzero -target-feature +shstk -target-feature +wbnoinvd -target-feature +cldemote -emit-llvm -o %t %s
|
||||
// RUN: %clang_cc1 -DUSE_ALL -triple x86_64-unknown-unknown -target-feature +fxsr -target-feature +avx -target-feature +xsaveopt -target-feature +xsaves -target-feature +xsavec -target-feature +mwaitx -target-feature +shstk -target-feature +clzero -target-feature +wbnoinvd -target-feature +cldemote -fsyntax-only -o %t %s
|
||||
|
||||
#ifdef USE_ALL
|
||||
#define USE_3DNOW
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
// RUN: not %clang_cc1 -fsyntax-only -S -o %t -triple i386-unknown-unknown -fcf-protection=return %s 2>&1 | FileCheck %s --check-prefix=RETURN
|
||||
// RUN: not %clang_cc1 -fsyntax-only -S -o %t -triple i386-unknown-unknown -fcf-protection=branch %s 2>&1 | FileCheck %s --check-prefix=BRANCH
|
||||
// RUN: %clang -target i386-unknown-unknown -x c -E -dM -o - -fcf-protection=return %s | FileCheck %s --check-prefix=RETURN
|
||||
// RUN: %clang -target i386-unknown-unknown -x c -E -dM -o - -fcf-protection=branch %s | FileCheck %s --check-prefix=BRANCH
|
||||
// RUN: %clang -target i386-unknown-unknown -x c -E -dM -o - -fcf-protection=full %s | FileCheck %s --check-prefix=FULL
|
||||
|
||||
// RETURN: error: option 'cf-protection=return' cannot be specified without '-mshstk'
|
||||
// BRANCH: error: option 'cf-protection=branch' cannot be specified without '-mibt'
|
||||
// RETURN: #define __CET__ 2
|
||||
// BRANCH: #define __CET__ 1
|
||||
// FULL: #define __CET__ 3
|
||||
void foo() {}
|
||||
|
|
|
@ -80,11 +80,6 @@
|
|||
// CETSS: "-target-feature" "+shstk"
|
||||
// NO-CETSS: "-target-feature" "-shstk"
|
||||
|
||||
// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mibt %s -### -o %t.o 2>&1 | FileCheck -check-prefix=CETIBT %s
|
||||
// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mno-ibt %s -### -o %t.o 2>&1 | FileCheck -check-prefix=NO-CETIBT %s
|
||||
// CETIBT: "-target-feature" "+ibt"
|
||||
// NO-CETIBT: "-target-feature" "-ibt"
|
||||
|
||||
// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -msgx %s -### -o %t.o 2>&1 | FileCheck -check-prefix=SGX %s
|
||||
// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mno-sgx %s -### -o %t.o 2>&1 | FileCheck -check-prefix=NO-SGX %s
|
||||
// SGX: "-target-feature" "+sgx"
|
||||
|
|
|
@ -380,10 +380,6 @@
|
|||
|
||||
// SHSTK: #define __SHSTK__ 1
|
||||
|
||||
// RUN: %clang -target i386-unknown-unknown -mibt -x c -E -dM -o - %s | FileCheck -match-full-lines --check-prefix=IBT %s
|
||||
|
||||
// IBT: #define __IBT__ 1
|
||||
|
||||
// RUN: %clang -target i386-unknown-unknown -march=atom -mrdseed -x c -E -dM -o - %s | FileCheck -match-full-lines --check-prefix=RDSEED %s
|
||||
|
||||
// RDSEED: #define __RDSEED__ 1
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -verify -fcf-protection=branch -target-feature +ibt -fsyntax-only %s
|
||||
// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -verify -fcf-protection=branch -fsyntax-only %s
|
||||
|
||||
// Function pointer definition.
|
||||
typedef void (*FuncPointerWithNoCfCheck)(void) __attribute__((nocf_check)); // no-warning
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -triple=i386-unknown-unknown -verify -fcf-protection=branch -target-feature +ibt -std=c++11 -fsyntax-only %s
|
||||
// RUN: %clang_cc1 -triple=i386-unknown-unknown -verify -fcf-protection=branch -std=c++11 -fsyntax-only %s
|
||||
|
||||
// Function pointer definition.
|
||||
[[gnu::nocf_check]] typedef void (*FuncPointerWithNoCfCheck)(void); // no-warning
|
||||
|
|
Loading…
Reference in New Issue