Refactor svr4_create_solib_event_breakpoints

Move the bulk of svr4_create_solib_event_breakpoints into a new
function to simplify the logic. No functional changes.

gdb/ChangeLog:

	* solib-svr4.c (svr4_find_and_create_probe_breakpoints): Move
	code to here...
	(svr4_create_solib_event_breakpoints): ...from here.
This commit is contained in:
Alan Hayward
2019-08-21 15:05:40 +01:00
parent 217d2eaa69
commit e661ef01e5
2 changed files with 66 additions and 67 deletions

View File

@ -1,3 +1,9 @@
2019-09-02 Alan Hayward <alan.hayward@arm.com>
* solib-svr4.c (svr4_find_and_create_probe_breakpoints): Move
code to here...
(svr4_create_solib_event_breakpoints): ...from here.
2019-08-30 Sergio Durigan Junior <sergiodj@redhat.com>
* nat/fork-inferior.c (trace_start_error): Remove "\nError: "

View File

@ -2061,6 +2061,61 @@ svr4_create_probe_breakpoints (svr4_info *info, struct gdbarch *gdbarch,
svr4_update_solib_event_breakpoints ();
}
/* Find all the glibc named probes. Only if all of the probes are found, then
create them and return true. Otherwise return false. If WITH_PREFIX is set
then add "rtld" to the front of the probe names. */
static bool
svr4_find_and_create_probe_breakpoints (svr4_info *info,
struct gdbarch *gdbarch,
struct obj_section *os,
bool with_prefix)
{
std::vector<probe *> probes[NUM_PROBES];
bool checked_can_use_probe_arguments = false;
for (int i = 0; i < NUM_PROBES; i++)
{
const char *name = probe_info[i].name;
char buf[32];
/* Fedora 17 and Red Hat Enterprise Linux 6.2-6.4 shipped with an early
version of the probes code in which the probes' names were prefixed
with "rtld_" and the "map_failed" probe did not exist. The locations
of the probes are otherwise the same, so we check for probes with
prefixed names if probes with unprefixed names are not present. */
if (with_prefix)
{
xsnprintf (buf, sizeof (buf), "rtld_%s", name);
name = buf;
}
probes[i] = find_probes_in_objfile (os->objfile, "rtld", name);
/* The "map_failed" probe did not exist in early
versions of the probes code in which the probes'
names were prefixed with "rtld_". */
if (with_prefix && streq (name, "rtld_map_failed"))
continue;
/* Ensure at least one probe for the current name was found. */
if (probes[i].empty ())
return false;
/* Ensure probe arguments can be evaluated. */
if (!checked_can_use_probe_arguments)
{
probe *p = probes[i][0];
if (!p->can_evaluate_arguments ())
return false;
checked_can_use_probe_arguments = true;
}
}
/* All probes found. Now create them. */
svr4_create_probe_breakpoints (info, gdbarch, probes, os->objfile);
return true;
}
/* Both the SunOS and the SVR4 dynamic linkers call a marker function
before and after mapping and unmapping shared libraries. The sole
purpose of this method is to allow debuggers to set a breakpoint so
@ -2077,74 +2132,12 @@ static void
svr4_create_solib_event_breakpoints (svr4_info *info, struct gdbarch *gdbarch,
CORE_ADDR address)
{
struct obj_section *os;
struct obj_section *os = find_pc_section (address);
os = find_pc_section (address);
if (os != NULL)
{
int with_prefix;
for (with_prefix = 0; with_prefix <= 1; with_prefix++)
{
std::vector<probe *> probes[NUM_PROBES];
int all_probes_found = 1;
int checked_can_use_probe_arguments = 0;
for (int i = 0; i < NUM_PROBES; i++)
{
const char *name = probe_info[i].name;
probe *p;
char buf[32];
/* Fedora 17 and Red Hat Enterprise Linux 6.2-6.4
shipped with an early version of the probes code in
which the probes' names were prefixed with "rtld_"
and the "map_failed" probe did not exist. The
locations of the probes are otherwise the same, so
we check for probes with prefixed names if probes
with unprefixed names are not present. */
if (with_prefix)
{
xsnprintf (buf, sizeof (buf), "rtld_%s", name);
name = buf;
}
probes[i] = find_probes_in_objfile (os->objfile, "rtld", name);
/* The "map_failed" probe did not exist in early
versions of the probes code in which the probes'
names were prefixed with "rtld_". */
if (strcmp (name, "rtld_map_failed") == 0)
continue;
if (probes[i].empty ())
{
all_probes_found = 0;
break;
}
/* Ensure probe arguments can be evaluated. */
if (!checked_can_use_probe_arguments)
{
p = probes[i][0];
if (!p->can_evaluate_arguments ())
{
all_probes_found = 0;
break;
}
checked_can_use_probe_arguments = 1;
}
}
if (all_probes_found)
svr4_create_probe_breakpoints (info, gdbarch, probes, os->objfile);
if (all_probes_found)
return;
}
}
create_solib_event_breakpoint (gdbarch, address);
if (os == nullptr
|| (!svr4_find_and_create_probe_breakpoints (info, gdbarch, os, false)
&& !svr4_find_and_create_probe_breakpoints (info, gdbarch, os, true)))
create_solib_event_breakpoint (gdbarch, address);
}
/* Helper function for gdb_bfd_lookup_symbol. */