Skip to content

Commit 9c6d4c7

Browse files
committed
[aarch64] XOR the frame pointer with the stack cookie when protecting the stack
1 parent cac0635 commit 9c6d4c7

File tree

3 files changed

+15
-2
lines changed

3 files changed

+15
-2
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28818,7 +28818,17 @@ void AArch64TargetLowering::ReplaceNodeResults(
2881828818
bool AArch64TargetLowering::useLoadStackGuardNode(const Module &M) const {
2881928819
if (Subtarget->isTargetAndroid() || Subtarget->isTargetFuchsia())
2882028820
return TargetLowering::useLoadStackGuardNode(M);
28821-
return true;
28821+
return false;
28822+
}
28823+
28824+
bool AArch64TargetLowering::useStackGuardXorFP() const { return true; }
28825+
28826+
SDValue AArch64TargetLowering::emitStackGuardXorFP(SelectionDAG &DAG,
28827+
SDValue Val,
28828+
const SDLoc &DL) const {
28829+
return DAG.getNode(
28830+
ISD::XOR, DL, Val.getValueType(), Val,
28831+
DAG.getRegister(getStackPointerRegisterToSaveRestore(), MVT::i64));
2882228832
}
2882328833

2882428834
unsigned AArch64TargetLowering::combineRepeatedFPDivisors() const {

llvm/lib/Target/AArch64/AArch64ISelLowering.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,9 @@ class AArch64TargetLowering : public TargetLowering {
349349
shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override;
350350

351351
bool useLoadStackGuardNode(const Module &M) const override;
352+
bool useStackGuardXorFP() const override;
353+
SDValue emitStackGuardXorFP(SelectionDAG &DAG, SDValue Val,
354+
const SDLoc &DL) const override;
352355
TargetLoweringBase::LegalizeTypeAction
353356
getPreferredVectorAction(MVT VT) const override;
354357

llvm/lib/Target/AArch64/AArch64SelectionDAGInfo.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ AArch64SelectionDAGInfo::AArch64SelectionDAGInfo()
3232

3333
void AArch64SelectionDAGInfo::verifyTargetNode(const SelectionDAG &DAG,
3434
const SDNode *N) const {
35-
SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
35+
// SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
3636

3737
#ifndef NDEBUG
3838
// Some additional checks not yet implemented by verifyTargetNode.

0 commit comments

Comments
 (0)