MCDisassembler.h revision 98c5ddabca1debf935a07d14d0cbc9732374bdb8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- llvm/MC/MCDisassembler.h - Disassembler interface -------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MCDISASSEMBLER_H
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MCDISASSEMBLER_H
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/DataTypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm-c/Disassembler.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MCInst;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MCSubtargetInfo;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MemoryObject;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class raw_ostream;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MCContext;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct EDInstInfo;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// MCDisassembler - Superclass for all disassemblers.  Consumes a memory region
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///   and provides an array of assembly instructions.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MCDisassembler {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Ternary decode status. Most backends will just use Fail and
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Success, however some have a concept of an instruction with
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// understandable semantics but which is architecturally
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// incorrect. An example of this is ARM UNPREDICTABLE instructions
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// which are disassemblable but cause undefined behaviour.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Because it makes sense to disassemble these instructions, there
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// is a "soft fail" failure mode that indicates the MCInst& is
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// valid but architecturally incorrect.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// The enum numbers are deliberately chosen such that reduction
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// from Success->SoftFail ->Fail can be done with a simple
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// bitwise-AND:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///   LEFT & TOP =  | Success       Unpredictable   Fail
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///   --------------+-----------------------------------
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///   Success       | Success       Unpredictable   Fail
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///   Unpredictable | Unpredictable Unpredictable   Fail
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///   Fail          | Fail          Fail            Fail
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// An easy way of encoding this is as 0b11, 0b01, 0b00 for
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Success, SoftFail, Fail respectively.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum DecodeStatus {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Fail = 0,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SoftFail = 1,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Success = 3
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Constructor     - Performs initial setup for the disassembler.
5858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  MCDisassembler(const MCSubtargetInfo &STI) : GetOpInfo(0), DisInfo(0), Ctx(0), STI(STI) {}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MCDisassembler();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// getInstruction  - Returns the disassembly of a single instruction.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param instr    - An MCInst to populate with the contents of the
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                   instruction.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param size     - A value to populate with the size of the instruction, or
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                   the number of bytes consumed while attempting to decode
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                   an invalid instruction.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param region   - The memory object to use as a source for machine code.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param address  - The address, in the memory space of region, of the first
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                   byte of the instruction.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param vStream  - The stream to print warnings and diagnostic messages on.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @param cStream  - The stream to print comments and annotations on.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @return         - MCDisassembler::Success if the instruction is valid,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                   MCDisassembler::SoftFail if the instruction was
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                                            disassemblable but invalid,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///                   MCDisassembler::Fail if the instruction was invalid.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual DecodeStatus  getInstruction(MCInst& instr,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       uint64_t& size,
80                                       const MemoryObject &region,
81                                       uint64_t address,
82                                       raw_ostream &vStream,
83                                       raw_ostream &cStream) const = 0;
84
85  /// getEDInfo - Returns the enhanced instruction information corresponding to
86  ///   the disassembler.
87  ///
88  /// @return         - An array of instruction information, with one entry for
89  ///                   each MCInst opcode this disassembler returns.
90  ///                   NULL if there is no info for this target.
91  virtual EDInstInfo   *getEDInfo() const { return (EDInstInfo*)0; }
92
93private:
94  //
95  // Hooks for symbolic disassembly via the public 'C' interface.
96  //
97  // The function to get the symbolic information for operands.
98  LLVMOpInfoCallback GetOpInfo;
99  // The pointer to the block of symbolic information for above call back.
100  void *DisInfo;
101  // The assembly context for creating symbols and MCExprs in place of
102  // immediate operands when there is symbolic information.
103  MCContext *Ctx;
104protected:
105  // Subtarget information, for instruction decoding predicates if required.
106  const MCSubtargetInfo &STI;
107
108public:
109  void setupForSymbolicDisassembly(LLVMOpInfoCallback getOpInfo,
110                                   void *disInfo,
111                                   MCContext *ctx) {
112    GetOpInfo = getOpInfo;
113    DisInfo = disInfo;
114    Ctx = ctx;
115  }
116  LLVMOpInfoCallback getLLVMOpInfoCallback() const { return GetOpInfo; }
117  void *getDisInfoBlock() const { return DisInfo; }
118  MCContext *getMCContext() const { return Ctx; }
119};
120
121} // namespace llvm
122
123#endif
124