forked from OSchip/llvm-project
[AArch64] Add clang command line support for -mharden-sls=
The accepted options to -mharden-sls= are: * all: enable all mitigations against Straight Line Speculation that are implemented. * none: disable all mitigations against Straight Line Speculation. * retbr: enable the mitigation against Straight Line Speculation for RET and BR instructions. * blr: enable the mitigation against Straight Line Speculation for BLR instructions. Differential Revision: https://reviews.llvm.org/D81404
This commit is contained in:
parent
7f0d7f3263
commit
c113b59ef5
|
@ -334,6 +334,8 @@ def warn_drv_object_size_disabled_O0 : Warning<
|
||||||
InGroup<InvalidCommandLineArgument>, DefaultWarnNoWerror;
|
InGroup<InvalidCommandLineArgument>, DefaultWarnNoWerror;
|
||||||
def err_invalid_branch_protection: Error <
|
def err_invalid_branch_protection: Error <
|
||||||
"invalid branch protection option '%0' in '%1'">;
|
"invalid branch protection option '%0' in '%1'">;
|
||||||
|
def err_invalid_sls_hardening : Error<
|
||||||
|
"invalid sls hardening option '%0' in '%1'">;
|
||||||
|
|
||||||
def note_drv_command_failed_diag_msg : Note<
|
def note_drv_command_failed_diag_msg : Note<
|
||||||
"diagnostic msg: %0">;
|
"diagnostic msg: %0">;
|
||||||
|
|
|
@ -2313,6 +2313,9 @@ def msign_return_address_EQ : Joined<["-"], "msign-return-address=">,
|
||||||
def mbranch_protection_EQ : Joined<["-"], "mbranch-protection=">,
|
def mbranch_protection_EQ : Joined<["-"], "mbranch-protection=">,
|
||||||
HelpText<"Enforce targets of indirect branches and function returns">;
|
HelpText<"Enforce targets of indirect branches and function returns">;
|
||||||
|
|
||||||
|
def mharden_sls_EQ : Joined<["-"], "mharden-sls=">,
|
||||||
|
HelpText<"Select straight-line speculation hardening scope">;
|
||||||
|
|
||||||
def msimd128 : Flag<["-"], "msimd128">, Group<m_wasm_Features_Group>;
|
def msimd128 : Flag<["-"], "msimd128">, Group<m_wasm_Features_Group>;
|
||||||
def munimplemented_simd128 : Flag<["-"], "munimplemented-simd128">, Group<m_wasm_Features_Group>;
|
def munimplemented_simd128 : Flag<["-"], "munimplemented-simd128">, Group<m_wasm_Features_Group>;
|
||||||
def mno_unimplemented_simd128 : Flag<["-"], "mno-unimplemented-simd128">, Group<m_wasm_Features_Group>;
|
def mno_unimplemented_simd128 : Flag<["-"], "mno-unimplemented-simd128">, Group<m_wasm_Features_Group>;
|
||||||
|
|
|
@ -218,6 +218,39 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
|
||||||
D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args);
|
D.Diag(diag::err_drv_invalid_mtp) << A->getAsString(Args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable/disable straight line speculation hardening.
|
||||||
|
if (Arg *A = Args.getLastArg(options::OPT_mharden_sls_EQ)) {
|
||||||
|
StringRef Scope = A->getValue();
|
||||||
|
bool EnableRetBr = false;
|
||||||
|
bool EnableBlr = false;
|
||||||
|
if (Scope != "none" && Scope != "all") {
|
||||||
|
SmallVector<StringRef, 4> Opts;
|
||||||
|
Scope.split(Opts, ",");
|
||||||
|
for (auto Opt : Opts) {
|
||||||
|
Opt = Opt.trim();
|
||||||
|
if (Opt == "retbr") {
|
||||||
|
EnableRetBr = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (Opt == "blr") {
|
||||||
|
EnableBlr = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
D.Diag(diag::err_invalid_sls_hardening)
|
||||||
|
<< Scope << A->getAsString(Args);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (Scope == "all") {
|
||||||
|
EnableRetBr = true;
|
||||||
|
EnableBlr = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (EnableRetBr)
|
||||||
|
Features.push_back("+harden-sls-retbr");
|
||||||
|
if (EnableBlr)
|
||||||
|
Features.push_back("+harden-sls-blr");
|
||||||
|
}
|
||||||
|
|
||||||
// En/disable crc
|
// En/disable crc
|
||||||
if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
|
if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
|
||||||
if (A->getOption().matches(options::OPT_mcrc))
|
if (A->getOption().matches(options::OPT_mcrc))
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
// Check the -mharden-sls= option, which has a required argument to select
|
||||||
|
// scope.
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=none 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=blr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-ON
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=blr -mharden-sls=none 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-OFF --check-prefix=BLR-OFF
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=blr -mharden-sls=retbr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-OFF
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=all 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr,retbr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=RETBR-ON --check-prefix=BLR-ON
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=retbr,blr,r 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=none,blr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC
|
||||||
|
|
||||||
|
// RUN: %clang -target aarch64--none-eabi -c %s -### -mharden-sls=all,-blr 2>&1 | \
|
||||||
|
// RUN: FileCheck %s --check-prefix=BAD-SLS-SPEC
|
||||||
|
|
||||||
|
// RETBR-OFF-NOT: "harden-sls-retbr"
|
||||||
|
// RETBR-ON: "+harden-sls-retbr"
|
||||||
|
|
||||||
|
// BLR-OFF-NOT: "harden-sls-blr"
|
||||||
|
// BLR-ON: "+harden-sls-blr"
|
||||||
|
|
||||||
|
// BAD-SLS-SPEC: invalid sls hardening option '{{[^']+}}' in '-mharden-sls=
|
Loading…
Reference in New Issue