1833a003da082ab0db343e0e640069dfc6813e7d6Nick Lewycky//===-- lib/MC/Disassembler.cpp - Disassembler Public C Interface ---------===//
293f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
393f79364351650b58172522ae8346153a3c67a5cKevin Enderby//                     The LLVM Compiler Infrastructure
493f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
593f79364351650b58172522ae8346153a3c67a5cKevin Enderby// This file is distributed under the University of Illinois Open Source
693f79364351650b58172522ae8346153a3c67a5cKevin Enderby// License. See LICENSE.TXT for details.
793f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
893f79364351650b58172522ae8346153a3c67a5cKevin Enderby//===----------------------------------------------------------------------===//
997ff42d51dc9e4ec8c4a6c2439b230bba1877553Chris Lattner
1093f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "Disassembler.h"
1193f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "llvm-c/Disassembler.h"
1293f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "llvm/MC/MCAsmInfo.h"
134c8164813c1be51f6797fda6826bdf3665f2a7d1Evan Cheng#include "llvm/MC/MCContext.h"
1493f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "llvm/MC/MCDisassembler.h"
1593f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "llvm/MC/MCInst.h"
1693f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "llvm/MC/MCInstPrinter.h"
1755e79804226f1da02ec880c120671ff930e3dbe4Sean Callanan#include "llvm/MC/MCInstrInfo.h"
184c8164813c1be51f6797fda6826bdf3665f2a7d1Evan Cheng#include "llvm/MC/MCRegisterInfo.h"
192c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha#include "llvm/MC/MCRelocationInfo.h"
2055e79804226f1da02ec880c120671ff930e3dbe4Sean Callanan#include "llvm/MC/MCSubtargetInfo.h"
21de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet#include "llvm/MC/MCSymbolizer.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
2393f79364351650b58172522ae8346153a3c67a5cKevin Enderby#include "llvm/Support/MemoryObject.h"
243e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
2593f79364351650b58172522ae8346153a3c67a5cKevin Enderby
2693f79364351650b58172522ae8346153a3c67a5cKevin Enderbynamespace llvm {
2793f79364351650b58172522ae8346153a3c67a5cKevin Enderbyclass Target;
2893f79364351650b58172522ae8346153a3c67a5cKevin Enderby} // namespace llvm
2993f79364351650b58172522ae8346153a3c67a5cKevin Enderbyusing namespace llvm;
3093f79364351650b58172522ae8346153a3c67a5cKevin Enderby
3193f79364351650b58172522ae8346153a3c67a5cKevin Enderby// LLVMCreateDisasm() creates a disassembler for the TripleName.  Symbolic
3293f79364351650b58172522ae8346153a3c67a5cKevin Enderby// disassembly is supported by passing a block of information in the DisInfo
3397ff42d51dc9e4ec8c4a6c2439b230bba1877553Chris Lattner// parameter and specifying the TagType and callback functions as described in
3493f79364351650b58172522ae8346153a3c67a5cKevin Enderby// the header llvm-c/Disassembler.h .  The pointer to the block and the
3597ff42d51dc9e4ec8c4a6c2439b230bba1877553Chris Lattner// functions can all be passed as NULL.  If successful, this returns a
3697ff42d51dc9e4ec8c4a6c2439b230bba1877553Chris Lattner// disassembler context.  If not, it returns NULL.
3793f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
3868a590df13f47180abd3022aa75f237ae993770fJim GrosbachLLVMDisasmContextRef LLVMCreateDisasmCPU(const char *Triple, const char *CPU,
3968a590df13f47180abd3022aa75f237ae993770fJim Grosbach                                         void *DisInfo, int TagType,
4068a590df13f47180abd3022aa75f237ae993770fJim Grosbach                                         LLVMOpInfoCallback GetOpInfo,
4168a590df13f47180abd3022aa75f237ae993770fJim Grosbach                                         LLVMSymbolLookupCallback SymbolLookUp){
4293f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Get the target.
4393f79364351650b58172522ae8346153a3c67a5cKevin Enderby  std::string Error;
4468a590df13f47180abd3022aa75f237ae993770fJim Grosbach  const Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
45b737702efd96d2902c7063152747e8f193aa1fbcKevin Enderby  if (!TheTarget)
46b737702efd96d2902c7063152747e8f193aa1fbcKevin Enderby    return 0;
4793f79364351650b58172522ae8346153a3c67a5cKevin Enderby
484a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  const MCRegisterInfo *MRI = TheTarget->createMCRegInfo(Triple);
494a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  if (!MRI)
504a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola    return 0;
514a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola
5293f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Get the assembler info needed to setup the MCContext.
534a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  const MCAsmInfo *MAI = TheTarget->createMCAsmInfo(*MRI, Triple);
542ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!MAI)
552ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
5693f79364351650b58172522ae8346153a3c67a5cKevin Enderby
5717463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper  const MCInstrInfo *MII = TheTarget->createMCInstrInfo();
582ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!MII)
592ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
6017463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper
6193f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Package up features to be passed to target/subtarget
6293f79364351650b58172522ae8346153a3c67a5cKevin Enderby  std::string FeaturesStr;
6393f79364351650b58172522ae8346153a3c67a5cKevin Enderby
6468a590df13f47180abd3022aa75f237ae993770fJim Grosbach  const MCSubtargetInfo *STI = TheTarget->createMCSubtargetInfo(Triple, CPU,
65b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                                                FeaturesStr);
662ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!STI)
672ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
68b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy
6993f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Set up the MCContext for creating symbols and MCExpr's.
7099cb622041a0839c7dfcf0263c5102a305a0fdb5Bill Wendling  MCContext *Ctx = new MCContext(MAI, MRI, 0);
712ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!Ctx)
722ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
7393f79364351650b58172522ae8346153a3c67a5cKevin Enderby
7493f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Set up disassembler.
75b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy  MCDisassembler *DisAsm = TheTarget->createMCDisassembler(*STI);
762ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!DisAsm)
772ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
782c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
792c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  OwningPtr<MCRelocationInfo> RelInfo(
802c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    TheTarget->createMCRelocationInfo(Triple, *Ctx));
812c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  if (!RelInfo)
822c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha    return 0;
832c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha
84de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  OwningPtr<MCSymbolizer> Symbolizer(
85de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet    TheTarget->createMCSymbolizer(Triple, GetOpInfo, SymbolLookUp, DisInfo,
86de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet                                  Ctx, RelInfo.take()));
87de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet  DisAsm->setSymbolizer(Symbolizer);
882c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha  DisAsm->setupForSymbolicDisassembly(GetOpInfo, SymbolLookUp, DisInfo,
892c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha                                      Ctx, RelInfo);
9093f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Set up the instruction printer.
9193f79364351650b58172522ae8346153a3c67a5cKevin Enderby  int AsmPrinterVariant = MAI->getAssemblerDialect();
92b262799d49891b036daa00eddf51947487346c98Evan Cheng  MCInstPrinter *IP = TheTarget->createMCInstPrinter(AsmPrinterVariant,
9317463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                                     *MAI, *MII, *MRI, *STI);
942ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!IP)
952ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
9693f79364351650b58172522ae8346153a3c67a5cKevin Enderby
9768a590df13f47180abd3022aa75f237ae993770fJim Grosbach  LLVMDisasmContext *DC = new LLVMDisasmContext(Triple, DisInfo, TagType,
9893f79364351650b58172522ae8346153a3c67a5cKevin Enderby                                                GetOpInfo, SymbolLookUp,
99203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng                                                TheTarget, MAI, MRI,
10055e79804226f1da02ec880c120671ff930e3dbe4Sean Callanan                                                STI, MII, Ctx, DisAsm, IP);
1012ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby  if (!DC)
1022ee69f1be6473bef40862f4c55e0b33d141c6380Kevin Enderby    return 0;
1038f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson
10493f79364351650b58172522ae8346153a3c67a5cKevin Enderby  return DC;
10593f79364351650b58172522ae8346153a3c67a5cKevin Enderby}
10693f79364351650b58172522ae8346153a3c67a5cKevin Enderby
10768a590df13f47180abd3022aa75f237ae993770fJim GrosbachLLVMDisasmContextRef LLVMCreateDisasm(const char *Triple, void *DisInfo,
10868a590df13f47180abd3022aa75f237ae993770fJim Grosbach                                      int TagType, LLVMOpInfoCallback GetOpInfo,
10968a590df13f47180abd3022aa75f237ae993770fJim Grosbach                                      LLVMSymbolLookupCallback SymbolLookUp) {
11068a590df13f47180abd3022aa75f237ae993770fJim Grosbach  return LLVMCreateDisasmCPU(Triple, "", DisInfo, TagType, GetOpInfo,
11168a590df13f47180abd3022aa75f237ae993770fJim Grosbach                             SymbolLookUp);
11268a590df13f47180abd3022aa75f237ae993770fJim Grosbach}
11368a590df13f47180abd3022aa75f237ae993770fJim Grosbach
11493f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
11593f79364351650b58172522ae8346153a3c67a5cKevin Enderby// LLVMDisasmDispose() disposes of the disassembler specified by the context.
11693f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
11793f79364351650b58172522ae8346153a3c67a5cKevin Enderbyvoid LLVMDisasmDispose(LLVMDisasmContextRef DCR){
11893f79364351650b58172522ae8346153a3c67a5cKevin Enderby  LLVMDisasmContext *DC = (LLVMDisasmContext *)DCR;
11993f79364351650b58172522ae8346153a3c67a5cKevin Enderby  delete DC;
12093f79364351650b58172522ae8346153a3c67a5cKevin Enderby}
12193f79364351650b58172522ae8346153a3c67a5cKevin Enderby
12293f79364351650b58172522ae8346153a3c67a5cKevin Enderbynamespace {
12393f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
12493f79364351650b58172522ae8346153a3c67a5cKevin Enderby// The memory object created by LLVMDisasmInstruction().
12593f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
12693f79364351650b58172522ae8346153a3c67a5cKevin Enderbyclass DisasmMemoryObject : public MemoryObject {
12793f79364351650b58172522ae8346153a3c67a5cKevin Enderby  uint8_t *Bytes;
12893f79364351650b58172522ae8346153a3c67a5cKevin Enderby  uint64_t Size;
12993f79364351650b58172522ae8346153a3c67a5cKevin Enderby  uint64_t BasePC;
13093f79364351650b58172522ae8346153a3c67a5cKevin Enderbypublic:
13193f79364351650b58172522ae8346153a3c67a5cKevin Enderby  DisasmMemoryObject(uint8_t *bytes, uint64_t size, uint64_t basePC) :
13293f79364351650b58172522ae8346153a3c67a5cKevin Enderby                     Bytes(bytes), Size(size), BasePC(basePC) {}
13393f79364351650b58172522ae8346153a3c67a5cKevin Enderby
13493f79364351650b58172522ae8346153a3c67a5cKevin Enderby  uint64_t getBase() const { return BasePC; }
135adef06a71458ded0716935a61b3d43d164d4df12Derek Schuff  uint64_t getExtent() const { return Size; }
13693f79364351650b58172522ae8346153a3c67a5cKevin Enderby
137adef06a71458ded0716935a61b3d43d164d4df12Derek Schuff  int readByte(uint64_t Addr, uint8_t *Byte) const {
13893f79364351650b58172522ae8346153a3c67a5cKevin Enderby    if (Addr - BasePC >= Size)
13993f79364351650b58172522ae8346153a3c67a5cKevin Enderby      return -1;
14093f79364351650b58172522ae8346153a3c67a5cKevin Enderby    *Byte = Bytes[Addr - BasePC];
14193f79364351650b58172522ae8346153a3c67a5cKevin Enderby    return 0;
14293f79364351650b58172522ae8346153a3c67a5cKevin Enderby  }
14393f79364351650b58172522ae8346153a3c67a5cKevin Enderby};
14497ff42d51dc9e4ec8c4a6c2439b230bba1877553Chris Lattner} // end anonymous namespace
14593f79364351650b58172522ae8346153a3c67a5cKevin Enderby
14693f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
1475731ff636b87abf648ceea51c404d6ae6b27f65fBenjamin Kramer// LLVMDisasmInstruction() disassembles a single instruction using the
14893f79364351650b58172522ae8346153a3c67a5cKevin Enderby// disassembler context specified in the parameter DC.  The bytes of the
1495731ff636b87abf648ceea51c404d6ae6b27f65fBenjamin Kramer// instruction are specified in the parameter Bytes, and contains at least
15093f79364351650b58172522ae8346153a3c67a5cKevin Enderby// BytesSize number of bytes.  The instruction is at the address specified by
15193f79364351650b58172522ae8346153a3c67a5cKevin Enderby// the PC parameter.  If a valid instruction can be disassembled its string is
15293f79364351650b58172522ae8346153a3c67a5cKevin Enderby// returned indirectly in OutString which whos size is specified in the
15393f79364351650b58172522ae8346153a3c67a5cKevin Enderby// parameter OutStringSize.  This function returns the number of bytes in the
15493f79364351650b58172522ae8346153a3c67a5cKevin Enderby// instruction or zero if there was no valid instruction.  If this function
15593f79364351650b58172522ae8346153a3c67a5cKevin Enderby// returns zero the caller will have to pick how many bytes they want to step
15693f79364351650b58172522ae8346153a3c67a5cKevin Enderby// over by printing a .byte, .long etc. to continue.
15793f79364351650b58172522ae8346153a3c67a5cKevin Enderby//
15893f79364351650b58172522ae8346153a3c67a5cKevin Enderbysize_t LLVMDisasmInstruction(LLVMDisasmContextRef DCR, uint8_t *Bytes,
15993f79364351650b58172522ae8346153a3c67a5cKevin Enderby                             uint64_t BytesSize, uint64_t PC, char *OutString,
16093f79364351650b58172522ae8346153a3c67a5cKevin Enderby                             size_t OutStringSize){
16193f79364351650b58172522ae8346153a3c67a5cKevin Enderby  LLVMDisasmContext *DC = (LLVMDisasmContext *)DCR;
16293f79364351650b58172522ae8346153a3c67a5cKevin Enderby  // Wrap the pointer to the Bytes, BytesSize and PC in a MemoryObject.
16393f79364351650b58172522ae8346153a3c67a5cKevin Enderby  DisasmMemoryObject MemoryObject(Bytes, BytesSize, PC);
16493f79364351650b58172522ae8346153a3c67a5cKevin Enderby
16593f79364351650b58172522ae8346153a3c67a5cKevin Enderby  uint64_t Size;
16693f79364351650b58172522ae8346153a3c67a5cKevin Enderby  MCInst Inst;
16793f79364351650b58172522ae8346153a3c67a5cKevin Enderby  const MCDisassembler *DisAsm = DC->getDisAsm();
16893f79364351650b58172522ae8346153a3c67a5cKevin Enderby  MCInstPrinter *IP = DC->getIP();
169ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  MCDisassembler::DecodeStatus S;
170ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  S = DisAsm->getInstruction(Inst, Size, MemoryObject, PC,
17198c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson                             /*REMOVE*/ nulls(), DC->CommentStream);
172ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  switch (S) {
173ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  case MCDisassembler::Fail:
174ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  case MCDisassembler::SoftFail:
175c047dcade506a5acaccb1548cb83a3f85f52d71dJames Molloy    // FIXME: Do something different for soft failure modes?
17693f79364351650b58172522ae8346153a3c67a5cKevin Enderby    return 0;
177833a003da082ab0db343e0e640069dfc6813e7d6Nick Lewycky
178ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  case MCDisassembler::Success: {
1798f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson    DC->CommentStream.flush();
1808f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson    StringRef Comments = DC->CommentsToEmit.str();
1818f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson
18298c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson    SmallVector<char, 64> InsnStr;
18398c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson    raw_svector_ostream OS(InsnStr);
18498c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson    IP->printInst(&Inst, OS, Comments);
18598c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson    OS.flush();
1868f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson
1878f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson    // Tell the comment stream that the vector changed underneath it.
18898c5ddabca1debf935a07d14d0cbc9732374bdb8Owen Anderson    DC->CommentsToEmit.clear();
1898f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson    DC->CommentStream.resync();
1908f29e6969eb99410b9914bcb5ee2d9a125f07f88Owen Anderson
191ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy    assert(OutStringSize != 0 && "Output buffer cannot be zero size");
192ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy    size_t OutputSize = std::min(OutStringSize-1, InsnStr.size());
193ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy    std::memcpy(OutString, InsnStr.data(), OutputSize);
194ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy    OutString[OutputSize] = '\0'; // Terminate string.
195833a003da082ab0db343e0e640069dfc6813e7d6Nick Lewycky
196ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy    return Size;
197ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  }
198ee06443945b4c9f471c9b80c4325075dbc27746eJames Molloy  }
1994d6ccb5f68cd7c6418a209f1fa4dbade569e4493David Blaikie  llvm_unreachable("Invalid DecodeStatus!");
20093f79364351650b58172522ae8346153a3c67a5cKevin Enderby}
2013ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby
2023ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby//
2033ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby// LLVMSetDisasmOptions() sets the disassembler's options.  It returns 1 if it
2043ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby// can set all the Options and 0 otherwise.
2053ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby//
2063ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderbyint LLVMSetDisasmOptions(LLVMDisasmContextRef DCR, uint64_t Options){
2073ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  if (Options & LLVMDisassembler_Option_UseMarkup){
2083ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby      LLVMDisasmContext *DC = (LLVMDisasmContext *)DCR;
2093ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby      MCInstPrinter *IP = DC->getIP();
2103ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby      IP->setUseMarkup(1);
2113ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby      Options &= ~LLVMDisassembler_Option_UseMarkup;
2123ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  }
21314ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  if (Options & LLVMDisassembler_Option_PrintImmHex){
21414ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby      LLVMDisasmContext *DC = (LLVMDisasmContext *)DCR;
21514ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby      MCInstPrinter *IP = DC->getIP();
21614ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby      IP->setPrintImmHex(1);
21714ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby      Options &= ~LLVMDisassembler_Option_PrintImmHex;
21814ccc9007a932a23201251ced4be4c898a62d6a5Kevin Enderby  }
2195469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby  if (Options & LLVMDisassembler_Option_AsmPrinterVariant){
2205469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      LLVMDisasmContext *DC = (LLVMDisasmContext *)DCR;
2215469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      // Try to set up the new instruction printer.
2225469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      const MCAsmInfo *MAI = DC->getAsmInfo();
2235469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      const MCInstrInfo *MII = DC->getInstrInfo();
2245469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      const MCRegisterInfo *MRI = DC->getRegisterInfo();
2255469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      const MCSubtargetInfo *STI = DC->getSubtargetInfo();
2265469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      int AsmPrinterVariant = MAI->getAssemblerDialect();
2275469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      AsmPrinterVariant = AsmPrinterVariant == 0 ? 1 : 0;
2285469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      MCInstPrinter *IP = DC->getTarget()->createMCInstPrinter(
2295469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby          AsmPrinterVariant, *MAI, *MII, *MRI, *STI);
2305469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      if (IP) {
2315469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby        DC->setIP(IP);
2325469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby        Options &= ~LLVMDisassembler_Option_AsmPrinterVariant;
2335469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby      }
2345469f605fe86edcfb6d3f0e36f3e3ce0254334ccKevin Enderby  }
2353ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby  return (Options == 0);
2363ed0316f756e2f1730f46654776fcf77f5ace7aaKevin Enderby}
237