Fix the x86 disassembler to at least print the lock prefix if it is the first
authorKevin Enderby <enderby@apple.com>
Fri, 9 Mar 2012 17:52:49 +0000 (17:52 +0000)
committerKevin Enderby <enderby@apple.com>
Fri, 9 Mar 2012 17:52:49 +0000 (17:52 +0000)
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

lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
test/MC/Disassembler/X86/simple-tests.txt
utils/TableGen/X86RecognizableInstr.cpp

index b0e66f00c71f194dba8abf0bd65d804c5f532269..6f7e8f234660022cb921fc658fa2a8499e068f0f 100644 (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 */
index 840d5fab2dc544a65d214165ff9fd1e62f130e49..414c5d5fe9ed9950c7d2130e4b799d9233e3caa4 100644 (file)
 
 # 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
index 5bf473d95e07109ed51dac02afaf38c4736cd55c..6bbc929d26dbec770126e49a66d73a2f3061595a 100644 (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.