aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC
diff options
context:
space:
mode:
authorCharles Davis <cdavis@mines.edu>2011-05-19 04:04:13 +0000
committerCharles Davis <cdavis@mines.edu>2011-05-19 04:04:13 +0000
commit91d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1 (patch)
tree9cc82de40f2899bd23da683e871c6962cc978466 /lib/MC
parentd76773a22169fae235be98df7034bc2544492333 (diff)
downloadexternal_llvm-91d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1.tar.gz
external_llvm-91d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1.tar.bz2
external_llvm-91d9a1c0f7c598d51c50f80bc9e8dfc1494f78c1.zip
Implement the StartChained and EndChained Win64 EH methods on MCStreamer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@131629 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCStreamer.cpp36
1 files changed, 23 insertions, 13 deletions
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index ed73c1b3a3..4163198e39 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/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()