summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Expression/IRMemoryMap.h9
-rw-r--r--lldb/include/lldb/Target/Process.h27
-rw-r--r--lldb/source/Expression/IRExecutionUnit.cpp4
-rw-r--r--lldb/source/Expression/IRMemoryMap.cpp21
-rw-r--r--lldb/source/Expression/LLVMUserExpression.cpp20
-rw-r--r--lldb/source/Expression/Materializer.cpp21
-rw-r--r--lldb/source/Target/Process.cpp12
7 files changed, 99 insertions, 15 deletions
diff --git a/lldb/include/lldb/Expression/IRMemoryMap.h b/lldb/include/lldb/Expression/IRMemoryMap.h
index 80add46ef0d..6fb718a341f 100644
--- a/lldb/include/lldb/Expression/IRMemoryMap.h
+++ b/lldb/include/lldb/Expression/IRMemoryMap.h
@@ -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);
diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h
index 863bfe9c812..f04c0019c3f 100644
--- a/lldb/include/lldb/Target/Process.h
+++ b/lldb/include/lldb/Target/Process.h
@@ -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
diff --git a/lldb/source/Expression/IRExecutionUnit.cpp b/lldb/source/Expression/IRExecutionUnit.cpp
index 8a0066c1c64..3f19c508c92 100644
--- a/lldb/source/Expression/IRExecutionUnit.cpp
+++ b/lldb/source/Expression/IRExecutionUnit.cpp
@@ -50,10 +50,12 @@ IRExecutionUnit::WriteNow (const uint8_t *bytes,
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::ProcessSP &process_sp)
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 4733b16d5f1..e96bddde7cb 100644
--- a/lldb/source/Expression/IRMemoryMap.cpp
+++ b/lldb/source/Expression/IRMemoryMap.cpp
@@ -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 (lldb::addr_t process_alloc,
}
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_t alignment, uint32_t permissions, Alloc
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_t alignment, uint32_t permissions, Alloc
{
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 8c1c7bf3040..e1bea839442 100644
--- a/lldb/source/Expression/LLVMUserExpression.cpp
+++ b/lldb/source/Expression/LLVMUserExpression.cpp
@@ -302,9 +302,14 @@ LLVMUserExpression::PrepareToExecuteJITExpression(Stream &error_stream, Executio
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::PrepareToExecuteJITExpression(Stream &error_stream, Executio
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 3c73f49838a..f69a1cd93f8 100644
--- a/lldb/source/Expression/Materializer.cpp
+++ b/lldb/source/Expression/Materializer.cpp
@@ -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())
diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp
index 6ffc4a96a9b..a51a734bca3 100644
--- a/lldb/source/Target/Process.cpp
+++ b/lldb/source/Target/Process.cpp
@@ -2967,6 +2967,18 @@ Process::AllocateMemory(size_t size, uint32_t permissions, Error &error)
#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 ()
{
OpenPOWER on IntegriCloud