summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2012-02-11 14:50:54 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2012-02-11 14:50:54 +0000
commit478e8de8efd4dca4734571fc9e42700b8f618318 (patch)
treed0604c278fc8eeaf3fe8a914af6c8ded495ccfcb /llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
parent911fdf47cda1a5a6278430a3cdfffe0d1ff23a2b (diff)
downloadbcm5719-llvm-478e8de8efd4dca4734571fc9e42700b8f618318.tar.gz
bcm5719-llvm-478e8de8efd4dca4734571fc9e42700b8f618318.zip
Reuse the enum names from X86Desc in the X86Disassembler.
This requires some gymnastics to make it available for C code. Remove the names from the disassembler tables, making them relocation free. llvm-svn: 150303
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c')
-rw-r--r--llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
index a7becdb2c70..c15709d33da 100644
--- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
+++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
@@ -712,7 +712,7 @@ static BOOL is16BitEquvalent(const char* orig, const char* equiv) {
* @return - 0 if the ModR/M could be read when needed or was not needed;
* nonzero otherwise.
*/
-static int getID(struct InternalInstruction* insn) {
+static int getID(struct InternalInstruction* insn, void *miiArg) {
uint8_t attrMask;
uint16_t instructionID;
@@ -844,8 +844,12 @@ static int getID(struct InternalInstruction* insn) {
}
specWithOpsize = specifierForUID(instructionIDWithOpsize);
-
- if (is16BitEquvalent(spec->name, specWithOpsize->name)) {
+
+ const char *specName = x86DisassemblerGetInstrName(instructionID, miiArg);
+ const char *specWithOpSizeSizeName =
+ x86DisassemblerGetInstrName(instructionIDWithOpsize, miiArg);
+
+ if (is16BitEquvalent(specName, specWithOpSizeSizeName)) {
insn->instructionID = instructionIDWithOpsize;
insn->spec = specWithOpsize;
} else {
@@ -1608,6 +1612,7 @@ int decodeInstruction(struct InternalInstruction* insn,
void* readerArg,
dlog_t logger,
void* loggerArg,
+ void* miiArg,
uint64_t startLoc,
DisassemblerMode mode) {
memset(insn, 0, sizeof(struct InternalInstruction));
@@ -1623,7 +1628,7 @@ int decodeInstruction(struct InternalInstruction* insn,
if (readPrefixes(insn) ||
readOpcode(insn) ||
- getID(insn) ||
+ getID(insn, miiArg) ||
insn->instructionID == 0 ||
readOperands(insn))
return -1;
OpenPOWER on IntegriCloud