1251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan//===-- llvm/MC/MCDisassembler.h - Disassembler interface -------*- C++ -*-===// 2251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan// 3251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan// The LLVM Compiler Infrastructure 4251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan// 5251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan// This file is distributed under the University of Illinois Open Source 6251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan// License. See LICENSE.TXT for details. 7251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan// 8251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan//===----------------------------------------------------------------------===// 9251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan#ifndef MCDISASSEMBLER_H 10251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan#define MCDISASSEMBLER_H 11251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 121f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 13bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby#include "llvm-c/Disassembler.h" 14251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 15251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanannamespace llvm { 16251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 17251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass MCInst; 18b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloyclass MCSubtargetInfo; 19251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass MemoryObject; 20251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass raw_ostream; 21bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderbyclass MCContext; 229899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan 239899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callananstruct EDInstInfo; 24251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 25251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan/// MCDisassembler - Superclass for all disassemblers. Consumes a memory region 26251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan/// and provides an array of assembly instructions. 27251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass MCDisassembler { 28251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananpublic: 2983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Ternary decode status. Most backends will just use Fail and 3083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Success, however some have a concept of an instruction with 3183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// understandable semantics but which is architecturally 3283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// incorrect. An example of this is ARM UNPREDICTABLE instructions 3383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// which are disassemblable but cause undefined behaviour. 3483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 3583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Because it makes sense to disassemble these instructions, there 3683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// is a "soft fail" failure mode that indicates the MCInst& is 3783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// valid but architecturally incorrect. 3883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 3983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// The enum numbers are deliberately chosen such that reduction 4083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// from Success->SoftFail ->Fail can be done with a simple 4183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// bitwise-AND: 4283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 4383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// LEFT & TOP = | Success Unpredictable Fail 4483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// --------------+----------------------------------- 4583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Success | Success Unpredictable Fail 4683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Unpredictable | Unpredictable Unpredictable Fail 4783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Fail | Fail Fail Fail 4883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 4983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// An easy way of encoding this is as 0b11, 0b01, 0b00 for 5083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Success, SoftFail, Fail respectively. 5183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson enum DecodeStatus { 5283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson Fail = 0, 5383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson SoftFail = 1, 5483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson Success = 3 5583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson }; 5683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson 57251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// Constructor - Performs initial setup for the disassembler. 589e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby MCDisassembler(const MCSubtargetInfo &STI) : GetOpInfo(0), SymbolLookUp(0), 599e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby DisInfo(0), Ctx(0), 609e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby STI(STI), CommentStream(0) {} 61251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 62251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan virtual ~MCDisassembler(); 63251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 64251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// getInstruction - Returns the disassembly of a single instruction. 65251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// 66251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param instr - An MCInst to populate with the contents of the 67251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// instruction. 68251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param size - A value to populate with the size of the instruction, or 69251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// the number of bytes consumed while attempting to decode 70251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// an invalid instruction. 71251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param region - The memory object to use as a source for machine code. 72251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param address - The address, in the memory space of region, of the first 73251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// byte of the instruction. 74251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// @param vStream - The stream to print warnings and diagnostic messages on. 7598c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson /// @param cStream - The stream to print comments and annotations on. 7683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// @return - MCDisassembler::Success if the instruction is valid, 7783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// MCDisassembler::SoftFail if the instruction was 7883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// disassemblable but invalid, 7983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// MCDisassembler::Fail if the instruction was invalid. 8083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson virtual DecodeStatus getInstruction(MCInst& instr, 81251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan uint64_t& size, 82251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan const MemoryObject ®ion, 83251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan uint64_t address, 8498c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson raw_ostream &vStream, 8598c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson raw_ostream &cStream) const = 0; 869899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan 87cdc06fa3c7d68b92f56a5a9c537ac159aefc6323John McCall /// getEDInfo - Returns the enhanced instruction information corresponding to 889899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan /// the disassembler. 899899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan /// 909899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan /// @return - An array of instruction information, with one entry for 919899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan /// each MCInst opcode this disassembler returns. 929899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan /// NULL if there is no info for this target. 93535f4de469c58e326e8bf49310ac30fe4e792a02Sean Callanan virtual EDInstInfo *getEDInfo() const { return (EDInstInfo*)0; } 94bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby 95bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderbyprivate: 96bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // 97bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // Hooks for symbolic disassembly via the public 'C' interface. 98bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // 99bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // The function to get the symbolic information for operands. 100bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby LLVMOpInfoCallback GetOpInfo; 1019e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby // The function to lookup a symbol name. 1029e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby LLVMSymbolLookupCallback SymbolLookUp; 103bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // The pointer to the block of symbolic information for above call back. 104bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby void *DisInfo; 105bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // The assembly context for creating symbols and MCExprs in place of 106bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby // immediate operands when there is symbolic information. 107bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby MCContext *Ctx; 108b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloyprotected: 109b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy // Subtarget information, for instruction decoding predicates if required. 110b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI; 111bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby 112bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderbypublic: 113bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby void setupForSymbolicDisassembly(LLVMOpInfoCallback getOpInfo, 1149e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby LLVMSymbolLookupCallback symbolLookUp, 115bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby void *disInfo, 116bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby MCContext *ctx) { 117bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby GetOpInfo = getOpInfo; 1189e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby SymbolLookUp = symbolLookUp; 119bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby DisInfo = disInfo; 120bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby Ctx = ctx; 121bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby } 122bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby LLVMOpInfoCallback getLLVMOpInfoCallback() const { return GetOpInfo; } 1239e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby LLVMSymbolLookupCallback getLLVMSymbolLookupCallback() const { 1249e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby return SymbolLookUp; 1259e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby } 126bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby void *getDisInfoBlock() const { return DisInfo; } 127bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby MCContext *getMCContext() const { return Ctx; } 1289e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby 1299e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby // Marked mutable because we cache it inside the disassembler, rather than 1309e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby // having to pass it around as an argument through all the autogenerated code. 1319e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby mutable raw_ostream *CommentStream; 1329899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan}; 133251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 134251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan} // namespace llvm 135251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 136251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan#endif 137