1 //===-- llvm/MC/MCInst.h - MCInst class -------------------------*- 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 contains the declaration of the MCInst and MCOperand classes, which
11 // is the basic representation used to represent low-level machine code
12 // instructions.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 /* Capstone Disassembly Engine */
17 /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
18 
19 #ifndef CS_MCINST_H
20 #define CS_MCINST_H
21 
22 #include "include/capstone/capstone.h"
23 
24 typedef struct MCInst MCInst;
25 typedef struct cs_struct cs_struct;
26 typedef struct MCOperand MCOperand;
27 
28 /// MCOperand - Instances of this class represent operands of the MCInst class.
29 /// This is a simple discriminated union.
30 struct MCOperand {
31 	enum {
32 		kInvalid = 0,                 ///< Uninitialized.
33 		kRegister,                ///< Register operand.
34 		kImmediate,               ///< Immediate operand.
35 		kFPImmediate,             ///< Floating-point immediate operand.
36 	} MachineOperandType;
37 	unsigned char Kind;
38 
39 	union {
40 		unsigned RegVal;
41 		int64_t ImmVal;
42 		double FPImmVal;
43 	};
44 };
45 
46 bool MCOperand_isValid(const MCOperand *op);
47 
48 bool MCOperand_isReg(const MCOperand *op);
49 
50 bool MCOperand_isImm(const MCOperand *op);
51 
52 bool MCOperand_isFPImm(const MCOperand *op);
53 
54 bool MCOperand_isInst(const MCOperand *op);
55 
56 /// getReg - Returns the register number.
57 unsigned MCOperand_getReg(const MCOperand *op);
58 
59 /// setReg - Set the register number.
60 void MCOperand_setReg(MCOperand *op, unsigned Reg);
61 
62 int64_t MCOperand_getImm(MCOperand *op);
63 
64 void MCOperand_setImm(MCOperand *op, int64_t Val);
65 
66 double MCOperand_getFPImm(const MCOperand *op);
67 
68 void MCOperand_setFPImm(MCOperand *op, double Val);
69 
70 const MCInst *MCOperand_getInst(const MCOperand *op);
71 
72 void MCOperand_setInst(MCOperand *op, const MCInst *Val);
73 
74 // create Reg operand in the next slot
75 void MCOperand_CreateReg0(MCInst *inst, unsigned Reg);
76 
77 // create Reg operand use the last-unused slot
78 MCOperand *MCOperand_CreateReg1(MCInst *inst, unsigned Reg);
79 
80 // create Imm operand in the next slot
81 void MCOperand_CreateImm0(MCInst *inst, int64_t Val);
82 
83 // create Imm operand in the last-unused slot
84 MCOperand *MCOperand_CreateImm1(MCInst *inst, int64_t Val);
85 
86 /// MCInst - Instances of this class represent a single low-level machine
87 /// instruction.
88 struct MCInst {
89 	unsigned OpcodePub;
90 	uint8_t size;	// number of operands
91 	bool has_imm;	// indicate this instruction has an X86_OP_IMM operand - used for ATT syntax
92 	uint8_t op1_size; // size of 1st operand - for X86 Intel syntax
93 	unsigned Opcode;
94 	MCOperand Operands[48];
95 	cs_insn *flat_insn;	// insn to be exposed to public
96 	uint64_t address;	// address of this insn
97 	cs_struct *csh;	// save the main csh
98 	uint8_t x86opsize;	// opsize for [mem] operand
99 
100 	// (Optional) instruction prefix, which can be up to 4 bytes.
101 	// A prefix byte gets value 0 when irrelevant.
102 	// This is copied from cs_x86 struct
103 	uint8_t x86_prefix[4];
104 	uint8_t imm_size;	// immediate size for X86_OP_IMM operand
105 	bool writeback;	// writeback for ARM
106 	// operand access index for list of registers sharing the same access right (for ARM)
107 	uint8_t ac_idx;
108 	uint8_t popcode_adjust;   // Pseudo X86 instruction adjust
109 	char assembly[8];	// for special instruction, so that we dont need printer
110 	unsigned char evm_data[32];	// for EVM PUSH operand
111 	uint8_t xAcquireRelease;	// X86 xacquire/xrelease
112 };
113 
114 void MCInst_Init(MCInst *inst);
115 
116 void MCInst_clear(MCInst *inst);
117 
118 // do not free operand after inserting
119 void MCInst_insert0(MCInst *inst, int index, MCOperand *Op);
120 
121 void MCInst_setOpcode(MCInst *inst, unsigned Op);
122 
123 unsigned MCInst_getOpcode(const MCInst*);
124 
125 void MCInst_setOpcodePub(MCInst *inst, unsigned Op);
126 
127 unsigned MCInst_getOpcodePub(const MCInst*);
128 
129 MCOperand *MCInst_getOperand(MCInst *inst, unsigned i);
130 
131 unsigned MCInst_getNumOperands(const MCInst *inst);
132 
133 // This addOperand2 function doesnt free Op
134 void MCInst_addOperand2(MCInst *inst, MCOperand *Op);
135 
136 #endif
137