From 309213279e5d95826d97b2ab2178db5ddea0ed80 Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Wed, 25 May 2011 01:33:42 +0000 Subject: [PATCH] Add a test for the .seh_handler directive. Fix problems with the parsing method exposed by the test. While we're at it, simplify the .seh_proc parsing method. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132028 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCParser/COFFAsmParser.cpp | 45 +++++++++++++++---------------- test/MC/AsmParser/directive_seh.s | 10 ++++--- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/lib/MC/MCParser/COFFAsmParser.cpp b/lib/MC/MCParser/COFFAsmParser.cpp index ce99509fe78..fa7ae5cf148 100644 --- a/lib/MC/MCParser/COFFAsmParser.cpp +++ b/lib/MC/MCParser/COFFAsmParser.cpp @@ -184,20 +184,17 @@ bool COFFAsmParser::ParseDirectiveEndef(StringRef, SMLoc) { } bool COFFAsmParser::ParseSEHDirectiveStartProc(StringRef, SMLoc) { - const MCExpr *e; - const MCSymbolRefExpr *funcExpr; - SMLoc startLoc = getLexer().getLoc(); - if (getParser().ParseExpression(e)) + StringRef SymbolID; + if (getParser().ParseIdentifier(SymbolID)) return true; - if (!(funcExpr = dyn_cast(e))) - return Error(startLoc, "expected symbol"); - if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); + MCSymbol *Symbol = getContext().GetOrCreateSymbol(SymbolID); + Lex(); - getStreamer().EmitWin64EHStartProc(&funcExpr->getSymbol()); + getStreamer().EmitWin64EHStartProc(Symbol); return false; } @@ -220,29 +217,28 @@ bool COFFAsmParser::ParseSEHDirectiveEndChained(StringRef, SMLoc) { } bool COFFAsmParser::ParseSEHDirectiveHandler(StringRef, SMLoc) { - const MCExpr *e; - const MCSymbolRefExpr *funcExpr; - SMLoc startLoc = getLexer().getLoc(); - if (getParser().ParseExpression(e)) + StringRef SymbolID; + if (getParser().ParseIdentifier(SymbolID)) return true; - if (!(funcExpr = dyn_cast(e))) - return Error(startLoc, "expected symbol"); - + if (getLexer().isNot(AsmToken::Comma)) + return TokError("you must specify one or both of @unwind or @except"); + Lex(); bool unwind = false, except = false; - startLoc = getLexer().getLoc(); - if (!ParseAtUnwindOrAtExcept(unwind, except)) - return Error(startLoc,"you must specify one or both of @unwind or @except"); + if (ParseAtUnwindOrAtExcept(unwind, except)) + return true; if (getLexer().is(AsmToken::Comma)) { Lex(); - if (!ParseAtUnwindOrAtExcept(unwind, except)) + if (ParseAtUnwindOrAtExcept(unwind, except)) return true; } if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); + MCSymbol *handler = getContext().GetOrCreateSymbol(SymbolID); + Lex(); - getStreamer().EmitWin64EHHandler(&funcExpr->getSymbol(), unwind, except); + getStreamer().EmitWin64EHHandler(handler, unwind, except); return false; } @@ -372,12 +368,15 @@ bool COFFAsmParser::ParseSEHDirectiveEndProlog(StringRef, SMLoc) { bool COFFAsmParser::ParseAtUnwindOrAtExcept(bool &unwind, bool &except) { StringRef identifier; + if (getLexer().isNot(AsmToken::At)) + return TokError("a handler attribute must begin with '@'"); SMLoc startLoc = getLexer().getLoc(); - if (!getParser().ParseIdentifier(identifier)) + Lex(); + if (getParser().ParseIdentifier(identifier)) return Error(startLoc, "expected @unwind or @except"); - if (identifier == "@unwind") + if (identifier == "unwind") unwind = true; - else if (identifier == "@except") + else if (identifier == "except") except = true; else return Error(startLoc, "expected @unwind or @except"); diff --git a/test/MC/AsmParser/directive_seh.s b/test/MC/AsmParser/directive_seh.s index 5fd2efad39a..7111fcc6b20 100644 --- a/test/MC/AsmParser/directive_seh.s +++ b/test/MC/AsmParser/directive_seh.s @@ -1,8 +1,9 @@ # RUN: llvm-mc -triple x86_64-pc-win32 %s | FileCheck %s # CHECK: .seh_proc func -# CHECK: .seh_stackalloc 8 +# CHECK: .seh_stackalloc 24 # CHECK: .seh_endprologue +# CHECK: .seh_handler __C_specific_handler, @except # CHECK: .seh_endproc .text @@ -10,9 +11,10 @@ .def func; .scl 2; .type 32; .endef .seh_proc func func: - subq $8, %rsp - .seh_stackalloc 8 + subq $24, %rsp + .seh_stackalloc 24 .seh_endprologue - addq $8, %rsp + .seh_handler __C_specific_handler, @except + addq $24, %rsp ret .seh_endproc -- 2.34.1