diff options
author | Richard Mitton <richard@codersnotes.com> | 2013-08-30 21:19:48 +0000 |
---|---|---|
committer | Richard Mitton <richard@codersnotes.com> | 2013-08-30 21:19:48 +0000 |
commit | 576ee003d0f53df9a2091741d881d79a05a70ca6 (patch) | |
tree | 9d3164ebcd8834087bc547ec13e8da54546dbf7a /llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | |
parent | 2865be79f897e01fe62bb9c0ff3d541acf873e4f (diff) | |
download | bcm5719-llvm-576ee003d0f53df9a2091741d881d79a05a70ca6.tar.gz bcm5719-llvm-576ee003d0f53df9a2091741d881d79a05a70ca6.zip |
Fixed a bug where diassembling an instruction that had a prefix would cause LLVM to identify a 1-byte instruction, but then upon querying it for that 1-byte instruction would cause an undefined opcode.
llvm-svn: 189698
Diffstat (limited to 'llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c')
-rw-r--r-- | llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c index bb195ee3140..b63fd5aee3c 100644 --- a/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c +++ b/llvm/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c @@ -314,20 +314,22 @@ static int readPrefixes(struct InternalInstruction* insn) { while (isPrefix) { prefixLocation = insn->readerCursor; + /* If we fail reading prefixes, just stop here and let the opcode reader deal with it */ if (consumeByte(insn, &byte)) - return -1; + break; /* * If the byte is a LOCK/REP/REPNE prefix and not a part of the opcode, then * break and let it be disassembled as a normal "instruction". */ + if (insn->readerCursor - 1 == insn->startLocation && byte == 0xf0) + break; + + uint8_t nextByte; if (insn->readerCursor - 1 == insn->startLocation - && (byte == 0xf0 || byte == 0xf2 || byte == 0xf3)) { - uint8_t nextByte; - if (byte == 0xf0) - break; - if (lookAtByte(insn, &nextByte)) - return -1; + && (byte == 0xf2 || byte == 0xf3) + && !lookAtByte(insn, &nextByte)) + { /* * If the byte is 0xf2 or 0xf3, and any of the following conditions are * met: |