Move inferior mmap/munmap call code into their own functions in utility lib

git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@132584 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
index 8b0c47c..6ba0bd2 100644
--- a/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
+++ b/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
@@ -45,6 +45,7 @@
 
 // Project includes
 #include "lldb/Host/Host.h"
+#include "Plugins/Process/Utility/InferiorCallPOSIX.h"
 #include "Utility/StringExtractorGDBRemote.h"
 #include "GDBRemoteRegisterContext.h"
 #include "ProcessGDBRemote.h"
@@ -1561,97 +1562,20 @@
                 return allocated_addr;
 
         case eLazyBoolNo:
-            // Call mmap() to create executable memory in the inferior..
-            {
-                Thread *thread = GetThreadList().GetSelectedThread().get();
-                if (thread == NULL)
-                    thread = GetThreadList().GetThreadAtIndex(0).get();
+            // Call mmap() to create memory in the inferior..
+            unsigned prot = 0;
+            if (permissions & lldb::ePermissionsReadable)
+                prot |= eMmapProtRead;
+            if (permissions & lldb::ePermissionsWritable)
+                prot |= eMmapProtWrite;
+            if (permissions & lldb::ePermissionsExecutable)
+                prot |= eMmapProtExec;
 
-                const bool append = true;
-                const bool include_symbols = true;
-                SymbolContextList sc_list;
-                const uint32_t count = m_target.GetImages().FindFunctions (ConstString ("mmap"), 
-                                                                           eFunctionNameTypeFull,
-                                                                           include_symbols, 
-                                                                           append, 
-                                                                           sc_list);
-                if (count > 0)
-                {
-                    SymbolContext sc;
-                    if (sc_list.GetContextAtIndex(0, sc))
-                    {
-                        const uint32_t range_scope = eSymbolContextFunction | eSymbolContextSymbol;
-                        const bool use_inline_block_range = false;
-                        const bool stop_other_threads = true;
-                        const bool discard_on_error = true;
-                        const bool try_all_threads = true;
-                        const uint32_t single_thread_timeout_usec = 500000;
-                        addr_t arg1_addr = 0;
-                        addr_t arg2_len = size;
-                        addr_t arg3_prot = PROT_NONE;
-                        addr_t arg4_flags = MAP_ANON | MAP_PRIVATE;
-                        addr_t arg5_fd = -1;
-                        addr_t arg6_offset = 0;
-                        if (permissions & lldb::ePermissionsReadable)
-                            arg3_prot |= PROT_READ;
-                        if (permissions & lldb::ePermissionsWritable)
-                            arg3_prot |= PROT_WRITE;
-                        if (permissions & lldb::ePermissionsExecutable)
-                            arg3_prot |= PROT_EXEC;
-
-                        AddressRange mmap_range;
-                        if (sc.GetAddressRange(range_scope, 0, use_inline_block_range, mmap_range))
-                        {
-                            ThreadPlanCallFunction *call_function_thread_plan = new ThreadPlanCallFunction (*thread,
-                                                                                                            mmap_range.GetBaseAddress(),
-                                                                                                            stop_other_threads,
-                                                                                                            discard_on_error,
-                                                                                                            &arg1_addr,
-                                                                                                            &arg2_len,
-                                                                                                            &arg3_prot,
-                                                                                                            &arg4_flags,
-                                                                                                            &arg5_fd,
-                                                                                                            &arg6_offset);
-                            lldb::ThreadPlanSP call_plan_sp (call_function_thread_plan);
-                            if (call_plan_sp)
-                            {
-                                ValueSP return_value_sp (new Value);
-                                ClangASTContext *clang_ast_context = m_target.GetScratchClangASTContext();
-                                lldb::clang_type_t clang_void_ptr_type = clang_ast_context->GetVoidPtrType(false);
-                                return_value_sp->SetValueType (Value::eValueTypeScalar);
-                                return_value_sp->SetContext (Value::eContextTypeClangType, clang_void_ptr_type);
-                                call_function_thread_plan->RequestReturnValue (return_value_sp);
-    
-                                StreamFile error_strm;
-                                StackFrame *frame = thread->GetStackFrameAtIndex (0).get();
-                                if (frame)
-                                {
-                                    ExecutionContext exe_ctx;
-                                    frame->CalculateExecutionContext (exe_ctx);
-                                    ExecutionResults result = RunThreadPlan (exe_ctx,
-                                                                             call_plan_sp,        
-                                                                             stop_other_threads,
-                                                                             try_all_threads,
-                                                                             discard_on_error,
-                                                                             single_thread_timeout_usec,
-                                                                             error_strm);
-                                    if (result == eExecutionCompleted)
-                                    {
-                                        allocated_addr = return_value_sp->GetScalar().ULongLong();
-                                        if (GetAddressByteSize() == 4)
-                                        {
-                                            if (allocated_addr == UINT32_MAX)
-                                                allocated_addr = LLDB_INVALID_ADDRESS;
-                                        }
-                                        if (allocated_addr != LLDB_INVALID_ADDRESS)
-                                            m_addr_to_mmap_size[allocated_addr] = size;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
+            if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
+                                 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0))
+                m_addr_to_mmap_size[allocated_addr] = size;
+            else
+                allocated_addr = LLDB_INVALID_ADDRESS;
             break;
     }
     
@@ -1682,71 +1606,14 @@
             break;
             
         case eLazyBoolNo:
-            // Call munmap() to create executable memory in the inferior..
+            // Call munmap() to deallocate memory in the inferior..
             {
                 MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
-                if (pos != m_addr_to_mmap_size.end())
-                {
-                    Thread *thread = GetThreadList().GetSelectedThread().get();
-                    if (thread == NULL)
-                        thread = GetThreadList().GetThreadAtIndex(0).get();
-                    
-                    const bool append = true;
-                    const bool include_symbols = true;
-                    SymbolContextList sc_list;
-                    const uint32_t count = m_target.GetImages().FindFunctions (ConstString ("munmap"), 
-                                                                               eFunctionNameTypeFull,
-                                                                               include_symbols, 
-                                                                               append, 
-                                                                               sc_list);
-                    if (count > 0)
-                    {
-                        SymbolContext sc;
-                        if (sc_list.GetContextAtIndex(0, sc))
-                        {
-                            const uint32_t range_scope = eSymbolContextFunction | eSymbolContextSymbol;
-                            const bool use_inline_block_range = false;
-                            const bool stop_other_threads = true;
-                            const bool discard_on_error = true;
-                            const bool try_all_threads = true;
-                            const uint32_t single_thread_timeout_usec = 500000;
-                            addr_t arg1_addr = addr;
-                            addr_t arg2_len = pos->second;
-                            
-                            AddressRange munmap_range;
-                            if (sc.GetAddressRange(range_scope, 0, use_inline_block_range, munmap_range))
-                            {
-                                lldb::ThreadPlanSP call_plan_sp (new ThreadPlanCallFunction (*thread,
-                                                                                             munmap_range.GetBaseAddress(),
-                                                                                             stop_other_threads,
-                                                                                             discard_on_error,
-                                                                                             &arg1_addr,
-                                                                                             &arg2_len));
-                                if (call_plan_sp)
-                                {
-                                    StreamFile error_strm;
-                                    StackFrame *frame = thread->GetStackFrameAtIndex (0).get();
-                                    if (frame)
-                                    {
-                                        ExecutionContext exe_ctx;
-                                        frame->CalculateExecutionContext (exe_ctx);
-                                        ExecutionResults result = RunThreadPlan (exe_ctx,
-                                                                                 call_plan_sp,        
-                                                                                 stop_other_threads,
-                                                                                 try_all_threads,
-                                                                                 discard_on_error,
-                                                                                 single_thread_timeout_usec,
-                                                                                 error_strm);
-                                        if (result == eExecutionCompleted)
-                                        {
-                                            m_addr_to_mmap_size.erase (pos);
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
+                if (pos != m_addr_to_mmap_size.end() &&
+                    InferiorCallMunmap(this, addr, pos->second))
+                    m_addr_to_mmap_size.erase (pos);
+                else
+                    error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr);
             }
             break;
     }