blob: 2ac6c79296a0e239c90dac4bdb7f2b5ce3ae3e22 [file] [log] [blame]
Sean Callananbd51cdd2010-01-29 01:30:01 +00001//===-EDMain.cpp - LLVM Enhanced Disassembly C API ------------------------===//
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 implements the enhanced disassembler's public C API.
11//
12//===----------------------------------------------------------------------===//
13
Sean Callananee5dfd42010-02-01 08:49:35 +000014#include "EDDisassembler.h"
15#include "EDInst.h"
16#include "EDOperand.h"
17#include "EDToken.h"
18
19#include "llvm-c/EnhancedDisassembly.h"
Sean Callananbd51cdd2010-01-29 01:30:01 +000020
21int EDGetDisassembler(EDDisassemblerRef *disassembler,
22 const char *triple,
23 EDAssemblySyntax_t syntax) {
Sean Callananee5dfd42010-02-01 08:49:35 +000024 EDDisassembler::initialize();
25
26 EDDisassemblerRef ret = EDDisassembler::getDisassembler(triple,
27 syntax);
28
29 if (ret) {
30 *disassembler = ret;
31 return 0;
32 }
33 else {
34 return -1;
35 }
Sean Callananbd51cdd2010-01-29 01:30:01 +000036}
Sean Callananee5dfd42010-02-01 08:49:35 +000037
38int EDGetRegisterName(const char** regName,
39 EDDisassemblerRef disassembler,
40 unsigned regID) {
41 const char* name = disassembler->nameWithRegisterID(regID);
42 if(!name)
43 return -1;
44 *regName = name;
45 return 0;
46}
47
48int EDRegisterIsStackPointer(EDDisassemblerRef disassembler,
49 unsigned regID) {
50 return disassembler->registerIsStackPointer(regID) ? 1 : 0;
51}
52
53int EDRegisterIsProgramCounter(EDDisassemblerRef disassembler,
54 unsigned regID) {
55 return disassembler->registerIsProgramCounter(regID) ? 1 : 0;
56}
57
58unsigned int EDCreateInsts(EDInstRef *insts,
59 unsigned int count,
60 EDDisassemblerRef disassembler,
61 EDByteReaderCallback byteReader,
62 uint64_t address,
63 void *arg) {
64 unsigned int index;
65
66 for (index = 0; index < count; index++) {
67 EDInst *inst = disassembler->createInst(byteReader, address, arg);
68
69 if(!inst)
70 return index;
71
72 insts[index] = inst;
73 address += inst->byteSize();
74 }
75
76 return count;
77}
78
79void EDReleaseInst(EDInstRef inst) {
80 delete inst;
81}
82
83int EDInstByteSize(EDInstRef inst) {
84 return inst->byteSize();
85}
86
87int EDGetInstString(const char **buf,
88 EDInstRef inst) {
89 return inst->getString(*buf);
90}
91
92int EDInstID(unsigned *instID, EDInstRef inst) {
93 *instID = inst->instID();
94 return 0;
95}
96
97int EDInstIsBranch(EDInstRef inst) {
98 return inst->isBranch();
99}
100
101int EDInstIsMove(EDInstRef inst) {
102 return inst->isMove();
103}
104
105int EDBranchTargetID(EDInstRef inst) {
106 return inst->branchTargetID();
107}
108
109int EDMoveSourceID(EDInstRef inst) {
110 return inst->moveSourceID();
111}
112
113int EDMoveTargetID(EDInstRef inst) {
114 return inst->moveTargetID();
115}
116
117int EDNumTokens(EDInstRef inst) {
118 return inst->numTokens();
119}
120
121int EDGetToken(EDTokenRef *token,
122 EDInstRef inst,
123 int index) {
124 return inst->getToken(*token, index);
125}
126
127int EDGetTokenString(const char **buf,
128 EDTokenRef token) {
129 return token->getString(*buf);
130}
131
132int EDOperandIndexForToken(EDTokenRef token) {
133 return token->operandID();
134}
135
136int EDTokenIsWhitespace(EDTokenRef token) {
137 if(token->type() == EDToken::kTokenWhitespace)
138 return 1;
139 else
140 return 0;
141}
142
143int EDTokenIsPunctuation(EDTokenRef token) {
144 if(token->type() == EDToken::kTokenPunctuation)
145 return 1;
146 else
147 return 0;
148}
149
150int EDTokenIsOpcode(EDTokenRef token) {
151 if(token->type() == EDToken::kTokenOpcode)
152 return 1;
153 else
154 return 0;
155}
156
157int EDTokenIsLiteral(EDTokenRef token) {
158 if(token->type() == EDToken::kTokenLiteral)
159 return 1;
160 else
161 return 0;
162}
163
164int EDTokenIsRegister(EDTokenRef token) {
165 if(token->type() == EDToken::kTokenRegister)
166 return 1;
167 else
168 return 0;
169}
170
171int EDTokenIsNegativeLiteral(EDTokenRef token) {
172 if(token->type() != EDToken::kTokenLiteral)
173 return -1;
174
175 return token->literalSign();
176}
177
178int EDLiteralTokenAbsoluteValue(uint64_t *value,
179 EDTokenRef token) {
180 if(token->type() != EDToken::kTokenLiteral)
181 return -1;
182
183 return token->literalAbsoluteValue(*value);
184}
185
186int EDRegisterTokenValue(unsigned *registerID,
187 EDTokenRef token) {
188 if(token->type() != EDToken::kTokenRegister)
189 return -1;
190
191 return token->registerID(*registerID);
192}
193
194int EDNumOperands(EDInstRef inst) {
195 return inst->numOperands();
196}
197
198int EDGetOperand(EDOperandRef *operand,
199 EDInstRef inst,
200 int index) {
201 return inst->getOperand(*operand, index);
202}
203
204int EDEvaluateOperand(uint64_t *result,
205 EDOperandRef operand,
206 EDRegisterReaderCallback regReader,
207 void *arg) {
208 return operand->evaluate(*result, regReader, arg);
209}
210
211#ifdef __BLOCKS__
212
213struct ByteReaderWrapper {
214 EDByteBlock_t byteBlock;
215};
216
217static int readerWrapperCallback(uint8_t *byte,
218 uint64_t address,
219 void *arg) {
220 struct ByteReaderWrapper *wrapper = (struct ByteReaderWrapper *)arg;
221 return wrapper->byteBlock(byte, address);
222}
223
224unsigned int EDBlockCreateInsts(EDInstRef *insts,
225 int count,
226 EDDisassemblerRef disassembler,
227 EDByteBlock_t byteBlock,
228 uint64_t address) {
229 struct ByteReaderWrapper wrapper;
230 wrapper.byteBlock = byteBlock;
231
232 return EDCreateInsts(insts,
233 count,
234 disassembler,
235 readerWrapperCallback,
236 address,
237 (void*)&wrapper);
238}
239
240int EDBlockEvaluateOperand(uint64_t *result,
241 EDOperandRef operand,
242 EDRegisterBlock_t regBlock) {
243 return operand->evaluate(*result, regBlock);
244}
245
246int EDBlockVisitTokens(EDInstRef inst,
247 EDTokenVisitor_t visitor) {
248 return inst->visitTokens(visitor);
249}
250
251#endif