[Lldb-commits] [lldb] r252072 - Add "zero_memory" option to IRMemoryMap::FindSpace & IRMemoryMap::Malloc. Zero out

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Wed Nov 4 12:32:27 PST 2015


Author: jingham
Date: Wed Nov  4 14:32:27 2015
New Revision: 252072

URL: http://llvm.org/viewvc/llvm-project?rev=252072&view=rev
Log:
Add "zero_memory" option to IRMemoryMap::FindSpace & IRMemoryMap::Malloc.  Zero out
the Expression ResultVariable so it's in a known initial state.

Modified:
    lldb/trunk/include/lldb/Expression/IRMemoryMap.h
    lldb/trunk/include/lldb/Target/Process.h
    lldb/trunk/source/Expression/IRExecutionUnit.cpp
    lldb/trunk/source/Expression/IRMemoryMap.cpp
    lldb/trunk/source/Expression/LLVMUserExpression.cpp
    lldb/trunk/source/Expression/Materializer.cpp
    lldb/trunk/source/Target/Process.cpp

Modified: lldb/trunk/include/lldb/Expression/IRMemoryMap.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Expression/IRMemoryMap.h?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Expression/IRMemoryMap.h (original)
+++ lldb/trunk/include/lldb/Expression/IRMemoryMap.h Wed Nov  4 14:32:27 2015
@@ -50,7 +50,12 @@ public:
         eAllocationPolicyProcessOnly            ///< The intent is that this allocation exist only in the process.
     };
 
-    lldb::addr_t Malloc (size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, Error &error);
+    lldb::addr_t Malloc (size_t size,
+                         uint8_t alignment,
+                         uint32_t permissions,
+                         AllocationPolicy policy,
+                         bool zero_memory,
+                         Error &error);
     void Leak (lldb::addr_t process_address, Error &error);
     void Free (lldb::addr_t process_address, Error &error);
     
@@ -124,7 +129,7 @@ private:
     typedef std::map<lldb::addr_t, Allocation>  AllocationMap;
     AllocationMap                               m_allocations;
         
-    lldb::addr_t FindSpace (size_t size);
+    lldb::addr_t FindSpace (size_t size, bool zero_memory = false);
     bool ContainsHostOnlyAllocations ();
     AllocationMap::iterator FindAllocation (lldb::addr_t addr, size_t size);
 

Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Wed Nov  4 14:32:27 2015
@@ -2376,6 +2376,33 @@ public:
     AllocateMemory (size_t size, uint32_t permissions, Error &error);
 
     //------------------------------------------------------------------
+    /// The public interface to allocating memory in the process, this also
+    /// clears the allocated memory.
+    ///
+    /// This function will allocate memory in the process's address
+    /// space.  This can't rely on the generic function calling mechanism,
+    /// since that requires this function.
+    ///
+    /// @param[in] size
+    ///     The size of the allocation requested.
+    ///
+    /// @param[in] permissions
+    ///     Or together any of the lldb::Permissions bits.  The permissions on
+    ///     a given memory allocation can't be changed after allocation.  Note
+    ///     that a block that isn't set writable can still be written on from lldb,
+    ///     just not by the process itself.
+    ///
+    /// @param[in/out] error
+    ///     An error object to fill in if things go wrong.
+    /// @return
+    ///     The address of the allocated buffer in the process, or
+    ///     LLDB_INVALID_ADDRESS if the allocation failed.
+    //------------------------------------------------------------------
+
+    lldb::addr_t
+    CallocateMemory (size_t size, uint32_t permissions, Error &error);
+
+    //------------------------------------------------------------------
     /// Resolve dynamically loaded indirect functions.
     ///
     /// @param[in] address

Modified: lldb/trunk/source/Expression/IRExecutionUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRExecutionUnit.cpp?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRExecutionUnit.cpp (original)
+++ lldb/trunk/source/Expression/IRExecutionUnit.cpp Wed Nov  4 14:32:27 2015
@@ -50,10 +50,12 @@ IRExecutionUnit::WriteNow (const uint8_t
                            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 @@ IRExecutionUnit::CommitAllocations (lldb
             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;
         }

Modified: lldb/trunk/source/Expression/IRMemoryMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/IRMemoryMap.cpp?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/source/Expression/IRMemoryMap.cpp (original)
+++ lldb/trunk/source/Expression/IRMemoryMap.cpp Wed Nov  4 14:32:27 2015
@@ -47,7 +47,7 @@ IRMemoryMap::~IRMemoryMap ()
 }
 
 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 @@ IRMemoryMap::FindSpace (size_t size)
     {
         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 @@ IRMemoryMap::Allocation::Allocation (lld
 }
 
 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 @@ IRMemoryMap::Malloc (size_t size, uint8_
             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 @@ IRMemoryMap::Malloc (size_t size, uint8_
         {
             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;
             }

Modified: lldb/trunk/source/Expression/LLVMUserExpression.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/LLVMUserExpression.cpp?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/source/Expression/LLVMUserExpression.cpp (original)
+++ lldb/trunk/source/Expression/LLVMUserExpression.cpp Wed Nov  4 14:32:27 2015
@@ -302,9 +302,14 @@ LLVMUserExpression::PrepareToExecuteJITE
             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 @@ LLVMUserExpression::PrepareToExecuteJITE
 
             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;
 

Modified: lldb/trunk/source/Expression/Materializer.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/Materializer.cpp?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/source/Expression/Materializer.cpp (original)
+++ lldb/trunk/source/Expression/Materializer.cpp Wed Nov  4 14:32:27 2015
@@ -87,11 +87,13 @@ public:
         // 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 @@ public:
                     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 @@ public:
                 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())

Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=252072&r1=252071&r2=252072&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Wed Nov  4 14:32:27 2015
@@ -2967,6 +2967,18 @@ Process::AllocateMemory(size_t size, uin
 #endif
 }
 
+addr_t
+Process::CallocateMemory(size_t size, uint32_t permissions, Error &error)
+{
+    addr_t return_addr = AllocateMemory(size, permissions, error);
+    if (error.Success())
+    {
+        std::string buffer(size, 0);
+        WriteMemory(return_addr, buffer.c_str(), size, error);
+    }
+    return return_addr;
+}
+
 bool
 Process::CanJIT ()
 {




More information about the lldb-commits mailing list