1 //===-- llvm/MC/MCInstrAnalysis.h - InstrDesc target hooks ------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the MCInstrAnalysis class which the MCTargetDescs can 11 // derive from to give additional information to MC. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_MC_MCINSTRANALYSIS_H 16 #define LLVM_MC_MCINSTRANALYSIS_H 17 18 #include "llvm/MC/MCInst.h" 19 #include "llvm/MC/MCInstrDesc.h" 20 #include "llvm/MC/MCInstrInfo.h" 21 22 namespace llvm { 23 24 class MCInstrAnalysis { 25 protected: 26 friend class Target; 27 const MCInstrInfo *Info; 28 29 public: MCInstrAnalysis(const MCInstrInfo * Info)30 MCInstrAnalysis(const MCInstrInfo *Info) : Info(Info) {} 31 ~MCInstrAnalysis()32 virtual ~MCInstrAnalysis() {} 33 isBranch(const MCInst & Inst)34 virtual bool isBranch(const MCInst &Inst) const { 35 return Info->get(Inst.getOpcode()).isBranch(); 36 } 37 isConditionalBranch(const MCInst & Inst)38 virtual bool isConditionalBranch(const MCInst &Inst) const { 39 return Info->get(Inst.getOpcode()).isConditionalBranch(); 40 } 41 isUnconditionalBranch(const MCInst & Inst)42 virtual bool isUnconditionalBranch(const MCInst &Inst) const { 43 return Info->get(Inst.getOpcode()).isUnconditionalBranch(); 44 } 45 isIndirectBranch(const MCInst & Inst)46 virtual bool isIndirectBranch(const MCInst &Inst) const { 47 return Info->get(Inst.getOpcode()).isIndirectBranch(); 48 } 49 isCall(const MCInst & Inst)50 virtual bool isCall(const MCInst &Inst) const { 51 return Info->get(Inst.getOpcode()).isCall(); 52 } 53 isReturn(const MCInst & Inst)54 virtual bool isReturn(const MCInst &Inst) const { 55 return Info->get(Inst.getOpcode()).isReturn(); 56 } 57 isTerminator(const MCInst & Inst)58 virtual bool isTerminator(const MCInst &Inst) const { 59 return Info->get(Inst.getOpcode()).isTerminator(); 60 } 61 62 /// evaluateBranch - Given a branch instruction try to get the address the 63 /// branch targets. Return true on success, and the address in Target. 64 virtual bool 65 evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size, 66 uint64_t &Target) const; 67 }; 68 69 } // End llvm namespace 70 71 #endif 72