diff options
Diffstat (limited to 'bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp')
-rw-r--r-- | bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp index f271867..df4f421 100644 --- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp +++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp @@ -244,6 +244,28 @@ public: } } + bool isPSignOnLR(const MCInst &Inst) const override { + std::optional<MCPhysReg> SignReg = getSignedReg(Inst); + return SignReg && *SignReg == AArch64::LR; + } + + bool isPAuthOnLR(const MCInst &Inst) const override { + // LDR(A|B) should not be covered. + bool IsChecked; + std::optional<MCPhysReg> AuthReg = + getWrittenAuthenticatedReg(Inst, IsChecked); + return !IsChecked && AuthReg && *AuthReg == AArch64::LR; + } + + bool isPAuthAndRet(const MCInst &Inst) const override { + return Inst.getOpcode() == AArch64::RETAA || + Inst.getOpcode() == AArch64::RETAB || + Inst.getOpcode() == AArch64::RETAASPPCi || + Inst.getOpcode() == AArch64::RETABSPPCi || + Inst.getOpcode() == AArch64::RETAASPPCr || + Inst.getOpcode() == AArch64::RETABSPPCr; + } + std::optional<MCPhysReg> getSignedReg(const MCInst &Inst) const override { switch (Inst.getOpcode()) { case AArch64::PACIA: |