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