Add "zero_memory" option to IRMemoryMap::FindSpace & IRMemoryMap::Malloc.  Zero out
the Expression ResultVariable so it's in a known initial state.

llvm-svn: 252072
diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp
index 8a0066c..3f19c50 100644
--- a/lldb/source/Expression/IRExecutionUnit.cpp
+++ b/lldb/source/Expression/IRExecutionUnit.cpp
@@ -50,10 +50,12 @@
                            size_t size,
                            Error &error)
 {
+    const bool zero_memory = false;
     lldb::addr_t allocation_process_addr = Malloc (size,
                                                    8,
                                                    lldb::ePermissionsWritable | lldb::ePermissionsReadable,
                                                    eAllocationPolicyMirror,
+                                                   zero_memory,
                                                    error);
 
     if (!error.Success())
@@ -819,10 +821,12 @@
             err.Clear();
             break;
         default:
+            const bool zero_memory = false;
             record.m_process_address = Malloc (record.m_size,
                                                record.m_alignment,
                                                record.m_permissions,
                                                eAllocationPolicyProcessOnly,
+                                               zero_memory,
                                                err);
             break;
         }
diff --git a/lldb/source/Expression/IRMemoryMap.cpp b/lldb/source/Expression/IRMemoryMap.cpp
index 4733b16..e96bddd 100644
--- a/lldb/source/Expression/IRMemoryMap.cpp
+++ b/lldb/source/Expression/IRMemoryMap.cpp
@@ -47,7 +47,7 @@
 }
 
 lldb::addr_t
