summaryrefslogtreecommitdiff
path: root/lib/MC/MCParser
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-25 01:33:42 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-25 01:33:42 +0000
commit309213279e5d95826d97b2ab2178db5ddea0ed80 (patch)
tree3fb76719f64040c0d2bbdf86e1da942b92304d69 /lib/MC/MCParser
parent56926a39619bd644c83c4128f0b55189e52707d7 (diff)
downloadllvm-309213279e5d95826d97b2ab2178db5ddea0ed80.tar.gz
llvm-309213279e5d95826d97b2ab2178db5ddea0ed80.tar.bz2
llvm-309213279e5d95826d97b2ab2178db5ddea0ed80.tar.xz
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
Diffstat (limited to 'lib/MC/MCParser')
-rw-r--r--lib/MC/MCParser/COFFAsmParser.cpp45
1 files changed, 22 insertions, 23 deletions
diff --git a/lib/MC/MCParser/COFFAsmParser.cpp b/lib/MC/MCParser/COFFAsmParser.cpp
index ce99509fe7..fa7ae5cf14 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<MCSymbolRefExpr>(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<MCSymbolRefExpr>(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");