From 5fd1a349f04524afe86e4aa5c46390698d7901dd Mon Sep 17 00:00:00 2001 From: Paul Pluzhnikov Date: Mon, 9 Mar 2009 22:38:37 +0000 Subject: [PATCH] 2009-03-09 Paul Pluzhnikov * solib.c (solib_contains_address_p): New function. (solib_name_from_address): Use it. * printcmd.c (display_uses_solib_p): Use it. * solib.h (solib_contains_address_p): Declare it. --- gdb/ChangeLog | 7 +++++++ gdb/printcmd.c | 4 ++-- gdb/solib.c | 26 +++++++++++++++++--------- gdb/solib.h | 4 ++++ 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a0cace5ed1c..a69ef7f960b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2009-03-09 Paul Pluzhnikov + + * solib.c (solib_contains_address_p): New function. + (solib_name_from_address): Use it. + * printcmd.c (display_uses_solib_p): Use it. + * solib.h (solib_contains_address_p): Declare it. + 2009-03-09 Jan Kratochvil * varobj.c (free_variable): Call value_free. diff --git a/gdb/printcmd.c b/gdb/printcmd.c index 8a746e49c4a..23a22305d04 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -1767,7 +1767,7 @@ display_uses_solib_p (const struct display *d, struct expression *const exp = d->exp; if (d->block != NULL - && solib_name_from_address (d->block->startaddr) == solib->so_name) + && solib_contains_address_p (solib, d->block->startaddr)) return 1; for (i = 0; i < exp->nelts; ) @@ -1783,7 +1783,7 @@ display_uses_solib_p (const struct display *d, SYMBOL_OBJ_SECTION (symbol); if (block != NULL - && solib_name_from_address (block->startaddr) == solib->so_name) + && solib_contains_address_p (solib, block->startaddr)) return 1; if (section && section->objfile == solib->objfile) diff --git a/gdb/solib.c b/gdb/solib.c index 0bd767ef659..0eae2006254 100644 --- a/gdb/solib.c +++ b/gdb/solib.c @@ -834,6 +834,21 @@ info_sharedlibrary_command (char *ignore, int from_tty) } } +/* Return 1 if ADDRESS lies within SOLIB. */ + +int +solib_contains_address_p (const struct so_list *const solib, + CORE_ADDR address) +{ + struct section_table *p; + + for (p = solib->sections; p < solib->sections_end; p++) + if (p->addr <= address && address < p->endaddr) + return 1; + + return 0; +} + /* GLOBAL FUNCTION @@ -862,15 +877,8 @@ solib_name_from_address (CORE_ADDR address) struct so_list *so = 0; /* link map state variable */ for (so = so_list_head; so; so = so->next) - { - struct section_table *p; - - for (p = so->sections; p < so->sections_end; p++) - { - if (p->addr <= address && address < p->endaddr) - return (so->so_name); - } - } + if (solib_contains_address_p (so, address)) + return (so->so_name); return (0); } diff --git a/gdb/solib.h b/gdb/solib.h index e84ba0f72d3..b4b770e2ac3 100644 --- a/gdb/solib.h +++ b/gdb/solib.h @@ -47,6 +47,10 @@ extern void solib_create_inferior_hook (void); extern char *solib_name_from_address (CORE_ADDR); +/* Return 1 if ADDR lies within SOLIB. */ + +extern int solib_contains_address_p (const struct so_list *, CORE_ADDR); + /* Return 1 if PC lies in the dynamic symbol resolution code of the run time loader. */ -- 2.30.2