Make expressions clean up their JIT'ed code allocation.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@123855 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Expression/ClangExpressionParser.cpp b/source/Expression/ClangExpressionParser.cpp
index 0a63e4d..536160b 100644
--- a/source/Expression/ClangExpressionParser.cpp
+++ b/source/Expression/ClangExpressionParser.cpp
@@ -425,11 +425,15 @@
}
Error
-ClangExpressionParser::MakeJIT (lldb::addr_t &func_addr,
+ClangExpressionParser::MakeJIT (lldb::addr_t &func_allocation_addr,
+ lldb::addr_t &func_addr,
lldb::addr_t &func_end,
ExecutionContext &exe_ctx,
lldb::ClangExpressionVariableSP *const_result)
{
+ func_allocation_addr = LLDB_INVALID_ADDRESS;
+ func_addr = LLDB_INVALID_ADDRESS;
+ func_end = LLDB_INVALID_ADDRESS;
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
Error err;
@@ -488,7 +492,9 @@
}
}
- m_jit_mm = new RecordingMemoryManager();
+ // llvm will own this pointer when llvm::ExecutionEngine::createJIT is called
+ // below so we don't need to free it.
+ RecordingMemoryManager *jit_memory_manager = new RecordingMemoryManager();
std::string error_string;
@@ -496,7 +502,7 @@
m_execution_engine.reset(llvm::ExecutionEngine::createJIT (module,
&error_string,
- m_jit_mm,
+ jit_memory_manager,
CodeGenOpt::Less,
true,
CodeModel::Small));
@@ -544,25 +550,27 @@
size_t alloc_size = 0;
- std::map<uint8_t *, uint8_t *>::iterator fun_pos = m_jit_mm->m_functions.begin();
- std::map<uint8_t *, uint8_t *>::iterator fun_end = m_jit_mm->m_functions.end();
+ std::map<uint8_t *, uint8_t *>::iterator fun_pos = jit_memory_manager->m_functions.begin();
+ std::map<uint8_t *, uint8_t *>::iterator fun_end = jit_memory_manager->m_functions.end();
for (; fun_pos != fun_end; ++fun_pos)
alloc_size += (*fun_pos).second - (*fun_pos).first;
Error alloc_error;
- lldb::addr_t target_addr = exc_context.process->AllocateMemory (alloc_size, lldb::ePermissionsReadable|lldb::ePermissionsExecutable, alloc_error);
+ func_allocation_addr = exc_context.process->AllocateMemory (alloc_size,
+ lldb::ePermissionsReadable|lldb::ePermissionsExecutable,
+ alloc_error);
- if (target_addr == LLDB_INVALID_ADDRESS)
+ if (func_allocation_addr == LLDB_INVALID_ADDRESS)
{
err.SetErrorToGenericError();
err.SetErrorStringWithFormat("Couldn't allocate memory for the JITted function: %s", alloc_error.AsCString("unknown error"));
return err;
}
- lldb::addr_t cursor = target_addr;
+ lldb::addr_t cursor = func_allocation_addr;
- for (fun_pos = m_jit_mm->m_functions.begin(); fun_pos != fun_end; fun_pos++)
+ for (fun_pos = jit_memory_manager->m_functions.begin(); fun_pos != fun_end; fun_pos++)
{
lldb::addr_t lstart = (lldb::addr_t) (*fun_pos).first;
lldb::addr_t lend = (lldb::addr_t) (*fun_pos).second;
@@ -577,7 +585,7 @@
return err;
}
- m_jit_mm->AddToLocalToRemoteMap (lstart, size, cursor);
+ jit_memory_manager->AddToLocalToRemoteMap (lstart, size, cursor);
cursor += size;
}
@@ -585,11 +593,11 @@
for (pos = m_jitted_functions.begin(); pos != end; pos++)
{
- (*pos).m_remote_addr = m_jit_mm->GetRemoteAddressForLocal ((*pos).m_local_addr);
+ (*pos).m_remote_addr = jit_memory_manager->GetRemoteAddressForLocal ((*pos).m_local_addr);
if (!(*pos).m_name.compare(function_name.c_str()))
{
- func_end = m_jit_mm->GetRemoteRangeForLocal ((*pos).m_local_addr).second;
+ func_end = jit_memory_manager->GetRemoteRangeForLocal ((*pos).m_local_addr).second;
func_addr = (*pos).m_remote_addr;
}
}
@@ -600,7 +608,7 @@
StreamString disassembly_stream;
- Error err = DisassembleFunction(disassembly_stream, exe_ctx);
+ Error err = DisassembleFunction(disassembly_stream, exe_ctx, jit_memory_manager);
if (!err.Success())
{
@@ -617,7 +625,7 @@
}
Error
-ClangExpressionParser::DisassembleFunction (Stream &stream, ExecutionContext &exe_ctx)
+ClangExpressionParser::DisassembleFunction (Stream &stream, ExecutionContext &exe_ctx, RecordingMemoryManager *jit_memory_manager)
{
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
@@ -653,7 +661,7 @@
std::pair <lldb::addr_t, lldb::addr_t> func_range;
- func_range = m_jit_mm->GetRemoteRangeForLocal(func_local_addr);
+ func_range = jit_memory_manager->GetRemoteRangeForLocal(func_local_addr);
if (func_range.first == 0 && func_range.second == 0)
{
diff --git a/source/Expression/ClangFunction.cpp b/source/Expression/ClangFunction.cpp
index e7b6f77..31b74c6 100644
--- a/source/Expression/ClangFunction.cpp
+++ b/source/Expression/ClangFunction.cpp
@@ -61,7 +61,6 @@
m_clang_ast_context (ast_context),
m_wrapper_function_name ("__lldb_caller_function"),
m_wrapper_struct_name ("__lldb_caller_struct"),
- m_wrapper_function_addr (),
m_wrapper_args_addrs (),
m_arg_values (arg_value_list),
m_compiled (false),
@@ -83,7 +82,6 @@
m_clang_ast_context (ast_context),
m_wrapper_function_name ("__lldb_function_caller"),
m_wrapper_struct_name ("__lldb_caller_struct"),
- m_wrapper_function_addr (),
m_wrapper_args_addrs (),
m_arg_values (arg_value_list),
m_compiled (false),
@@ -240,12 +238,12 @@
if (m_JITted)
return true;
- lldb::addr_t wrapper_function_end;
-
- Error jit_error = m_parser->MakeJIT(m_wrapper_function_addr, wrapper_function_end, exe_ctx);
+ Error jit_error (m_parser->MakeJIT (m_jit_alloc, m_jit_start_addr, m_jit_end_addr, exe_ctx));
if (!jit_error.Success())
return false;
+ if (exe_ctx.process && m_jit_alloc != LLDB_INVALID_ADDRESS)
+ m_jit_process_sp = exe_ctx.process->GetSP();
return true;
}
@@ -360,7 +358,7 @@
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
if (log)
- log->Printf ("Call Address: 0x%llx Struct Address: 0x%llx.\n", m_wrapper_function_addr, args_addr_ref);
+ log->Printf ("Call Address: 0x%llx Struct Address: 0x%llx.\n", m_jit_start_addr, args_addr_ref);
return true;
}
@@ -524,8 +522,14 @@
return lldb::eExecutionSetupError;
}
- return_value = ClangFunction::ExecuteFunction(exe_ctx, m_wrapper_function_addr, args_addr, stop_others,
- try_all_threads, discard_on_error, single_thread_timeout_usec, errors);
+ return_value = ClangFunction::ExecuteFunction (exe_ctx,
+ m_jit_start_addr,
+ args_addr,
+ stop_others,
+ try_all_threads,
+ discard_on_error,
+ single_thread_timeout_usec,
+ errors);
if (args_addr_ptr != NULL)
*args_addr_ptr = args_addr;
diff --git a/source/Expression/ClangUserExpression.cpp b/source/Expression/ClangUserExpression.cpp
index 5ce5c1a..4142c5c 100644
--- a/source/Expression/ClangUserExpression.cpp
+++ b/source/Expression/ClangUserExpression.cpp
@@ -41,15 +41,15 @@
ClangUserExpression::ClangUserExpression (const char *expr,
const char *expr_prefix) :
- m_expr_text(expr),
- m_expr_prefix(expr_prefix ? expr_prefix : ""),
- m_transformed_text(),
- m_jit_addr(LLDB_INVALID_ADDRESS),
- m_cplusplus(false),
- m_objectivec(false),
- m_needs_object_ptr(false),
- m_const_object(false),
- m_desired_type(NULL, NULL)
+ ClangExpression (),
+ m_expr_text (expr),
+ m_expr_prefix (expr_prefix ? expr_prefix : ""),
+ m_transformed_text (),
+ m_cplusplus (false),
+ m_objectivec (false),
+ m_needs_object_ptr (false),
+ m_const_object (false),
+ m_desired_type (NULL, NULL)
{
}
@@ -295,14 +295,14 @@
m_dwarf_opcodes.reset();
- lldb::addr_t jit_end;
-
- Error jit_error = parser.MakeJIT (m_jit_addr, jit_end, exe_ctx, const_result);
+ Error jit_error = parser.MakeJIT (m_jit_alloc, m_jit_start_addr, m_jit_end_addr, exe_ctx, const_result);
m_expr_decl_map->DidParse();
if (jit_error.Success())
{
+ if (exe_ctx.process && m_jit_alloc != LLDB_INVALID_ADDRESS)
+ m_jit_process_sp = exe_ctx.process->GetSP();
return true;
}
else
@@ -321,7 +321,7 @@
{
lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
- if (m_jit_addr != LLDB_INVALID_ADDRESS)
+ if (m_jit_start_addr != LLDB_INVALID_ADDRESS)
{
Error materialize_error;
@@ -370,14 +370,14 @@
#if 0
// jingham: look here
StreamFile logfile ("/tmp/exprs.txt", "a");
- logfile.Printf("0x%16.16llx: thread = 0x%4.4x, expr = '%s'\n", m_jit_addr, exe_ctx.thread ? exe_ctx.thread->GetID() : -1, m_expr_text.c_str());
+ logfile.Printf("0x%16.16llx: thread = 0x%4.4x, expr = '%s'\n", m_jit_start_addr, exe_ctx.thread ? exe_ctx.thread->GetID() : -1, m_expr_text.c_str());
#endif
if (log)
{
log->Printf("-- [ClangUserExpression::PrepareToExecuteJITExpression] Materializing for execution --");
- log->Printf(" Function address : 0x%llx", (uint64_t)m_jit_addr);
+ log->Printf(" Function address : 0x%llx", (uint64_t)m_jit_start_addr);
if (m_needs_object_ptr)
log->Printf(" Object pointer : 0x%llx", (uint64_t)object_ptr);
@@ -420,7 +420,7 @@
// forcing unwind_on_error to be true here, in practical terms that can't happen.
return ClangFunction::GetThreadPlanToCallFunction (exe_ctx,
- m_jit_addr,
+ m_jit_start_addr,
struct_address,
error_stream,
true,
@@ -484,7 +484,7 @@
return lldb::eExecutionSetupError;
}
- else if (m_jit_addr != LLDB_INVALID_ADDRESS)
+ else if (m_jit_start_addr != LLDB_INVALID_ADDRESS)
{
lldb::addr_t struct_address;
@@ -497,7 +497,7 @@
const bool stop_others = true;
const bool try_all_threads = true;
- Address wrapper_address (NULL, m_jit_addr);
+ Address wrapper_address (NULL, m_jit_start_addr);
lldb::ThreadPlanSP call_plan_sp(new ThreadPlanCallUserExpression (*(exe_ctx.thread),
wrapper_address,
struct_address,
diff --git a/source/Expression/ClangUtilityFunction.cpp b/source/Expression/ClangUtilityFunction.cpp
index d3ede6b..03b15d1 100644
--- a/source/Expression/ClangUtilityFunction.cpp
+++ b/source/Expression/ClangUtilityFunction.cpp
@@ -38,10 +38,9 @@
//------------------------------------------------------------------
ClangUtilityFunction::ClangUtilityFunction (const char *text,
const char *name) :
- m_function_text(text),
- m_function_name(name),
- m_jit_begin(LLDB_INVALID_ADDRESS),
- m_jit_end(LLDB_INVALID_ADDRESS)
+ ClangExpression (),
+ m_function_text (text),
+ m_function_name (name)
{
}
@@ -65,7 +64,7 @@
ClangUtilityFunction::Install (Stream &error_stream,
ExecutionContext &exe_ctx)
{
- if (m_jit_begin != LLDB_INVALID_ADDRESS)
+ if (m_jit_start_addr != LLDB_INVALID_ADDRESS)
{
error_stream.PutCString("error: already installed\n");
return false;
@@ -123,13 +122,16 @@
// JIT the output of the parser
//
- Error jit_error = parser.MakeJIT (m_jit_begin, m_jit_end, exe_ctx);
+ Error jit_error = parser.MakeJIT (m_jit_alloc, m_jit_start_addr, m_jit_end_addr, exe_ctx);
+
+ if (exe_ctx.process && m_jit_start_addr != LLDB_INVALID_ADDRESS)
+ m_jit_process_sp = exe_ctx.process->GetSP();
#if 0
// jingham: look here
StreamFile logfile ("/tmp/exprs.txt", "a");
logfile.Printf ("0x%16.16llx: func = %s, source =\n%s\n",
- m_jit_begin,
+ m_jit_start_addr,
m_function_name.c_str(),
m_function_text.c_str());
#endif