Index: gdb/hppa-hpux-tdep.c |
diff --git a/gdb/hppa-hpux-tdep.c b/gdb/hppa-hpux-tdep.c |
index f6dfef2f0ed58c588e3c9a32f1236e4ef21a0fa4..c2ba1eedb0b11350e876c22243cff9d9ea91112b 100644 |
--- a/gdb/hppa-hpux-tdep.c |
+++ b/gdb/hppa-hpux-tdep.c |
@@ -1,6 +1,6 @@ |
/* Target-dependent code for HP-UX on PA-RISC. |
- Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc. |
+ Copyright (C) 2002-2013 Free Software Foundation, Inc. |
This file is part of GDB. |
@@ -36,7 +36,7 @@ |
#include "regcache.h" |
#include "exceptions.h" |
-#include "gdb_string.h" |
+#include <string.h> |
#define IS_32BIT_TARGET(_gdbarch) \ |
((gdbarch_tdep (_gdbarch))->bytes_per_address == 4) |
@@ -65,31 +65,16 @@ |
extern void _initialize_hppa_hpux_tdep (void); |
extern initialize_file_ftype _initialize_hppa_hpux_tdep; |
-static int |
-in_opd_section (CORE_ADDR pc) |
-{ |
- struct obj_section *s; |
- int retval = 0; |
- |
- s = find_pc_section (pc); |
- |
- retval = (s != NULL |
- && s->the_bfd_section->name != NULL |
- && strcmp (s->the_bfd_section->name, ".opd") == 0); |
- return (retval); |
-} |
- |
/* Return one if PC is in the call path of a trampoline, else return zero. |
Note we return one for *any* call trampoline (long-call, arg-reloc), not |
just shared library trampolines (import, export). */ |
static int |
-hppa32_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, |
- CORE_ADDR pc, char *name) |
+hppa32_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc) |
{ |
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
- struct minimal_symbol *minsym; |
+ struct bound_minimal_symbol minsym; |
struct unwind_table_entry *u; |
/* First see if PC is in one of the two C-library trampolines. */ |
@@ -98,7 +83,8 @@ hppa32_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, |
return 1; |
minsym = lookup_minimal_symbol_by_pc (pc); |
- if (minsym && strcmp (SYMBOL_LINKAGE_NAME (minsym), ".stub") == 0) |
+ if (minsym.minsym |
+ && strcmp (SYMBOL_LINKAGE_NAME (minsym.minsym), ".stub") == 0) |
return 1; |
/* Get the unwind descriptor corresponding to PC, return zero |
@@ -155,8 +141,7 @@ hppa32_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, |
} |
static int |
-hppa64_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, |
- CORE_ADDR pc, char *name) |
+hppa64_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc) |
{ |
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
@@ -174,16 +159,16 @@ hppa64_hpux_in_solib_call_trampoline (struct gdbarch *gdbarch, |
step. If it does, then assume we are not in a stub and return. |
Finally peek at the instructions to see if they look like a stub. */ |
- struct minimal_symbol *minsym; |
+ struct bound_minimal_symbol minsym; |
asection *sec; |
CORE_ADDR addr; |
int insn; |
minsym = lookup_minimal_symbol_by_pc (pc); |
- if (! minsym) |
+ if (! minsym.minsym) |
return 0; |
- sec = SYMBOL_OBJ_SECTION (minsym)->the_bfd_section; |
+ sec = SYMBOL_OBJ_SECTION (minsym.objfile, minsym.minsym)->the_bfd_section; |
if (bfd_get_section_vma (sec->owner, sec) <= pc |
&& pc < (bfd_get_section_vma (sec->owner, sec) |
@@ -311,7 +296,7 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) |
int word_size = gdbarch_ptr_bit (gdbarch) / 8; |
long orig_pc = pc; |
long prev_inst, curr_inst, loc; |
- struct minimal_symbol *msym; |
+ struct bound_minimal_symbol msym; |
struct unwind_table_entry *u; |
/* Addresses passed to dyncall may *NOT* be the actual address |
@@ -366,10 +351,12 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) |
/*--------------------------------------------------------------------------*/ |
msym = lookup_minimal_symbol_by_pc (pc); |
- if (msym == NULL || MSYMBOL_TYPE (msym) != mst_solib_trampoline) |
+ if (msym.minsym == NULL |
+ || MSYMBOL_TYPE (msym.minsym) != mst_solib_trampoline) |
return orig_pc == pc ? 0 : pc & ~0x3; |
- else if (msym != NULL && MSYMBOL_TYPE (msym) == mst_solib_trampoline) |
+ else if (msym.minsym != NULL |
+ && MSYMBOL_TYPE (msym.minsym) == mst_solib_trampoline) |
{ |
struct objfile *objfile; |
struct minimal_symbol *msymbol; |
@@ -384,7 +371,7 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) |
{ |
if (MSYMBOL_TYPE (msymbol) == mst_text |
&& strcmp (SYMBOL_LINKAGE_NAME (msymbol), |
- SYMBOL_LINKAGE_NAME (msym)) == 0) |
+ SYMBOL_LINKAGE_NAME (msym.minsym)) == 0) |
{ |
function_found = 1; |
break; |
@@ -401,7 +388,7 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) |
should be mst_text. So we need to fix the msym, and also |
get out of this function. */ |
{ |
- MSYMBOL_TYPE (msym) = mst_text; |
+ MSYMBOL_TYPE (msym.minsym) = mst_text; |
return orig_pc == pc ? 0 : pc & ~0x3; |
} |
} |
@@ -472,21 +459,22 @@ hppa_hpux_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) |
(curr_inst == 0xeaa0d000) || |
(curr_inst == 0xeaa0d002)) |
{ |
- struct minimal_symbol *stubsym, *libsym; |
+ struct bound_minimal_symbol stubsym; |
+ struct minimal_symbol *libsym; |
stubsym = lookup_minimal_symbol_by_pc (loc); |
- if (stubsym == NULL) |
+ if (stubsym.minsym == NULL) |
{ |
warning (_("Unable to find symbol for 0x%lx"), loc); |
return orig_pc == pc ? 0 : pc & ~0x3; |
} |
- libsym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (stubsym), |
+ libsym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (stubsym.minsym), |
NULL, NULL); |
if (libsym == NULL) |
{ |
warning (_("Unable to find library symbol for %s."), |
- SYMBOL_PRINT_NAME (stubsym)); |
+ SYMBOL_PRINT_NAME (stubsym.minsym)); |
return orig_pc == pc ? 0 : pc & ~0x3; |
} |
@@ -772,7 +760,7 @@ hppa32_hpux_find_global_pointer (struct gdbarch *gdbarch, |
if (faddr & 2) |
{ |
int status; |
- char buf[4]; |
+ gdb_byte buf[4]; |
faddr &= ~3; |
@@ -790,11 +778,11 @@ hppa64_hpux_find_global_pointer (struct gdbarch *gdbarch, |
{ |
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
CORE_ADDR faddr; |
- char buf[32]; |
+ gdb_byte buf[32]; |
faddr = value_as_address (function); |
- if (in_opd_section (faddr)) |
+ if (pc_in_section (faddr, ".opd")) |
{ |
target_read_memory (faddr, buf, sizeof (buf)); |
return extract_unsigned_integer (&buf[24], 8, byte_order); |
@@ -857,7 +845,7 @@ hppa32_hpux_search_dummy_call_sequence (struct gdbarch *gdbarch, CORE_ADDR pc, |
struct frame_info *frame; |
struct unwind_table_entry *u; |
CORE_ADDR addr, rp; |
- char buf[4]; |
+ gdb_byte buf[4]; |
unsigned int insn; |
sec = find_pc_section (pc); |
@@ -1025,7 +1013,8 @@ static CORE_ADDR |
hppa_hpux_find_import_stub_for_addr (CORE_ADDR funcaddr) |
{ |
struct objfile *objfile; |
- struct minimal_symbol *funsym, *stubsym; |
+ struct bound_minimal_symbol funsym; |
+ struct minimal_symbol *stubsym; |
CORE_ADDR stubaddr; |
funsym = lookup_minimal_symbol_by_pc (funcaddr); |
@@ -1034,7 +1023,7 @@ hppa_hpux_find_import_stub_for_addr (CORE_ADDR funcaddr) |
ALL_OBJFILES (objfile) |
{ |
stubsym = lookup_minimal_symbol_solib_trampoline |
- (SYMBOL_LINKAGE_NAME (funsym), objfile); |
+ (SYMBOL_LINKAGE_NAME (funsym.minsym), objfile); |
if (stubsym) |
{ |
@@ -1201,17 +1190,18 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, |
if (IS_32BIT_TARGET (gdbarch)) |
{ |
- static unsigned int hppa32_tramp[] = { |
- 0x0fdf1291, /* stw r31,-8(,sp) */ |
- 0x02c010a1, /* ldsid (,r22),r1 */ |
- 0x00011820, /* mtsp r1,sr0 */ |
- 0xe6c00000, /* be,l 0(sr0,r22),%sr0,%r31 */ |
- 0x081f0242, /* copy r31,rp */ |
- 0x0fd11082, /* ldw -8(,sp),rp */ |
- 0x004010a1, /* ldsid (,rp),r1 */ |
- 0x00011820, /* mtsp r1,sr0 */ |
- 0xe0400000, /* be 0(sr0,rp) */ |
- 0x08000240 /* nop */ |
+#define INSN(I1, I2, I3, I4) 0x ## I1, 0x ## I2, 0x ## I3, 0x ## I4 |
+ static const gdb_byte hppa32_tramp[] = { |
+ INSN(0f,df,12,91), /* stw r31,-8(,sp) */ |
+ INSN(02,c0,10,a1), /* ldsid (,r22),r1 */ |
+ INSN(00,01,18,20), /* mtsp r1,sr0 */ |
+ INSN(e6,c0,00,00), /* be,l 0(sr0,r22),%sr0,%r31 */ |
+ INSN(08,1f,02,42), /* copy r31,rp */ |
+ INSN(0f,d1,10,82), /* ldw -8(,sp),rp */ |
+ INSN(00,40,10,a1), /* ldsid (,rp),r1 */ |
+ INSN(00,01,18,20), /* mtsp r1,sr0 */ |
+ INSN(e0,40,00,00), /* be 0(sr0,rp) */ |
+ INSN(08,00,02,40) /* nop */ |
}; |
/* for hppa32, we must call the function through a stub so that on |
@@ -1222,7 +1212,7 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, |
"(no import stub).\n")); |
regcache_cooked_write_unsigned (regcache, 22, stubaddr); |
- write_memory (sp, (char *)&hppa32_tramp, sizeof (hppa32_tramp)); |
+ write_memory (sp, hppa32_tramp, sizeof (hppa32_tramp)); |
*bp_addr = hppa_hpux_find_dummy_bpaddr (pc); |
regcache_cooked_write_unsigned (regcache, 31, *bp_addr); |
@@ -1237,18 +1227,19 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, |
} |
else |
{ |
- static unsigned int hppa64_tramp[] = { |
- 0xeac0f000, /* bve,l (r22),%r2 */ |
- 0x0fdf12d1, /* std r31,-8(,sp) */ |
- 0x0fd110c2, /* ldd -8(,sp),rp */ |
- 0xe840d002, /* bve,n (rp) */ |
- 0x08000240 /* nop */ |
+ static const gdb_byte hppa64_tramp[] = { |
+ INSN(ea,c0,f0,00), /* bve,l (r22),%r2 */ |
+ INSN(0f,df,12,d1), /* std r31,-8(,sp) */ |
+ INSN(0f,d1,10,c2), /* ldd -8(,sp),rp */ |
+ INSN(e8,40,d0,02), /* bve,n (rp) */ |
+ INSN(08,00,02,40) /* nop */ |
}; |
+#undef INSN |
/* for hppa64, we don't need to call through a stub; all functions |
return via a bve. */ |
regcache_cooked_write_unsigned (regcache, 22, funcaddr); |
- write_memory (sp, (char *)&hppa64_tramp, sizeof (hppa64_tramp)); |
+ write_memory (sp, hppa64_tramp, sizeof (hppa64_tramp)); |
*bp_addr = pc - 4; |
regcache_cooked_write_unsigned (regcache, 31, *bp_addr); |
@@ -1271,9 +1262,9 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp, |
static void |
hppa_hpux_supply_ss_narrow (struct regcache *regcache, |
- int regnum, const char *save_state) |
+ int regnum, const gdb_byte *save_state) |
{ |
- const char *ss_narrow = save_state + HPPA_HPUX_SS_NARROW_OFFSET; |
+ const gdb_byte *ss_narrow = save_state + HPPA_HPUX_SS_NARROW_OFFSET; |
int i, offset = 0; |
for (i = HPPA_R1_REGNUM; i < HPPA_FP0_REGNUM; i++) |
@@ -1287,9 +1278,9 @@ hppa_hpux_supply_ss_narrow (struct regcache *regcache, |
static void |
hppa_hpux_supply_ss_fpblock (struct regcache *regcache, |
- int regnum, const char *save_state) |
+ int regnum, const gdb_byte *save_state) |
{ |
- const char *ss_fpblock = save_state + HPPA_HPUX_SS_FPBLOCK_OFFSET; |
+ const gdb_byte *ss_fpblock = save_state + HPPA_HPUX_SS_FPBLOCK_OFFSET; |
int i, offset = 0; |
/* FIXME: We view the floating-point state as 64 single-precision |
@@ -1322,9 +1313,9 @@ hppa_hpux_supply_ss_fpblock (struct regcache *regcache, |
static void |
hppa_hpux_supply_ss_wide (struct regcache *regcache, |
- int regnum, const char *save_state) |
+ int regnum, const gdb_byte *save_state) |
{ |
- const char *ss_wide = save_state + HPPA_HPUX_SS_WIDE_OFFSET; |
+ const gdb_byte *ss_wide = save_state + HPPA_HPUX_SS_WIDE_OFFSET; |
int i, offset = 8; |
if (register_size (get_regcache_arch (regcache), HPPA_R1_REGNUM) == 4) |
@@ -1346,8 +1337,8 @@ hppa_hpux_supply_save_state (const struct regset *regset, |
{ |
struct gdbarch *gdbarch = get_regcache_arch (regcache); |
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); |
- const char *proc_info = regs; |
- const char *save_state = proc_info + 8; |
+ const gdb_byte *proc_info = regs; |
+ const gdb_byte *save_state = proc_info + 8; |
ULONGEST flags; |
flags = extract_unsigned_integer (save_state + HPPA_HPUX_SS_FLAGS_OFFSET, |
@@ -1355,7 +1346,7 @@ hppa_hpux_supply_save_state (const struct regset *regset, |
if (regnum == -1 || regnum == HPPA_FLAGS_REGNUM) |
{ |
size_t size = register_size (gdbarch, HPPA_FLAGS_REGNUM); |
- char buf[8]; |
+ gdb_byte buf[8]; |
store_unsigned_integer (buf, size, byte_order, flags); |
regcache_raw_supply (regcache, HPPA_FLAGS_REGNUM, buf); |