From 5859356d80c9b8005ea796857688f2857380f64e Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Fri, 26 Oct 2012 18:32:44 +0000 Subject: [PATCH] [ms-inline asm] Emit an error for unsupported SIZE and LENGTH directives. Part of rdar://12576868 llvm-svn: 166792 --- llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index 87abfd2..0e0ddcf 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -891,7 +891,7 @@ X86Operand *X86AsmParser::ParseIntelOffsetOfOperator(SMLoc Start) { SMLoc End; const MCExpr *Val; if (getParser().ParseExpression(Val, End)) - return 0; + return ErrorOperand(Start, "Unable to parse expression!"); End = Parser.getTok().getLoc(); @@ -928,7 +928,7 @@ X86Operand *X86AsmParser::ParseIntelTypeOperator(SMLoc Start) { // identifier. // FIXME: Pass a valid SMLoc. if (!SemaCallback->LookupInlineAsmIdentifier(Sym.getName(), NULL, Size)) - return ErrorOperand(Start, "Unable to lookup TYPE of expr."); + return ErrorOperand(Start, "Unable to lookup TYPE of expr!"); Size /= 8; // Size is in terms of bits, but we want bytes in the context. } @@ -946,16 +946,22 @@ X86Operand *X86AsmParser::ParseIntelOperand() { SMLoc Start = Parser.getTok().getLoc(), End; // offset operator. - const AsmToken &Tok = Parser.getTok(); - if ((Tok.getString() == "offset" || Tok.getString() == "OFFSET") && + StringRef AsmTokStr = Parser.getTok().getString(); + if ((AsmTokStr == "offset" || AsmTokStr == "OFFSET") && isParsingInlineAsm()) return ParseIntelOffsetOfOperator(Start); // Type directive. - if ((Tok.getString() == "type" || Tok.getString() == "TYPE") && + if ((AsmTokStr == "type" || AsmTokStr == "TYPE") && isParsingInlineAsm()) return ParseIntelTypeOperator(Start); + // Unsupported directives. + if (isParsingIntelSyntax() && + (AsmTokStr == "size" || AsmTokStr == "SIZE" || + AsmTokStr == "length" || AsmTokStr == "LENGTH")) + return ErrorOperand(Start, "Unsupported directive!"); + // immediate. if (getLexer().is(AsmToken::Integer) || getLexer().is(AsmToken::Real) || getLexer().is(AsmToken::Minus)) { -- 2.7.4