1 //===-- EDMain.cpp - LLVM Enhanced Disassembly C API ----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the enhanced disassembler's public C API.
12 //===----------------------------------------------------------------------===//
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"
23 int EDGetDisassembler(EDDisassemblerRef *disassembler,
25 EDAssemblySyntax_t syntax) {
26 EDDisassembler::AssemblySyntax Syntax;
28 default: assert(0 && "Unknown assembly syntax!");
29 case kEDAssemblySyntaxX86Intel:
30 Syntax = EDDisassembler::kEDAssemblySyntaxX86Intel;
32 case kEDAssemblySyntaxX86ATT:
33 Syntax = EDDisassembler::kEDAssemblySyntaxX86ATT;
35 case kEDAssemblySyntaxARMUAL:
36 Syntax = EDDisassembler::kEDAssemblySyntaxARMUAL;
40 EDDisassemblerRef ret = EDDisassembler::getDisassembler(triple, Syntax);
48 int EDGetRegisterName(const char** regName,
49 EDDisassemblerRef disassembler,
51 const char *name = ((EDDisassembler*)disassembler)->nameWithRegisterID(regID);
58 int EDRegisterIsStackPointer(EDDisassemblerRef disassembler,
60 return ((EDDisassembler*)disassembler)->registerIsStackPointer(regID) ? 1 : 0;
63 int EDRegisterIsProgramCounter(EDDisassemblerRef disassembler,
65 return ((EDDisassembler*)disassembler)->registerIsProgramCounter(regID) ? 1:0;
68 unsigned int EDCreateInsts(EDInstRef *insts,
70 EDDisassemblerRef disassembler,
71 ::EDByteReaderCallback byteReader,
76 for (index = 0; index < count; ++index) {
77 EDInst *inst = ((EDDisassembler*)disassembler)->createInst(byteReader,
84 address += inst->byteSize();
90 void EDReleaseInst(EDInstRef inst) {
91 delete ((EDInst*)inst);
94 int EDInstByteSize(EDInstRef inst) {
95 return ((EDInst*)inst)->byteSize();
98 int EDGetInstString(const char **buf,
100 return ((EDInst*)inst)->getString(*buf);
103 int EDInstID(unsigned *instID, EDInstRef inst) {
104 *instID = ((EDInst*)inst)->instID();
108 int EDInstIsBranch(EDInstRef inst) {
109 return ((EDInst*)inst)->isBranch();
112 int EDInstIsMove(EDInstRef inst) {
113 return ((EDInst*)inst)->isMove();
116 int EDBranchTargetID(EDInstRef inst) {
117 return ((EDInst*)inst)->branchTargetID();
120 int EDMoveSourceID(EDInstRef inst) {
121 return ((EDInst*)inst)->moveSourceID();
124 int EDMoveTargetID(EDInstRef inst) {
125 return ((EDInst*)inst)->moveTargetID();
128 int EDNumTokens(EDInstRef inst) {
129 return ((EDInst*)inst)->numTokens();
132 int EDGetToken(EDTokenRef *token,
135 return ((EDInst*)inst)->getToken(*(EDToken**)token, index);
138 int EDGetTokenString(const char **buf,
140 return ((EDToken*)token)->getString(*buf);
143 int EDOperandIndexForToken(EDTokenRef token) {
144 return ((EDToken*)token)->operandID();
147 int EDTokenIsWhitespace(EDTokenRef token) {
148 return ((EDToken*)token)->type() == EDToken::kTokenWhitespace;
151 int EDTokenIsPunctuation(EDTokenRef token) {
152 return ((EDToken*)token)->type() == EDToken::kTokenPunctuation;
155 int EDTokenIsOpcode(EDTokenRef token) {
156 return ((EDToken*)token)->type() == EDToken::kTokenOpcode;
159 int EDTokenIsLiteral(EDTokenRef token) {
160 return ((EDToken*)token)->type() == EDToken::kTokenLiteral;
163 int EDTokenIsRegister(EDTokenRef token) {
164 return ((EDToken*)token)->type() == EDToken::kTokenRegister;
167 int EDTokenIsNegativeLiteral(EDTokenRef token) {
168 if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
171 return ((EDToken*)token)->literalSign();
174 int EDLiteralTokenAbsoluteValue(uint64_t *value, EDTokenRef token) {
175 if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
178 return ((EDToken*)token)->literalAbsoluteValue(*value);
181 int EDRegisterTokenValue(unsigned *registerID,
183 if (((EDToken*)token)->type() != EDToken::kTokenRegister)
186 return ((EDToken*)token)->registerID(*registerID);
189 int EDNumOperands(EDInstRef inst) {
190 return ((EDInst*)inst)->numOperands();
193 int EDGetOperand(EDOperandRef *operand,
196 return ((EDInst*)inst)->getOperand(*(EDOperand**)operand, index);
199 int EDOperandIsRegister(EDOperandRef operand) {
200 return ((EDOperand*)operand)->isRegister();
203 int EDOperandIsImmediate(EDOperandRef operand) {
204 return ((EDOperand*)operand)->isImmediate();
207 int EDOperandIsMemory(EDOperandRef operand) {
208 return ((EDOperand*)operand)->isMemory();
211 int EDRegisterOperandValue(unsigned *value, EDOperandRef operand) {
212 if (!((EDOperand*)operand)->isRegister())
214 *value = ((EDOperand*)operand)->regVal();
218 int EDImmediateOperandValue(uint64_t *value, EDOperandRef operand) {
219 if (!((EDOperand*)operand)->isImmediate())
221 *value = ((EDOperand*)operand)->immediateVal();
225 int EDEvaluateOperand(uint64_t *result, EDOperandRef operand,
226 ::EDRegisterReaderCallback regReader, void *arg) {
227 return ((EDOperand*)operand)->evaluate(*result, regReader, arg);
232 struct ByteReaderWrapper {
233 EDByteBlock_t byteBlock;
236 static int readerWrapperCallback(uint8_t *byte,
239 struct ByteReaderWrapper *wrapper = (struct ByteReaderWrapper *)arg;
240 return wrapper->byteBlock(byte, address);
243 unsigned int EDBlockCreateInsts(EDInstRef *insts,
245 EDDisassemblerRef disassembler,
246 EDByteBlock_t byteBlock,
248 struct ByteReaderWrapper wrapper;
249 wrapper.byteBlock = byteBlock;
251 return EDCreateInsts(insts,
254 readerWrapperCallback,
259 int EDBlockEvaluateOperand(uint64_t *result, EDOperandRef operand,
260 EDRegisterBlock_t regBlock) {
261 return ((EDOperand*)operand)->evaluate(*result, regBlock);
264 int EDBlockVisitTokens(EDInstRef inst, ::EDTokenVisitor_t visitor) {
265 return ((EDInst*)inst)->visitTokens((llvm::EDTokenVisitor_t)visitor);
270 extern "C" unsigned int EDBlockCreateInsts() {
274 extern "C" int EDBlockEvaluateOperand() {
278 extern "C" int EDBlockVisitTokens() {