Home | History | Annotate | Download | only in MC
      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 #include <cstdint>
     22 
     23 namespace llvm {
     24 
     25 class MCInstrAnalysis {
     26 protected:
     27   friend class Target;
     28 
     29   const MCInstrInfo *Info;
     30 
     31 public:
     32   MCInstrAnalysis(const MCInstrInfo *Info) : Info(Info) {}
     33   virtual ~MCInstrAnalysis() = default;
     34 
     35   virtual bool isBranch(const MCInst &Inst) const {
     36     return Info->get(Inst.getOpcode()).isBranch();
     37   }
     38 
     39   virtual bool isConditionalBranch(const MCInst &Inst) const {
     40     return Info->get(Inst.getOpcode()).isConditionalBranch();
     41   }
     42 
     43   virtual bool isUnconditionalBranch(const MCInst &Inst) const {
     44     return Info->get(Inst.getOpcode()).isUnconditionalBranch();
     45   }
     46 
     47   virtual bool isIndirectBranch(const MCInst &Inst) const {
     48     return Info->get(Inst.getOpcode()).isIndirectBranch();
     49   }
     50 
     51   virtual bool isCall(const MCInst &Inst) const {
     52     return Info->get(Inst.getOpcode()).isCall();
     53   }
     54 
     55   virtual bool isReturn(const MCInst &Inst) const {
     56     return Info->get(Inst.getOpcode()).isReturn();
     57   }
     58 
     59   virtual bool isTerminator(const MCInst &Inst) const {
     60     return Info->get(Inst.getOpcode()).isTerminator();
     61   }
     62 
     63   /// \brief Given a branch instruction try to get the address the branch
     64   /// targets. Return true on success, and the address in Target.
     65   virtual bool
     66   evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,
     67                  uint64_t &Target) const;
     68 };
     69 
     70 } // end namespace llvm
     71 
     72 #endif // LLVM_MC_MCINSTRANALYSIS_H
     73