Re: [PATCH] Fix setting-breakpoints regression on PPC64 (function descriptors)

Yao Qi
2017-12-08T09:44:33Z

Pedro Alves <palves@redhat.com> writes:

> @@ -4309,22 +4309,16 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
> struct minimal_symbol *msymbol,
> std::vector<symtab_and_line> *result)
> {
> - struct gdbarch *gdbarch = get_objfile_arch (objfile);
> - CORE_ADDR pc;
> struct symtab_and_line sal;
>
> - if (msymbol_is_text (msymbol))
> - {
> - sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (objfile, msymbol),
> - (struct obj_section *) 0, 0);
> - sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);

This line is removed, so that sal.section can be null. It causes
PR 22567. How is the patch below?

> + /* The minimal symbol might point to a function descriptor, which is
> + not a text symbol; try resolving it to the actual code
> + address. */
>
> - /* The minimal symbol might point to a function descriptor;
> - resolve it to the actual code address instead. */
> - pc = gdbarch_convert_from_func_ptr_addr (gdbarch, sal.pc,
> - &current_target);
> - if (pc != sal.pc)
> - sal = find_pc_sect_line (pc, NULL, 0);
> + CORE_ADDR func_addr;
> + if (msymbol_is_function (objfile, msymbol, &func_addr))
> + {
> + sal = find_pc_sect_line (func_addr, NULL, 0);
>
> if (self->funfirstline)
> {

--
Yao (齐尧)
From b8e112071a75e7227dc3ee5f35cfa874f3b41da7 Mon Sep 17 00:00:00 2001
From: Yao Qi <yao.qi@linaro.org>
Date: Thu, 7 Dec 2017 16:53:13 +0000
Subject: [PATCH] Fix PR 22567: set SAL .section in minsym_found

PR 22567 is that breakpoint location can't correct gdbarch from SAL,
because its fields .section and .symtab is NULL. We use to have code
setting .section, but was removed by 4024cf2

- if (msymbol_is_text (msymbol))
+ CORE_ADDR func_addr;
+ if (msymbol_is_function (objfile, msymbol, &func_addr))
{
- sal = find_pc_sect_line (MSYMBOL_VALUE_ADDRESS (objfile, msymbol),
- (struct obj_section *) 0, 0);
- sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);

this patch adds this back by moving it to the common place at the bottom
of the function.

gdb:

2017-12-07 Yao Qi <yao.qi@linaro.org>

PR breakpionts/22567
* linespec.c (minsym_found): Set sal. objfile and section.

diff --git a/gdb/linespec.c b/gdb/linespec.c
index 09758762..8c36f2a 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -4365,9 +4365,10 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
sal.objfile = objfile;
sal.pc = MSYMBOL_VALUE_ADDRESS (objfile, msymbol);
sal.pspace = current_program_space;
- sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
}

+ sal.section = MSYMBOL_OBJ_SECTION (objfile, msymbol);
+
if (maybe_add_address (self->addr_set, objfile->pspace, sal.pc))
add_sal_to_sals (self, result, &sal, MSYMBOL_NATURAL_NAME (msymbol), 0);
}