1 //===-- ThreadPlanCallFunction.cpp ------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Target/ThreadPlanCallFunction.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 #include "llvm/Support/MachO.h" 16 // Project includes 17 #include "lldb/lldb-private-log.h" 18 #include "lldb/Breakpoint/Breakpoint.h" 19 #include "lldb/Breakpoint/BreakpointLocation.h" 20 #include "lldb/Core/Address.h" 21 #include "lldb/Core/Log.h" 22 #include "lldb/Core/Module.h" 23 #include "lldb/Core/Stream.h" 24 #include "lldb/Symbol/ObjectFile.h" 25 #include "lldb/Target/LanguageRuntime.h" 26 #include "lldb/Target/Process.h" 27 #include "lldb/Target/RegisterContext.h" 28 #include "lldb/Target/StopInfo.h" 29 #include "lldb/Target/Target.h" 30 #include "lldb/Target/Thread.h" 31 #include "lldb/Target/ThreadPlanRunToAddress.h" 32 33 using namespace lldb; 34 using namespace lldb_private; 35 36 //---------------------------------------------------------------------- 37 // ThreadPlanCallFunction: Plan to call a single function 38 //---------------------------------------------------------------------- 39 bool 40 ThreadPlanCallFunction::ConstructorSetup (Thread &thread, 41 ABI *& abi, 42 lldb::addr_t &start_load_addr, 43 lldb::addr_t &function_load_addr) 44 { 45 SetIsMasterPlan (true); 46 SetOkayToDiscard (false); 47 SetPrivate (true); 48 49 ProcessSP process_sp (thread.GetProcess()); 50 if (!process_sp) 51 return false; 52 53 abi = process_sp->GetABI().get(); 54 55 if (!abi) 56 return false; 57 58 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP)); 59 60 SetBreakpoints(); 61 62 m_function_sp = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 63 // If we can't read memory at the point of the process where we are planning to put our function, we're 64 // not going to get any further... 65 Error error; 66 process_sp->ReadUnsignedIntegerFromMemory(m_function_sp, 4, 0, error); 67 if (!error.Success()) 68 { 69 m_constructor_errors.Printf ("Trying to put the stack in unreadable memory at: 0x%" PRIx64 ".", m_function_sp); 70 if (log) 71 log->Printf ("ThreadPlanCallFunction(%p): %s.", this, m_constructor_errors.GetData()); 72 return false; 73 } 74 75 Module *exe_module = GetTarget().GetExecutableModulePointer(); 76 77 if (exe_module == NULL) 78 { 79 m_constructor_errors.Printf ("Can't execute code without an executable module."); 80 if (log) 81 log->Printf ("ThreadPlanCallFunction(%p): %s.", this, m_constructor_errors.GetData()); 82 return false; 83 } 84 else 85 { 86 ObjectFile *objectFile = exe_module->GetObjectFile(); 87 if (!objectFile) 88 { 89 m_constructor_errors.Printf ("Could not find object file for module \"%s\".", 90 exe_module->GetFileSpec().GetFilename().AsCString()); 91 92 if (log) 93 log->Printf ("ThreadPlanCallFunction(%p): %s.", this, m_constructor_errors.GetData()); 94 return false; 95 } 96 97 m_start_addr = objectFile->GetEntryPointAddress(); 98 if (!m_start_addr.IsValid()) 99 { 100 m_constructor_errors.Printf ("Could not find entry point address for executable module \"%s\".", 101 exe_module->GetFileSpec().GetFilename().AsCString()); 102 if (log) 103 log->Printf ("ThreadPlanCallFunction(%p): %s.", this, m_constructor_errors.GetData()); 104 return false; 105 } 106 } 107 108 start_load_addr = m_start_addr.GetLoadAddress (&GetTarget()); 109 110 // Checkpoint the thread state so we can restore it later. 111 if (log && log->GetVerbose()) 112 ReportRegisterState ("About to checkpoint thread before function call. Original register state was:"); 113 114 if (!thread.CheckpointThreadState (m_stored_thread_state)) 115 { 116 m_constructor_errors.Printf ("Setting up ThreadPlanCallFunction, failed to checkpoint thread state."); 117 if (log) 118 log->Printf ("ThreadPlanCallFunction(%p): %s.", this, m_constructor_errors.GetData()); 119 return false; 120 } 121 function_load_addr = m_function_addr.GetLoadAddress (&GetTarget()); 122 123 return true; 124 } 125 126 ThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, 127 const Address &function, 128 const ClangASTType &return_type, 129 llvm::ArrayRef<addr_t> args, 130 const EvaluateExpressionOptions &options) : 131 ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 132 m_valid (false), 133 m_stop_other_threads (options.GetStopOthers()), 134 m_unwind_on_error (options.DoesUnwindOnError()), 135 m_ignore_breakpoints (options.DoesIgnoreBreakpoints()), 136 m_debug_execution (options.GetDebug()), 137 m_trap_exceptions (options.GetTrapExceptions()), 138 m_function_addr (function), 139 m_function_sp (0), 140 m_return_type (return_type), 141 m_takedown_done (false), 142 m_should_clear_objc_exception_bp(false), 143 m_should_clear_cxx_exception_bp (false), 144 m_stop_address (LLDB_INVALID_ADDRESS) 145 { 146 lldb::addr_t start_load_addr; 147 ABI *abi; 148 lldb::addr_t function_load_addr; 149 if (!ConstructorSetup (thread, abi, start_load_addr, function_load_addr)) 150 return; 151 152 if (!abi->PrepareTrivialCall(thread, 153 m_function_sp, 154 function_load_addr, 155 start_load_addr, 156 args)) 157 return; 158 159 ReportRegisterState ("Function call was set up. Register state was:"); 160 161 m_valid = true; 162 } 163 164 ThreadPlanCallFunction::~ThreadPlanCallFunction () 165 { 166 DoTakedown(PlanSucceeded()); 167 } 168 169 void 170 ThreadPlanCallFunction::ReportRegisterState (const char *message) 171 { 172 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_VERBOSE)); 173 if (log) 174 { 175 StreamString strm; 176 RegisterContext *reg_ctx = m_thread.GetRegisterContext().get(); 177 178 log->PutCString(message); 179 180 RegisterValue reg_value; 181 182 for (uint32_t reg_idx = 0, num_registers = reg_ctx->GetRegisterCount(); 183 reg_idx < num_registers; 184 ++reg_idx) 185 { 186 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 187 if (reg_ctx->ReadRegister(reg_info, reg_value)) 188 { 189 reg_value.Dump(&strm, reg_info, true, false, eFormatDefault); 190 strm.EOL(); 191 } 192 } 193 log->PutCString(strm.GetData()); 194 } 195 } 196 197 void 198 ThreadPlanCallFunction::DoTakedown (bool success) 199 { 200 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP)); 201 202 if (!m_valid) 203 { 204 //Don't call DoTakedown if we were never valid to begin with. 205 if (log) 206 log->Printf ("ThreadPlanCallFunction(%p): Log called on ThreadPlanCallFunction that was never valid.", this); 207 return; 208 } 209 210 if (!m_takedown_done) 211 { 212 if (success) 213 { 214 ProcessSP process_sp (m_thread.GetProcess()); 215 const ABI *abi = process_sp ? process_sp->GetABI().get() : NULL; 216 if (abi && m_return_type.IsValid()) 217 { 218 const bool persistent = false; 219 m_return_valobj_sp = abi->GetReturnValueObject (m_thread, m_return_type, persistent); 220 } 221 } 222 if (log) 223 log->Printf ("ThreadPlanCallFunction(%p): DoTakedown called for thread 0x%4.4" PRIx64 ", m_valid: %d complete: %d.\n", this, m_thread.GetID(), m_valid, IsPlanComplete()); 224 m_takedown_done = true; 225 m_stop_address = m_thread.GetStackFrameAtIndex(0)->GetRegisterContext()->GetPC(); 226 m_real_stop_info_sp = GetPrivateStopInfo (); 227 m_thread.RestoreRegisterStateFromCheckpoint(m_stored_thread_state); 228 SetPlanComplete(success); 229 ClearBreakpoints(); 230 if (log && log->GetVerbose()) 231 ReportRegisterState ("Restoring thread state after function call. Restored register state:"); 232 233 } 234 else 235 { 236 if (log) 237 log->Printf ("ThreadPlanCallFunction(%p): DoTakedown called as no-op for thread 0x%4.4" PRIx64 ", m_valid: %d complete: %d.\n", this, m_thread.GetID(), m_valid, IsPlanComplete()); 238 } 239 } 240 241 void 242 ThreadPlanCallFunction::WillPop () 243 { 244 DoTakedown(PlanSucceeded()); 245 } 246 247 void 248 ThreadPlanCallFunction::GetDescription (Stream *s, DescriptionLevel level) 249 { 250 if (level == eDescriptionLevelBrief) 251 { 252 s->Printf("Function call thread plan"); 253 } 254 else 255 { 256 TargetSP target_sp (m_thread.CalculateTarget()); 257 s->Printf("Thread plan to call 0x%" PRIx64, m_function_addr.GetLoadAddress(target_sp.get())); 258 } 259 } 260 261 bool 262 ThreadPlanCallFunction::ValidatePlan (Stream *error) 263 { 264 if (!m_valid) 265 { 266 if (error) 267 { 268 if (m_constructor_errors.GetSize() > 0) 269 error->PutCString (m_constructor_errors.GetData()); 270 else 271 error->PutCString ("Unknown error"); 272 } 273 return false; 274 } 275 276 return true; 277 } 278 279 280 Vote 281 ThreadPlanCallFunction::ShouldReportStop(Event *event_ptr) 282 { 283 if (m_takedown_done || IsPlanComplete()) 284 return eVoteYes; 285 else 286 return ThreadPlan::ShouldReportStop(event_ptr); 287 } 288 289 bool 290 ThreadPlanCallFunction::DoPlanExplainsStop (Event *event_ptr) 291 { 292 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP|LIBLLDB_LOG_PROCESS)); 293 m_real_stop_info_sp = GetPrivateStopInfo (); 294 295 // If our subplan knows why we stopped, even if it's done (which would forward the question to us) 296 // we answer yes. 297 if (m_subplan_sp.get() != NULL && m_subplan_sp->PlanExplainsStop(event_ptr)) 298 { 299 SetPlanComplete(); 300 return true; 301 } 302 303 // Check if the breakpoint is one of ours. 304 305 StopReason stop_reason; 306 if (!m_real_stop_info_sp) 307 stop_reason = eStopReasonNone; 308 else 309 stop_reason = m_real_stop_info_sp->GetStopReason(); 310 if (log) 311 log->Printf ("ThreadPlanCallFunction::PlanExplainsStop: Got stop reason - %s.", Thread::StopReasonAsCString(stop_reason)); 312 313 if (stop_reason == eStopReasonBreakpoint && BreakpointsExplainStop()) 314 return true; 315 316 // We control breakpoints separately from other "stop reasons." So first, 317 // check the case where we stopped for an internal breakpoint, in that case, continue on. 318 // If it is not an internal breakpoint, consult m_ignore_breakpoints. 319 320 321 if (stop_reason == eStopReasonBreakpoint) 322 { 323 ProcessSP process_sp (m_thread.CalculateProcess()); 324 uint64_t break_site_id = m_real_stop_info_sp->GetValue(); 325 BreakpointSiteSP bp_site_sp; 326 if (process_sp) 327 bp_site_sp = process_sp->GetBreakpointSiteList().FindByID(break_site_id); 328 if (bp_site_sp) 329 { 330 uint32_t num_owners = bp_site_sp->GetNumberOfOwners(); 331 bool is_internal = true; 332 for (uint32_t i = 0; i < num_owners; i++) 333 { 334 Breakpoint &bp = bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint(); 335 if (log) 336 log->Printf ("ThreadPlanCallFunction::PlanExplainsStop: hit breakpoint %d while calling function", bp.GetID()); 337 338 if (!bp.IsInternal()) 339 { 340 is_internal = false; 341 break; 342 } 343 } 344 if (is_internal) 345 { 346 if (log) 347 log->Printf ("ThreadPlanCallFunction::PlanExplainsStop hit an internal breakpoint, not stopping."); 348 return false; 349 } 350 } 351 352 if (m_ignore_breakpoints) 353 { 354 if (log) 355 log->Printf("ThreadPlanCallFunction::PlanExplainsStop: we are ignoring breakpoints, overriding breakpoint stop info ShouldStop, returning true"); 356 m_real_stop_info_sp->OverrideShouldStop(false); 357 return true; 358 } 359 else 360 { 361 if (log) 362 log->Printf("ThreadPlanCallFunction::PlanExplainsStop: we are not ignoring breakpoints, overriding breakpoint stop info ShouldStop, returning true"); 363 m_real_stop_info_sp->OverrideShouldStop(true); 364 return false; 365 } 366 } 367 else if (!m_unwind_on_error) 368 { 369 // If we don't want to discard this plan, than any stop we don't understand should be propagated up the stack. 370 return false; 371 } 372 else 373 { 374 // If the subplan is running, any crashes are attributable to us. 375 // If we want to discard the plan, then we say we explain the stop 376 // but if we are going to be discarded, let whoever is above us 377 // explain the stop. 378 // But don't discard the plan if the stop would restart itself (for instance if it is a 379 // signal that is set not to stop. Check that here first. We just say we explain the stop 380 // but aren't done and everything will continue on from there. 381 382 if (m_real_stop_info_sp->ShouldStopSynchronous(event_ptr)) 383 { 384 SetPlanComplete(false); 385 if (m_subplan_sp) 386 { 387 if (m_unwind_on_error) 388 return true; 389 else 390 return false; 391 } 392 else 393 return false; 394 } 395 else 396 return true; 397 } 398 } 399 400 bool 401 ThreadPlanCallFunction::ShouldStop (Event *event_ptr) 402 { 403 // We do some computation in DoPlanExplainsStop that may or may not set the plan as complete. 404 // We need to do that here to make sure our state is correct. 405 DoPlanExplainsStop(event_ptr); 406 407 if (IsPlanComplete()) 408 { 409 ReportRegisterState ("Function completed. Register state was:"); 410 return true; 411 } 412 else 413 { 414 return false; 415 } 416 } 417 418 bool 419 ThreadPlanCallFunction::StopOthers () 420 { 421 return m_stop_other_threads; 422 } 423 424 void 425 ThreadPlanCallFunction::SetStopOthers (bool new_value) 426 { 427 if (m_subplan_sp) 428 { 429 ThreadPlanRunToAddress *address_plan = static_cast<ThreadPlanRunToAddress *>(m_subplan_sp.get()); 430 address_plan->SetStopOthers(new_value); 431 } 432 m_stop_other_threads = new_value; 433 } 434 435 StateType 436 ThreadPlanCallFunction::GetPlanRunState () 437 { 438 return eStateRunning; 439 } 440 441 void 442 ThreadPlanCallFunction::DidPush () 443 { 444 //#define SINGLE_STEP_EXPRESSIONS 445 446 // Now set the thread state to "no reason" so we don't run with whatever signal was outstanding... 447 // Wait till the plan is pushed so we aren't changing the stop info till we're about to run. 448 449 GetThread().SetStopInfoToNothing(); 450 451 #ifndef SINGLE_STEP_EXPRESSIONS 452 m_subplan_sp.reset(new ThreadPlanRunToAddress(m_thread, m_start_addr, m_stop_other_threads)); 453 454 m_thread.QueueThreadPlan(m_subplan_sp, false); 455 m_subplan_sp->SetPrivate (true); 456 #endif 457 } 458 459 bool 460 ThreadPlanCallFunction::WillStop () 461 { 462 return true; 463 } 464 465 bool 466 ThreadPlanCallFunction::MischiefManaged () 467 { 468 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 469 470 if (IsPlanComplete()) 471 { 472 if (log) 473 log->Printf("ThreadPlanCallFunction(%p): Completed call function plan.", this); 474 475 ThreadPlan::MischiefManaged (); 476 return true; 477 } 478 else 479 { 480 return false; 481 } 482 } 483 484 void 485 ThreadPlanCallFunction::SetBreakpoints () 486 { 487 ProcessSP process_sp (m_thread.CalculateProcess()); 488 if (m_trap_exceptions && process_sp) 489 { 490 m_cxx_language_runtime = process_sp->GetLanguageRuntime(eLanguageTypeC_plus_plus); 491 m_objc_language_runtime = process_sp->GetLanguageRuntime(eLanguageTypeObjC); 492 493 if (m_cxx_language_runtime) 494 { 495 m_should_clear_cxx_exception_bp = !m_cxx_language_runtime->ExceptionBreakpointsAreSet(); 496 m_cxx_language_runtime->SetExceptionBreakpoints(); 497 } 498 if (m_objc_language_runtime) 499 { 500 m_should_clear_objc_exception_bp = !m_objc_language_runtime->ExceptionBreakpointsAreSet(); 501 m_objc_language_runtime->SetExceptionBreakpoints(); 502 } 503 } 504 } 505 506 void 507 ThreadPlanCallFunction::ClearBreakpoints () 508 { 509 if (m_trap_exceptions) 510 { 511 if (m_cxx_language_runtime && m_should_clear_cxx_exception_bp) 512 m_cxx_language_runtime->ClearExceptionBreakpoints(); 513 if (m_objc_language_runtime && m_should_clear_objc_exception_bp) 514 m_objc_language_runtime->ClearExceptionBreakpoints(); 515 } 516 } 517 518 bool 519 ThreadPlanCallFunction::BreakpointsExplainStop() 520 { 521 StopInfoSP stop_info_sp = GetPrivateStopInfo (); 522 523 if (m_trap_exceptions) 524 { 525 if ((m_cxx_language_runtime && 526 m_cxx_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp)) 527 ||(m_objc_language_runtime && 528 m_objc_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp))) 529 { 530 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP)); 531 if (log) 532 log->Printf ("ThreadPlanCallFunction::BreakpointsExplainStop - Hit an exception breakpoint, setting plan complete."); 533 534 SetPlanComplete(false); 535 536 // If the user has set the ObjC language breakpoint, it would normally get priority over our internal 537 // catcher breakpoint, but in this case we can't let that happen, so force the ShouldStop here. 538 stop_info_sp->OverrideShouldStop (true); 539 return true; 540 } 541 } 542 543 return false; 544 } 545 546 bool 547 ThreadPlanCallFunction::RestoreThreadState() 548 { 549 return GetThread().RestoreThreadStateFromCheckpoint(m_stored_thread_state); 550 } 551 552