EDInst.h revision 847da55716e9c1d39c08ed052bc86d28796cb91f
1//===-- EDInst.h - LLVM Enhanced Disassembler -------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the interface for the Enhanced Disassembly library's 11// instruction class. The instruction is responsible for vending the string 12// representation, individual tokens and operands for a single instruction. 13// 14//===----------------------------------------------------------------------===// 15 16#ifndef LLVM_EDINST_H 17#define LLVM_EDINST_H 18 19#include "llvm/ADT/SmallVector.h" 20#include <string> 21#include <vector> 22 23namespace llvm { 24 class MCInst; 25 struct EDInstInfo; 26 struct EDToken; 27 struct EDDisassembler; 28 struct EDOperand; 29 30#ifdef __BLOCKS__ 31 typedef int (^EDTokenVisitor_t)(EDToken *token); 32#endif 33 34/// CachedResult - Encapsulates the result of a function along with the validity 35/// of that result, so that slow functions don't need to run twice 36struct CachedResult { 37 /// True if the result has been obtained by executing the function 38 bool Valid; 39 /// The result last obtained from the function 40 int Result; 41 42 /// Constructor - Initializes an invalid result 43 CachedResult() : Valid(false) { } 44 /// valid - Returns true if the result has been obtained by executing the 45 /// function and false otherwise 46 bool valid() { return Valid; } 47 /// result - Returns the result of the function or an undefined value if 48 /// valid() is false 49 int result() { return Result; } 50 /// setResult - Sets the result of the function and declares it valid 51 /// returning the result (so that setResult() can be called from inside a 52 /// return statement) 53 /// @arg result - The result of the function 54 int setResult(int result) { Result = result; Valid = true; return result; } 55}; 56 57/// EDInst - Encapsulates a single instruction, which can be queried for its 58/// string representation, as well as its operands and tokens 59struct EDInst { 60 /// The parent disassembler 61 EDDisassembler &Disassembler; 62 /// The containing MCInst 63 llvm::MCInst *Inst; 64 /// The instruction information provided by TableGen for this instruction 65 const llvm::EDInstInfo *ThisInstInfo; 66 /// The number of bytes for the machine code representation of the instruction 67 uint64_t ByteSize; 68 69 /// The result of the stringify() function 70 CachedResult StringifyResult; 71 /// The string representation of the instruction 72 std::string String; 73 /// The order in which operands from the InstInfo's operand information appear 74 /// in String 75 const char* OperandOrder; 76 77 /// The result of the parseOperands() function 78 CachedResult ParseResult; 79 typedef llvm::SmallVector<EDOperand*, 5> opvec_t; 80 /// The instruction's operands 81 opvec_t Operands; 82 /// The operand corresponding to the target, if the instruction is a branch 83 int BranchTarget; 84 /// The operand corresponding to the source, if the instruction is a move 85 int MoveSource; 86 /// The operand corresponding to the target, if the instruction is a move 87 int MoveTarget; 88 89 /// The result of the tokenize() function 90 CachedResult TokenizeResult; 91 typedef std::vector<EDToken*> tokvec_t; 92 /// The instruction's tokens 93 tokvec_t Tokens; 94 95 /// Constructor - initializes an instruction given the output of the LLVM 96 /// C++ disassembler 97 /// 98 /// @arg inst - The MCInst, which will now be owned by this object 99 /// @arg byteSize - The size of the consumed instruction, in bytes 100 /// @arg disassembler - The parent disassembler 101 /// @arg instInfo - The instruction information produced by the table 102 /// generator for this instruction 103 EDInst(llvm::MCInst *inst, 104 uint64_t byteSize, 105 EDDisassembler &disassembler, 106 const llvm::EDInstInfo *instInfo); 107 ~EDInst(); 108 109 /// byteSize - returns the number of bytes consumed by the machine code 110 /// representation of the instruction 111 uint64_t byteSize(); 112 /// instID - returns the LLVM instruction ID of the instruction 113 unsigned instID(); 114 115 /// stringify - populates the String and AsmString members of the instruction, 116 /// returning 0 on success or -1 otherwise 117 int stringify(); 118 /// getString - retrieves a pointer to the string representation of the 119 /// instructinon, returning 0 on success or -1 otherwise 120 /// 121 /// @arg str - A reference to a pointer that, on success, is set to point to 122 /// the string representation of the instruction; this string is still owned 123 /// by the instruction and will be deleted when it is 124 int getString(const char *&str); 125 126 /// isBranch - Returns true if the instruction is a branch 127 bool isBranch(); 128 /// isMove - Returns true if the instruction is a move 129 bool isMove(); 130 131 /// parseOperands - populates the Operands member of the instruction, 132 /// returning 0 on success or -1 otherwise 133 int parseOperands(); 134 /// branchTargetID - returns the ID (suitable for use with getOperand()) of 135 /// the target operand if the instruction is a branch, or -1 otherwise 136 int branchTargetID(); 137 /// moveSourceID - returns the ID of the source operand if the instruction 138 /// is a move, or -1 otherwise 139 int moveSourceID(); 140 /// moveTargetID - returns the ID of the target operand if the instruction 141 /// is a move, or -1 otherwise 142 int moveTargetID(); 143 144 /// numOperands - returns the number of operands available to retrieve, or -1 145 /// on error 146 int numOperands(); 147 /// getOperand - retrieves an operand from the instruction's operand list by 148 /// index, returning 0 on success or -1 on error 149 /// 150 /// @arg operand - A reference whose target is pointed at the operand on 151 /// success, although the operand is still owned by the EDInst 152 /// @arg index - The index of the operand in the instruction 153 int getOperand(EDOperand *&operand, unsigned int index); 154 155 /// tokenize - populates the Tokens member of the instruction, returning 0 on 156 /// success or -1 otherwise 157 int tokenize(); 158 /// numTokens - returns the number of tokens in the instruction, or -1 on 159 /// error 160 int numTokens(); 161 /// getToken - retrieves a token from the instruction's token list by index, 162 /// returning 0 on success or -1 on error 163 /// 164 /// @arg token - A reference whose target is pointed at the token on success, 165 /// although the token is still owned by the EDInst 166 /// @arg index - The index of the token in the instrcutino 167 int getToken(EDToken *&token, unsigned int index); 168 169#ifdef __BLOCKS__ 170 /// visitTokens - Visits each token in turn and applies a block to it, 171 /// returning 0 if all blocks are visited and/or the block signals 172 /// termination by returning 1; returns -1 on error 173 /// 174 /// @arg visitor - The visitor block to apply to all tokens. 175 int visitTokens(EDTokenVisitor_t visitor); 176#endif 177}; 178 179} // end namespace llvm 180 181#endif 182