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 Kramerpublic:
277801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng  MCInstrAnalysis(const MCInstrInfo *Info) : Info(Info) {}
287801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng
2908de97a5b024c3dc7dd051ecaa63d7ec1a27a5cfBenjamin Kramer  virtual ~MCInstrAnalysis() {}
3008de97a5b024c3dc7dd051ecaa63d7ec1a27a5cfBenjamin Kramer
3141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isBranch(const MCInst &Inst) const {
3241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isBranch();
3341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
3441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
3541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isConditionalBranch(const MCInst &Inst) const {
369ca9acfaff3c5e9f9dc86b830ef0255610e254e7Owen Anderson    return Info->get(Inst.getOpcode()).isConditionalBranch();
3741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
3841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
3941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isUnconditionalBranch(const MCInst &Inst) const {
4041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isUnconditionalBranch();
4141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
4241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
4341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isIndirectBranch(const MCInst &Inst) const {
4441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isIndirectBranch();
4541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
4641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
476667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer  virtual bool isCall(const MCInst &Inst) const {
486667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer    return Info->get(Inst.getOpcode()).isCall();
496667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer  }
506667e5429608b5a0d55850b980ae433deda0e5f2Benjamin Kramer
5141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual bool isReturn(const MCInst &Inst) const {
5241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer    return Info->get(Inst.getOpcode()).isReturn();
5341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  }
5441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
5541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  /// evaluateBranch - Given a branch instruction try to get the address the
5641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  /// branch targets. Otherwise return -1.
5741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  virtual uint64_t
5841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer  evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size) const;
5941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer};
6041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer
6141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer}
62