[clang] [PPC] Disable rop-protect for 32-bit OS targets. (PR #139619)
Sean Fertile via cfe-commits
cfe-commits at lists.llvm.org
Mon May 12 13:27:01 PDT 2025
https://github.com/mandlebug created https://github.com/llvm/llvm-project/pull/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.
>From 6f089b31986290495a452d71fe24ebb73fcd0f42 Mon Sep 17 00:00:00 2001
From: Sean Fertile <sd.fertile at gmail.com>
Date: Mon, 12 May 2025 11:27:39 -0400
Subject: [PATCH] [PPC] Disable rop-protect for 32-bit OS targets.
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.
---
clang/lib/Basic/Targets/PPC.cpp | 16 +++++++++++-----
.../Driver/ppc-mrop-protection-support-check.c | 6 ++++++
2 files changed, 17 insertions(+), 5 deletions(-)
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