Rework how the MCWin64EHUnwindInfo instances are stored. Fix issues with
chained unwind areas exposed by the test that were related to this.
The ChainedParent field had the wrong address, because when the chained unwind
info was added, the addresses shifted around. Now we store the pointers to the
structures, which are now allocated from the MC heap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132106
91177308-0d34-0410-b5e6-
96231b3b80d8
MCDwarfFrameInfo *getCurrentFrameInfo();
void EnsureValidFrame();
MCDwarfFrameInfo *getCurrentFrameInfo();
void EnsureValidFrame();
- std::vector<MCWin64EHUnwindInfo> W64UnwindInfos;
+ std::vector<MCWin64EHUnwindInfo *> W64UnwindInfos;
MCWin64EHUnwindInfo *CurrentW64UnwindInfo;
void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame);
void EnsureValidW64UnwindInfo();
MCWin64EHUnwindInfo *CurrentW64UnwindInfo;
void setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame);
void EnsureValidW64UnwindInfo();
}
MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) {
}
MCWin64EHUnwindInfo &getW64UnwindInfo(unsigned i) {
- return W64UnwindInfos[i];
+ return *W64UnwindInfos[i];
}
/// @name Assembly File Formatting.
}
/// @name Assembly File Formatting.
}
void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
}
void MCStreamer::setCurrentW64UnwindInfo(MCWin64EHUnwindInfo *Frame) {
- W64UnwindInfos.push_back(*Frame);
- CurrentW64UnwindInfo = &W64UnwindInfos.back();
+ W64UnwindInfos.push_back(Frame);
+ CurrentW64UnwindInfo = W64UnwindInfos.back();
}
void MCStreamer::EnsureValidW64UnwindInfo() {
}
void MCStreamer::EnsureValidW64UnwindInfo() {
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
if (CurFrame && !CurFrame->End)
report_fatal_error("Starting a function before ending the previous one!");
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() {
}
void MCStreamer::EmitWin64EHEndProc() {
void MCStreamer::EmitWin64EHStartChained() {
EnsureValidW64UnwindInfo();
void MCStreamer::EmitWin64EHStartChained() {
EnsureValidW64UnwindInfo();
- MCWin64EHUnwindInfo Frame;
+ MCWin64EHUnwindInfo *Frame = new (getContext()) MCWin64EHUnwindInfo;
MCWin64EHUnwindInfo *CurFrame = CurrentW64UnwindInfo;
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() {
}
void MCStreamer::EmitWin64EHEndChained() {
.seh_handlerdata
.long 0
.text
.seh_handlerdata
.long 0
.text
+ .seh_startchained
+ .seh_endprologue
+ .seh_endchained
lea (%rbx), %rsp
pop %rbx
addq $24, %rsp
lea (%rbx), %rsp
pop %rbx
addq $24, %rsp