aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2018-04-26 13:01:26 +0100
committerPedro Alves <palves@redhat.com>2018-04-26 13:07:47 +0100
commit42ddae103c9eb20fb87378548ee95b4bd23648a5 (patch)
tree5c80aa1d1f176e414687769979a72961ea20ecaa
parenta0aca7b0e13d884f43ba77c4c6d752d9140cb54b (diff)
downloadgdb-42ddae103c9eb20fb87378548ee95b4bd23648a5.zip
gdb-42ddae103c9eb20fb87378548ee95b4bd23648a5.tar.gz
gdb-42ddae103c9eb20fb87378548ee95b4bd23648a5.tar.bz2
Factor out minsym_found/find_function_start_sal overload
I need to make the ifunc resolving code in elfread.c skip the target function's prologue like minsym_found does. I thought of factoring that out to a separate function, but turns out there's already a comment in find_function_start_sal that says that should agree with minsym_found... Instead of making sure the code agrees with a comment, factor out the common code to a separate function and use it from both places. Note that the current find_function_start_sal does a bit more than minsym_found's equivalent (the "We always should ..." bit), though that's probably a latent bug. gdb/ChangeLog: 2018-04-26 Pedro Alves <palves@redhat.com> * linespec.c (minsym_found): Use find_function_start_sal CORE_ADDR overload. * symtab.c (find_function_start_sal(CORE_ADDR, obj_section *,bool)): New, factored out from ... (find_function_start_sal(symbol *, int)): ... this. Reimplement and use bool. * symtab.h (find_function_start_sal(CORE_ADDR, obj_section *,bool)): New. (find_function_start_sal(symbol *, int)): Change boolean parameter type to bool.
-rw-r--r--gdb/linespec.c20
-rw-r--r--gdb/symtab.c45
-rw-r--r--gdb/symtab.h13
3 files changed, 37 insertions, 41 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c
index b2deabe..045c97a 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -4292,25 +4292,7 @@ minsym_found (struct linespec_state *self, struct objfile *objfile,
symtab_and_line sal;
if (is_function && want_start_sal)
- {
- sal = find_pc_sect_line (func_addr, NULL, 0);
-
- if (self->funfirstline)
- {
- if (sal.symtab != NULL
- && (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab))
- || SYMTAB_LANGUAGE (sal.symtab) == language_asm))
- {
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
-
- sal.pc = func_addr;
- if (gdbarch_skip_entrypoint_p (gdbarch))
- sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc);
- }
- else
- skip_prologue_sal (&sal);
- }
- }
+ sal = find_function_start_sal (func_addr, NULL, self->funfirstline);
else
{
sal.objfile = objfile;
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 92b7ed7..13910c6 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -3575,46 +3575,36 @@ find_pc_line_pc_range (CORE_ADDR pc, CORE_ADDR *startptr, CORE_ADDR *endptr)
return sal.symtab != 0;
}
-/* Given a function symbol SYM, find the symtab and line for the start
- of the function.
- If the argument FUNFIRSTLINE is nonzero, we want the first line
- of real code inside the function.
- This function should return SALs matching those from minsym_found,
- otherwise false multiple-locations breakpoints could be placed. */
+/* See symtab.h. */
-struct symtab_and_line
-find_function_start_sal (struct symbol *sym, int funfirstline)
+symtab_and_line
+find_function_start_sal (CORE_ADDR func_addr, obj_section *section,
+ bool funfirstline)
{
- fixup_symbol_section (sym, NULL);
-
- obj_section *section = SYMBOL_OBJ_SECTION (symbol_objfile (sym), sym);
- symtab_and_line sal
- = find_pc_sect_line (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)), section, 0);
- sal.symbol = sym;
+ symtab_and_line sal = find_pc_sect_line (func_addr, section, 0);
if (funfirstline && sal.symtab != NULL
&& (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab))
|| SYMTAB_LANGUAGE (sal.symtab) == language_asm))
{
- struct gdbarch *gdbarch = symbol_arch (sym);
+ struct gdbarch *gdbarch = get_objfile_arch (SYMTAB_OBJFILE (sal.symtab));
- sal.pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+ sal.pc = func_addr;
if (gdbarch_skip_entrypoint_p (gdbarch))
sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc);
return sal;
}
/* We always should have a line for the function start address.
- If we don't, something is odd. Create a plain SAL refering
+ If we don't, something is odd. Create a plain SAL referring
just the PC and hope that skip_prologue_sal (if requested)
can find a line number for after the prologue. */
- if (sal.pc < BLOCK_START (SYMBOL_BLOCK_VALUE (sym)))
+ if (sal.pc < func_addr)
{
sal = {};
sal.pspace = current_program_space;
- sal.pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+ sal.pc = func_addr;
sal.section = section;
- sal.symbol = sym;
}
if (funfirstline)
@@ -3623,6 +3613,21 @@ find_function_start_sal (struct symbol *sym, int funfirstline)
return sal;
}
+/* See symtab.h. */
+
+symtab_and_line
+find_function_start_sal (symbol *sym, bool funfirstline)
+{
+ fixup_symbol_section (sym, NULL);
+ symtab_and_line sal
+ = find_function_start_sal (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)),
+ SYMBOL_OBJ_SECTION (symbol_objfile (sym), sym),
+ funfirstline);
+ sal.symbol = sym;
+ return sal;
+}
+
+
/* Given a function start address FUNC_ADDR and SYMTAB, find the first
address for that function that has an entry in SYMTAB's line info
table. If such an entry cannot be found, return FUNC_ADDR
diff --git a/gdb/symtab.h b/gdb/symtab.h
index a89d597..0bd95fa 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1899,8 +1899,17 @@ int matching_obj_sections (struct obj_section *, struct obj_section *);
extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *);
-extern struct symtab_and_line find_function_start_sal (struct symbol *sym,
- int);
+/* Given a function symbol SYM, find the symtab and line for the start
+ of the function. If FUNFIRSTLINE is true, we want the first line
+ of real code inside the function. */
+extern symtab_and_line find_function_start_sal (symbol *sym, bool
+ funfirstline);
+
+/* Same, but start with a function address/section instead of a
+ symbol. */
+extern symtab_and_line find_function_start_sal (CORE_ADDR func_addr,
+ obj_section *section,
+ bool funfirstline);
extern void skip_prologue_sal (struct symtab_and_line *);