aboutsummaryrefslogtreecommitdiffstats
path: root/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
commit953362cdfbf1088153f65376c86d22ee0176bcdf (patch)
tree2d5a533d8ef56500b8d8d70264879e5e33555611 /lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
parentb9d75a94dd617f0bcc4bd56c52e2d5e8a9bec3fa (diff)
downloadexternal_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.c13
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;