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