diff options
author | Charles Davis <cdavis@mines.edu> | 2011-05-19 02:49:00 +0000 |
---|---|---|
committer | Charles Davis <cdavis@mines.edu> | 2011-05-19 02:49:00 +0000 |
commit | d991ec4e6872e17a8f46ad35048abf81bb5b1a5f (patch) | |
tree | 0cb8a215a8c1e342050d1827532b5cbd2903d347 /llvm/lib/MC/MCStreamer.cpp | |
parent | 382c065822e4b952706b708839fe56c9be969d06 (diff) | |
download | bcm5719-llvm-d991ec4e6872e17a8f46ad35048abf81bb5b1a5f.tar.gz bcm5719-llvm-d991ec4e6872e17a8f46ad35048abf81bb5b1a5f.zip |
Implement the StartProc and EndProc Win64 EH methods on the base MCStreamer.
Based largely on Rafael Espindola's work on CFI. Other methods soon to follow.
llvm-svn: 131623
Diffstat (limited to 'llvm/lib/MC/MCStreamer.cpp')
-rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index bf63f8faee4..ed73c1b3a34 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -310,16 +310,37 @@ void MCStreamer::EmitCFISameValue(int64_t Register) { CurFrame->Instructions.push_back(Instruction); } -void MCStreamer::EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler) -{ - errs() << "Not implemented yet\n"; - abort(); +MCWin64EHUnwindInfo *MCStreamer::getCurrentW64UnwindInfo() { + if (W64UnwindInfos.empty()) + return NULL; + return &W64UnwindInfos.back(); } -void MCStreamer::EmitWin64EHEndProc() -{ - errs() << "Not implemented yet\n"; - abort(); +void MCStreamer::EnsureValidW64UnwindInfo() { + MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); + if (!CurFrame || CurFrame->End) + report_fatal_error("No open Win64 EH frame function!"); +} + +void MCStreamer::EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler) { + MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); + if (CurFrame && !CurFrame->End) + report_fatal_error("Starting a function before ending the previous one!"); + MCWin64EHUnwindInfo Frame; + Frame.Begin = getContext().CreateTempSymbol(); + Frame.Function = Symbol; + Frame.ExceptionHandler = EHandler; + EmitLabel(Frame.Begin); + W64UnwindInfos.push_back(Frame); +} + +void MCStreamer::EmitWin64EHEndProc() { + EnsureValidW64UnwindInfo(); + MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); + if (CurFrame->Chained) + report_fatal_error("Not all chained regions terminated!"); + CurFrame->End = getContext().CreateTempSymbol(); + EmitLabel(CurFrame->End); } void MCStreamer::EmitWin64EHStartChained() |