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//===----------------------------------------------------------------------===// 9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_MC_MCDISASSEMBLER_MCDISASSEMBLER_H 10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_MC_MCDISASSEMBLER_MCDISASSEMBLER_H 11251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 12bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderby#include "llvm-c/Disassembler.h" 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/MC/MCDisassembler/MCSymbolizer.h" 14255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/DataTypes.h" 15251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 16251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanannamespace llvm { 17639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainartemplate <typename T> class ArrayRef; 19251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass MCInst; 20b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloyclass MCSubtargetInfo; 21251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass raw_ostream; 22bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderbyclass MCContext; 23639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach 2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// Superclass for all disassemblers. Consumes a memory region and provides an 2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// array of assembly instructions. 26251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananclass MCDisassembler { 27251ef612a812ac99edeab6c08a752bf8ca220921Sean Callananpublic: 2883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Ternary decode status. Most backends will just use Fail and 2983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Success, however some have a concept of an instruction with 3083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// understandable semantics but which is architecturally 3183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// incorrect. An example of this is ARM UNPREDICTABLE instructions 3283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// which are disassemblable but cause undefined behaviour. 3383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 3483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Because it makes sense to disassemble these instructions, there 3583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// is a "soft fail" failure mode that indicates the MCInst& is 3683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// valid but architecturally incorrect. 3783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 3883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// The enum numbers are deliberately chosen such that reduction 3983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// from Success->SoftFail ->Fail can be done with a simple 4083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// bitwise-AND: 4183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 4283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// LEFT & TOP = | Success Unpredictable Fail 4383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// --------------+----------------------------------- 4483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Success | Success Unpredictable Fail 4583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Unpredictable | Unpredictable Unpredictable Fail 4683e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Fail | Fail Fail Fail 4783e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// 4883e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// An easy way of encoding this is as 0b11, 0b01, 0b00 for 4983e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// Success, SoftFail, Fail respectively. 5083e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson enum DecodeStatus { 5183e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson Fail = 0, 5283e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson SoftFail = 1, 5383e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson Success = 3 5483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson }; 5583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx) 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : Ctx(Ctx), STI(STI), Symbolizer(), CommentStream(nullptr) {} 58639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach 59251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan virtual ~MCDisassembler(); 60639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach 6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Returns the disassembly of a single instruction. 62251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// 636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Instr - An MCInst to populate with the contents of the 64251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// instruction. 656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Size - A value to populate with the size of the instruction, or 66251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// the number of bytes consumed while attempting to decode 67251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// an invalid instruction. 686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param Address - The address, in the memory space of region, of the first 69251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan /// byte of the instruction. 706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param VStream - The stream to print warnings and diagnostic messages on. 716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \param CStream - The stream to print comments and annotations on. 726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// \return - MCDisassembler::Success if the instruction is valid, 73639aa87bee77fe2d83f0978ae1eea53e49def324Jim Grosbach /// MCDisassembler::SoftFail if the instruction was 7483e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// disassemblable but invalid, 7583e3f67fb68d497b600da83a62f000fcce7868a9Owen Anderson /// MCDisassembler::Fail if the instruction was invalid. 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines virtual DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, 7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ArrayRef<uint8_t> Bytes, uint64_t Address, 7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines raw_ostream &VStream, 7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines raw_ostream &CStream) const = 0; 8037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 81de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombetprivate: 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCContext &Ctx; 839899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan 84b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloyprotected: 85b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy // Subtarget information, for instruction decoding predicates if required. 86b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCSubtargetInfo &STI; 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<MCSymbolizer> Symbolizer; 882c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 89bd3327654b5708f1ba92aff3ab25b1bbf5034797Kevin Enderbypublic: 902c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha // Helpers around MCSymbolizer 912c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha bool tryAddingSymbolicOperand(MCInst &Inst, 922c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha int64_t Value, 932c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha uint64_t Address, bool IsBranch, 942c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha uint64_t Offset, uint64_t InstSize) const; 952c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 962c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha void tryAddingPcLoadReferenceComment(int64_t Value, uint64_t Address) const; 972c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 982c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// Set \p Symzer as the current symbolizer. 992c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha /// This takes ownership of \p Symzer, and deletes the previously set one. 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setSymbolizer(std::unique_ptr<MCSymbolizer> Symzer); 1012c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCContext& getContext() const { return Ctx; } 103de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet 10462ab26548fee37422fb90daaac22fc1140be797dArtyom Skrobov const MCSubtargetInfo& getSubtargetInfo() const { return STI; } 10562ab26548fee37422fb90daaac22fc1140be797dArtyom Skrobov 1069e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby // Marked mutable because we cache it inside the disassembler, rather than 1079e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby // having to pass it around as an argument through all the autogenerated code. 1089e5887b17e634b98f7c1cf0ee4f25c218097d08eKevin Enderby mutable raw_ostream *CommentStream; 1099899f70a7406d632c82849978bf6981f1ee4ccb5Sean Callanan}; 110251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 111251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan} // namespace llvm 112251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan 113251ef612a812ac99edeab6c08a752bf8ca220921Sean Callanan#endif 114