-IRMemoryMap::FindSpace (size_t size)
+IRMemoryMap::FindSpace (size_t size, bool zero_memory)
 {
     lldb::TargetSP target_sp = m_target_wp.lock();
     lldb::ProcessSP process_sp = m_process_wp.lock();
@@ -60,7 +60,10 @@
     {
         Error alloc_error;
 
-        ret = process_sp->AllocateMemory(size, lldb::ePermissionsReadable | lldb::ePermissionsWritable, alloc_error);
+        if (!zero_memory)
+            ret = process_sp->AllocateMemory(size, lldb::ePermissionsReadable | lldb::ePermissionsWritable, alloc_error);
+        else
+            ret = process_sp->CallocateMemory(size, lldb::ePermissionsReadable | lldb::ePermissionsWritable, alloc_error);
 
         if (!alloc_error.Success())
             return LLDB_INVALID_ADDRESS;
@@ -225,7 +228,7 @@
 }
 
 lldb::addr_t
-IRMemoryMap::Malloc (size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, Error &error)
+IRMemoryMap::Malloc (size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, bool zero_memory, Error &error)
 {
     lldb_private::Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
     error.Clear();
@@ -263,7 +266,11 @@
             log->Printf ("IRMemoryMap::%s process_sp=0x%" PRIx64 ", process_sp->CanJIT()=%s, process_sp->IsAlive()=%s", __FUNCTION__, (lldb::addr_t) process_sp.get (), process_sp && process_sp->CanJIT () ? "true" : "false", process_sp && process_sp->IsAlive () ? "true" : "false");
         if (process_sp && process_sp->CanJIT() && process_sp->IsAlive())
         {
-            allocation_address = process_sp->AllocateMemory(allocation_size, permissions, error);
+            if (!zero_memory)
+              allocation_address = process_sp->AllocateMemory(allocation_size, permissions, error);
+            else
+              allocation_address = process_sp->CallocateMemory(allocation_size, permissions, error);
+
             if (!error.Success())
                 return LLDB_INVALID_ADDRESS;
         }
@@ -287,7 +294,11 @@
         {
             if (process_sp->CanJIT() && process_sp->IsAlive())
             {
-                allocation_address = process_sp->AllocateMemory(allocation_size, permissions, error);
+                if (!zero_memory)
+                  allocation_address = process_sp->AllocateMemory(allocation_size, permissions, error);
+                else
+                  allocation_address = process_sp->CallocateMemory(allocation_size, permissions, error);
+
                 if (!error.Success())
                     return LLDB_INVALID_ADDRESS;
             }
diff --git a/lldb/source/Expression/LLVMUserExpression.cpp b/lldb/source/Expression/LLVMUserExpression.cpp
index 8c1c7bf..e1bea83 100644
--- a/lldb/source/Expression/LLVMUserExpression.cpp
+++ b/lldb/source/Expression/LLVMUserExpression.cpp
@@ -302,9 +302,14 @@
             IRMemoryMap::AllocationPolicy policy =
                 m_can_interpret ? IRMemoryMap::eAllocationPolicyHostOnly : IRMemoryMap::eAllocationPolicyMirror;
 
-            m_materialized_address = m_execution_unit_sp->Malloc(
-                m_materializer_ap->GetStructByteSize(), m_materializer_ap->GetStructAlignment(),
-                lldb::ePermissionsReadable | lldb::ePermissionsWritable, policy, alloc_error);
+            const bool zero_memory = false;
+
+            m_materialized_address = m_execution_unit_sp->Malloc(m_materializer_ap->GetStructByteSize(), 
+                                                                 m_materializer_ap->GetStructAlignment(),
+                                                                 lldb::ePermissionsReadable | lldb::ePermissionsWritable, 
+                                                                 policy,
+                                                                 zero_memory, 
+                                                                 alloc_error);
 
             if (!alloc_error.Success())
             {
@@ -321,9 +326,14 @@
 
             const size_t stack_frame_size = 512 * 1024;
 
-            m_stack_frame_bottom = m_execution_unit_sp->Malloc(stack_frame_size, 8,
+            const bool zero_memory = false;
+
+            m_stack_frame_bottom = m_execution_unit_sp->Malloc(stack_frame_size, 
+                                                               8,
                                                                lldb::ePermissionsReadable | lldb::ePermissionsWritable,
-                                                               IRMemoryMap::eAllocationPolicyHostOnly, alloc_error);
+                                                               IRMemoryMap::eAllocationPolicyHostOnly, 
+                                                               zero_memory,
+                                                               alloc_error);
 
             m_stack_frame_top = m_stack_frame_bottom + stack_frame_size;
 
diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp
index 3c73f49..f69a1cd 100644
--- a/lldb/source/Expression/Materializer.cpp
+++ b/lldb/source/Expression/Materializer.cpp
@@ -87,11 +87,13 @@
         // Allocate a spare memory area to store the persistent variable's contents.
         
         Error allocate_error;
+        const bool zero_memory = false;
         
         lldb::addr_t mem = map.Malloc(m_persistent_variable_sp->GetByteSize(),
                                       8,
                                       lldb::ePermissionsReadable | lldb::ePermissionsWritable,
                                       IRMemoryMap::eAllocationPolicyMirror,
+                                      zero_memory,
                                       allocate_error);
         
         if (!allocate_error.Success())
@@ -552,8 +554,15 @@
                     byte_align = 1;
                 
                 Error alloc_error;
+                const bool zero_memory = false;
+
+                m_temporary_allocation = map.Malloc(data.GetByteSize(),
+                                                    byte_align,
+                                                    lldb::ePermissionsReadable | lldb::ePermissionsWritable,
+                                                    IRMemoryMap::eAllocationPolicyMirror,
+                                                    zero_memory,
+                                                    alloc_error);
                 
-                m_temporary_allocation = map.Malloc(data.GetByteSize(), byte_align, lldb::ePermissionsReadable | lldb::ePermissionsWritable, IRMemoryMap::eAllocationPolicyMirror, alloc_error);
                 m_temporary_allocation_size = data.GetByteSize();
                 
                 m_original_data.reset(new DataBufferHeap(data.GetDataStart(), data.GetByteSize()));
@@ -817,8 +826,14 @@
                 byte_align = 1;
             
             Error alloc_error;
-            
-            m_temporary_allocation = map.Malloc(byte_size, byte_align, lldb::ePermissionsReadable | lldb::ePermissionsWritable, IRMemoryMap::eAllocationPolicyMirror, alloc_error);
+            const bool zero_memory = true;
+
+            m_temporary_allocation = map.Malloc(byte_size,
+                                                byte_align,
+                                                lldb::ePermissionsReadable | lldb::ePermissionsWritable,
+                                                IRMemoryMap::eAllocationPolicyMirror,
+                                                zero_memory,
+                                                alloc_error);
             m_temporary_allocation_size = byte_size;
             
             if (!alloc_error.Success())