MCInstrAnalysis.h revision 6667e5429608b5a0d55850b980ae433deda0e5f2
141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//===-- llvm/MC/MCInstrAnalysis.h - InstrDesc target hooks ------*- C++ -*-===//
241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//
341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//                     The LLVM Compiler Infrastructure
441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//
541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer// This file is distributed under the University of Illinois Open Source
641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer// License. See LICENSE.TXT for details.
741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//
841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//===----------------------------------------------------------------------===//
941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//
1041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer// This file defines the MCInstrAnalysis class which the MCTargetDescs can
1141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer// derive from to give additional information to MC.
1241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//
1341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer//===----------------------------------------------------------------------===//
1441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
1541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer#include "llvm/MC/MCInst.h"
1641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer#include "llvm/MC/MCInstrDesc.h"
1741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer#include "llvm/MC/MCInstrInfo.h"
1841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
1941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramernamespace llvm {
2041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
2141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramerclass MCInstrAnalysis {
2241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramerprotected:
2341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  friend class Target;
2441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  const MCInstrInfo *Info;
2541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
2641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  MCInstrAnalysis(const MCInstrInfo *Info) : Info(Info) {}
2741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramerpublic:
2808de97a5b024c3dc7dd051ecaa63d7ec1a27a5cfBenjamin Kramer  virtual ~MCInstrAnalysis() {}
2908de97a5b024c3dc7dd051ecaa63d7ec1a27a5cfBenjamin Kramer
3041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isBranch(const MCInst &Inst) const {
3141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isBranch();
3241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
3341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
3441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isConditionalBranch(const MCInst &Inst) const {
3541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isBranch();
3641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
3741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
3841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isUnconditionalBranch(const MCInst &Inst) const {
3941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isUnconditionalBranch();
4041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
4141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
4241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isIndirectBranch(const MCInst &Inst) const {
4341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isIndirectBranch();
4441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
4541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
466667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer  virtual bool isCall(const MCInst &Inst) const {
476667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer    return Info->get(Inst.getOpcode()).isCall();
486667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer  }
496667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer
5041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isReturn(const MCInst &Inst) const {
5141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isReturn();
5241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
5341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
5441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  /// evaluateBranch - Given a branch instruction try to get the address the
5541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  /// branch targets. Otherwise return -1.
5641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual uint64_t
5741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size) const;
5841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer};
5941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
6041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer}
61