[PPC] Disable rop-protect for 32-bit OS targets. (#139619)
The instructions are not supported on either 32-bit ELF (due to no redzone) or 32-bit AIX due to the instructions always using the full 64-bit width of the register inputs.
This commit is contained in:
@@ -679,11 +679,17 @@ bool PPCTargetInfo::initFeatureMap(
|
||||
}
|
||||
}
|
||||
|
||||
if (!(ArchDefs & ArchDefinePwr8) &&
|
||||
llvm::is_contained(FeaturesVec, "+rop-protect")) {
|
||||
// We can turn on ROP Protect on Power 8 and above.
|
||||
Diags.Report(diag::err_opt_not_valid_with_opt) << "-mrop-protect" << CPU;
|
||||
return false;
|
||||
if (llvm::is_contained(FeaturesVec, "+rop-protect")) {
|
||||
if (PointerWidth == 32) {
|
||||
Diags.Report(diag::err_opt_not_valid_on_target) << "-mrop-protect";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(ArchDefs & ArchDefinePwr8)) {
|
||||
// We can turn on ROP Protect on Power 8 and above.
|
||||
Diags.Report(diag::err_opt_not_valid_with_opt) << "-mrop-protect" << CPU;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(ArchDefs & ArchDefinePwr8) &&
|
||||
|
||||
@@ -16,6 +16,11 @@
|
||||
// RUN: not %clang -target powerpc64le-unknown-linux-gnu -fsyntax-only \
|
||||
// RUN: -mcpu=power7 -mrop-protect %s 2>&1 | FileCheck %s --check-prefix=NOROP
|
||||
|
||||
// RUN: not %clang -target powerpc-unknown-linux -fsyntax-only \
|
||||
// RUN: -mcpu=pwr8 -mrop-protect %s 2>&1 | FileCheck %s --check-prefix=32BIT
|
||||
// RUN: not %clang -target powerpc-unknown-aix -fsyntax-only \
|
||||
// RUN: -mcpu=pwr8 -mrop-protect %s 2>&1 | FileCheck %s --check-prefix=32BIT
|
||||
|
||||
#ifdef __ROP_PROTECT__
|
||||
static_assert(false, "ROP Protect enabled");
|
||||
#endif
|
||||
@@ -24,3 +29,4 @@ static_assert(false, "ROP Protect enabled");
|
||||
// HASROP-NOT: option '-mrop-protect' cannot be specified with
|
||||
// NOROP: option '-mrop-protect' cannot be specified with
|
||||
|
||||
// 32BIT: option '-mrop-protect' cannot be specified on this target
|
||||
|
||||
Reference in New Issue
Block a user