From 3388d7ff414546f25b9258ac2bf650f6691c243d Mon Sep 17 00:00:00 2001 From: Randolph Chung Date: Mon, 7 Jun 2004 02:17:29 +0000 Subject: [PATCH] 2004-06-06 Randolph Chung * 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. --- gdb/ChangeLog | 8 +++++++ gdb/hppa-hpux-tdep.c | 65 ++++----------------------------------------------- gdb/hppa-linux-tdep.c | 16 +------------ gdb/hppa-tdep.c | 12 ++++++++++ gdb/hppa-tdep.h | 1 + 5 files changed, 27 insertions(+), 75 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 88f39da..ba41a7a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2004-06-06 Randolph Chung + * 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 + * 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 f8c141a..615f45d 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 32c6068..1998a0a 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 a5b2f85..8bad243 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 3f2235d..26a7556 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, -- 2.7.4