]> granicus.if.org Git - llvm/commitdiff
[MC] Use unique_ptr to manage WinFrameInfos, NFC
authorReid Kleckner <rnk@google.com>
Fri, 6 Oct 2017 17:21:49 +0000 (17:21 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 6 Oct 2017 17:21:49 +0000 (17:21 +0000)
The FrameInfo cannot be stored directly in the vector because chained
frames may refer to parent frames, so we need pointers that are stable
across a vector resize.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315080 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCStreamer.h
lib/MC/MCStreamer.cpp
lib/MC/MCWin64EH.cpp

index d6f41ce5cfe8f21b4b0107d091038ffd50657cdc..493f00ee69bfcd38b4e4c304076832d4fb328f1d 100644 (file)
@@ -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;
   }
 
index 61f65c5f9461f150f4e0508e65abc35c4fbe35da..7521a752fe59cba0a5fffbbabd23bd32cdff009c 100644 (file)
@@ -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();
 }
 
index fdc4c10cd6cef1815d071aeedcac58a3a11c301d..44dd8f1385a0dddcc63242cb143be4ac2bfb197f 100644 (file)
@@ -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());
   }
 }