From b4222589bfc0b80b4e4248c62ae901a9e77445f4 Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Thu, 19 May 2011 04:04:13 +0000 Subject: [PATCH] Implement the StartChained and EndChained Win64 EH methods on MCStreamer. llvm-svn: 131629 --- llvm/include/llvm/MC/MCStreamer.h | 3 ++- llvm/include/llvm/MC/MCWin64EH.h | 4 ++-- llvm/lib/MC/MCStreamer.cpp | 36 ++++++++++++++++++++----------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index 8fb46317db3a..83bcb15ae9ae 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -59,7 +59,8 @@ namespace llvm { void EnsureValidFrame(); std::vector W64UnwindInfos; - MCWin64EHUnwindInfo *getCurrentW64UnwindInfo(); + MCWin64EHUnwindInfo *CurrentW64UnwindInfo; + void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame); void EnsureValidW64UnwindInfo(); const MCSymbol* LastNonPrivate; diff --git a/llvm/include/llvm/MC/MCWin64EH.h b/llvm/include/llvm/MC/MCWin64EH.h index b7513c8867a1..c772cdef2a5a 100644 --- a/llvm/include/llvm/MC/MCWin64EH.h +++ b/llvm/include/llvm/MC/MCWin64EH.h @@ -64,7 +64,7 @@ namespace llvm { struct MCWin64EHUnwindInfo { MCWin64EHUnwindInfo() : Begin(0), End(0), ExceptionHandler(0), Lsda(0), Function(0), UnwindOnly(false), LsdaSize(0), - PrologSize(0), LastFrameInst(-1), Chained(false), + PrologSize(0), LastFrameInst(-1), ChainedParent(0), Instructions() {} MCSymbol *Begin; MCSymbol *End; @@ -75,7 +75,7 @@ namespace llvm { unsigned LsdaSize; unsigned PrologSize; int LastFrameInst; - bool Chained; + MCWin64EHUnwindInfo *ChainedParent; std::vector Instructions; }; diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index ed73c1b3a342..4163198e3945 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -310,20 +310,19 @@ void MCStreamer::EmitCFISameValue(int64_t Register) { CurFrame->Instructions.push_back(Instruction); } -MCWin64EHUnwindInfo *MCStreamer::getCurrentW64UnwindInfo() { - if (W64UnwindInfos.empty()) - return NULL; - return &W64UnwindInfos.back(); +void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) { + W64UnwindInfos.push_back(*Frame); + CurrentW64UnwindInfo = &W64UnwindInfos.back(); } void MCStreamer::EnsureValidW64UnwindInfo() { - MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); + MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo; if (!CurFrame || CurFrame->End) report_fatal_error("No open Win64 EH frame function!"); } void MCStreamer::EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler) { - MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); + MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo; if (CurFrame && !CurFrame->End) report_fatal_error("Starting a function before ending the previous one!"); MCWin64EHUnwindInfo Frame; @@ -331,13 +330,13 @@ void MCStreamer::EmitWin64EHStartProc(MCSymbol *Symbol, MCSymbol *EHandler) { Frame.Function = Symbol; Frame.ExceptionHandler = EHandler; EmitLabel(Frame.Begin); - W64UnwindInfos.push_back(Frame); + setCurrentW64UnwindInfo(&Frame); } void MCStreamer::EmitWin64EHEndProc() { EnsureValidW64UnwindInfo(); - MCWin64EHUnwindInfo *CurFrame = getCurrentW64UnwindInfo(); - if (CurFrame->Chained) + MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo; + if (CurFrame->ChainedParent) report_fatal_error("Not all chained regions terminated!"); CurFrame->End = getContext().CreateTempSymbol(); EmitLabel(CurFrame->End); @@ -345,14 +344,25 @@ void MCStreamer::EmitWin64EHEndProc() { void MCStreamer::EmitWin64EHStartChained() { - errs() << "Not implemented yet\n"; - abort(); + EnsureValidW64UnwindInfo(); + MCWin64EHUnwindInfo Frame; + MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo; + Frame.Begin = getContext().CreateTempSymbol(); + Frame.Function = CurFrame->Function; + Frame.ChainedParent = CurFrame; + EmitLabel(Frame.Begin); + setCurrentW64UnwindInfo(&Frame); } void MCStreamer::EmitWin64EHEndChained() { - errs() << "Not implemented yet\n"; - abort(); + EnsureValidW64UnwindInfo(); + MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo; + if (!CurFrame->ChainedParent) + report_fatal_error("End of a chained region outside a chained region!"); + CurFrame->End = getContext().CreateTempSymbol(); + EmitLabel(CurFrame->End); + CurrentW64UnwindInfo = CurFrame->ChainedParent; } void MCStreamer::EmitWin64EHUnwindOnly()