From: Marina Yatsina Date: Thu, 3 Dec 2015 12:17:03 +0000 (+0000) Subject: [X86] MS inline asm: produce error when encountering " ptr " X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=3a64f1988f06b903d52d74eebceb77ff31581956 [X86] MS inline asm: produce error when encountering " ptr " Currently " ptr " treated as in MS inline asm, ignoring the " ptr" completely and possibly ignoring the intention of the user. Fixed llvm to produce an error when encountering " ptr " operands. For example: andpd xmm1,xmmword ptr xmm1 --> andpd xmm1, xmm1 though andpd has 2 possible matching formats - andpd xmm, xmm/m128 Patch by: ziv.izhar@intel.com Differential Revision: http://reviews.llvm.org/D14607 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254607 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 7089c1f7592..d53ab71f3d5 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -1693,12 +1693,14 @@ std::unique_ptr X86AsmParser::ParseIntelOperand() { return ParseIntelOperator(IOK_TYPE); } + bool PtrInOperand = false; unsigned Size = getIntelMemOperandSize(Tok.getString()); if (Size) { Parser.Lex(); // Eat operand size (e.g., byte, word). if (Tok.getString() != "PTR" && Tok.getString() != "ptr") return ErrorOperand(Tok.getLoc(), "Expected 'PTR' or 'ptr' token!"); Parser.Lex(); // Eat ptr. + PtrInOperand = true; } Start = Tok.getLoc(); @@ -1754,9 +1756,16 @@ std::unique_ptr X86AsmParser::ParseIntelOperand() { if (!ParseRegister(RegNo, Start, End)) { // If this is a segment register followed by a ':', then this is the start // of a segment override, otherwise this is a normal register reference. - if (getLexer().isNot(AsmToken::Colon)) + // In case it is a normal register and there is ptr in the operand this + // is an error + if (getLexer().isNot(AsmToken::Colon)){ + if (PtrInOperand){ + return ErrorOperand(Start, "expected memory operand after " + "'ptr', found register operand instead"); + } return X86Operand::CreateReg(RegNo, Start, End); - + } + return ParseIntelSegmentOverride(/*SegReg=*/RegNo, Start, Size); } diff --git a/test/MC/X86/intel-syntax-ambiguous.s b/test/MC/X86/intel-syntax-ambiguous.s index fe1fe502390..e90cca82004 100644 --- a/test/MC/X86/intel-syntax-ambiguous.s +++ b/test/MC/X86/intel-syntax-ambiguous.s @@ -45,3 +45,15 @@ add rax, 3 fadd "?half@?0??bar@@YAXXZ@4NA" // CHECK: error: ambiguous operand size for instruction 'fadd' + +// Instruction line with PTR inside check that they don't accept register as memory. + +// CHECK: error: expected memory operand after 'ptr', found register operand instead +// CHECK: andps xmm1, xmmword ptr xmm1 +andps xmm1, xmmword ptr xmm1 +// CHECK: error: expected memory operand after 'ptr', found register operand instead +// CHECK: andps xmmword ptr xmm1, xmm1 +andps xmmword ptr xmm1, xmm1 +// CHECK: error: expected memory operand after 'ptr', found register operand instead +// CHECK: mov dword ptr eax, ebx +mov dword ptr eax, ebx