blob: dd3e1df477b45bb728ab67bd94b62f2b9a64b720 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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
23namespace llvm {
24
25class MCInstrAnalysis {
26protected:
27 friend class Target;
28
29 const MCInstrInfo *Info;
30
31public:
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