diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2012-02-11 14:50:54 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2012-02-11 14:50:54 +0000 |
commit | 953362cdfbf1088153f65376c86d22ee0176bcdf (patch) | |
tree | 2d5a533d8ef56500b8d8d70264879e5e33555611 /lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | |
parent | b9d75a94dd617f0bcc4bd56c52e2d5e8a9bec3fa (diff) | |
download | external_llvm-953362cdfbf1088153f65376c86d22ee0176bcdf.zip external_llvm-953362cdfbf1088153f65376c86d22ee0176bcdf.tar.gz external_llvm-953362cdfbf1088153f65376c86d22ee0176bcdf.tar.bz2 |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150303 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/Disassembler/X86DisassemblerDecoder.c')
-rw-r--r-- | lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c index a7becdb..c15709d 100644 --- a/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c +++ b/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; |