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