Fix the x86 disassembler to at least print the lock prefix if it is the first

prefix.  Added a FIXME to remind us this still does not work when it is not the
first prefix.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152414 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Kevin Enderby 2012-03-09 17:52:49 +00:00
parent 75c0d8e0d8
commit faf72ffda3
3 changed files with 15 additions and 3 deletions

View File

@ -312,6 +312,13 @@ static int readPrefixes(struct InternalInstruction* insn) {
if (consumeByte(insn, &byte))
return -1;
// If the the first byte is a LOCK prefix break and let it be disassembled
// as a lock "instruction", by creating an <MCInst #xxxx LOCK_PREFIX>.
// FIXME there is currently no way to get the disassembler to print the
// lock prefix if it is not the first byte.
if (insn->readerCursor - 1 == insn->startLocation && byte == 0xf0)
break;
switch (byte) {
case 0xf0: /* LOCK */

View File

@ -724,3 +724,8 @@
# CHECK: vpermil2ps $1, 4(%rax), %xmm2, %xmm3, %xmm0
0xc4 0xe3 0xe1 0x48 0x40 0x04 0x21
# rdar://8812056 lldb doesn't print the x86 lock prefix when disassembling
# CHECK: lock
# CHECK: xaddq %rcx, %rbx
0xf0 0x48 0x0f 0xc1 0xcb

View File

@ -405,13 +405,13 @@ RecognizableInstr::filter_ret RecognizableInstr::filter() const {
return FILTER_STRONG;
// Filter out artificial instructions
// Filter out artificial instructions but leave in the LOCK_PREFIX so it is
// printed as a separate "instruction".
if (Name.find("_Int") != Name.npos ||
Name.find("Int_") != Name.npos ||
Name.find("_NOREX") != Name.npos ||
Name.find("2SDL") != Name.npos ||
Name == "LOCK_PREFIX")
Name.find("2SDL") != Name.npos)
return FILTER_STRONG;
// Filter out instructions with segment override prefixes.