X86 MC: Reject invalid segment registers before a memory operand colon
authorReid Kleckner <reid@kleckner.net>
Thu, 31 Jul 2014 23:03:22 +0000 (23:03 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 31 Jul 2014 23:03:22 +0000 (23:03 +0000)
Previously we would execute unreachable during object emission.

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

lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/X86/x86_errors.s

index c60bbb4003360f06bde5007aaa1c2530dc382d22..78b56b744f889079e6f5fa6d0b8b5a63441d3aa7 100644 (file)
@@ -1632,6 +1632,9 @@ std::unique_ptr<X86Operand> X86AsmParser::ParseATTOperand() {
     if (getLexer().isNot(AsmToken::Colon))
       return X86Operand::CreateReg(RegNo, Start, End);
 
+    if (!X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(RegNo))
+      return ErrorOperand(Start, "invalid segment register");
+
     getParser().Lex(); // Eat the colon.
     return ParseMemOperand(RegNo, Start);
   }
index 51f2e8e146850c6c1da3d0dad6e555896e2973a0..0b3bc7f43502bfb77867353deb3929e8d584098b 100644 (file)
@@ -46,3 +46,7 @@ movl %eax,(,%bx)
 
 // 32: error: invalid operand for instruction
 outb al, 4
+
+// 32: error: invalid segment register
+// 64: error: invalid segment register
+movl %eax:0x00, %ebx