summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/MC/MCStreamer.h4
-rw-r--r--lib/MC/MCStreamer.cpp26
-rw-r--r--test/MC/AsmParser/directive_seh.s3
3 files changed, 18 insertions, 15 deletions
diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h
index 9dd8d4b533..c05a9251dc 100644
--- a/include/llvm/MC/MCStreamer.h
+++ b/include/llvm/MC/MCStreamer.h
@@ -58,7 +58,7 @@ namespace llvm {
MCDwarfFrameInfo *getCurrentFrameInfo();
void EnsureValidFrame();
- std::vector<MCWin64EHUnwindInfo> W64UnwindInfos;
+ std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos;
MCWin64EHUnwindInfo *CurrentW64UnwindInfo;
void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame);
void EnsureValidW64UnwindInfo();
@@ -101,7 +101,7 @@ namespace llvm {
}
MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) {
- return W64UnwindInfos[i];
+ return *W64UnwindInfos[i];
}
/// @name Assembly File Formatting.
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index 19aeaafc72..9957a76ba3 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -307,8 +307,8 @@ void MCStreamer::EmitCFISameValue(int64_t Register) {
}
void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
- W64UnwindInfos.push_back(*Frame);
- CurrentW64UnwindInfo = &W64UnwindInfos.back();
+ W64UnwindInfos.push_back(Frame);
+ CurrentW64UnwindInfo = W64UnwindInfos.back();
}
void MCStreamer::EnsureValidW64UnwindInfo() {
@@ -321,11 +321,11 @@ void MCStreamer::EmitWin64EHStartProc(const MCSymbol *Symbol) {
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
if (CurFrame && !CurFrame->End)
report_fatal_error("Starting a function before ending the previous one!");
- MCWin64EHUnwindInfo Frame;
- Frame.Begin = getContext().CreateTempSymbol();
- Frame.Function = Symbol;
- EmitLabel(Frame.Begin);
- setCurrentW64UnwindInfo(&Frame);
+ MCWin64EHUnwindInfo *Frame = new (getContext()) MCWin64EHUnwindInfo;
+ Frame->Begin = getContext().CreateTempSymbol();
+ Frame->Function = Symbol;
+ EmitLabel(Frame->Begin);
+ setCurrentW64UnwindInfo(Frame);
}
void MCStreamer::EmitWin64EHEndProc() {
@@ -339,13 +339,13 @@ void MCStreamer::EmitWin64EHEndProc() {
void MCStreamer::EmitWin64EHStartChained() {
EnsureValidW64UnwindInfo();
- MCWin64EHUnwindInfo Frame;
+ MCWin64EHUnwindInfo *Frame = new (getContext()) MCWin64EHUnwindInfo;
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
- Frame.Begin = getContext().CreateTempSymbol();
- Frame.Function = CurFrame->Function;
- Frame.ChainedParent = CurFrame;
- EmitLabel(Frame.Begin);
- setCurrentW64UnwindInfo(&Frame);
+ Frame->Begin = getContext().CreateTempSymbol();
+ Frame->Function = CurFrame->Function;
+ Frame->ChainedParent = CurFrame;
+ EmitLabel(Frame->Begin);
+ setCurrentW64UnwindInfo(Frame);
}
void MCStreamer::EmitWin64EHEndChained() {
diff --git a/test/MC/AsmParser/directive_seh.s b/test/MC/AsmParser/directive_seh.s
index d4f7625e88..b4384daf48 100644
--- a/test/MC/AsmParser/directive_seh.s
+++ b/test/MC/AsmParser/directive_seh.s
@@ -35,6 +35,9 @@ func:
.seh_handlerdata
.long 0
.text
+ .seh_startchained
+ .seh_endprologue
+ .seh_endchained
lea (%rbx), %rsp
pop %rbx
addq $24, %rsp