fix rdar://8735979 - "int 3" doesn't match to "int3". Unfortunately,
authorChris Lattner <sabre@nondot.org>
Sat, 9 Apr 2011 19:41:05 +0000 (19:41 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 9 Apr 2011 19:41:05 +0000 (19:41 +0000)
InstAlias doesn't allow matching immediate operands, so we have to write
C++ code to do this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129223 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmParser/X86AsmParser.cpp
lib/Target/X86/X86InstrSystem.td
test/MC/X86/x86-64.s

index e0989b081e45f04380f094017645b9bfd84019af..c352bfcd8cceb8384772a4c894803f4ed4d1a3fe 100644 (file)
@@ -928,6 +928,18 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
       Operands.erase(Operands.begin() + 1);
     }
   }
+  
+  // Transforms "int $3" into "int3" as a size optimization.  We can't write an
+  // instalias with an immediate operand yet.
+  if (Name == "int" && Operands.size() == 2) {
+    X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
+    if (Op1->isImm() && isa<MCConstantExpr>(Op1->getImm()) &&
+        cast<MCConstantExpr>(Op1->getImm())->getValue() == 3) {
+      delete Operands[1];
+      Operands.erase(Operands.begin() + 1);
+      static_cast<X86Operand*>(Operands[0])->setTokenValue("int3");
+    }
+  }
 
   return false;
 }
index 2710425628a0eaaa7b2d3536674297fe0a465b8e..f73cff39e86d45132791b15ed817996dc9cb7506 100644 (file)
@@ -34,9 +34,16 @@ let Uses = [EFLAGS] in
   def INTO : I<0xce, RawFrm, (outs), (ins), "into", []>;
 def INT3 : I<0xcc, RawFrm, (outs), (ins), "int3",
               [(int_x86_int (i8 3))]>;
+
+// The long form of "int $3" turns into int3 as a size optimization.
+// FIXME: This doesn't work because InstAlias can't match immediate constants.
+//def : InstAlias<"int\t$3", (INT3)>;
+
+
 def INT : Ii8<0xcd, RawFrm, (outs), (ins i8imm:$trap), "int\t$trap",
               [(int_x86_int imm:$trap)]>;
 
+
 def SYSCALL  : I<0x05, RawFrm, (outs), (ins), "syscall", []>, TB;
 def SYSRETL  : I<0x07, RawFrm, (outs), (ins), "sysretl", []>, TB;
 def SYSRETQ  :RI<0x07, RawFrm, (outs), (ins), "sysretq", []>, TB,
index 1d41d5b2d5f24c5071b28e9dad4414002f9e70dd..80b12dbfc2ffded5c70d94d54a935c89acd27c24 100644 (file)
@@ -190,6 +190,10 @@ fadd %st(7)
 // CHECK: int3
 INT3
 
+// rdar://8735979 - int $3 -> int3
+// CHECK: int3
+int    $3
+
 
 // Allow scale factor without index register.
 // CHECK: movaps       %xmm3, (%esi)