[llvm] MachineVerifier: Check stack protector is top-most in frame (PR #121481)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 7 07:01:45 PST 2025
================
@@ -4038,3 +4042,44 @@ void MachineVerifier::verifyStackFrame() {
}
}
}
+
+void MachineVerifier::verifyStackProtector() {
+ const MachineFrameInfo &MFI = MF->getFrameInfo();
+ if (!MFI.hasStackProtectorIndex())
+ return;
+ // Only applicable when the offsets of frame objects have been determined,
+ // which is indicated by a non-zero stack size.
+ if (!MFI.getStackSize())
+ return;
+ const TargetFrameLowering &TFI = *MF->getSubtarget().getFrameLowering();
+ bool StackGrowsDown =
+ TFI.getStackGrowthDirection() == TargetFrameLowering::StackGrowsDown;
+ assert(StackGrowsDown && "Only support stack growth down");
+ // Collect the frame indices of the callee-saved registers which are spilled
+ // to the stack. These are the registers that are stored above the stack
+ // protector.
+ SmallSet<unsigned, 4> CalleeSavedFrameIndices;
+ if (MFI.isCalleeSavedInfoValid()) {
+ for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) {
+ if (!Info.isSpilledToReg())
+ CalleeSavedFrameIndices.insert(Info.getFrameIdx());
+ }
+ }
+ unsigned FI = MFI.getStackProtectorIndex();
+ int64_t SPOffset = MFI.getObjectOffset(FI);
+ for (unsigned I = 0, E = MFI.getObjectIndexEnd(); I != E; ++I) {
+ if (I == FI)
+ continue;
+ // Variable-sized objects do not have a fixed offset.
+ if (MFI.isVariableSizedObjectIndex(I))
+ continue;
+ if (CalleeSavedFrameIndices.contains(I))
+ continue;
+ if (SPOffset < MFI.getObjectOffset(I)) {
+ report("Stack protector is not the top-most object on the stack", MF);
+ OS << "Stack protector is not the top-most object on the stack in "
+ << MF->getName() << '\n';
----------------
arsenm wrote:
This is redundant with the report? The second message isn't tested anyway
https://github.com/llvm/llvm-project/pull/121481
More information about the llvm-commits
mailing list