summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandolph Chung <tausq@debian.org>2004-06-07 02:17:29 +0000
committerRandolph Chung <tausq@debian.org>2004-06-07 02:17:29 +0000
commitfe3523372d6afeebd9509c4fdfbc2b5a51f97d05 (patch)
treecf049444ba3103505111a22f31c44d853966fecc
parent7fedc5803f91b961cdbf8159f876bfa46d759766 (diff)
downloadgdb-fe3523372d6afeebd9509c4fdfbc2b5a51f97d05.tar.gz
2004-06-06 Randolph Chung <tausq@debian.org>
* hppa-hpux-tdep.c (hppa32_hpux_in_solib_call_trampoline) (hppa_hpux_skip_trampoline_code): Don't cache symbol values. * hppa-linux-tdep.c (hppa_linux_in_dyncall): Likewise. * hppa-tdep.c (hppa_symbol_address): New function definition. * hppa-tdep.h (hppa_symbol_address): New function declaration.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/hppa-hpux-tdep.c65
-rw-r--r--gdb/hppa-linux-tdep.c16
-rw-r--r--gdb/hppa-tdep.c12
-rw-r--r--gdb/hppa-tdep.h1
5 files changed, 27 insertions, 75 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 88f39daed9a..ba41a7a9dcd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2004-06-06 Randolph Chung <tausq@debian.org>
+ * hppa-hpux-tdep.c (hppa32_hpux_in_solib_call_trampoline)
+ (hppa_hpux_skip_trampoline_code): Don't cache symbol values.
+ * hppa-linux-tdep.c (hppa_linux_in_dyncall): Likewise.
+ * hppa-tdep.c (hppa_symbol_address): New function definition.
+ * hppa-tdep.h (hppa_symbol_address): New function declaration.
+
+2004-06-06 Randolph Chung <tausq@debian.org>
+
* hppa-tdep.h (struct value): Forward declaration.
(gdbarch_tdep): Define tdep find_global_pointer method.
* hppa-tdep.c (hppa32_push_dummy_call): Find the global pointer
diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c
index f8c141a4105..615f45de69f 100644
--- a/gdb/hppa-hpux-tdep.c
+++ b/gdb/hppa-hpux-tdep.c
@@ -61,32 +61,10 @@ hppa32_hpux_in_solib_call_trampoline (CORE_ADDR pc, char *name)
{
struct minimal_symbol *minsym;
struct unwind_table_entry *u;
- static CORE_ADDR dyncall = 0;
- static CORE_ADDR sr4export = 0;
-
- /* FIXME XXX - dyncall and sr4export must be initialized whenever we get a
- new exec file */
/* First see if PC is in one of the two C-library trampolines. */
- if (!dyncall)
- {
- minsym = lookup_minimal_symbol ("$$dyncall", NULL, NULL);
- if (minsym)
- dyncall = SYMBOL_VALUE_ADDRESS (minsym);
- else
- dyncall = -1;
- }
-
- if (!sr4export)
- {
- minsym = lookup_minimal_symbol ("_sr4export", NULL, NULL);
- if (minsym)
- sr4export = SYMBOL_VALUE_ADDRESS (minsym);
- else
- sr4export = -1;
- }
-
- if (pc == dyncall || pc == sr4export)
+ if (pc == hppa_symbol_address("$$dyncall")
+ || pc == hppa_symbol_address("_sr4export"))
return 1;
minsym = lookup_minimal_symbol_by_pc (pc);
@@ -295,45 +273,12 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
{
long orig_pc = pc;
long prev_inst, curr_inst, loc;
- static CORE_ADDR dyncall = 0;
- static CORE_ADDR dyncall_external = 0;
- static CORE_ADDR sr4export = 0;
struct minimal_symbol *msym;
struct unwind_table_entry *u;
- /* FIXME XXX - dyncall and sr4export must be initialized whenever we get a
- new exec file */
-
- if (!dyncall)
- {
- msym = lookup_minimal_symbol ("$$dyncall", NULL, NULL);
- if (msym)
- dyncall = SYMBOL_VALUE_ADDRESS (msym);
- else
- dyncall = -1;
- }
-
- if (!dyncall_external)
- {
- msym = lookup_minimal_symbol ("$$dyncall_external", NULL, NULL);
- if (msym)
- dyncall_external = SYMBOL_VALUE_ADDRESS (msym);
- else
- dyncall_external = -1;
- }
-
- if (!sr4export)
- {
- msym = lookup_minimal_symbol ("_sr4export", NULL, NULL);
- if (msym)
- sr4export = SYMBOL_VALUE_ADDRESS (msym);
- else
- sr4export = -1;
- }
-
/* Addresses passed to dyncall may *NOT* be the actual address
of the function. So we may have to do something special. */
- if (pc == dyncall)
+ if (pc == hppa_symbol_address("$$dyncall"))
{
pc = (CORE_ADDR) read_register (22);
@@ -343,12 +288,12 @@ hppa_hpux_skip_trampoline_code (CORE_ADDR pc)
if (pc & 0x2)
pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, TARGET_PTR_BIT / 8);
}
- if (pc == dyncall_external)
+ if (pc == hppa_symbol_address("$$dyncall_external"))
{
pc = (CORE_ADDR) read_register (22);
pc = (CORE_ADDR) read_memory_integer (pc & ~0x3, TARGET_PTR_BIT / 8);
}
- else if (pc == sr4export)
+ else if (pc == hppa_symbol_address("_sr4export"))
pc = (CORE_ADDR) (read_register (22));
/* Get the unwind descriptor corresponding to PC, return zero
diff --git a/gdb/hppa-linux-tdep.c b/gdb/hppa-linux-tdep.c
index 32c6068dbd9..1998a0ac6be 100644
--- a/gdb/hppa-linux-tdep.c
+++ b/gdb/hppa-linux-tdep.c
@@ -164,21 +164,7 @@ insns_match_pattern (CORE_ADDR pc,
static int
hppa_linux_in_dyncall (CORE_ADDR pc)
{
- static CORE_ADDR dyncall = 0;
-
- /* FIXME: if we switch exec files, dyncall should be reinitialized */
- if (!dyncall)
- {
- struct minimal_symbol *minsym;
-
- minsym = lookup_minimal_symbol ("$$dyncall", NULL, NULL);
- if (minsym)
- dyncall = SYMBOL_VALUE_ADDRESS (minsym);
- else
- dyncall = -1;
- }
-
- return pc == dyncall;
+ return pc == hppa_symbol_address("$$dyncall");
}
/* There are several kinds of "trampolines" that we need to deal with:
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index a5b2f852c9e..8bad2437761 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -262,6 +262,18 @@ hppa_extract_17 (unsigned word)
hppa_get_field (word, 11, 15) << 11 |
(word & 0x1) << 16, 17) << 2;
}
+
+CORE_ADDR
+hppa_symbol_address(const char *sym)
+{
+ struct minimal_symbol *minsym;
+
+ minsym = lookup_minimal_symbol (sym, NULL, NULL);
+ if (minsym)
+ return SYMBOL_VALUE_ADDRESS (minsym);
+ else
+ return (CORE_ADDR)-1;
+}
/* Compare the start address for two unwind entries returning 1 if
diff --git a/gdb/hppa-tdep.h b/gdb/hppa-tdep.h
index 3f2235ddcd8..26a7556a686 100644
--- a/gdb/hppa-tdep.h
+++ b/gdb/hppa-tdep.h
@@ -194,6 +194,7 @@ int hppa_extract_21 (unsigned);
int hppa_extract_14 (unsigned);
int hppa_low_sign_extend (unsigned int, unsigned int);
int hppa_sign_extend (unsigned int, unsigned int);
+CORE_ADDR hppa_symbol_address(const char *sym);
void
hppa_frame_prev_register_helper (struct frame_info *next_frame,