[XRay][NFC] Promote isTailCall() as virtual in TargetInstrInfo.

This change is broken out from D23986, where XRay detects tail call
exits.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280331 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dean Michael Berris 2016-09-01 01:03:22 +00:00
parent 2a3f18e638
commit 31a52c200b
4 changed files with 34 additions and 1 deletions

View File

@ -1481,6 +1481,11 @@ public:
return None;
}
/// Determines whether |Inst| is a tail call instruction.
virtual bool isTailCall(const MachineInstr &Inst) const {
return false;
}
private:
unsigned CallFrameSetupOpcode, CallFrameDestroyOpcode;
unsigned CatchRetOpcode;

View File

@ -340,7 +340,10 @@ public:
bool isSignExtendingLoad(const MachineInstr &MI) const;
bool isSolo(const MachineInstr &MI) const;
bool isSpillPredRegOp(const MachineInstr &MI) const;
bool isTailCall(const MachineInstr &MI) const;
// Defined in Target.h.
bool isTailCall(const MachineInstr &MI) const override;
bool isTC1(const MachineInstr &MI) const;
bool isTC2(const MachineInstr &MI) const;
bool isTC2Early(const MachineInstr &MI) const;

View File

@ -8061,6 +8061,29 @@ X86InstrInfo::getSerializableDirectMachineOperandTargetFlags() const {
return makeArrayRef(TargetFlags);
}
bool X86InstrInfo::isTailCall(const MachineInstr &Inst) const {
switch (Inst.getOpcode()) {
case X86::TCRETURNdi:
case X86::TCRETURNmi:
case X86::TCRETURNri:
case X86::TCRETURNdi64:
case X86::TCRETURNmi64:
case X86::TCRETURNri64:
case X86::TAILJMPd:
case X86::TAILJMPm:
case X86::TAILJMPr:
case X86::TAILJMPd64:
case X86::TAILJMPm64:
case X86::TAILJMPr64:
case X86::TAILJMPd64_REX:
case X86::TAILJMPm64_REX:
case X86::TAILJMPr64_REX:
return true;
default:
return false;
}
}
namespace {
/// Create Global Base Reg pass. This initializes the PIC
/// global base register for x86-32.

View File

@ -541,6 +541,8 @@ public:
ArrayRef<std::pair<unsigned, const char *>>
getSerializableDirectMachineOperandTargetFlags() const override;
bool isTailCall(const MachineInstr &Inst) const override;
protected:
/// Commutes the operands in the given instruction by changing the operands
/// order and/or changing the instruction's opcode and/or the immediate value