Add a sys::OwningMemoryBlock class, which is a sys::MemoryBlock that owns its
underlying memory, and will automatically release it on destruction.

Use this to tidy up the orc::IndirectStubsInfo class.

llvm-svn: 251731
diff --git a/llvm/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp b/llvm/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp
index 1e2d58c..c03b935 100644
--- a/llvm/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/OrcTargetSupport.cpp
@@ -144,27 +144,6 @@
   return GetLabelName;
 }
 
-OrcX86_64::IndirectStubsInfo::IndirectStubsInfo(IndirectStubsInfo &&Other) {
-  StubsBlock = std::move(Other.StubsBlock);
-  PtrsBlock = std::move(Other.PtrsBlock);
-  Other.StubsBlock = sys::MemoryBlock();
-  Other.PtrsBlock = sys::MemoryBlock();
-}
-
-OrcX86_64::IndirectStubsInfo&
-OrcX86_64::IndirectStubsInfo::operator=(IndirectStubsInfo &&Other) {
-  StubsBlock = std::move(Other.StubsBlock);
-  PtrsBlock = std::move(Other.PtrsBlock);
-  Other.StubsBlock = sys::MemoryBlock();
-  Other.PtrsBlock = sys::MemoryBlock();
-  return *this;
-}
-
-OrcX86_64::IndirectStubsInfo::~IndirectStubsInfo() {
-  sys::Memory::releaseMappedMemory(StubsBlock);
-  sys::Memory::releaseMappedMemory(PtrsBlock);
-}
-
 std::error_code OrcX86_64::emitIndirectStubsBlock(IndirectStubsInfo &StubsInfo,
                                                   unsigned MinStubs,
                                                   void *InitialPtrVal) {
@@ -197,19 +176,20 @@
 
   // Allocate memory for stubs and pointers in one call.
   std::error_code EC;
-  auto InitialBlock = sys::Memory::allocateMappedMemory(2 * NumPages * PageSize,
-                                                        nullptr,
-                                                        sys::Memory::MF_READ |
-                                                        sys::Memory::MF_WRITE,
-                                                        EC);
+  auto StubsMem =
+    sys::OwningMemoryBlock(
+      sys::Memory::allocateMappedMemory(2 * NumPages * PageSize, nullptr,
+                                        sys::Memory::MF_READ |
+                                        sys::Memory::MF_WRITE,
+                                        EC));
 
   if (EC)
     return EC;
 
   // Create separate MemoryBlocks representing the stubs and pointers.
-  sys::MemoryBlock StubsBlock(InitialBlock.base(), NumPages * PageSize);
-  sys::MemoryBlock PtrsBlock(static_cast<char*>(InitialBlock.base()) +
-                             NumPages * PageSize,
+  sys::MemoryBlock StubsBlock(StubsMem.base(), NumPages * PageSize);
+  sys::MemoryBlock PtrsBlock(static_cast<char*>(StubsMem.base()) +
+                               NumPages * PageSize,
                              NumPages * PageSize);
 
   // Populate the stubs page stubs and mark it executable.
@@ -230,8 +210,7 @@
     Ptr[I] = InitialPtrVal;
 
   StubsInfo.NumStubs = NumStubs;
-  StubsInfo.StubsBlock = std::move(StubsBlock);
-  StubsInfo.PtrsBlock = std::move(PtrsBlock);
+  StubsInfo.StubsMem = std::move(StubsMem);
 
   return std::error_code();
 }