LLVM 19.0.0git
Public Types | Public Member Functions | Public Attributes | Protected Attributes | List of all members
llvm::MCDisassembler Class Referenceabstract

Superclass for all disassemblers. More...

#include "llvm/MC/MCDisassembler/MCDisassembler.h"

Inheritance diagram for llvm::MCDisassembler:
Inheritance graph
[legend]

Public Types

enum  DecodeStatus { Fail = 0 , SoftFail = 1 , Success = 3 }
 Ternary decode status. More...
 

Public Member Functions

 MCDisassembler (const MCSubtargetInfo &STI, MCContext &Ctx)
 
virtual ~MCDisassembler ()
 
virtual DecodeStatus getInstruction (MCInst &Instr, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CStream) const =0
 Returns the disassembly of a single instruction.
 
virtual std::optional< DecodeStatusonSymbolStart (SymbolInfoTy &Symbol, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CStream) const
 Used to perform separate target specific disassembly for a particular symbol.
 
virtual uint64_t suggestBytesToSkip (ArrayRef< uint8_t > Bytes, uint64_t Address) const
 Suggest a distance to skip in a buffer of data to find the next place to look for the start of an instruction.
 
bool tryAddingSymbolicOperand (MCInst &Inst, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) const
 
void tryAddingPcLoadReferenceComment (int64_t Value, uint64_t Address) const
 
void setSymbolizer (std::unique_ptr< MCSymbolizer > Symzer)
 Set Symzer as the current symbolizer.
 
MCContextgetContext () const
 
const MCSubtargetInfogetSubtargetInfo () const
 
virtual void setABIVersion (unsigned Version)
 ELF-specific, set the ABI version from the object header.
 

Public Attributes

raw_ostreamCommentStream = nullptr
 

Protected Attributes

const MCSubtargetInfoSTI
 
std::unique_ptr< MCSymbolizerSymbolizer
 

Detailed Description

Superclass for all disassemblers.

Consumes a memory region and provides an array of assembly instructions.

Definition at line 83 of file MCDisassembler.h.

Member Enumeration Documentation

◆ DecodeStatus

Ternary decode status.

Most backends will just use Fail and Success, however some have a concept of an instruction with understandable semantics but which is architecturally incorrect. An example of this is ARM UNPREDICTABLE instructions which are disassemblable but cause undefined behaviour.

Because it makes sense to disassemble these instructions, there is a "soft fail" failure mode that indicates the MCInst& is valid but architecturally incorrect.

The enum numbers are deliberately chosen such that reduction from Success->SoftFail ->Fail can be done with a simple bitwise-AND:

LEFT & TOP = | Success Unpredictable Fail -----------—+--------------------------------— Success | Success Unpredictable Fail Unpredictable | Unpredictable Unpredictable Fail Fail | Fail Fail Fail

An easy way of encoding this is as 0b11, 0b01, 0b00 for Success, SoftFail, Fail respectively.

Enumerator
Fail 
SoftFail 
Success 

Definition at line 107 of file MCDisassembler.h.

Constructor & Destructor Documentation

◆ MCDisassembler()

llvm::MCDisassembler::MCDisassembler ( const MCSubtargetInfo STI,
MCContext Ctx 
)
inline

Definition at line 113 of file MCDisassembler.h.

◆ ~MCDisassembler()

MCDisassembler::~MCDisassembler ( )
virtualdefault

Member Function Documentation

◆ getContext()

MCContext & llvm::MCDisassembler::getContext ( ) const
inline

Definition at line 216 of file MCDisassembler.h.

Referenced by llvm::AMDGPUDisassembler::getRegClassName().

◆ getInstruction()

virtual DecodeStatus llvm::MCDisassembler::getInstruction ( MCInst Instr,
uint64_t Size,
ArrayRef< uint8_t >  Bytes,
uint64_t  Address,
raw_ostream CStream 
) const
pure virtual

Returns the disassembly of a single instruction.

Parameters
Instr- An MCInst to populate with the contents of the instruction.
Size- A value to populate with the size of the instruction, or the number of bytes consumed while attempting to decode an invalid instruction.
Address- The address, in the memory space of region, of the first byte of the instruction.
Bytes- A reference to the actual bytes of the instruction.
CStream- The stream to print comments and annotations on.
Returns
- MCDisassembler::Success if the instruction is valid, MCDisassembler::SoftFail if the instruction was disassemblable but invalid, MCDisassembler::Fail if the instruction was invalid.

