MCInstrAnalysis.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
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 22namespace llvm { 23 24class MCInstrAnalysis { 25protected: 26 friend class Target; 27 const MCInstrInfo *Info; 28 29public: 30 MCInstrAnalysis(const MCInstrInfo *Info) : Info(Info) {} 31 32 virtual ~MCInstrAnalysis() {} 33 34 virtual bool isBranch(const MCInst &Inst) const { 35 return Info->get(Inst.getOpcode()).isBranch(); 36 } 37 38 virtual bool isConditionalBranch(const MCInst &Inst) const { 39 return Info->get(Inst.getOpcode()).isConditionalBranch(); 40 } 41 42 virtual bool isUnconditionalBranch(const MCInst &Inst) const { 43 return Info->get(Inst.getOpcode()).isUnconditionalBranch(); 44 } 45 46 virtual bool isIndirectBranch(const MCInst &Inst) const { 47 return Info->get(Inst.getOpcode()).isIndirectBranch(); 48 } 49 50 virtual bool isCall(const MCInst &Inst) const { 51 return Info->get(Inst.getOpcode()).isCall(); 52 } 53 54 virtual bool isReturn(const MCInst &Inst) const { 55 return Info->get(Inst.getOpcode()).isReturn(); 56 } 57 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