[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:
Sean Fertile
2025-05-14 13:00:15 -04:00
committed by GitHub
parent 441d382f93
commit 4ac8e90df7
2 changed files with 17 additions and 5 deletions

View File

@@ -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) &&

View File

@@ -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