MCDisassembler.h revision 83e3f67fb68d497b600da83a62f000fcce7868a9
198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project//===-- llvm/MC/MCDisassembler.h - Disassembler interface -------*- C++ -*-===//
298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project//
398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project//                     The LLVM Compiler Infrastructure
498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project//
598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project// This file is distributed under the University of Illinois Open Source
698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project// License. See LICENSE.TXT for details.
798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project//
898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project//===----------------------------------------------------------------------===//
998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#ifndef MCDISASSEMBLER_H
1098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#define MCDISASSEMBLER_H
1198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
1298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#include "llvm/Support/DataTypes.h"
1398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#include "llvm-c/Disassembler.h"
1498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
1598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectnamespace llvm {
1698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
1798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectclass MCInst;
1898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectclass MemoryObject;
1998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectclass raw_ostream;
2098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectclass MCContext;
2198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
2298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectstruct EDInstInfo;
2398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
2498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project/// MCDisassembler - Superclass for all disassemblers.  Consumes a memory region
2598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project///   and provides an array of assembly instructions.
2698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectclass MCDisassembler {
2798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectpublic:
2898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// Ternary decode status. Most backends will just use Fail and
2998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// Success, however some have a concept of an instruction with
3098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// understandable semantics but which is architecturally
3198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// incorrect. An example of this is ARM UNPREDICTABLE instructions
3298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// which are disassemblable but cause undefined behaviour.
3398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///
3498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// Because it makes sense to disassemble these instructions, there
3598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// is a "soft fail" failure mode that indicates the MCInst& is
3698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// valid but architecturally incorrect.
3798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///
3898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// The enum numbers are deliberately chosen such that reduction
3998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// from Success->SoftFail ->Fail can be done with a simple
4098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// bitwise-AND:
4198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///
4298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///   LEFT & TOP =  | Success       Unpredictable   Fail
4398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///   --------------+-----------------------------------
4498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///   Success       | Success       Unpredictable   Fail
4598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///   Unpredictable | Unpredictable Unpredictable   Fail
4698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///   Fail          | Fail          Fail            Fail
4798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///
4898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// An easy way of encoding this is as 0b11, 0b01, 0b00 for
4998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// Success, SoftFail, Fail respectively.
5098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  enum DecodeStatus {
5198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project    Fail = 0,
5298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project    SoftFail = 1,
5398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project    Success = 3
5498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  };
5598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
5698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// Constructor     - Performs initial setup for the disassembler.
5798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  MCDisassembler() : GetOpInfo(0), DisInfo(0), Ctx(0) {}
5898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
5998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  virtual ~MCDisassembler();
6098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
6198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// getInstruction  - Returns the disassembly of a single instruction.
6298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///
6398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @param instr    - An MCInst to populate with the contents of the
6498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   instruction.
6598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @param size     - A value to populate with the size of the instruction, or
6698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   the number of bytes consumed while attempting to decode
6798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   an invalid instruction.
6898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @param region   - The memory object to use as a source for machine code.
6998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @param address  - The address, in the memory space of region, of the first
7098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   byte of the instruction.
7198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @param vStream  - The stream to print warnings and diagnostic messages on.
7298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @return         - MCDisassembler::Success if the instruction is valid,
7398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   MCDisassembler::SoftFail if the instruction was
7498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                                            disassemblable but invalid,
7598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   MCDisassembler::Fail if the instruction was invalid.
7698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  virtual DecodeStatus  getInstruction(MCInst& instr,
7798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project                                       uint64_t& size,
7898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project                                       const MemoryObject &region,
7998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project                                       uint64_t address,
8098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project                                       raw_ostream &vStream) const = 0;
8198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
8298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// getEDInfo - Returns the enhanced instruction information corresponding to
8398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///   the disassembler.
8498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///
8598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  /// @return         - An array of instruction information, with one entry for
8698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   each MCInst opcode this disassembler returns.
8798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  ///                   NULL if there is no info for this target.
8898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  virtual EDInstInfo   *getEDInfo() const { return (EDInstInfo*)0; }
8998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
9098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectprivate:
9198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  //
9298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  // Hooks for symbolic disassembly via the public 'C' interface.
9398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  //
9498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  // The function to get the symbolic information for operands.
9598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  LLVMOpInfoCallback GetOpInfo;
9698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  // The pointer to the block of symbolic information for above call back.
9798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  void *DisInfo;
9898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  // The assembly context for creating symbols and MCExprs in place of
9998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  // immediate operands when there is symbolic information.
10098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  MCContext *Ctx;
10198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
10298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Projectpublic:
10398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  void setupForSymbolicDisassembly(LLVMOpInfoCallback getOpInfo,
10498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project                                   void *disInfo,
10598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project                                   MCContext *ctx) {
10698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project    GetOpInfo = getOpInfo;
10798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project    DisInfo = disInfo;
10898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project    Ctx = ctx;
10998913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  }
11098913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  LLVMOpInfoCallback getLLVMOpInfoCallback() const { return GetOpInfo; }
11198913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  void *getDisInfoBlock() const { return DisInfo; }
11298913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project  MCContext *getMCContext() const { return Ctx; }
11398913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project};
11498913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
11598913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project} // namespace llvm
11698913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project
11798913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project#endif
11898913fed6520d8849fb2e246be943e04474aefaThe Android Open Source Project