| //===-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 |