40 void *DisInfo,
int TagType,
63 std::string FeaturesStr;
87 Ctx, RelInfo.take()));
94 *MAI, *MII, *MRI, *STI);
99 GetOpInfo, SymbolLookUp,
101 STI, MII, Ctx, DisAsm, IP);
133 DisasmMemoryObject(uint8_t *bytes, uint64_t size, uint64_t basePC) :
134 Bytes(bytes), Size(size), BasePC(basePC) {}
136 uint64_t getBase()
const {
return BasePC; }
137 uint64_t getExtent()
const {
return Size; }
139 int readByte(uint64_t Addr, uint8_t *Byte)
const {
140 if (Addr - BasePC >= Size)
142 *Byte = Bytes[Addr - BasePC];
160 while (!Comments.
empty()) {
165 size_t Position = Comments.
find(
'\n');
166 FormattedOS << CommentBegin <<
' ' << Comments.
substr(0, Position);
168 Comments = Comments.
substr(Position+1);
183 const int NoInformationAvailable = -1;
187 return NoInformationAvailable;
197 for (
unsigned OpIdx = 0, OpIdxEnd = Inst.
getNumOperands(); OpIdx != OpIdxEnd;
211 const int NoInformationAvailable = -1;
226 return NoInformationAvailable;
231 DefIdx != DefEnd; ++DefIdx) {
235 Latency = std::max(Latency, WLEntry->
Cycles);
267 uint64_t BytesSize, uint64_t PC,
char *OutString,
268 size_t OutStringSize){
281 nulls(), Annotations);
295 IP->
printInst(&Inst, FormattedOS, AnnotationsStr);
302 assert(OutStringSize != 0 &&
"Output buffer cannot be zero size");
303 size_t OutputSize = std::min(OutStringSize-1, InsnStr.
size());
305 OutString[OutputSize] =
'\0';
322 DC->
addOptions(LLVMDisassembler_Option_UseMarkup);
323 Options &= ~LLVMDisassembler_Option_UseMarkup;
329 DC->
addOptions(LLVMDisassembler_Option_PrintImmHex);
330 Options &= ~LLVMDisassembler_Option_PrintImmHex;
340 AsmPrinterVariant = AsmPrinterVariant == 0 ? 1 : 0;
342 AsmPrinterVariant, *MAI, *MII, *MRI, *STI);
345 DC->
addOptions(LLVMDisassembler_Option_AsmPrinterVariant);
346 Options &= ~LLVMDisassembler_Option_AsmPrinterVariant;
353 DC->
addOptions(LLVMDisassembler_Option_SetInstrComments);
354 Options &= ~LLVMDisassembler_Option_SetInstrComments;
358 DC->
addOptions(LLVMDisassembler_Option_PrintLatency);
359 Options &= ~LLVMDisassembler_Option_PrintLatency;
361 return (Options == 0);
void setIP(MCInstPrinter *NewIP)
unsigned getAssemblerDialect() const
#define LLVMDisassembler_Option_SetInstrComments
const MCAsmInfo * getAsmInfo() const
const MCRegisterInfo * getRegisterInfo() const
InstrItineraryData getInstrItineraryForCPU(StringRef CPU) const
LLVMDisasmContextRef LLVMCreateDisasm(const char *Triple, void *DisInfo, int TagType, LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp)
const char *(* LLVMSymbolLookupCallback)(void *DisInfo, uint64_t ReferenceValue, uint64_t *ReferenceType, uint64_t ReferencePC, const char **ReferenceName)
size_t find(char C, size_t From=0) const
StringRef substr(size_t Start, size_t N=npos) const
void setPrintImmHex(bool Value)
const MCSchedModel * getSchedModel() const
uint64_t getOptions() const
#define LLVMDisassembler_Option_UseMarkup
static const Target * lookupTarget(const std::string &Triple, std::string &Error)
LLVMDisasmContextRef LLVMCreateDisasmCPU(const char *Triple, const char *CPU, void *DisInfo, int TagType, LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp)
virtual void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot)=0
MCInstrInfo * createMCInstrInfo() const
const MCDisassembler * getDisAsm() const
MCAsmInfo * createMCAsmInfo(const MCRegisterInfo &MRI, StringRef Triple) const
int getOperandCycle(unsigned ItinClassIndx, unsigned OperandIdx) const
const MCSubtargetInfo * getSubtargetInfo() const
#define llvm_unreachable(msg)
unsigned getCommentColumn() const
static int getItineraryLatency(LLVMDisasmContext *DC, const MCInst &Inst)
Gets latency information for Inst form the itinerary scheduling model, based on DC information...
raw_svector_ostream CommentStream
static void emitLatency(LLVMDisasmContext *DC, const MCInst &Inst)
Emits latency information in DC->CommentStream for Inst, based on the information available in DC...
MCInstPrinter * createMCInstPrinter(unsigned SyntaxVariant, const MCAsmInfo &MAI, const MCInstrInfo &MII, const MCRegisterInfo &MRI, const MCSubtargetInfo &STI) const
void * LLVMDisasmContextRef
static int getLatency(LLVMDisasmContext *DC, const MCInst &Inst)
Gets latency information for Inst, based on DC information.
void setSymbolizer(OwningPtr< MCSymbolizer > &Symzer)
unsigned NumWriteLatencyEntries
void setCommentStream(raw_ostream &OS)
setCommentStream - Specify a stream to emit comments to.
#define LLVMDisassembler_Option_PrintImmHex
const MCWriteLatencyEntry * getWriteLatencyEntry(const MCSchedClassDesc *SC, unsigned DefIdx) const
virtual DecodeStatus getInstruction(MCInst &instr, uint64_t &size, const MemoryObject ®ion, uint64_t address, raw_ostream &vStream, raw_ostream &cStream) const =0
MCRelocationInfo * createMCRelocationInfo(StringRef TT, MCContext &Ctx) const
static void emitComments(LLVMDisasmContext *DC, formatted_raw_ostream &FormattedOS)
Emits the comments that are stored in DC comment stream. Each comment in the comment stream must end ...
MCSubtargetInfo * createMCSubtargetInfo(StringRef Triple, StringRef CPU, StringRef Features) const
const MCInstrDesc & get(unsigned Opcode) const
void setupForSymbolicDisassembly(LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, MCContext *Ctx, OwningPtr< MCRelocationInfo > &RelInfo)
Sets up an external symbolizer that uses the C API callbacks.
const MCInstrInfo * getInstrInfo() const
bool hasInstrSchedModel() const
Does this machine model include instruction-level scheduling.
MCDisassembler * createMCDisassembler(const MCSubtargetInfo &STI) const
unsigned getOpcode() const
StringRef str() const
Explicit conversion to StringRef.
void setUseMarkup(bool Value)
const MCSchedClassDesc * getSchedClassDesc(unsigned SchedClassIdx) const
size_t LLVMDisasmInstruction(LLVMDisasmContextRef DCR, uint8_t *Bytes, uint64_t BytesSize, uint64_t PC, char *OutString, size_t OutStringSize)
int LLVMSetDisasmOptions(LLVMDisasmContextRef DCR, uint64_t Options)
#define LLVMDisassembler_Option_AsmPrinterVariant
MCSymbolizer * createMCSymbolizer(StringRef TT, LLVMOpInfoCallback GetOpInfo, LLVMSymbolLookupCallback SymbolLookUp, void *DisInfo, MCContext *Ctx, MCRelocationInfo *RelInfo) const
unsigned getSchedClass() const
Return the scheduling class for this instruction. The scheduling class is an index into the InstrItin...
pointer data()
data - Return a pointer to the vector's buffer, even if empty().
MCRegisterInfo * createMCRegInfo(StringRef Triple) const
unsigned getNumOperands() const
void LLVMDisasmDispose(LLVMDisasmContextRef DCR)
raw_ostream & nulls()
nulls() - This returns a reference to a raw_ostream which discards output.
void addOptions(uint64_t Options)
void setCPU(const char *CPU)
const MCRegisterInfo & MRI
SmallString< 128 > CommentsToEmit
int(* LLVMOpInfoCallback)(void *DisInfo, uint64_t PC, uint64_t Offset, uint64_t Size, int TagType, void *TagBuf)
const char * getCommentString() const
const Target * getTarget() const
bool empty() const
empty - Check if the string is empty.
#define LLVMDisassembler_Option_PrintLatency