diff options
Diffstat (limited to 'source/Expression/FunctionCaller.cpp')
-rw-r--r-- | source/Expression/FunctionCaller.cpp | 89 |
1 files changed, 42 insertions, 47 deletions
diff --git a/source/Expression/FunctionCaller.cpp b/source/Expression/FunctionCaller.cpp index ddc378dcb416..3a4f1fe33add 100644 --- a/source/Expression/FunctionCaller.cpp +++ b/source/Expression/FunctionCaller.cpp @@ -13,13 +13,14 @@ // Other libraries and framework includes // Project includes +#include "lldb/Expression/FunctionCaller.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/Log.h" #include "lldb/Core/Module.h" #include "lldb/Core/State.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectList.h" -#include "lldb/Expression/FunctionCaller.h" +#include "lldb/Expression/DiagnosticManager.h" #include "lldb/Expression/IRExecutionUnit.h" #include "lldb/Interpreter/CommandReturnObject.h" #include "lldb/Symbol/Function.h" @@ -76,11 +77,11 @@ FunctionCaller::~FunctionCaller() lldb::ModuleSP jit_module_sp (m_jit_module_wp.lock()); if (jit_module_sp) process_sp->GetTarget().GetImages().Remove(jit_module_sp); - } + } } bool -FunctionCaller::WriteFunctionWrapper (ExecutionContext &exe_ctx, Stream &errors) +FunctionCaller::WriteFunctionWrapper(ExecutionContext &exe_ctx, DiagnosticManager &diagnostic_manager) { Process *process = exe_ctx.GetProcessPtr(); @@ -133,27 +134,28 @@ FunctionCaller::WriteFunctionWrapper (ExecutionContext &exe_ctx, Stream &errors) } bool -FunctionCaller::WriteFunctionArguments (ExecutionContext &exe_ctx, lldb::addr_t &args_addr_ref, Stream &errors) +FunctionCaller::WriteFunctionArguments(ExecutionContext &exe_ctx, lldb::addr_t &args_addr_ref, + DiagnosticManager &diagnostic_manager) { - return WriteFunctionArguments(exe_ctx, args_addr_ref, m_arg_values, errors); + return WriteFunctionArguments(exe_ctx, args_addr_ref, m_arg_values, diagnostic_manager); } // FIXME: Assure that the ValueList we were passed in is consistent with the one that defined this function. bool -FunctionCaller::WriteFunctionArguments (ExecutionContext &exe_ctx, - lldb::addr_t &args_addr_ref, - ValueList &arg_values, - Stream &errors) +FunctionCaller::WriteFunctionArguments(ExecutionContext &exe_ctx, lldb::addr_t &args_addr_ref, ValueList &arg_values, + DiagnosticManager &diagnostic_manager) { // All the information to reconstruct the struct is provided by the // StructExtractor. if (!m_struct_valid) { - errors.Printf("Argument information was not correctly parsed, so the function cannot be called."); + diagnostic_manager.PutCString( + eDiagnosticSeverityError, + "Argument information was not correctly parsed, so the function cannot be called."); return false; } - + Error error; lldb::ExpressionResults return_value = lldb::eExpressionSetupError; @@ -191,14 +193,16 @@ FunctionCaller::WriteFunctionArguments (ExecutionContext &exe_ctx, // FIXME: We will need to extend this for Variadic functions. Error value_error; - + size_t num_args = arg_values.GetSize(); if (num_args != m_arg_values.GetSize()) { - errors.Printf ("Wrong number of arguments - was: %" PRIu64 " should be: %" PRIu64 "", (uint64_t)num_args, (uint64_t)m_arg_values.GetSize()); + diagnostic_manager.Printf(eDiagnosticSeverityError, + "Wrong number of arguments - was: %" PRIu64 " should be: %" PRIu64 "", + (uint64_t)num_args, (uint64_t)m_arg_values.GetSize()); return false; } - + for (size_t i = 0; i < num_args; i++) { // FIXME: We should sanity check sizes. @@ -225,16 +229,17 @@ FunctionCaller::WriteFunctionArguments (ExecutionContext &exe_ctx, } bool -FunctionCaller::InsertFunction (ExecutionContext &exe_ctx, lldb::addr_t &args_addr_ref, Stream &errors) +FunctionCaller::InsertFunction(ExecutionContext &exe_ctx, lldb::addr_t &args_addr_ref, + DiagnosticManager &diagnostic_manager) { - if (CompileFunction(errors) != 0) + if (CompileFunction(exe_ctx.GetThreadSP(), diagnostic_manager) != 0) return false; - if (!WriteFunctionWrapper(exe_ctx, errors)) + if (!WriteFunctionWrapper(exe_ctx, diagnostic_manager)) return false; - if (!WriteFunctionArguments(exe_ctx, args_addr_ref, errors)) + if (!WriteFunctionArguments(exe_ctx, args_addr_ref, diagnostic_manager)) return false; - Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP)); if (log) log->Printf ("Call Address: 0x%" PRIx64 " Struct Address: 0x%" PRIx64 ".\n", m_jit_start_addr, args_addr_ref); @@ -242,13 +247,12 @@ FunctionCaller::InsertFunction (ExecutionContext &exe_ctx, lldb::addr_t &args_ad } lldb::ThreadPlanSP -FunctionCaller::GetThreadPlanToCallFunction (ExecutionContext &exe_ctx, - lldb::addr_t args_addr, +FunctionCaller::GetThreadPlanToCallFunction(ExecutionContext &exe_ctx, lldb::addr_t args_addr, const EvaluateExpressionOptions &options, - Stream &errors) + DiagnosticManager &diagnostic_manager) { - Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_EXPRESSIONS | LIBLLDB_LOG_STEP)); - + Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EXPRESSIONS | LIBLLDB_LOG_STEP)); + if (log) log->Printf("-- [FunctionCaller::GetThreadPlanToCallFunction] Creating thread plan to call function \"%s\" --", m_name.c_str()); @@ -256,7 +260,7 @@ FunctionCaller::GetThreadPlanToCallFunction (ExecutionContext &exe_ctx, Thread *thread = exe_ctx.GetThreadPtr(); if (thread == NULL) { - errors.Printf("Can't call a function without a valid thread."); + diagnostic_manager.PutCString(eDiagnosticSeverityError, "Can't call a function without a valid thread."); return NULL; } @@ -322,15 +326,12 @@ FunctionCaller::DeallocateFunctionResults (ExecutionContext &exe_ctx, lldb::addr } lldb::ExpressionResults -FunctionCaller::ExecuteFunction( - ExecutionContext &exe_ctx, - lldb::addr_t *args_addr_ptr, - const EvaluateExpressionOptions &options, - Stream &errors, - Value &results) +FunctionCaller::ExecuteFunction(ExecutionContext &exe_ctx, lldb::addr_t *args_addr_ptr, + const EvaluateExpressionOptions &options, DiagnosticManager &diagnostic_manager, + Value &results) { lldb::ExpressionResults return_value = lldb::eExpressionSetupError; - + // FunctionCaller::ExecuteFunction execution is always just to get the result. Do make sure we ignore // breakpoints, unwind on error, and don't try to debug it. EvaluateExpressionOptions real_options = options; @@ -345,12 +346,12 @@ FunctionCaller::ExecuteFunction( else args_addr = LLDB_INVALID_ADDRESS; - if (CompileFunction(errors) != 0) + if (CompileFunction(exe_ctx.GetThreadSP(), diagnostic_manager) != 0) return lldb::eExpressionSetupError; - + if (args_addr == LLDB_INVALID_ADDRESS) { - if (!InsertFunction(exe_ctx, args_addr, errors)) + if (!InsertFunction(exe_ctx, args_addr, diagnostic_manager)) return lldb::eExpressionSetupError; } @@ -358,24 +359,18 @@ FunctionCaller::ExecuteFunction( if (log) log->Printf("== [FunctionCaller::ExecuteFunction] Executing function \"%s\" ==", m_name.c_str()); - - lldb::ThreadPlanSP call_plan_sp = GetThreadPlanToCallFunction (exe_ctx, - args_addr, - real_options, - errors); + + lldb::ThreadPlanSP call_plan_sp = GetThreadPlanToCallFunction(exe_ctx, args_addr, real_options, diagnostic_manager); if (!call_plan_sp) return lldb::eExpressionSetupError; - + // We need to make sure we record the fact that we are running an expression here // otherwise this fact will fail to be recorded when fetching an Objective-C object description if (exe_ctx.GetProcessPtr()) exe_ctx.GetProcessPtr()->SetRunningUserExpression(true); - - return_value = exe_ctx.GetProcessRef().RunThreadPlan (exe_ctx, - call_plan_sp, - real_options, - errors); - + + return_value = exe_ctx.GetProcessRef().RunThreadPlan(exe_ctx, call_plan_sp, real_options, diagnostic_manager); + if (log) { if (return_value != lldb::eExpressionCompleted) |