diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -332,6 +332,7 @@ IES_PLUS, IES_MINUS, IES_OFFSET, + IES_CAST, IES_NOT, IES_MULTIPLY, IES_DIVIDE, @@ -632,6 +633,7 @@ default: State = IES_ERROR; break; + case IES_CAST: case IES_PLUS: case IES_MINUS: case IES_NOT: @@ -744,6 +746,7 @@ IC.pushOperator(IC_PLUS); break; case IES_INIT: + case IES_CAST: assert(!BracCount && "BracCount should be zero on parsing's start"); State = IES_LBRAC; break; @@ -816,6 +819,7 @@ case IES_INTEGER: case IES_OFFSET: case IES_REGISTER: + case IES_RBRAC: case IES_RPAREN: State = IES_RPAREN; IC.pushOperator(IC_RPAREN); @@ -848,6 +852,18 @@ } return false; } + void onCast(StringRef Type) { + PrevState = State; + switch (State) { + default: + State = IES_ERROR; + break; + case IES_LPAREN: + setType(Type); + State = IES_CAST; + break; + } + } void setType(StringRef Type) { CurType = Type; } }; @@ -1635,6 +1651,18 @@ SMLoc IdentLoc = Tok.getLoc(); StringRef Identifier = Tok.getString(); UpdateLocLex = false; + // (MASM only) PTR operator + if (Parser.isParsingMasm()) { + const AsmToken &NextTok = getLexer().peekTok(); + if (NextTok.is(AsmToken::Identifier) && + NextTok.getIdentifier().equals_lower("ptr")) { + SM.onCast(Identifier); + // eat type and ptr + consumeToken(); + End = consumeToken(); + break; + } + } // Register, or (MASM only) . unsigned Reg; if (Tok.is(AsmToken::Identifier)) { @@ -1681,7 +1709,8 @@ const MCExpr *Val; if (isParsingMSInlineAsm() || Parser.isParsingMasm()) { // MS Dot Operator expression - if (Identifier.count('.') && PrevTK == AsmToken::RBrac) { + if (Identifier.count('.') && + (PrevTK == AsmToken::RBrac || PrevTK == AsmToken::RParen)) { if (ParseIntelDotOperator(SM, End)) return true; break; diff --git a/llvm/test/tools/llvm-ml/struct.test b/llvm/test/tools/llvm-ml/struct.test --- a/llvm/test/tools/llvm-ml/struct.test +++ b/llvm/test/tools/llvm-ml/struct.test @@ -176,4 +176,20 @@ ; CHECK-NEXT: mov eax, dword ptr [ebx + 5] ; CHECK-NEXT: mov eax, dword ptr [ebx + 8] +t10: +mov eax, FOOBAR.f +mov eax, FOOBAR.f.h + +; CHECK: t10: +; CHECK-NEXT: mov eax, 10 +; CHECK-NEXT: mov eax, 12 + +t11: +mov eax, (FOOBAR PTR [ebx]).f +mov eax, (FOOBAR PTR t1).f + +; CHECK: t11: +; CHECK-NEXT: mov eax, dword ptr [ebx + 10] +; CHECK-NEXT: mov eax, dword ptr [rip + t1+10] + END