[llvm] 4e5fa3b - [RISCV] Mark HW shadow stack ops as frame setup/destroy (#203362)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 12 18:06:34 PDT 2026
Author: Sergey Stepanov
Date: 2026-06-12T18:06:29-07:00
New Revision: 4e5fa3bbabdf304975abf9eea59bc44d72277169
URL: https://github.com/llvm/llvm-project/commit/4e5fa3bbabdf304975abf9eea59bc44d72277169
DIFF: https://github.com/llvm/llvm-project/commit/4e5fa3bbabdf304975abf9eea59bc44d72277169.diff
LOG: [RISCV] Mark HW shadow stack ops as frame setup/destroy (#203362)
This change follows up on PR #200182 and addresses the issue in the
[related
comment](https://github.com/llvm/llvm-project/pull/200182#discussion_r3329197379).
It sets `FrameSetup` on SSPUSH/C_SSPUSH and `FrameDestroy` on SSPOPCHK
instructions emitted by RISCVFrameLowering for the HW shadow stack path.
The test was written manually (instead of using
`utils/update_mir_test_checks.py`) to keep it simple and avoid
unnecessary fragility.
Added:
llvm/test/CodeGen/RISCV/shadowcallstack-frame-flags.ll
Modified:
llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
index 7facdb1b4d548..3b72262777ddc 100644
--- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp
@@ -132,9 +132,13 @@ static void emitSCSPrologue(MachineFunction &MF, MachineBasicBlock &MBB,
if (HasHWShadowStack) {
if (STI.hasStdExtZcmop()) {
static_assert(RAReg == RISCV::X1, "C.SSPUSH only accepts X1");
- BuildMI(MBB, MI, DL, TII->get(RISCV::C_SSPUSH)).addReg(RAReg);
+ BuildMI(MBB, MI, DL, TII->get(RISCV::C_SSPUSH))
+ .addReg(RAReg)
+ .setMIFlag(MachineInstr::FrameSetup);
} else {
- BuildMI(MBB, MI, DL, TII->get(RISCV::SSPUSH)).addReg(RAReg);
+ BuildMI(MBB, MI, DL, TII->get(RISCV::SSPUSH))
+ .addReg(RAReg)
+ .setMIFlag(MachineInstr::FrameSetup);
}
return;
}
@@ -197,7 +201,9 @@ static void emitSCSEpilogue(MachineFunction &MF, MachineBasicBlock &MBB,
const RISCVInstrInfo *TII = STI.getInstrInfo();
if (HasHWShadowStack) {
- BuildMI(MBB, MI, DL, TII->get(RISCV::SSPOPCHK)).addReg(RAReg);
+ BuildMI(MBB, MI, DL, TII->get(RISCV::SSPOPCHK))
+ .addReg(RAReg)
+ .setMIFlag(MachineInstr::FrameDestroy);
return;
}
diff --git a/llvm/test/CodeGen/RISCV/shadowcallstack-frame-flags.ll b/llvm/test/CodeGen/RISCV/shadowcallstack-frame-flags.ll
new file mode 100644
index 0000000000000..e4a15ce457047
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/shadowcallstack-frame-flags.ll
@@ -0,0 +1,21 @@
+; RUN: llc < %s -mtriple=riscv32 -mattr=+experimental-zicfiss \
+; RUN: -verify-machineinstrs -stop-after=prologepilog \
+; RUN: | FileCheck %s --check-prefix=RV32
+; RUN: llc < %s -mtriple=riscv64 -mattr=+experimental-zicfiss \
+; RUN: -verify-machineinstrs -stop-after=prologepilog \
+; RUN: | FileCheck %s --check-prefix=RV64
+
+declare i32 @bar()
+
+define i32 @f() "hw-shadow-stack" {
+; RV32-LABEL: name: f
+; RV32: frame-setup SSPUSH
+; RV32: frame-destroy SSPOPCHK
+;
+; RV64-LABEL: name: f
+; RV64: frame-setup SSPUSH
+; RV64: frame-destroy SSPOPCHK
+ %res = call i32 @bar()
+ %res1 = add i32 %res, 1
+ ret i32 %res
+}
More information about the llvm-commits
mailing list