Fixed a few bugs in IRMemoryMap:

- If an allocation is mirrored between the host
  and the process, update the host's version
  before returning a DataExtractor pointing to
  it.

- If anyone attempts to access memory in a
  process/target that does not have a corresponding
  allocation, try accessing the memory directly
  before erroring out.

llvm-svn: 179561
diff --git a/lldb/source/Expression/IRMemoryMap.cpp b/lldb/source/Expression/IRMemoryMap.cpp
index 300aaa5..7aecc9e 100644
--- a/lldb/source/Expression/IRMemoryMap.cpp
+++ b/lldb/source/Expression/IRMemoryMap.cpp
@@ -325,8 +325,16 @@
     
     if (iter == m_allocations.end())
     {
+        lldb::ProcessSP process_sp = m_process_wp.lock();
+        
+        if (process_sp)
+        {
+            process_sp->WriteMemory(process_address, bytes, size, error);
+            return;
+        }
+        
         error.SetErrorToGenericError();
-        error.SetErrorString("Couldn't write: no allocation contains the target range");
+        error.SetErrorString("Couldn't write: no allocation contains the target range and the process doesn't exist");
         return;
     }
     
@@ -433,8 +441,25 @@
     
     if (iter == m_allocations.end())
     {
+        lldb::ProcessSP process_sp = m_process_wp.lock();
+        
+        if (process_sp)
+        {
+            process_sp->ReadMemory(process_address, bytes, size, error);
+            return;
+        }
+        
+        lldb::TargetSP target_sp = m_target_wp.lock();
+        
+        if (target_sp)
+        {
+            Address absolute_address(process_address);
+            target_sp->ReadMemory(absolute_address, false, bytes, size, error);
+            return;
+        }
+        
         error.SetErrorToGenericError();
-        error.SetErrorString("Couldn't read: no allocation contains the target range");
+        error.SetErrorString("Couldn't read: no allocation contains the target range, and neither the process nor the target exist");
         return;
     }
     
@@ -561,8 +586,27 @@
             error.SetErrorToGenericError();
             error.SetErrorString("Couldn't get memory data: memory is only in the target");
             return;
-        case eAllocationPolicyHostOnly:
         case eAllocationPolicyMirror:
+            {
+                lldb::ProcessSP process_sp = m_process_wp.lock();
+
+                if (!allocation.m_data.get())
+                {
+                    error.SetErrorToGenericError();
+                    error.SetErrorString("Couldn't get memory data: data buffer is empty");
+                    return;
+                }
+                if (process_sp)
+                {
+                    process_sp->ReadMemory(allocation.m_process_start, allocation.m_data->GetBytes(), allocation.m_data->GetByteSize(), error);
+                    if (!error.Success())
+                        return;
+                    uint64_t offset = process_address - allocation.m_process_start;
+                    extractor = DataExtractor(allocation.m_data->GetBytes() + offset, size, GetByteOrder(), GetAddressByteSize());
+                    return;
+                }
+            }
+        case eAllocationPolicyHostOnly:
             if (!allocation.m_data.get())
             {
                 error.SetErrorToGenericError();