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