//===-EDOperand.h - LLVM Enhanced Disassembler ------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the interface for the Enhanced Disassembly library's // operand class. The operand is responsible for allowing evaluation given a // particular register context. // //===----------------------------------------------------------------------===// #ifndef LLVM_EDOPERAND_H #define LLVM_EDOPERAND_H #include "llvm/Support/DataTypes.h" namespace llvm { struct EDDisassembler; struct EDInst; typedef int (*EDRegisterReaderCallback)(uint64_t *value, unsigned regID, void* arg); /// EDOperand - Encapsulates a single operand, which can be evaluated by the /// client struct EDOperand { /// The parent disassembler const EDDisassembler &Disassembler; /// The parent instruction const EDInst &Inst; /// The index of the operand in the EDInst unsigned int OpIndex; /// The index of the first component of the operand in the MCInst unsigned int MCOpIndex; /// Constructor - Initializes an EDOperand /// /// @arg disassembler - The disassembler responsible for the operand /// @arg inst - The instruction containing this operand /// @arg opIndex - The index of the operand in inst /// @arg mcOpIndex - The index of the operand in the original MCInst EDOperand(const EDDisassembler &disassembler, const EDInst &inst, unsigned int opIndex, unsigned int &mcOpIndex); ~EDOperand(); /// evaluate - Returns the numeric value of an operand to the extent possible, /// returning 0 on success or -1 if there was some problem (such as a /// register not being readable) /// /// @arg result - A reference whose target is filled in with the value of /// the operand (the address if it is a memory operand) /// @arg callback - A function to call to obtain register values /// @arg arg - An opaque argument to pass to callback int evaluate(uint64_t &result, EDRegisterReaderCallback callback, void *arg); /// isRegister - Returns 1 if the operand is a register or 0 otherwise int isRegister(); /// regVal - Returns the register value. unsigned regVal(); /// isImmediate - Returns 1 if the operand is an immediate or 0 otherwise int isImmediate(); /// immediateVal - Returns the immediate value. uint64_t immediateVal(); /// isMemory - Returns 1 if the operand is a memory location or 0 otherwise int isMemory(); #ifdef __BLOCKS__ typedef int (^EDRegisterBlock_t)(uint64_t *value, unsigned regID); /// evaluate - Like evaluate for a callback, but uses a block instead int evaluate(uint64_t &result, EDRegisterBlock_t regBlock); #endif }; } // end namespace llvm #endif