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 #include "EDDisassembler.h"
16 #include "EDOperand.h"
18 #include "llvm-c/EnhancedDisassembly.h"
21 int EDGetDisassembler(EDDisassemblerRef *disassembler,
23 EDAssemblySyntax_t syntax) {
24 EDDisassembler::AssemblySyntax Syntax;
26 default: llvm_unreachable("Unknown assembly syntax!");
27 case kEDAssemblySyntaxX86Intel:
28 Syntax = EDDisassembler::kEDAssemblySyntaxX86Intel;
30 case kEDAssemblySyntaxX86ATT:
31 Syntax = EDDisassembler::kEDAssemblySyntaxX86ATT;
33 case kEDAssemblySyntaxARMUAL:
34 Syntax = EDDisassembler::kEDAssemblySyntaxARMUAL;
38 EDDisassemblerRef ret = EDDisassembler::getDisassembler(triple, Syntax);
46 int EDGetRegisterName(const char** regName,
47 EDDisassemblerRef disassembler,
49 const char *name = ((EDDisassembler*)disassembler)->nameWithRegisterID(regID);
56 int EDRegisterIsStackPointer(EDDisassemblerRef disassembler,
58 return ((EDDisassembler*)disassembler)->registerIsStackPointer(regID) ? 1 : 0;
61 int EDRegisterIsProgramCounter(EDDisassemblerRef disassembler,
63 return ((EDDisassembler*)disassembler)->registerIsProgramCounter(regID) ? 1:0;
66 unsigned int EDCreateInsts(EDInstRef *insts,
68 EDDisassemblerRef disassembler,
69 ::EDByteReaderCallback byteReader,
74 for (index = 0; index < count; ++index) {
75 EDInst *inst = ((EDDisassembler*)disassembler)->createInst(byteReader,
82 address += inst->byteSize();
88 void EDReleaseInst(EDInstRef inst) {
89 delete ((EDInst*)inst);
92 int EDInstByteSize(EDInstRef inst) {
93 return ((EDInst*)inst)->byteSize();
96 int EDGetInstString(const char **buf,
98 return ((EDInst*)inst)->getString(*buf);
101 int EDInstID(unsigned *instID, EDInstRef inst) {
102 *instID = ((EDInst*)inst)->instID();
106 int EDInstIsBranch(EDInstRef inst) {
107 return ((EDInst*)inst)->isBranch();
110 int EDInstIsMove(EDInstRef inst) {
111 return ((EDInst*)inst)->isMove();
114 int EDBranchTargetID(EDInstRef inst) {
115 return ((EDInst*)inst)->branchTargetID();
118 int EDMoveSourceID(EDInstRef inst) {
119 return ((EDInst*)inst)->moveSourceID();
122 int EDMoveTargetID(EDInstRef inst) {
123 return ((EDInst*)inst)->moveTargetID();
126 int EDNumTokens(EDInstRef inst) {
127 return ((EDInst*)inst)->numTokens();
130 int EDGetToken(EDTokenRef *token,
133 return ((EDInst*)inst)->getToken(*(EDToken**)token, index);
136 int EDGetTokenString(const char **buf,
138 return ((EDToken*)token)->getString(*buf);
141 int EDOperandIndexForToken(EDTokenRef token) {
142 return ((EDToken*)token)->operandID();
145 int EDTokenIsWhitespace(EDTokenRef token) {
146 return ((EDToken*)token)->type() == EDToken::kTokenWhitespace;
149 int EDTokenIsPunctuation(EDTokenRef token) {
150 return ((EDToken*)token)->type() == EDToken::kTokenPunctuation;
153 int EDTokenIsOpcode(EDTokenRef token) {
154 return ((EDToken*)token)->type() == EDToken::kTokenOpcode;
157 int EDTokenIsLiteral(EDTokenRef token) {
158 return ((EDToken*)token)->type() == EDToken::kTokenLiteral;
161 int EDTokenIsRegister(EDTokenRef token) {
162 return ((EDToken*)token)->type() == EDToken::kTokenRegister;
165 int EDTokenIsNegativeLiteral(EDTokenRef token) {
166 if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
169 return ((EDToken*)token)->literalSign();
172 int EDLiteralTokenAbsoluteValue(uint64_t *value, EDTokenRef token) {
173 if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
176 return ((EDToken*)token)->literalAbsoluteValue(*value);
179 int EDRegisterTokenValue(unsigned *registerID,
181 if (((EDToken*)token)->type() != EDToken::kTokenRegister)
184 return ((EDToken*)token)->registerID(*registerID);
187 int EDNumOperands(EDInstRef inst) {
188 return ((EDInst*)inst)->numOperands();
191 int EDGetOperand(EDOperandRef *operand,
194 return ((EDInst*)inst)->getOperand(*(EDOperand**)operand, index);
197 int EDOperandIsRegister(EDOperandRef operand) {
198 return ((EDOperand*)operand)->isRegister();
201 int EDOperandIsImmediate(EDOperandRef operand) {
202 return ((EDOperand*)operand)->isImmediate();
205 int EDOperandIsMemory(EDOperandRef operand) {
206 return ((EDOperand*)operand)->isMemory();
209 int EDRegisterOperandValue(unsigned *value, EDOperandRef operand) {
210 if (!((EDOperand*)operand)->isRegister())
212 *value = ((EDOperand*)operand)->regVal();
216 int EDImmediateOperandValue(uint64_t *value, EDOperandRef operand) {
217 if (!((EDOperand*)operand)->isImmediate())
219 *value = ((EDOperand*)operand)->immediateVal();
223 int EDEvaluateOperand(uint64_t *result, EDOperandRef operand,
224 ::EDRegisterReaderCallback regReader, void *arg) {
225 return ((EDOperand*)operand)->evaluate(*result, regReader, arg);
230 struct ByteReaderWrapper {
231 EDByteBlock_t byteBlock;
234 static int readerWrapperCallback(uint8_t *byte,
237 struct ByteReaderWrapper *wrapper = (struct ByteReaderWrapper *)arg;
238 return wrapper->byteBlock(byte, address);
241 unsigned int EDBlockCreateInsts(EDInstRef *insts,
243 EDDisassemblerRef disassembler,
244 EDByteBlock_t byteBlock,
246 struct ByteReaderWrapper wrapper;
247 wrapper.byteBlock = byteBlock;
249 return EDCreateInsts(insts, count, disassembler, readerWrapperCallback,
250 address, (void*)&wrapper);
253 int EDBlockEvaluateOperand(uint64_t *result, EDOperandRef operand,
254 EDRegisterBlock_t regBlock) {
255 return ((EDOperand*)operand)->evaluate(*result, regBlock);
258 int EDBlockVisitTokens(EDInstRef inst, ::EDTokenVisitor_t visitor) {
259 return ((EDInst*)inst)->visitTokens((llvm::EDTokenVisitor_t)visitor);
264 extern "C" unsigned int EDBlockCreateInsts() {
268 extern "C" int EDBlockEvaluateOperand() {
272 extern "C" int EDBlockVisitTokens() {