diff options
-rw-r--r-- | llvm/include/llvm/MC/MCStreamer.h | 7 | ||||
-rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 20 | ||||
-rw-r--r-- | llvm/lib/MC/MCWin64EH.cpp | 8 |
3 files changed, 17 insertions, 18 deletions
diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index d6f41ce5cfe..493f00ee69b 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -176,7 +176,10 @@ class MCStreamer { MCSymbol *EmitCFILabel(); MCSymbol *EmitCFICommon(); - std::vector<WinEH::FrameInfo *> WinFrameInfos; + /// Similar to DwarfFrameInfos, but for SEH unwind info. Chained frames may + /// refer to each other, so use std::unique_ptr to provide pointer stability. + std::vector<std::unique_ptr<WinEH::FrameInfo>> WinFrameInfos; + WinEH::FrameInfo *CurrentWinFrameInfo; void EnsureValidWinFrameInfo(); @@ -238,7 +241,7 @@ public: bool hasUnfinishedDwarfFrameInfo(); unsigned getNumWinFrameInfos() { return WinFrameInfos.size(); } - ArrayRef<WinEH::FrameInfo *> getWinFrameInfos() const { + ArrayRef<std::unique_ptr<WinEH::FrameInfo>> getWinFrameInfos() const { return WinFrameInfos; } diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index 61f65c5f946..7521a752fe5 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -56,17 +56,12 @@ MCStreamer::MCStreamer(MCContext &Ctx) SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>()); } -MCStreamer::~MCStreamer() { - for (unsigned i = 0; i < getNumWinFrameInfos(); ++i) - delete WinFrameInfos[i]; -} +MCStreamer::~MCStreamer() {} void MCStreamer::reset() { DwarfFrameInfos.clear(); - for (unsigned i = 0; i < getNumWinFrameInfos(); ++i) - delete WinFrameInfos[i]; - WinFrameInfos.clear(); CurrentWinFrameInfo = nullptr; + WinFrameInfos.clear(); SymbolOrdering.clear(); SectionStack.clear(); SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>()); @@ -538,8 +533,9 @@ void MCStreamer::EmitWinCFIStartProc(const MCSymbol *Symbol) { MCSymbol *StartProc = EmitCFILabel(); - WinFrameInfos.push_back(new WinEH::FrameInfo(Symbol, StartProc)); - CurrentWinFrameInfo = WinFrameInfos.back(); + WinFrameInfos.emplace_back( + llvm::make_unique<WinEH::FrameInfo>(Symbol, StartProc)); + CurrentWinFrameInfo = WinFrameInfos.back().get(); CurrentWinFrameInfo->TextSection = getCurrentSectionOnly(); } @@ -557,9 +553,9 @@ void MCStreamer::EmitWinCFIStartChained() { MCSymbol *StartProc = EmitCFILabel(); - WinFrameInfos.push_back(new WinEH::FrameInfo(CurrentWinFrameInfo->Function, - StartProc, CurrentWinFrameInfo)); - CurrentWinFrameInfo = WinFrameInfos.back(); + WinFrameInfos.emplace_back(llvm::make_unique<WinEH::FrameInfo>( + CurrentWinFrameInfo->Function, StartProc, CurrentWinFrameInfo)); + CurrentWinFrameInfo = WinFrameInfos.back().get(); CurrentWinFrameInfo->TextSection = getCurrentSectionOnly(); } diff --git a/llvm/lib/MC/MCWin64EH.cpp b/llvm/lib/MC/MCWin64EH.cpp index fdc4c10cd6c..44dd8f1385a 100644 --- a/llvm/lib/MC/MCWin64EH.cpp +++ b/llvm/lib/MC/MCWin64EH.cpp @@ -220,17 +220,17 @@ static void EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info) { void llvm::Win64EH::UnwindEmitter::Emit(MCStreamer &Streamer) const { // Emit the unwind info structs first. - for (WinEH::FrameInfo *CFI : Streamer.getWinFrameInfos()) { + for (const auto &CFI : Streamer.getWinFrameInfos()) { MCSection *XData = Streamer.getAssociatedXDataSection(CFI->TextSection); Streamer.SwitchSection(XData); - ::EmitUnwindInfo(Streamer, CFI); + ::EmitUnwindInfo(Streamer, CFI.get()); } // Now emit RUNTIME_FUNCTION entries. - for (WinEH::FrameInfo *CFI : Streamer.getWinFrameInfos()) { + for (const auto &CFI : Streamer.getWinFrameInfos()) { MCSection *PData = Streamer.getAssociatedPDataSection(CFI->TextSection); Streamer.SwitchSection(PData); - EmitRuntimeFunction(Streamer, CFI); + EmitRuntimeFunction(Streamer, CFI.get()); } } |