diff options
author | Reid Kleckner <rnk@google.com> | 2017-10-10 01:26:25 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2017-10-10 01:26:25 +0000 |
commit | e52d1e678739b05b6dbf5c349877898e87ddecd7 (patch) | |
tree | 020dd0a3324bcb0aac65c7ad88d02fb07bc5948a /llvm/lib/MC/MCParser/COFFAsmParser.cpp | |
parent | cc7171abbf2772df7817b70ec975a201aad2de05 (diff) | |
download | bcm5719-llvm-e52d1e678739b05b6dbf5c349877898e87ddecd7.tar.gz bcm5719-llvm-e52d1e678739b05b6dbf5c349877898e87ddecd7.zip |
[SEH] Use reportError instead of report_fatal_error for bad directives
This makes the .seh_ directives slightly more usable from standalone
assembly files.
This removes a large number of report_fatal_errors and recovers from the
error by ignoring the directive.
llvm-svn: 315262
Diffstat (limited to 'llvm/lib/MC/MCParser/COFFAsmParser.cpp')
-rw-r--r-- | llvm/lib/MC/MCParser/COFFAsmParser.cpp | 66 |
1 files changed, 25 insertions, 41 deletions
diff --git a/llvm/lib/MC/MCParser/COFFAsmParser.cpp b/llvm/lib/MC/MCParser/COFFAsmParser.cpp index b83d68d4fe2..687e0cc1faa 100644 --- a/llvm/lib/MC/MCParser/COFFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/COFFAsmParser.cpp @@ -568,7 +568,7 @@ bool COFFAsmParser::ParseDirectiveLinkOnce(StringRef, SMLoc Loc) { return false; } -bool COFFAsmParser::ParseSEHDirectiveStartProc(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveStartProc(StringRef, SMLoc Loc) { StringRef SymbolID; if (getParser().parseIdentifier(SymbolID)) return true; @@ -579,29 +579,29 @@ bool COFFAsmParser::ParseSEHDirectiveStartProc(StringRef, SMLoc) { MCSymbol *Symbol = getContext().getOrCreateSymbol(SymbolID); Lex(); - getStreamer().EmitWinCFIStartProc(Symbol); + getStreamer().EmitWinCFIStartProc(Symbol, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveEndProc(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveEndProc(StringRef, SMLoc Loc) { Lex(); - getStreamer().EmitWinCFIEndProc(); + getStreamer().EmitWinCFIEndProc(Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveStartChained(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveStartChained(StringRef, SMLoc Loc) { Lex(); - getStreamer().EmitWinCFIStartChained(); + getStreamer().EmitWinCFIStartChained(Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveEndChained(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveEndChained(StringRef, SMLoc Loc) { Lex(); - getStreamer().EmitWinCFIEndChained(); + getStreamer().EmitWinCFIEndChained(Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveHandler(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveHandler(StringRef, SMLoc Loc) { StringRef SymbolID; if (getParser().parseIdentifier(SymbolID)) return true; @@ -623,17 +623,17 @@ bool COFFAsmParser::ParseSEHDirectiveHandler(StringRef, SMLoc) { MCSymbol *handler = getContext().getOrCreateSymbol(SymbolID); Lex(); - getStreamer().EmitWinEHHandler(handler, unwind, except); + getStreamer().EmitWinEHHandler(handler, unwind, except, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveHandlerData(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveHandlerData(StringRef, SMLoc Loc) { Lex(); getStreamer().EmitWinEHHandlerData(); return false; } -bool COFFAsmParser::ParseSEHDirectivePushReg(StringRef, SMLoc L) { +bool COFFAsmParser::ParseSEHDirectivePushReg(StringRef, SMLoc Loc) { unsigned Reg = 0; if (ParseSEHRegisterNumber(Reg)) return true; @@ -642,11 +642,11 @@ bool COFFAsmParser::ParseSEHDirectivePushReg(StringRef, SMLoc L) { return TokError("unexpected token in directive"); Lex(); - getStreamer().EmitWinCFIPushReg(Reg); + getStreamer().EmitWinCFIPushReg(Reg, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveSetFrame(StringRef, SMLoc L) { +bool COFFAsmParser::ParseSEHDirectiveSetFrame(StringRef, SMLoc Loc) { unsigned Reg = 0; int64_t Off; if (ParseSEHRegisterNumber(Reg)) @@ -655,39 +655,31 @@ bool COFFAsmParser::ParseSEHDirectiveSetFrame(StringRef, SMLoc L) { return TokError("you must specify a stack pointer offset"); Lex(); - SMLoc startLoc = getLexer().getLoc(); if (getParser().parseAbsoluteExpression(Off)) return true; - if (Off & 0x0F) - return Error(startLoc, "offset is not a multiple of 16"); - if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); Lex(); - getStreamer().EmitWinCFISetFrame(Reg, Off); + getStreamer().EmitWinCFISetFrame(Reg, Off, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveAllocStack(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveAllocStack(StringRef, SMLoc Loc) { int64_t Size; - SMLoc startLoc = getLexer().getLoc(); if (getParser().parseAbsoluteExpression(Size)) return true; - if (Size & 7) - return Error(startLoc, "size is not a multiple of 8"); - if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); Lex(); - getStreamer().EmitWinCFIAllocStack(Size); + getStreamer().EmitWinCFIAllocStack(Size, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveSaveReg(StringRef, SMLoc L) { +bool COFFAsmParser::ParseSEHDirectiveSaveReg(StringRef, SMLoc Loc) { unsigned Reg = 0; int64_t Off; if (ParseSEHRegisterNumber(Reg)) @@ -696,25 +688,21 @@ bool COFFAsmParser::ParseSEHDirectiveSaveReg(StringRef, SMLoc L) { return TokError("you must specify an offset on the stack"); Lex(); - SMLoc startLoc = getLexer().getLoc(); if (getParser().parseAbsoluteExpression(Off)) return true; - if (Off & 7) - return Error(startLoc, "size is not a multiple of 8"); - if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); Lex(); // FIXME: Err on %xmm* registers - getStreamer().EmitWinCFISaveReg(Reg, Off); + getStreamer().EmitWinCFISaveReg(Reg, Off, Loc); return false; } // FIXME: This method is inherently x86-specific. It should really be in the // x86 backend. -bool COFFAsmParser::ParseSEHDirectiveSaveXMM(StringRef, SMLoc L) { +bool COFFAsmParser::ParseSEHDirectiveSaveXMM(StringRef, SMLoc Loc) { unsigned Reg = 0; int64_t Off; if (ParseSEHRegisterNumber(Reg)) @@ -723,23 +711,19 @@ bool COFFAsmParser::ParseSEHDirectiveSaveXMM(StringRef, SMLoc L) { return TokError("you must specify an offset on the stack"); Lex(); - SMLoc startLoc = getLexer().getLoc(); if (getParser().parseAbsoluteExpression(Off)) return true; if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in directive"); - if (Off & 0x0F) - return Error(startLoc, "offset is not a multiple of 16"); - Lex(); // FIXME: Err on non-%xmm* registers - getStreamer().EmitWinCFISaveXMM(Reg, Off); + getStreamer().EmitWinCFISaveXMM(Reg, Off, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectivePushFrame(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectivePushFrame(StringRef, SMLoc Loc) { bool Code = false; StringRef CodeID; if (getLexer().is(AsmToken::At)) { @@ -756,13 +740,13 @@ bool COFFAsmParser::ParseSEHDirectivePushFrame(StringRef, SMLoc) { return TokError("unexpected token in directive"); Lex(); - getStreamer().EmitWinCFIPushFrame(Code); + getStreamer().EmitWinCFIPushFrame(Code, Loc); return false; } -bool COFFAsmParser::ParseSEHDirectiveEndProlog(StringRef, SMLoc) { +bool COFFAsmParser::ParseSEHDirectiveEndProlog(StringRef, SMLoc Loc) { Lex(); - getStreamer().EmitWinCFIEndProlog(); + getStreamer().EmitWinCFIEndProlog(Loc); return false; } |