Implemented in llvm::AArch64Disassembler, llvm::LanaiDisassembler, M68kDisassembler, and llvm::AMDGPUDisassembler.

Referenced by llvm::orc::addFunctionPointerRelocationsToCurrentSymbol(), and LLVMDisasmInstruction().

◆ getSubtargetInfo()

const MCSubtargetInfo & llvm::MCDisassembler::getSubtargetInfo ( ) const
inline

◆ onSymbolStart()

std::optional< MCDisassembler::DecodeStatus > MCDisassembler::onSymbolStart ( SymbolInfoTy Symbol,
uint64_t Size,
ArrayRef< uint8_t >  Bytes,
uint64_t  Address,
raw_ostream CStream 
) const
virtual

Used to perform separate target specific disassembly for a particular symbol.

May parse any prelude that precedes instructions after the start of a symbol, or the entire symbol. This is used for example by WebAssembly to decode preludes.

Base implementation returns std::nullopt. So all targets by default ignore to treat symbols separately.

Parameters
Symbol- The symbol.
Size- The number of bytes consumed.
Address- The address, in the memory space of region, of the first byte of the symbol.
Bytes- A reference to the actual bytes at the symbol location.
CStream- The stream to print comments and annotations on.
Returns
- MCDisassembler::Success if bytes are decoded successfully. Size must hold the number of bytes that were decoded.
  • MCDisassembler::Fail if the bytes are invalid. Size must hold the number of bytes that were decoded before failing. The target must print nothing. This can be done by buffering the output if needed.
  • std::nullopt if the target doesn't want to handle the symbol separately. Value of Size is ignored in this case.

Reimplemented in llvm::AMDGPUDisassembler.

Definition at line 17 of file MCDisassembler.cpp.

◆ setABIVersion()

virtual void llvm::MCDisassembler::setABIVersion ( unsigned  Version)
inlinevirtual

ELF-specific, set the ABI version from the object header.

Reimplemented in llvm::AMDGPUDisassembler.

Definition at line 221 of file MCDisassembler.h.

◆ setSymbolizer()

void MCDisassembler::setSymbolizer ( std::unique_ptr< MCSymbolizer Symzer)

Set Symzer as the current symbolizer.

This takes ownership of Symzer, and deletes the previously set one.

Definition at line 45 of file MCDisassembler.cpp.

References Symbolizer.

◆ suggestBytesToSkip()

uint64_t MCDisassembler::suggestBytesToSkip ( ArrayRef< uint8_t >  Bytes,
uint64_t  Address 
) const
virtual

Suggest a distance to skip in a buffer of data to find the next place to look for the start of an instruction.

For example, if all instructions have a fixed alignment, this might advance to the next multiple of that alignment.

If not overridden, the default is 1.

Parameters
Address- The address, in the memory space of region, of the starting point (typically the first byte of something that did not decode as a valid instruction at all).
Bytes- A reference to the actual bytes at Address. May be needed in order to determine the width of an unrecognized instruction (e.g. in Thumb this is a simple consistent criterion that doesn't require knowing the specific instruction). The caller can pass as much data as they have available, and the function is required to make a reasonable default choice if not enough data is available to make a better one.
Returns
- A number of bytes to skip. Must always be greater than zero. May be greater than the size of Bytes.

Reimplemented in llvm::AArch64Disassembler.

Definition at line 23 of file MCDisassembler.cpp.

◆ tryAddingPcLoadReferenceComment()

void MCDisassembler::tryAddingPcLoadReferenceComment ( int64_t  Value,
uint64_t  Address 
) const

Definition at line 39 of file MCDisassembler.cpp.

References llvm::Address, CommentStream, and Symbolizer.

Referenced by translateRMMemory(), and tryAddingPcLoadReferenceComment().

◆ tryAddingSymbolicOperand()

bool MCDisassembler::tryAddingSymbolicOperand ( MCInst Inst,
int64_t  Value,
uint64_t  Address,
bool  IsBranch,
uint64_t  Offset,
uint64_t  OpSize,
uint64_t  InstSize 
) const

Member Data Documentation

◆ CommentStream

raw_ostream* llvm::MCDisassembler::CommentStream = nullptr
mutable

◆ STI

const MCSubtargetInfo& llvm::MCDisassembler::STI
protected

◆ Symbolizer

std::unique_ptr<MCSymbolizer> llvm::MCDisassembler::Symbolizer
protected

The documentation for this class was generated from the following files: