1221337Sdim//===------------- Disassembler.h - LLVM Disassembler -----------*- C++ -*-===// 2221337Sdim// 3221337Sdim// The LLVM Compiler Infrastructure 4221337Sdim// 5221337Sdim// This file is distributed under the University of Illinois Open Source 6221337Sdim// License. See LICENSE.TXT for details. 7221337Sdim// 8221337Sdim//===----------------------------------------------------------------------===// 9221337Sdim// 10221337Sdim// This file defines the interface for the Disassembly library's disassembler 11221337Sdim// context. The disassembler is responsible for producing strings for 12221337Sdim// individual instructions according to a given architecture and disassembly 13221337Sdim// syntax. 14221337Sdim// 15221337Sdim//===----------------------------------------------------------------------===// 16221337Sdim 17280031Sdim#ifndef LLVM_LIB_MC_MCDISASSEMBLER_DISASSEMBLER_H 18280031Sdim#define LLVM_LIB_MC_MCDISASSEMBLER_DISASSEMBLER_H 19221337Sdim 20221337Sdim#include "llvm-c/Disassembler.h" 21226633Sdim#include "llvm/ADT/SmallString.h" 22226633Sdim#include "llvm/Support/raw_ostream.h" 23249423Sdim#include <string> 24221337Sdim 25221337Sdimnamespace llvm { 26221337Sdimclass MCContext; 27221337Sdimclass MCAsmInfo; 28221337Sdimclass MCDisassembler; 29221337Sdimclass MCInstPrinter; 30234353Sdimclass MCInstrInfo; 31226633Sdimclass MCRegisterInfo; 32234353Sdimclass MCSubtargetInfo; 33221337Sdimclass Target; 34221337Sdim 35221337Sdim// 36221337Sdim// This is the disassembler context returned by LLVMCreateDisasm(). 37221337Sdim// 38221337Sdimclass LLVMDisasmContext { 39221337Sdimprivate: 40221337Sdim // 41221337Sdim // The passed parameters when the disassembler context is created. 42221337Sdim // 43221337Sdim // The TripleName for this disassembler. 44221337Sdim std::string TripleName; 45221337Sdim // The pointer to the caller's block of symbolic information. 46221337Sdim void *DisInfo; 47221337Sdim // The Triple specific symbolic information type returned by GetOpInfo. 48221337Sdim int TagType; 49221337Sdim // The function to get the symbolic information for operands. 50221337Sdim LLVMOpInfoCallback GetOpInfo; 51221337Sdim // The function to look up a symbol name. 52221337Sdim LLVMSymbolLookupCallback SymbolLookUp; 53221337Sdim // 54221337Sdim // The objects created and saved by LLVMCreateDisasm() then used by 55221337Sdim // LLVMDisasmInstruction(). 56221337Sdim // 57221337Sdim // The LLVM target corresponding to the disassembler. 58276479Sdim // FIXME: using std::unique_ptr<const llvm::Target> causes a malloc error 59221337Sdim // when this LLVMDisasmContext is deleted. 60221337Sdim const Target *TheTarget; 61221337Sdim // The assembly information for the target architecture. 62276479Sdim std::unique_ptr<const llvm::MCAsmInfo> MAI; 63226633Sdim // The register information for the target architecture. 64276479Sdim std::unique_ptr<const llvm::MCRegisterInfo> MRI; 65234353Sdim // The subtarget information for the target architecture. 66276479Sdim std::unique_ptr<const llvm::MCSubtargetInfo> MSI; 67234353Sdim // The instruction information for the target architecture. 68276479Sdim std::unique_ptr<const llvm::MCInstrInfo> MII; 69221337Sdim // The assembly context for creating symbols and MCExprs. 70276479Sdim std::unique_ptr<const llvm::MCContext> Ctx; 71221337Sdim // The disassembler for the target architecture. 72276479Sdim std::unique_ptr<const llvm::MCDisassembler> DisAsm; 73221337Sdim // The instruction printer for the target architecture. 74276479Sdim std::unique_ptr<llvm::MCInstPrinter> IP; 75261991Sdim // The options used to set up the disassembler. 76261991Sdim uint64_t Options; 77261991Sdim // The CPU string. 78261991Sdim std::string CPU; 79221337Sdim 80221337Sdimpublic: 81226633Sdim // Comment stream and backing vector. 82226633Sdim SmallString<128> CommentsToEmit; 83226633Sdim raw_svector_ostream CommentStream; 84226633Sdim 85221337Sdim LLVMDisasmContext(std::string tripleName, void *disInfo, int tagType, 86221337Sdim LLVMOpInfoCallback getOpInfo, 87221337Sdim LLVMSymbolLookupCallback symbolLookUp, 88221337Sdim const Target *theTarget, const MCAsmInfo *mAI, 89226633Sdim const MCRegisterInfo *mRI, 90234353Sdim const MCSubtargetInfo *mSI, 91234353Sdim const MCInstrInfo *mII, 92221337Sdim llvm::MCContext *ctx, const MCDisassembler *disAsm, 93221337Sdim MCInstPrinter *iP) : TripleName(tripleName), 94221337Sdim DisInfo(disInfo), TagType(tagType), GetOpInfo(getOpInfo), 95226633Sdim SymbolLookUp(symbolLookUp), TheTarget(theTarget), 96261991Sdim Options(0), 97226633Sdim CommentStream(CommentsToEmit) { 98221337Sdim MAI.reset(mAI); 99226633Sdim MRI.reset(mRI); 100234353Sdim MSI.reset(mSI); 101234353Sdim MII.reset(mII); 102221337Sdim Ctx.reset(ctx); 103221337Sdim DisAsm.reset(disAsm); 104221337Sdim IP.reset(iP); 105221337Sdim } 106239462Sdim const std::string &getTripleName() const { return TripleName; } 107239462Sdim void *getDisInfo() const { return DisInfo; } 108239462Sdim int getTagType() const { return TagType; } 109239462Sdim LLVMOpInfoCallback getGetOpInfo() const { return GetOpInfo; } 110239462Sdim LLVMSymbolLookupCallback getSymbolLookupCallback() const { 111239462Sdim return SymbolLookUp; 112239462Sdim } 113239462Sdim const Target *getTarget() const { return TheTarget; } 114221337Sdim const MCDisassembler *getDisAsm() const { return DisAsm.get(); } 115226633Sdim const MCAsmInfo *getAsmInfo() const { return MAI.get(); } 116249423Sdim const MCInstrInfo *getInstrInfo() const { return MII.get(); } 117249423Sdim const MCRegisterInfo *getRegisterInfo() const { return MRI.get(); } 118249423Sdim const MCSubtargetInfo *getSubtargetInfo() const { return MSI.get(); } 119221337Sdim MCInstPrinter *getIP() { return IP.get(); } 120249423Sdim void setIP(MCInstPrinter *NewIP) { IP.reset(NewIP); } 121261991Sdim uint64_t getOptions() const { return Options; } 122261991Sdim void addOptions(uint64_t Options) { this->Options |= Options; } 123261991Sdim StringRef getCPU() const { return CPU; } 124261991Sdim void setCPU(const char *CPU) { this->CPU = CPU; } 125221337Sdim}; 126221337Sdim 127221337Sdim} // namespace llvm 128221337Sdim 129221337Sdim#endif 130