Switch the CMake edis build over to add_llvm_library_dependencies
[oota-llvm.git] / tools / edis / EDMain.cpp
1 //===-- 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
14 // FIXME: This code isn't layered right, the headers should be moved to
15 // include llvm/MC/MCDisassembler or something.
16 #include "../../lib/MC/MCDisassembler/EDDisassembler.h"
17 #include "../../lib/MC/MCDisassembler/EDInst.h"
18 #include "../../lib/MC/MCDisassembler/EDOperand.h"
19 #include "../../lib/MC/MCDisassembler/EDToken.h"
20 #include "llvm-c/EnhancedDisassembly.h"
21 using namespace llvm;
22
23 int EDGetDisassembler(EDDisassemblerRef *disassembler,
24                       const char *triple,
25                       EDAssemblySyntax_t syntax) {
26   EDDisassembler::initialize();
27   
28   EDDisassembler::AssemblySyntax Syntax;
29   switch (syntax) {
30   default: assert(0 && "Unknown assembly syntax!");
31   case kEDAssemblySyntaxX86Intel:
32     Syntax = EDDisassembler::kEDAssemblySyntaxX86Intel;
33     break;
34   case kEDAssemblySyntaxX86ATT:
35     Syntax = EDDisassembler::kEDAssemblySyntaxX86ATT;
36     break;
37   case kEDAssemblySyntaxARMUAL:
38     Syntax = EDDisassembler::kEDAssemblySyntaxARMUAL;
39     break;
40   }
41   
42   EDDisassemblerRef ret = EDDisassembler::getDisassembler(triple, Syntax);
43   
44   if (!ret)
45     return -1;
46   *disassembler = ret;
47   return 0;
48 }
49
50 int EDGetRegisterName(const char** regName,
51                       EDDisassemblerRef disassembler,
52                       unsigned regID) {
53   const char *name = ((EDDisassembler*)disassembler)->nameWithRegisterID(regID);
54   if (!name)
55     return -1;
56   *regName = name;
57   return 0;
58 }
59
60 int EDRegisterIsStackPointer(EDDisassemblerRef disassembler,
61                              unsigned regID) {
62   return ((EDDisassembler*)disassembler)->registerIsStackPointer(regID) ? 1 : 0;
63 }
64
65 int EDRegisterIsProgramCounter(EDDisassemblerRef disassembler,
66                                unsigned regID) {
67   return ((EDDisassembler*)disassembler)->registerIsProgramCounter(regID) ? 1:0;
68 }
69
70 unsigned int EDCreateInsts(EDInstRef *insts,
71                            unsigned int count,
72                            EDDisassemblerRef disassembler,
73                            ::EDByteReaderCallback byteReader,
74                            uint64_t address,
75                            void *arg) {
76   unsigned int index;
77   
78   for (index = 0; index < count; ++index) {
79     EDInst *inst = ((EDDisassembler*)disassembler)->createInst(byteReader,
80                                                                address, arg);
81     
82     if (!inst)
83       return index;
84     
85     insts[index] = inst;
86     address += inst->byteSize();
87   }
88   
89   return count;
90 }
91
92 void EDReleaseInst(EDInstRef inst) {
93   delete ((EDInst*)inst);
94 }
95
96 int EDInstByteSize(EDInstRef inst) {
97   return ((EDInst*)inst)->byteSize();
98 }
99
100 int EDGetInstString(const char **buf,
101                     EDInstRef inst) {
102   return ((EDInst*)inst)->getString(*buf);
103 }
104
105 int EDInstID(unsigned *instID, EDInstRef inst) {
106   *instID = ((EDInst*)inst)->instID();
107   return 0;
108 }
109
110 int EDInstIsBranch(EDInstRef inst) {
111   return ((EDInst*)inst)->isBranch();
112 }
113
114 int EDInstIsMove(EDInstRef inst) {
115   return ((EDInst*)inst)->isMove();
116 }
117
118 int EDBranchTargetID(EDInstRef inst) {
119   return ((EDInst*)inst)->branchTargetID();
120 }
121
122 int EDMoveSourceID(EDInstRef inst) {
123   return ((EDInst*)inst)->moveSourceID();
124 }
125
126 int EDMoveTargetID(EDInstRef inst) {
127   return ((EDInst*)inst)->moveTargetID();
128 }
129
130 int EDNumTokens(EDInstRef inst) {
131   return ((EDInst*)inst)->numTokens();
132 }
133
134 int EDGetToken(EDTokenRef *token,
135                EDInstRef inst,
136                int index) {
137   return ((EDInst*)inst)->getToken(*(EDToken**)token, index);
138 }
139
140 int EDGetTokenString(const char **buf,
141                      EDTokenRef token) {
142   return ((EDToken*)token)->getString(*buf);
143 }
144
145 int EDOperandIndexForToken(EDTokenRef token) {
146   return ((EDToken*)token)->operandID();
147 }
148
149 int EDTokenIsWhitespace(EDTokenRef token) {
150   return ((EDToken*)token)->type() == EDToken::kTokenWhitespace;
151 }
152
153 int EDTokenIsPunctuation(EDTokenRef token) {
154   return ((EDToken*)token)->type() == EDToken::kTokenPunctuation;
155 }
156
157 int EDTokenIsOpcode(EDTokenRef token) {
158   return ((EDToken*)token)->type() == EDToken::kTokenOpcode;
159 }
160
161 int EDTokenIsLiteral(EDTokenRef token) {
162   return ((EDToken*)token)->type() == EDToken::kTokenLiteral;
163 }
164
165 int EDTokenIsRegister(EDTokenRef token) {
166   return ((EDToken*)token)->type() == EDToken::kTokenRegister;
167 }
168
169 int EDTokenIsNegativeLiteral(EDTokenRef token) {
170   if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
171     return -1;
172   
173   return ((EDToken*)token)->literalSign();
174 }
175
176 int EDLiteralTokenAbsoluteValue(uint64_t *value, EDTokenRef token) {
177   if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
178     return -1;
179   
180   return ((EDToken*)token)->literalAbsoluteValue(*value);
181 }
182
183 int EDRegisterTokenValue(unsigned *registerID,
184                          EDTokenRef token) {
185   if (((EDToken*)token)->type() != EDToken::kTokenRegister)
186     return -1;
187   
188   return ((EDToken*)token)->registerID(*registerID);
189 }
190
191 int EDNumOperands(EDInstRef inst) {
192   return ((EDInst*)inst)->numOperands();
193 }
194
195 int EDGetOperand(EDOperandRef *operand,
196                  EDInstRef inst,
197                  int index) {
198   return ((EDInst*)inst)->getOperand(*(EDOperand**)operand, index);
199 }
200
201 int EDOperandIsRegister(EDOperandRef operand) {
202   return ((EDOperand*)operand)->isRegister();
203 }
204
205 int EDOperandIsImmediate(EDOperandRef operand) {
206   return ((EDOperand*)operand)->isImmediate();
207 }
208
209 int EDOperandIsMemory(EDOperandRef operand) {
210   return ((EDOperand*)operand)->isMemory();
211 }
212
213 int EDRegisterOperandValue(unsigned *value, EDOperandRef operand) {
214   if (!((EDOperand*)operand)->isRegister())
215     return -1;
216   *value = ((EDOperand*)operand)->regVal();
217   return 0;
218 }
219
220 int EDImmediateOperandValue(uint64_t *value, EDOperandRef operand) {
221   if (!((EDOperand*)operand)->isImmediate())
222     return -1;
223   *value = ((EDOperand*)operand)->immediateVal();
224   return 0;
225 }
226
227 int EDEvaluateOperand(uint64_t *result, EDOperandRef operand,
228                       ::EDRegisterReaderCallback regReader, void *arg) {
229   return ((EDOperand*)operand)->evaluate(*result, regReader, arg);
230 }
231
232 #ifdef __BLOCKS__
233
234 struct ByteReaderWrapper {
235   EDByteBlock_t byteBlock;
236 };
237
238 static int readerWrapperCallback(uint8_t *byte, 
239                           uint64_t address,
240                           void *arg) {
241   struct ByteReaderWrapper *wrapper = (struct ByteReaderWrapper *)arg;
242   return wrapper->byteBlock(byte, address);
243 }
244
245 unsigned int EDBlockCreateInsts(EDInstRef *insts,
246                                 int count,
247                                 EDDisassemblerRef disassembler,
248                                 EDByteBlock_t byteBlock,
249                                 uint64_t address) {
250   struct ByteReaderWrapper wrapper;
251   wrapper.byteBlock = byteBlock;
252   
253   return EDCreateInsts(insts,
254                        count,
255                        disassembler, 
256                        readerWrapperCallback, 
257                        address, 
258                        (void*)&wrapper);
259 }
260
261 int EDBlockEvaluateOperand(uint64_t *result, EDOperandRef operand,
262                            EDRegisterBlock_t regBlock) {
263   return ((EDOperand*)operand)->evaluate(*result, regBlock);
264 }
265
266 int EDBlockVisitTokens(EDInstRef inst, ::EDTokenVisitor_t visitor) {
267   return ((EDInst*)inst)->visitTokens((llvm::EDTokenVisitor_t)visitor);
268 }
269
270 #else
271
272 extern "C" unsigned int EDBlockCreateInsts() {
273   return 0;
274 }
275
276 extern "C" int EDBlockEvaluateOperand() {
277   return -1;
278 }
279
280 extern "C" int EDBlockVisitTokens() {
281   return -1;
282 }
283
284 #endif