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.
This commit is contained in:
parent
d4b6d57569
commit
3388d7ff41
@ -1,3 +1,11 @@
|
||||
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.
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user