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.fert...@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits