[clang] [PPC] Disable rop-protect for 32-bit OS targets. (PR #139619)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 12 13:27:31 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-driver
Author: Sean Fertile (mandlebug)
<details>
<summary>Changes</summary>
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.
---
Full diff: https://github.com/llvm/llvm-project/pull/139619.diff
2 Files Affected:
- (modified) clang/lib/Basic/Targets/PPC.cpp (+11-5)
- (modified) clang/test/Driver/ppc-mrop-protection-support-check.c (+6)
``````````diff
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
``````````
</details>
https://github.com/llvm/llvm-project/pull/139619
More information about the cfe-commits
mailing list