MCInstrAnalysis.h revision 08de97a5b024c3dc7dd051ecaa63d7ec1a27a5cf
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 4641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer virtual bool isReturn(const MCInst &Inst) const { 4741ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer return Info->get(Inst.getOpcode()).isReturn(); 4841ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer } 4941ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 5041ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// evaluateBranch - Given a branch instruction try to get the address the 5141ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer /// branch targets. Otherwise return -1. 5241ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer virtual uint64_t 5341ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size) const; 5441ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer}; 5541ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer 5641ab14b725c8f2bb3e54553d0d7d96ff184786b1Benjamin Kramer} 57