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