mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-25 21:41:47 +08:00
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:
@ -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: "
|
||||
|
127
gdb/solib-svr4.c
127
gdb/solib-svr4.c
@ -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. */
|
||||
|
Reference in New Issue
Block a user