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 () { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits