From: David Blaikie Date: Tue, 28 Apr 2020 21:31:43 +0000 (-0700) Subject: WebAssemblyExceptionInfo::Exceptions: Use unique_ptr to simplify memory management X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f6d5320ebe95857bbff01e977dfcfc1971aef4a3;p=platform%2Fupstream%2Fllvm.git WebAssemblyExceptionInfo::Exceptions: Use unique_ptr to simplify memory management --- diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp index a511b32..c75de7a 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.cpp @@ -46,14 +46,14 @@ bool WebAssemblyExceptionInfo::runOnMachineFunction(MachineFunction &MF) { void WebAssemblyExceptionInfo::recalculate( MachineDominatorTree &MDT, const MachineDominanceFrontier &MDF) { // Postorder traversal of the dominator tree. - SmallVector Exceptions; + SmallVector, 8> Exceptions; for (auto DomNode : post_order(&MDT)) { MachineBasicBlock *EHPad = DomNode->getBlock(); if (!EHPad->isEHPad()) continue; - auto *WE = new WebAssemblyException(EHPad); - discoverAndMapException(WE, MDT, MDF); - Exceptions.push_back(WE); + auto WE = std::make_unique(EHPad); + discoverAndMapException(WE.get(), MDT, MDF); + Exceptions.push_back(std::move(WE)); } // Add BBs to exceptions @@ -64,17 +64,21 @@ void WebAssemblyExceptionInfo::recalculate( WE->addBlock(MBB); } + SmallVector ExceptionPointers; + ExceptionPointers.reserve(Exceptions.size()); + // Add subexceptions to exceptions - for (auto *WE : Exceptions) { + for (auto &WE : Exceptions) { + ExceptionPointers.push_back(WE.get()); if (WE->getParentException()) - WE->getParentException()->getSubExceptions().push_back(WE); + WE->getParentException()->getSubExceptions().push_back(std::move(WE)); else - addTopLevelException(WE); + addTopLevelException(std::move(WE)); } // For convenience, Blocks and SubExceptions are inserted in postorder. // Reverse the lists. - for (auto *WE : Exceptions) { + for (auto *WE : ExceptionPointers) { WE->reverseBlock(); std::reverse(WE->getSubExceptions().begin(), WE->getSubExceptions().end()); } @@ -82,7 +86,6 @@ void WebAssemblyExceptionInfo::recalculate( void WebAssemblyExceptionInfo::releaseMemory() { BBMap.clear(); - DeleteContainerPointers(TopLevelExceptions); TopLevelExceptions.clear(); } @@ -181,6 +184,6 @@ raw_ostream &operator<<(raw_ostream &OS, const WebAssemblyException &WE) { } void WebAssemblyExceptionInfo::print(raw_ostream &OS, const Module *) const { - for (auto *WE : TopLevelExceptions) + for (auto &WE : TopLevelExceptions) WE->print(OS); } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h index 9a90d7d..50151ec 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblyExceptionInfo.h @@ -43,13 +43,12 @@ class WebAssemblyException { MachineBasicBlock *EHPad = nullptr; WebAssemblyException *ParentException = nullptr; - std::vector SubExceptions; + std::vector> SubExceptions; std::vector Blocks; SmallPtrSet BlockSet; public: WebAssemblyException(MachineBasicBlock *EHPad) : EHPad(EHPad) {} - ~WebAssemblyException() { DeleteContainerPointers(SubExceptions); } WebAssemblyException(const WebAssemblyException &) = delete; const WebAssemblyException &operator=(const WebAssemblyException &) = delete; @@ -83,14 +82,16 @@ public: unsigned getNumBlocks() const { return Blocks.size(); } std::vector &getBlocksVector() { return Blocks; } - const std::vector &getSubExceptions() const { + const std::vector> &getSubExceptions() const { return SubExceptions; } - std::vector &getSubExceptions() { + std::vector> &getSubExceptions() { return SubExceptions; } - void addSubException(WebAssemblyException *E) { SubExceptions.push_back(E); } - using iterator = typename std::vector::const_iterator; + void addSubException(std::unique_ptr E) { + SubExceptions.push_back(std::move(E)); + } + using iterator = typename decltype(SubExceptions)::const_iterator; iterator begin() const { return SubExceptions.begin(); } iterator end() const { return SubExceptions.end(); } @@ -117,7 +118,7 @@ raw_ostream &operator<<(raw_ostream &OS, const WebAssemblyException &WE); class WebAssemblyExceptionInfo final : public MachineFunctionPass { // Mapping of basic blocks to the innermost exception they occur in DenseMap BBMap; - std::vector TopLevelExceptions; + std::vector> TopLevelExceptions; void discoverAndMapException(WebAssemblyException *WE, const MachineDominatorTree &MDT, @@ -156,9 +157,9 @@ public: BBMap[MBB] = WE; } - void addTopLevelException(WebAssemblyException *WE) { + void addTopLevelException(std::unique_ptr WE) { assert(!WE->getParentException() && "Not a top level exception!"); - TopLevelExceptions.push_back(WE); + TopLevelExceptions.push_back(std::move(WE)); } void print(raw_ostream &OS, const Module *M = nullptr) const override;