[Lldb-commits] [lldb] [lldb][NFC] Add helper to compute breakpoint's constituent load address (PR #190762)
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 7 06:48:51 PDT 2026
================
@@ -1600,76 +1600,80 @@ static bool ShouldShowError(Process &process) {
llvm_unreachable("unhandled process state");
}
-lldb::break_id_t
-Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
- bool use_hardware) {
- addr_t load_addr = LLDB_INVALID_ADDRESS;
+static addr_t ComputeConstituentLoadAddress(BreakpointLocation &constituent,
+ Process &proc) {
+ // Reset the IsIndirect flag here, in case the location changes from pointing
+ // from an indirect symbol to a regular symbol.
+ constituent.SetIsIndirect(false);
- bool show_error = ShouldShowError(*this);
+ Target &target = proc.GetTarget();
- // Reset the IsIndirect flag here, in case the location changes from pointing
- // to a indirect symbol to a regular symbol.
- constituent->SetIsIndirect(false);
+ if (!constituent.ShouldResolveIndirectFunctions())
+ return constituent.GetAddress().GetOpcodeLoadAddress(&target);
- if (constituent->ShouldResolveIndirectFunctions()) {
- const Symbol *symbol =
- constituent->GetAddress().CalculateSymbolContextSymbol();
- if (symbol && symbol->IsIndirect()) {
- Status error;
- Address symbol_address = symbol->GetAddress();
- load_addr = ResolveIndirectFunction(&symbol_address, error);
- if (!error.Success() && show_error) {
- GetTarget().GetDebugger().GetAsyncErrorStream()->Printf(
- "warning: failed to resolve indirect function at 0x%" PRIx64
- " for breakpoint %i.%i: %s\n",
- symbol->GetLoadAddress(&GetTarget()),
- constituent->GetBreakpoint().GetID(), constituent->GetID(),
- error.AsCString() ? error.AsCString() : "unknown error");
- return LLDB_INVALID_BREAK_ID;
- }
- Address resolved_address(load_addr);
- load_addr = resolved_address.GetOpcodeLoadAddress(&GetTarget());
- constituent->SetIsIndirect(true);
- } else
- load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&GetTarget());
- } else
- load_addr = constituent->GetAddress().GetOpcodeLoadAddress(&GetTarget());
+ const Symbol *symbol =
+ constituent.GetAddress().CalculateSymbolContextSymbol();
+ if (!symbol || !symbol->IsIndirect())
+ return constituent.GetAddress().GetOpcodeLoadAddress(&target);
+
+ // An indirect symbol is involved.
+ Status error;
+ Address symbol_address = symbol->GetAddress();
+ addr_t load_addr = proc.ResolveIndirectFunction(&symbol_address, error);
+
+ if (!error.Success() && ShouldShowError(proc)) {
+ target.GetDebugger().GetAsyncErrorStream()->Printf(
+ "warning: failed to resolve indirect function at 0x%" PRIx64
+ " for breakpoint %i.%i: %s\n",
+ symbol->GetLoadAddress(&target), constituent.GetBreakpoint().GetID(),
+ constituent.GetID(),
+ error.AsCString() ? error.AsCString() : "unknown error");
+ // FIXME: ShouldShowError must only guard the error message.
+ return LLDB_INVALID_ADDRESS;
+ }
- if (load_addr != LLDB_INVALID_ADDRESS) {
- BreakpointSiteSP bp_site_sp;
+ Address resolved_address(load_addr);
+ constituent.SetIsIndirect(true);
+ return resolved_address.GetOpcodeLoadAddress(&target);
+}
- // Look up this breakpoint site. If it exists, then add this new
- // constituent, otherwise create a new breakpoint site and add it.
+lldb::break_id_t
+Process::CreateBreakpointSite(const BreakpointLocationSP &constituent,
+ bool use_hardware) {
+ addr_t load_addr = ComputeConstituentLoadAddress(*constituent, *this);
- bp_site_sp = m_breakpoint_site_list.FindByAddress(load_addr);
+ if (load_addr == LLDB_INVALID_ADDRESS)
+ return LLDB_INVALID_BREAK_ID;
+ BreakpointSiteSP bp_site_sp;
+
+ // Look up this breakpoint site. If it exists, then add this new
+ // constituent, otherwise create a new breakpoint site and add it.
+ bp_site_sp = m_breakpoint_site_list.FindByAddress(load_addr);
+ if (bp_site_sp) {
+ bp_site_sp->AddConstituent(constituent);
+ constituent->SetBreakpointSite(bp_site_sp);
+ return bp_site_sp->GetID();
+ } else {
----------------
Michael137 wrote:
Nit: no-return-after-else?
https://github.com/llvm/llvm-project/pull/190762
More information about the lldb-commits
mailing list