[clang] 4ac8e90 - [PPC] Disable rop-protect for 32-bit OS targets. (#139619)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 14 10:00:19 PDT 2025
Author: Sean Fertile
Date: 2025-05-14T13:00:15-04:00
New Revision: 4ac8e90df78354b06f7b4f8ffa135c1a1ee7e944
URL: https://github.com/llvm/llvm-project/commit/4ac8e90df78354b06f7b4f8ffa135c1a1ee7e944
DIFF: https://github.com/llvm/llvm-project/commit/4ac8e90df78354b06f7b4f8ffa135c1a1ee7e944.diff
LOG: [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.
Added:
Modified:
clang/lib/Basic/Targets/PPC.cpp
clang/test/Driver/ppc-mrop-protection-support-check.c
Removed:
################################################################################
diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp
index 425ad68bb9098..e6ef0ecc526ba 100644
--- a/clang/lib/Basic/Targets/PPC.cpp
+++ b/clang/lib/Basic/Targets/PPC.cpp
@@ -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) &&
diff --git a/clang/test/Driver/ppc-mrop-protection-support-check.c b/clang/test/Driver/ppc-mrop-protection-support-check.c
index 50eaef3ed770b..9081c583de8bf 100644
--- a/clang/test/Driver/ppc-mrop-protection-support-check.c
+++ b/clang/test/Driver/ppc-mrop-protection-support-check.c
@@ -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
More information about the cfe-commits
mailing list