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 ®ion, 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