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/Support/TargetSelect.h"
21 #include "llvm-c/EnhancedDisassembly.h"
24 int EDGetDisassembler(EDDisassemblerRef *disassembler,
26 EDAssemblySyntax_t syntax) {
27 static bool initialized;
29 // Initialize targets and assembly printers/parsers.
30 llvm::InitializeAllTargetInfos();
31 llvm::InitializeAllTargetMCs();
32 llvm::InitializeAllAsmParsers();
33 llvm::InitializeAllDisassemblers();
37 EDDisassembler::AssemblySyntax Syntax;
39 default: assert(0 && "Unknown assembly syntax!");
40 case kEDAssemblySyntaxX86Intel:
41 Syntax = EDDisassembler::kEDAssemblySyntaxX86Intel;
43 case kEDAssemblySyntaxX86ATT:
44 Syntax = EDDisassembler::kEDAssemblySyntaxX86ATT;
46 case kEDAssemblySyntaxARMUAL:
47 Syntax = EDDisassembler::kEDAssemblySyntaxARMUAL;
51 EDDisassemblerRef ret = EDDisassembler::getDisassembler(triple, Syntax);
59 int EDGetRegisterName(const char** regName,
60 EDDisassemblerRef disassembler,
62 const char *name = ((EDDisassembler*)disassembler)->nameWithRegisterID(regID);
69 int EDRegisterIsStackPointer(EDDisassemblerRef disassembler,
71 return ((EDDisassembler*)disassembler)->registerIsStackPointer(regID) ? 1 : 0;
74 int EDRegisterIsProgramCounter(EDDisassemblerRef disassembler,
76 return ((EDDisassembler*)disassembler)->registerIsProgramCounter(regID) ? 1:0;
79 unsigned int EDCreateInsts(EDInstRef *insts,
81 EDDisassemblerRef disassembler,
82 ::EDByteReaderCallback byteReader,
87 for (index = 0; index < count; ++index) {
88 EDInst *inst = ((EDDisassembler*)disassembler)->createInst(byteReader,
95 address += inst->byteSize();
101 void EDReleaseInst(EDInstRef inst) {
102 delete ((EDInst*)inst);
105 int EDInstByteSize(EDInstRef inst) {
106 return ((EDInst*)inst)->byteSize();
109 int EDGetInstString(const char **buf,
111 return ((EDInst*)inst)->getString(*buf);
114 int EDInstID(unsigned *instID, EDInstRef inst) {
115 *instID = ((EDInst*)inst)->instID();
119 int EDInstIsBranch(EDInstRef inst) {
120 return ((EDInst*)inst)->isBranch();
123 int EDInstIsMove(EDInstRef inst) {
124 return ((EDInst*)inst)->isMove();
127 int EDBranchTargetID(EDInstRef inst) {
128 return ((EDInst*)inst)->branchTargetID();
131 int EDMoveSourceID(EDInstRef inst) {
132 return ((EDInst*)inst)->moveSourceID();
135 int EDMoveTargetID(EDInstRef inst) {
136 return ((EDInst*)inst)->moveTargetID();
139 int EDNumTokens(EDInstRef inst) {
140 return ((EDInst*)inst)->numTokens();
143 int EDGetToken(EDTokenRef *token,
146 return ((EDInst*)inst)->getToken(*(EDToken**)token, index);
149 int EDGetTokenString(const char **buf,
151 return ((EDToken*)token)->getString(*buf);
154 int EDOperandIndexForToken(EDTokenRef token) {
155 return ((EDToken*)token)->operandID();
158 int EDTokenIsWhitespace(EDTokenRef token) {
159 return ((EDToken*)token)->type() == EDToken::kTokenWhitespace;
162 int EDTokenIsPunctuation(EDTokenRef token) {
163 return ((EDToken*)token)->type() == EDToken::kTokenPunctuation;
166 int EDTokenIsOpcode(EDTokenRef token) {
167 return ((EDToken*)token)->type() == EDToken::kTokenOpcode;
170 int EDTokenIsLiteral(EDTokenRef token) {
171 return ((EDToken*)token)->type() == EDToken::kTokenLiteral;
174 int EDTokenIsRegister(EDTokenRef token) {
175 return ((EDToken*)token)->type() == EDToken::kTokenRegister;
178 int EDTokenIsNegativeLiteral(EDTokenRef token) {
179 if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
182 return ((EDToken*)token)->literalSign();
185 int EDLiteralTokenAbsoluteValue(uint64_t *value, EDTokenRef token) {
186 if (((EDToken*)token)->type() != EDToken::kTokenLiteral)
189 return ((EDToken*)token)->literalAbsoluteValue(*value);
192 int EDRegisterTokenValue(unsigned *registerID,
194 if (((EDToken*)token)->type() != EDToken::kTokenRegister)
197 return ((EDToken*)token)->registerID(*registerID);
200 int EDNumOperands(EDInstRef inst) {
201 return ((EDInst*)inst)->numOperands();
204 int EDGetOperand(EDOperandRef *operand,
207 return ((EDInst*)inst)->getOperand(*(EDOperand**)operand, index);
210 int EDOperandIsRegister(EDOperandRef operand) {
211 return ((EDOperand*)operand)->isRegister();
214 int EDOperandIsImmediate(EDOperandRef operand) {
215 return ((EDOperand*)operand)->isImmediate();
218 int EDOperandIsMemory(EDOperandRef operand) {
219 return ((EDOperand*)operand)->isMemory();
222 int EDRegisterOperandValue(unsigned *value, EDOperandRef operand) {
223 if (!((EDOperand*)operand)->isRegister())
225 *value = ((EDOperand*)operand)->regVal();
229 int EDImmediateOperandValue(uint64_t *value, EDOperandRef operand) {
230 if (!((EDOperand*)operand)->isImmediate())
232 *value = ((EDOperand*)operand)->immediateVal();
236 int EDEvaluateOperand(uint64_t *result, EDOperandRef operand,
237 ::EDRegisterReaderCallback regReader, void *arg) {
238 return ((EDOperand*)operand)->evaluate(*result, regReader, arg);
243 struct ByteReaderWrapper {
244 EDByteBlock_t byteBlock;
247 static int readerWrapperCallback(uint8_t *byte,
250 struct ByteReaderWrapper *wrapper = (struct ByteReaderWrapper *)arg;
251 return wrapper->byteBlock(byte, address);
254 unsigned int EDBlockCreateInsts(EDInstRef *insts,
256 EDDisassemblerRef disassembler,
257 EDByteBlock_t byteBlock,
259 struct ByteReaderWrapper wrapper;
260 wrapper.byteBlock = byteBlock;
262 return EDCreateInsts(insts,
265 readerWrapperCallback,
270 int EDBlockEvaluateOperand(uint64_t *result, EDOperandRef operand,
271 EDRegisterBlock_t regBlock) {
272 return ((EDOperand*)operand)->evaluate(*result, regBlock);
275 int EDBlockVisitTokens(EDInstRef inst, ::EDTokenVisitor_t visitor) {
276 return ((EDInst*)inst)->visitTokens((llvm::EDTokenVisitor_t)visitor);
281 extern "C" unsigned int EDBlockCreateInsts() {
285 extern "C" int EDBlockEvaluateOperand() {
289 extern "C" int EDBlockVisitTokens() {