aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/printcmd.c4
-rw-r--r--gdb/solib.c26
-rw-r--r--gdb/solib.h4
4 files changed, 30 insertions, 11 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a0cace5..a69ef7f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2009-03-09 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ * 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 <jan.kratochvil@redhat.com>
* varobj.c (free_variable): Call value_free.
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index 8a746e4..23a2230 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 0bd767e..0eae200 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 e84ba0f..b4b770e 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. */