Index: include/llvm/MC/MCStreamer.h =================================================================== --- include/llvm/MC/MCStreamer.h +++ include/llvm/MC/MCStreamer.h @@ -222,6 +222,10 @@ return DwarfFrameInfos; } + bool hasUnfinishedDwarfFrameInfo(); + MCDwarfFrameInfo popDwarfFrameInfo(); + void pushDwarfFrameInfo(MCDwarfFrameInfo DFI); + unsigned getNumWinFrameInfos() { return WinFrameInfos.size(); } ArrayRef getWinFrameInfos() const { return WinFrameInfos; Index: lib/MC/MCStreamer.cpp =================================================================== --- lib/MC/MCStreamer.cpp +++ lib/MC/MCStreamer.cpp @@ -174,6 +174,25 @@ return &DwarfFrameInfos.back(); } +bool MCStreamer::hasUnfinishedDwarfFrameInfo() { + MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); + return CurFrame && !CurFrame->End; +} + +MCDwarfFrameInfo MCStreamer::popDwarfFrameInfo() { + if (!hasUnfinishedDwarfFrameInfo()) + report_fatal_error("Can only pop unfinished frames!"); + auto DFI = DwarfFrameInfos.back(); + DwarfFrameInfos.pop_back(); + return DFI; +} + +void MCStreamer::pushDwarfFrameInfo(MCDwarfFrameInfo DFI) { + if (hasUnfinishedDwarfFrameInfo()) + report_fatal_error("Pushing a frame before finishing the previous one!"); + DwarfFrameInfos.push_back(DFI); +} + void MCStreamer::EnsureValidDwarfFrame() { MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); if (!CurFrame || CurFrame->End) @@ -238,8 +257,7 @@ } void MCStreamer::EmitCFIStartProc(bool IsSimple) { - MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo(); - if (CurFrame && !CurFrame->End) + if (hasUnfinishedDwarfFrameInfo()) report_fatal_error("Starting a frame before finishing the previous one!"); MCDwarfFrameInfo Frame;