diff options
author | Charles Davis <cdavis@mines.edu> | 2011-05-25 21:43:45 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2011-05-25 21:43:45 +0000 |
commit | 2f6ecea19d3d5380e7c34502138e44b96476856e (patch) | |
tree | c000a97665772bf3fd5df72f690fc8cd30c86a22 /llvm/lib | |
parent | 8f2cd0254d4c4b3b5e25778c09320b4fc23bb60e (diff) | |
download | bcm5719-llvm-2f6ecea19d3d5380e7c34502138e44b96476856e.tar.gz bcm5719-llvm-2f6ecea19d3d5380e7c34502138e44b96476856e.zip |
Add tests for .seh_setframe and .seh_handlerdata parsing. Fix issues with
them.
I had to add a special SwitchSectionNoChange method to MCStreamer just for
.seh_handlerdata. If this isn't OK, please let me know, and I'll find some
other way to fix .seh_handlerdata streaming.
llvm-svn: 132084
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/MC/MCParser/COFFAsmParser.cpp | 8 |
2 files changed, 15 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 1df5c074746..9376d55e717 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -973,6 +973,15 @@ void MCAsmStreamer::EmitWin64EHHandler(const MCSymbol *Sym, bool Unwind, void MCAsmStreamer::EmitWin64EHHandlerData() { MCStreamer::EmitWin64EHHandlerData(); + // Switch sections. Don't call SwitchSection directly, because that will + // cause the section switch to be visible in the emitted assembly. + // We only do this so the section switch that terminates the handler + // data block is visible. + const MCSection *xdataSect = + getContext().getTargetAsmInfo().getWin64EHTableSection(); + if (xdataSect) + SwitchSectionNoChange(xdataSect); + OS << "\t.seh_handlerdata"; EmitEOL(); } diff --git a/llvm/lib/MC/MCParser/COFFAsmParser.cpp b/llvm/lib/MC/MCParser/COFFAsmParser.cpp index 7fde4fec38b..64f635517b1 100644 --- a/llvm/lib/MC/MCParser/COFFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/COFFAsmParser.cpp @@ -266,6 +266,10 @@ bool COFFAsmParser::ParseSEHDirectiveSetFrame(StringRef, SMLoc L) { int64_t Off; if (ParseSEHRegisterNumber(Reg)) return true; + if (getLexer().isNot(AsmToken::Comma)) + return TokError("you must specify a stack pointer offset"); + + Lex(); SMLoc startLoc = getLexer().getLoc(); if (getParser().ParseAbsoluteExpression(Off)) return true; @@ -304,7 +308,7 @@ bool COFFAsmParser::ParseSEHDirectiveSaveReg(StringRef, SMLoc L) { if (ParseSEHRegisterNumber(Reg)) return true; if (getLexer().isNot(AsmToken::Comma)) - return TokError("expected comma"); + return TokError("you must specify an offset on the stack"); Lex(); SMLoc startLoc = getLexer().getLoc(); @@ -331,7 +335,7 @@ bool COFFAsmParser::ParseSEHDirectiveSaveXMM(StringRef, SMLoc L) { if (ParseSEHRegisterNumber(Reg)) return true; if (getLexer().isNot(AsmToken::Comma)) - return TokError("expected comma"); + return TokError("you must specify an offset on the stack"); Lex(); SMLoc startLoc = getLexer().getLoc(); |